Compare commits

...

20 commits

Author SHA1 Message Date
Janek Bevendorff
860e51d8e9
Update translations.
Some checks failed
CodeQL / Analyze (push) Has been cancelled
2026-03-10 01:27:46 +01:00
Jonathan White
681886c8a5 Bump version number and Changelog 2026-03-10 01:22:14 +01:00
Janek Bevendorff
b4cf8fa435 Also override OPENSSL_ENGINES to prevent DLL injection (#13124) 2026-03-10 01:22:14 +01:00
Jonathan White
680f5dae7c Security: Prevent loading of openssl.cnf (#13118)
* Security: Prevent loading of openssl.cnf

Prevent loading openssl.cnf from the originating vcpkg folder tree to avoid DLL injections. This patch force sets the OPENSSL_CONF and OPENSSL_MODULES env vars to an invalid directory. This prevents openssl from attempting to load a cnf file which can contain settings to load arbitrary DLL files into KeePassXC memory space.

Thank you to zdi-disclosures for reporting this finding!
2026-03-10 01:22:14 +01:00
Sami Vänttinen
d7dc19bec6 Passkeys: Fix default BE and BS flag value (#13122) 2026-03-10 01:22:14 +01:00
Jonathan White
3743d7112b Support TIMEOTP autotype and entry placeholder (#13117)
* Additional fix for #7263 to support KeePass2 placeholder for TOTP

---------

Co-authored-by: Janek Bevendorff <janek@keepassxc.org>
2026-03-10 01:22:14 +01:00
Janek Bevendorff
30a540e8f7 Mock datetime to avoid test failures on second lapse (#13115)
Fixes #13059
2026-03-10 01:22:14 +01:00
Janek Bevendorff
1f217d65a0 Sanitise attachment file names before saving (#13114)
Reported by @yuki-matsuhashi
2026-03-10 01:22:14 +01:00
Sami Vänttinen
4352f0fad8 Fix showing correct checkbox value in entry Browser Integration settings (#12980)
Co-authored-by: varjolintu <sami.vanttinen@ahmala.org>
2026-03-10 01:22:14 +01:00
Sami Vänttinen
f58a56db6f Add support for nested folders with Bitwarden import (#13081)
Co-authored-by: varjolintu <sami.vanttinen@ahmala.org>
2026-03-10 01:22:14 +01:00
Sami Vänttinen
be2fa37b07 Passkeys: Set BE and BS flags to true (#13042)
Passkeys: Set BE flag to true

---------

Co-authored-by: varjolintu <sami.vanttinen@ahmala.org>
2026-03-10 01:22:14 +01:00
Sami Vänttinen
2d41de5e7c Fix setting browser related values to customData (#13026)
Co-authored-by: varjolintu <sami.vanttinen@ahmala.org>
2026-03-10 01:22:14 +01:00
Jonathan White
586b895230 Revert Auto-Type change that caused race condition (#12738)
* Fixes #12723
2026-03-10 01:22:14 +01:00
Janek Bevendorff
284486c056 Check version in vcpkg.json and appstream XML well-formedness, add translator listing (#12968)
* Check version in vcpkg.json and appstream XML well-formedness

* Move translator list utility to release-tool
2026-03-10 01:22:14 +01:00
xboxones1
0d88e602d4 Fix minor font and theme issues (#12814)
* Fix font size for all platforms

* Fix font size for TOTP in preview panel

* Styles: drop Windows-specific palette overrides

* Fix encoding of EditEntryWidgetMain.ui

* Fix tab width
2026-03-10 01:22:14 +01:00
varjolintu
9a240357ff Fix showing URls in browser access dialog 2026-03-10 01:22:14 +01:00
Anton Bobov
1036cf1099 fix(gui): enable Auto-Type help button when feature is active
The 'openHelpButton' in the Auto-Type configuration widget is now
enabled whenever the main 'Enable Auto-Type for this entry' checkbox is
checked, regardless of whether a custom sequence is defined.

Previously, the help button's state depended on the custom sequence
being enabled, which was inconsistent and confusing. The help is now
available whenever the main Auto-Type feature is enabled, providing
assistance for both default and window-specific sequences.
2026-03-10 01:22:14 +01:00
Sami Vänttinen
ab7c4f87f7 Passkeys: Add publicKey to register response (#12757) 2026-03-10 01:22:14 +01:00
Janek Bevendorff
d6c708e5a7 Fix Linux test failures (#13113)
* Fix test failure introduced by ab31a748fa (#10993)

* Fix tray hiding test failure

Introduced by 43904d87b7 (#10928), but somehow hasn't posed an issue until now.

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2026-03-10 01:22:14 +01:00
Janek Bevendorff
5b156893b1 Advance vcpkg baseline 2026-03-10 01:22:14 +01:00
84 changed files with 12689 additions and 1812 deletions

View file

@ -1,5 +1,26 @@
# Changelog
## 2.7.12 (2026-03-10)
### Changes
- Passkeys: Set BE and BS flags to true (NOTE: MAY BREAK EXISTING PASSKEYS) [#13042]
- Support TIMEOTP autotype and entry placeholder [#13117]
- Browser: Show URLs in browser access dialog [#12906]
- Bitwarden Import: Add support for nested folders [#13081]
### Fixes
- Prevent exploits through OpenSSL configurations [#13118, #13124]
- Auto-Type: Revert change that caused race condition on Linux [#12738]
- Auto-Type: Fix help button enablement [#12937]
- Browser: Fix showing correct checkbox value in entry Browser Integration settings [#12980]
- Browser: Fix setting browser related values to customData [#13026]
- Passkeys: Add publicKey to register response [#12757]
- Fix main entry URL validation when using placeholders [#12964]
- Fix minor font and theme issues [#12814]
- Fix 'Remove' button in Plugin Data being enabled when no row is selected [#12916]
- Sanitize attachment file names before saving [#13114]
## 2.7.11 (2025-11-23)
### Changes

View file

@ -128,7 +128,7 @@ endif()
set(KEEPASSXC_VERSION_MAJOR "2")
set(KEEPASSXC_VERSION_MINOR "7")
set(KEEPASSXC_VERSION_PATCH "11")
set(KEEPASSXC_VERSION_PATCH "12")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")

View file

@ -17,9 +17,11 @@
import argparse
from collections import defaultdict
import ctypes
from datetime import datetime
import hashlib
import json
import logging
import lzma
import os
@ -33,7 +35,8 @@ import subprocess
import sys
import tarfile
import tempfile
from urllib.request import urlretrieve
from urllib import request
from xml import sax
###########################################################################################
@ -447,6 +450,7 @@ class Check(Command):
if checkout:
_git_checkout(git_ref, cwd=src_dir)
logger.debug('Attempting to find "%s" version string in source files...', version)
cls.check_version_in_vcpkg_manifest(version, src_dir)
cls.check_version_in_cmake(version, src_dir)
cls.check_changelog(version, src_dir)
cls.check_app_stream_info(version, src_dir)
@ -460,32 +464,32 @@ class Check(Command):
raise Error(f'Source directory "{src_dir}" does not exist!')
@staticmethod
def check_git_repository(cwd):
def check_git_repository(cwd=None):
if _run(['git', 'rev-parse', '--is-inside-work-tree'], check=False, cwd=cwd).returncode != 0:
raise Error('Not a valid Git repository: %s', cwd)
@staticmethod
def check_release_exists(tag_name, cwd):
def check_release_exists(tag_name, cwd=None):
if not _run(['git', 'tag', '--list', tag_name], check=False, cwd=cwd).stdout:
raise Error('Release tag does not exists: %s', tag_name)
@staticmethod
def check_release_does_not_exist(tag_name, cwd):
def check_release_does_not_exist(tag_name, cwd=None):
if _run(['git', 'tag', '--list', tag_name], check=False, cwd=cwd).stdout:
raise Error('Release tag already exists: %s', tag_name)
@staticmethod
def check_working_tree_clean(cwd):
def check_working_tree_clean(cwd=None):
if not _git_working_dir_clean(cwd=cwd):
raise Error('Current working tree is not clean! Please commit or unstage any changes.')
@staticmethod
def check_branch_exists(branch, cwd):
def check_branch_exists(branch, cwd=None):
if _run(['git', 'rev-parse', branch], check=False, cwd=cwd).returncode != 0:
raise Error(f'Branch or tag "{branch}" does not exist!')
@staticmethod
def check_version_in_cmake(version, cwd):
def check_version_in_cmake(version, cwd=None):
cmakelists = Path('CMakeLists.txt')
if cwd:
cmakelists = Path(cwd) / cmakelists
@ -500,7 +504,17 @@ class Check(Command):
raise Error(f'Version number in {cmakelists} not updated! Expected: %s, found: %s.', version, cmake_version)
@staticmethod
def check_changelog(version, cwd):
def check_version_in_vcpkg_manifest(version, cwd=None):
manifest = Path('vcpkg.json')
if cwd:
manifest = Path(cwd) / manifest
manifest_json = json.load(manifest.open('r'))
if version != manifest_json['version-string']:
raise Error(f'Version number in {manifest} not updated! Expected: %s, found: %s.',
version, manifest_json['version-string'])
@staticmethod
def check_changelog(version, cwd=None):
changelog = Path('CHANGELOG.md')
if cwd:
changelog = Path(cwd) / changelog
@ -511,12 +525,21 @@ class Check(Command):
raise Error(f'{changelog} has not been updated to the "%s" release.', version)
@staticmethod
def check_app_stream_info(version, cwd):
def check_app_stream_info(version, cwd=None):
appstream = Path('share/linux/org.keepassxc.KeePassXC.appdata.xml')
if cwd:
appstream = Path(cwd) / appstream
if not appstream.is_file():
raise Error('File not found: %s', appstream)
try:
parser = sax.make_parser()
parser.setContentHandler(sax.handler.ContentHandler())
parser.parse(appstream)
except sax.SAXParseException as e:
raise Error(f'{appstream} is not well-formed. Error: %s at line %s, column %s',
e.getMessage(), e.getLineNumber(), e.getColumnNumber())
regex = re.compile(rf'^\s*<release version="{version}" date=".+?">')
with appstream.open('r', encoding='utf-8') as f:
for line in f:
@ -572,8 +595,7 @@ class Tag(Command):
# Update translations
if not skip_translations:
i18n = I18N(self._arg_parser)
i18n.run_tx_pull(src_dir, i18n.derive_resource_name(tx_resource, cwd=src_dir), tx_min_perc,
commit=True, yes=yes)
i18n.run_tx_pull(src_dir, tx_resource, tx_min_perc, commit=True, yes=yes)
changelog = re.search(rf'^## ({major}\.{minor}\.{patch} \(.*?\)\n\n+.+?)\n\n+## ',
(Path(src_dir) / 'CHANGELOG.md').read_text("UTF-8"), re.MULTILINE | re.DOTALL)
@ -808,7 +830,7 @@ class Build(Command):
if _run(['which', toolname], cwd=None, check=False, **(docker_args or {})).returncode != 0:
logger.info(f'Downloading {toolname}...')
outfile = bin_dir / toolname
urlretrieve(url, outfile)
request.urlretrieve(url, outfile)
outfile.chmod(outfile.stat().st_mode | stat.S_IEXEC)
def build_linux(self, version, src_dir, output_dir, *, install_prefix, parallelism, cmake_opts, use_system_deps,
@ -1048,7 +1070,7 @@ class GPGSign(Command):
class I18N(Command):
"""Update translation files and pull from or push to Transifex."""
TRANSIFEX_RESOURCE = 'keepassxc.share-translations-keepassxc-en-ts--{}'
TRANSIFEX_RESOURCE = 'share-translations-keepassxc-en-ts--{}'
TRANSIFEX_PULL_PERC = 60
@classmethod
@ -1070,6 +1092,15 @@ class I18N(Command):
pull.add_argument('-y', '--yes', help='Don\'t ask before pulling translations.', action='store_true')
pull.add_argument('tx_args', help='Additional arguments to pass to tx subcommand.', nargs=argparse.REMAINDER)
list_translators = subparsers.add_parser('tx-list-translators',
help='Print a HTML-formatted list of translation contributors.')
list_translators.add_argument('-o', '--org', help='Transifex org name.', default='keepassxc')
list_translators.add_argument('-p', '--project', help='Transifex project name.', default='keepassxc')
list_translators.add_argument('-r', '--resource', help='Transifex resource name.',
choices=['master', 'develop'])
list_translators.add_argument('-b', '--member-blacklist', nargs='+', help='Transifex users to ignore',
default=['phoerious', 'droidmonkey'])
lupdate = subparsers.add_parser('lupdate', help='Update source translation file from C++ sources.')
lupdate.add_argument('-d', '--build-dir', help='Build directory for looking up lupdate binary.')
lupdate.add_argument('-c', '--commit', help='Commit changes.', action='store_true')
@ -1112,12 +1143,15 @@ class I18N(Command):
self.check_transifex_cmd_exists()
self.check_transifex_config_exists(src_dir)
kwargs['resource'] = self.derive_resource_name(kwargs['resource'], cwd=src_dir)
kwargs['tx_args'] = kwargs['tx_args'][1:]
if 'tx_args' in kwargs:
kwargs['tx_args'] = kwargs['tx_args'][1:]
if subcmd == 'tx-push':
self.run_tx_push(src_dir, **kwargs)
elif subcmd == 'tx-pull':
self.run_tx_pull(src_dir, **kwargs)
elif subcmd == 'tx-list-translators':
self.run_tx_list_translators(src_dir, kwargs['org'], kwargs['project'], kwargs['resource'],
kwargs['member_blacklist'])
elif subcmd == 'lupdate':
kwargs['lupdate_args'] = kwargs['lupdate_args'][1:]
@ -1137,6 +1171,7 @@ class I18N(Command):
# noinspection PyMethodMayBeStatic
def run_tx_push(self, src_dir, resource, yes, tx_args):
resource = 'keepassxc.' + self.derive_resource_name(resource, cwd=src_dir)
sys.stderr.write('\nAbout to push the ' + fmt.bold('"en"') +
' source file from the current branch to Transifex:\n')
sys.stderr.write(f' {fmt.bold(_git_get_branch(cwd=src_dir))}'
@ -1151,6 +1186,7 @@ class I18N(Command):
# noinspection PyMethodMayBeStatic
def run_tx_pull(self, src_dir, resource, min_perc, commit=False, yes=False, tx_args=None):
resource = 'keepassxc.' + self.derive_resource_name(resource, cwd=src_dir)
sys.stderr.write('\nAbout to pull translations for ' + fmt.bold(f'"{resource}"') + '.\n')
if not yes and not _yes_no_prompt('Continue?'):
logger.error('Pull aborted.')
@ -1164,6 +1200,71 @@ class I18N(Command):
if commit:
_git_commit_files(files, 'Update translations.', cwd=src_dir)
# noinspection PyMethodMayBeStatic
def run_tx_list_translators(self, src_dir, org, project, resource, member_blacklist):
txrc = Path.home() / '.transifexrc'
if not txrc.exists():
raise Error('No Transifex config found. Run tx init first.')
org = f'o:{org}'
project = f'{org}:p:{project}'
resource = f'{project}:r:{self.derive_resource_name(resource, cwd=src_dir)}'
token = [l for l in open(txrc, 'r') if l.startswith('token')][0].split('=', 1)[1].strip()
member_blacklist = [f'u:{m}' for m in member_blacklist]
def get_url(url):
req = request.Request(url)
req.add_header('Content-Type', 'application/vnd.api+json')
req.add_header('Authorization', f'Bearer {token}')
with request.urlopen(req) as resp:
return json.load(resp)
logger.info('Fetching languages...',)
languages_json = get_url(f'https://rest.api.transifex.com/projects/{project}/languages')
languages = {}
for lang in languages_json['data']:
languages[lang['id']] = lang['attributes']['name']
logger.info('Fetching language stats...')
language_stats_json = get_url('https://rest.api.transifex.com/resource_language_stats?'
f'filter[project]={project}&filter[resource]={resource}')
for s in language_stats_json['data']:
completion = s['attributes']['translated_strings'] / s['attributes']['total_strings']
if completion < .6:
languages.pop(s['relationships']['language']['data']['id'])
logger.info('Fetching language members...')
members_json = get_url(f'https://rest.api.transifex.com/team_memberships?filter[organization]={org}')
members = defaultdict(set)
for member in members_json['data']:
print('.', end='', file=sys.stderr)
sys.stderr.flush()
if member['relationships']['user']['data']['id'] in member_blacklist:
continue
lid = member['relationships']['language']['data']['id']
if lid not in languages:
continue
user = get_url(member['relationships']['user']['links']['related'])['data']['attributes']['username']
members[lid].add(user)
print(file=sys.stderr, flush=True)
print('<ul>')
for lang in sorted(languages, key=lambda x: languages[x]):
if not members[lang]:
continue
lines = [f' <li><strong>{languages[lang]}:</strong> ']
for i, m in enumerate(sorted(members[lang], key=lambda x: x.lower())):
if len(lines[-1]) + len(m) >= 120:
lines.append(' ')
lines[-1] += m
if i < len(members[lang]) - 1:
lines[-1] += ', '
lines[-1] += '</li>'
print('\n'.join(lines))
print('</ul>')
logger.info('Done. Please add the list to the About dialog and commit the changes.')
def run_lupdate(self, src_dir, build_dir=None, commit=False, lupdate_args=None):
path = _get_bin_path(build_dir)
self.check_lupdate_exists(path)

View file

@ -45,6 +45,26 @@
</screenshot>
</screenshots>
<releases>
<release version="2.7.12" date="2026-03-10" type="stable">
<description>
<ul>
<li>Passkeys: Set BE and BS flags to true (NOTE: MAY BREAK EXISTING PASSKEYS) [#13042]</li>
<li>Support TIMEOTP autotype and entry placeholder [#13117]</li>
<li>Browser: Show URLs in browser access dialog [#12906]</li>
<li>Bitwarden Import: Add support for nested folders [#13081]</li>
<li>Prevent exploits through OpenSSL configurations [#13118, #13124]</li>
<li>Auto-Type: Revert change that caused race condition on Linux [#12738]</li>
<li>Auto-Type: Fix help button enablement [#12937]</li>
<li>Browser: Fix showing correct checkbox value in entry Browser Integration settings [#12980]</li>
<li>Browser: Fix setting browser related values to customData [#13026]</li>
<li>Passkeys: Add publicKey to register response [#12757]</li>
<li>Fix main entry URL validation when using placeholders [#12964]</li>
<li>Fix minor font and theme issues [#12814]</li>
<li>Fix 'Remove' button in Plugin Data being enabled when no row is selected [#12916]</li>
<li>Sanitize attachment file names before saving [#13114]</li>
</ul>
</description>
</release>
<release version="2.7.11" date="2025-11-23" type="stable">
<description>
<ul>

View file

@ -584,27 +584,27 @@
</message>
<message>
<source>Double-click action for URL:</source>
<translation type="unfinished"/>
<translation>إجراء النقر المزدوج للرابط:</translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation type="unfinished"/>
<translation>إجراء النقر المزدوج لحقل الرابط:</translation>
</message>
<message>
<source>Edit entry</source>
<translation type="unfinished"/>
<translation>عدِّل المدخل</translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation type="unfinished"/>
<translation>افتح رابط المدخل في المتصفح</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation type="unfinished"/>
<translation>انسخ رابط المدخل إلى الحافظة</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation type="unfinished"/>
<translation>ولِّد كلمة مرور تلقائيًا للمُدخلات الجديدة</translation>
</message>
<message>
<source> recent files</source>
@ -888,7 +888,7 @@
</message>
<message>
<source>Copy URL</source>
<translation type="unfinished"/>
<translation>انسخ رابط URL</translation>
</message>
<message>
<source>&lt;p&gt;The following shortcuts are available:&lt;br/&gt;
@ -3643,6 +3643,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>حدد ملف الاستيراد/التصدير</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3901,7 +3909,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>URL</source>
<translation type="unfinished"/>
<translation>URL</translation>
</message>
<message>
<source>Notes</source>
@ -6075,11 +6083,11 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Show Group Panel</source>
<translation type="unfinished"/>
<translation>أظهر لوحة المجموعة</translation>
</message>
<message>
<source>Toggle Show Group Panel</source>
<translation type="unfinished"/>
<translation>بدّل إظهار لوحة المجموعة</translation>
</message>
<message>
<source>Password Generator</source>
@ -6095,23 +6103,23 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>New Entry</source>
<translation type="unfinished"/>
<translation>مدخل جديد</translation>
</message>
<message>
<source>Edit Entry</source>
<translation type="unfinished"/>
<translation>عدِّل المدخل</translation>
</message>
<message>
<source>E&amp;xpire Entry</source>
<translation type="unfinished"/>
<translation>&amp;أنهِ المدخل</translation>
</message>
<message>
<source>Expire Entry</source>
<translation type="unfinished"/>
<translation>أنهِ المدخل</translation>
</message>
<message>
<source>&amp;Delete Entry</source>
<translation type="unfinished"/>
<translation>&amp;احذف المدخل</translation>
</message>
<message numerus="yes">
<source>Move selected entry(s) to the recycle bin</source>
@ -6902,7 +6910,7 @@ The following data is missing:
</message>
<message>
<source>Delete selected wordlist</source>
<translation type="unfinished"/>
<translation>احذف قائمة الكلمات المحدّدة</translation>
</message>
<message>
<source>Add custom wordlist</source>
@ -7002,7 +7010,7 @@ The following data is missing:
</message>
<message>
<source>MIXED case</source>
<translation type="unfinished"/>
<translation>حالة مختلطة</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;, &quot;B&quot;, &quot;8&quot;, &quot;G&quot;, &quot;6&quot;</source>
@ -7014,11 +7022,11 @@ The following data is missing:
</message>
<message>
<source>Confirm Remove Wordlist</source>
<translation type="unfinished"/>
<translation>أكِّد إزالة قائمة الكلمات</translation>
</message>
<message>
<source>Do you really want to remove the wordlist &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>أتريد حقًا إزالة قائمة الكلمات &quot;%1&quot;؟</translation>
</message>
<message>
<source>Select Custom Wordlist</source>
@ -7026,12 +7034,13 @@ The following data is missing:
</message>
<message>
<source>Overwrite Wordlist?</source>
<translation type="unfinished"/>
<translation>كتابة القائمة الكلمات فوق القديمة؟</translation>
</message>
<message>
<source>Wordlist &quot;%1&quot; already exists as a custom wordlist.
Do you want to overwrite it?</source>
<translation type="unfinished"/>
<translation>قائمة الكلمات &quot;%1&quot; موجودة بالفعل كقائمة كلمات مخصّصة.
أتريد استبدالها؟</translation>
</message>
</context>
<context>
@ -7480,7 +7489,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Entry %1 not found.</source>
<translation type="unfinished"/>
<translation>المدخل %1 غير موجود.</translation>
</message>
<message>
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
@ -10096,12 +10105,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>عام:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>لم نتمكن من العثور على واجهة لمفتاح حماية عتادي بالرقم التسلسلي %1. يرجى توصيله للمتابعة.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10161,10 +10166,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>تعذر العثور على مفتاح حماية عتادي الذي يحمل الرقم التسلسلي %1 أو الوصول إليه. يُرجى تقديمه للمتابعة.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>مفتاح حماية عتادي مُقفل أو انتهت مهلته. قم بإلغاء قفله أو إعادة تقديمه للمتابعة.</translation>

View file

@ -3655,6 +3655,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Выбраць файл для імпарту/экспарту</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5861,7 +5869,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>&amp;Getting Started</source>
<translation>&amp;Пачатак працы</translation>
<translation>&amp;Пачатковы дапаможнік</translation>
</message>
<message>
<source>Open Getting Started Guide</source>
@ -5869,7 +5877,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>&amp;Online Help</source>
<translation>&amp;Онлайн-дапамога</translation>
<translation>&amp;Анлайн-дапамога</translation>
</message>
<message>
<source>Go to online documentation</source>
@ -10099,12 +10107,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Агульнае: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не ўдалося знайсці інтэрфейс для апаратнага ключа з серыйным нумарам %1. Калі ласка, падключыце яго, каб працягнуць.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10164,10 +10168,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Не ўдалося знайсці або атрымаць доступ да апаратнага ключа з серыйным нумарам %1. Калі ласка, прад&apos;явіце яго, каб працягнуць.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Апаратны ключ заблакаваны або скончыўся час чакання. Разблакіруйце або прад&apos;явіце яго зноў, каб працягнуць.</translation>

View file

@ -82,7 +82,7 @@
</message>
<message>
<source>Remember</source>
<translation>Запомни</translation>
<translation>Запомняне</translation>
</message>
<message>
<source>Allow Selected</source>
@ -214,15 +214,15 @@
</message>
<message>
<source>Monochrome</source>
<translation>Едноцветен</translation>
<translation>Едноцветни</translation>
</message>
<message>
<source>Monochrome (light)</source>
<translation>Монохромен(светлъл)</translation>
<translation>Едноцветни (светли)</translation>
</message>
<message>
<source>Monochrome (dark)</source>
<translation>Монохромен(тъмен)</translation>
<translation>Едноцветни (тъмни)</translation>
</message>
<message>
<source>Colorful</source>
@ -293,7 +293,7 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
<translation>Започнете само една инстанция на KeePassXC</translation>
<translation>Поддържане на един екземпляр на KeePassXC</translation>
</message>
<message>
<source>Automatically launch KeePassXC at system startup</source>
@ -309,15 +309,15 @@
</message>
<message>
<source>Remember previously used databases</source>
<translation>Запаметяване на предишни използвани бази данни</translation>
<translation>Запомняне на последно използваните</translation>
</message>
<message>
<source>Load previously open databases on startup</source>
<translation>Зареждане на последно отворената бази данни при стартиране</translation>
<translation>Зареждане на последно отвореното хранилище при стартиране</translation>
</message>
<message>
<source>Remember database key files and security dongles</source>
<translation>Запомни файл-ключовете и защитните устройства</translation>
<translation>Запомняне на файловете с ключ и преносимите защитни устройства за хранилищата</translation>
</message>
<message>
<source>Check for updates at application startup once per week</source>
@ -337,19 +337,19 @@
</message>
<message>
<source>Automatically save when locking database</source>
<translation>Запази автоматично при заключване на базата данни</translation>
<translation>Автоматично запазване при заключване на хранилището</translation>
</message>
<message>
<source>Automatically save non-data changes when locking database</source>
<translation>При заключване на базата данни, запази автоматично промените, които не засягат данните.</translation>
<translation>Автоматично запазване на промени, които не са свързани с данни, при заключване на хранилището</translation>
</message>
<message>
<source>Automatically reload the database when modified externally</source>
<translation>Автоматично презареждане на базата данни при външно модифициране</translation>
<translation>Автоматично презареждане на хранилището, ако е променено от друго приложение</translation>
</message>
<message>
<source>Backup database file before saving</source>
<translation>Архивиране на файла с базата данни преди записване</translation>
<translation>Резервно копие на хранилището преди запазване</translation>
</message>
<message>
<source>{DB_FILENAME}.old.kdbx</source>
@ -365,7 +365,7 @@
</message>
<message>
<source>Directly write to database file (dangerous)</source>
<translation>Директно писане в файла с базата данни (опасно)</translation>
<translation>Директно писане във файла на хранилището (опасно)</translation>
</message>
<message>
<source>Entry Management</source>
@ -434,7 +434,7 @@
</message>
<message>
<source>Use monospaced font for notes</source>
<translation>Използване на еднопространствен шрифт за бележките</translation>
<translation>Използване на равноширок шрифт за бележките</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
@ -446,11 +446,11 @@
</message>
<message>
<source>Tray icon type</source>
<translation>Тип иконата в системната лента</translation>
<translation>Вид на пиктограмите в системния панел</translation>
</message>
<message>
<source>Tray icon type:</source>
<translation>Тип иконата в системната лента:</translation>
<translation>Вид на пиктограмите в системния панел:</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
@ -482,7 +482,7 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
<translation>Повторно заключване на предварително заключена база данни след извършване на Auto-Type</translation>
<translation>Повторно заключване на преди това заключено хранилище след автоматично въвеждане</translation>
</message>
<message>
<source>Auto-Type start delay:</source>
@ -515,7 +515,7 @@
</message>
<message>
<source>Remember last typed entry for:</source>
<translation>Запомни последно въведения запис за:</translation>
<translation>Запомняне на последния въведен запис за:</translation>
</message>
<message>
<source>On database unlock, show entries that will expire within</source>
@ -623,7 +623,7 @@
</message>
<message>
<source>Database lock timeout seconds</source>
<translation>Секунди за заключване на базата данни</translation>
<translation>Изчакване преди заключване на хранилище, секунди</translation>
</message>
<message>
<source> sec</source>
@ -649,7 +649,7 @@
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Заключване на бази данни след бездействие от</translation>
<translation>Заключване на хранилищата след бездействие от</translation>
</message>
<message>
<source>Convenience</source>
@ -661,11 +661,11 @@
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
<translation>Заключване на базите данни при заключена сесия или затваряне на капака</translation>
<translation>Заключване на хранилищата при заключена сесия или затваряне на капака</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
<translation>Заключи базите данни след минимизиране на прозореца</translation>
<translation>Заключване на хранилищата след скриване на прозореца</translation>
</message>
<message>
<source>Hide passwords when editing them</source>
@ -839,7 +839,7 @@
</message>
<message>
<source>Search all open databases</source>
<translation>Търсене във всички отворени бази данни</translation>
<translation>Търсене във всички отворени хранилища</translation>
</message>
<message>
<source>Search</source>
@ -943,11 +943,11 @@ Ctrl+Shift+4 копиране на адреса&lt;br/&gt;
</message>
<message>
<source>Remember access to checked entries</source>
<translation>Запомни достъпа до избраните записи</translation>
<translation>Запомняне на достъпа до избраните записи</translation>
</message>
<message>
<source>Remember</source>
<translation>Запомни</translation>
<translation>Запомняне</translation>
</message>
<message>
<source>Allow access to entries</source>
@ -983,8 +983,8 @@ Ctrl+Shift+4 копиране на адреса&lt;br/&gt;
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation>Имате отворени няколко бази данни.
Изберете правилната база данни за записване на идентификационни данни.</translation>
<translation>Отворени са няколко хранилища.
Изберете в кое от тях да бъде запазена тази самоличност.</translation>
</message>
<message>
<source>KeePassXC - Select Database</source>
@ -1205,7 +1205,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
<translation>Това е необходимо за достъп до вашите бази данни с KeePassXC-Browser</translation>
<translation>Това е необходимо за достъп до хранилищата от KeePassXC-Browser</translation>
</message>
<message>
<source>Enable browser integration</source>
@ -1282,12 +1282,12 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>All databases connected to the extension will return matching credentials.</source>
<translation>Всички бази данни, свързани с разширението, ще върнат съвпадащи идентификационни данни.</translation>
<translation>Всички хранилища, свързани към разширението, ще връщат съвпадащи самоличности.</translation>
</message>
<message>
<source>Search in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Търсене във всички отворени бази данни за съвпадащи идентификационни данни</translation>
<translation>Търсене на съвпадащи самоличности във всички отворени хранилища</translation>
</message>
<message>
<source>Advanced</source>
@ -1296,12 +1296,12 @@ Would you like to migrate your existing settings now?</source>
<message>
<source>Never ask before accessing credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Никога не питай преди достъпване на идентификационни данни</translation>
<translation>Без питане преди достъп до самоличности</translation>
</message>
<message>
<source>Never ask before updating credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Никога не питай преди актуализиране на идентификационни данни</translation>
<translation>Без питане преди променяне на самоличности</translation>
</message>
<message>
<source>Do not ask permission for HTTP Basic Auth</source>
@ -2024,7 +2024,7 @@ Permissions to access entries will be revoked.</source>
<source>Do you really want to convert all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Желаете ли да всички данни от съчетаването с изведени от употреба четци към последния стандарт?
Тази стъпка е необходима, за да се запази съвместимостта с разширението за мрежов четец.</translation>
Тази стъпка е необходима, за да бъде запазена съвместимостта с разширението за мрежов четец.</translation>
</message>
<message>
<source>Refresh database ID</source>
@ -2220,9 +2220,9 @@ If you keep this number, your database may take hours, days, or even longer to o
<source>You are using a very low number of key transform rounds with AES-KDF.
If you keep this number, your database will not be protected from brute force attacks.</source>
<translation>Използвате прекалено ниско число за AES-KDF ключова трансформация.
<translation>Използвате твърде малко преобразувания на ключове с AES-KDF.
Ако решите да запазите това число, вашата база няма да бъде защитена срещи brute force атаки.</translation>
Ако оставите този брой, хранилището няма да бъде защитено от атаки с груба сила.</translation>
</message>
<message>
<source>KDF unchanged</source>
@ -2645,7 +2645,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Remember my choice</source>
<translation>Запомни моя избор</translation>
<translation>Запомняне на избора</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
@ -2714,8 +2714,8 @@ Save changes?</source>
<message>
<source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</source>
<translation>KeePassXC не успя да запази базата данни няколко пъти. Това вероятно се дължи на услугите за синхронизация на файлове, които заключват записа на файла.
Забраняване на безопасното запазване и опитайте отново?</translation>
<translation>KeePassXC няколко пъти не успя да запази хранилището. Вероятна причина е услугата за синхронизиране на файлове, която е заключила файла за писане.
Да бъде ли изключено безопасното запазване и да бъде направен повторен опит?</translation>
</message>
<message>
<source>Writing the database failed: %1</source>
@ -3652,6 +3652,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Изберете файл за импортиране/експортиране</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Поддържане структурата на групата и в споделеното хранилище</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Запазване структурата на групата</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5578,7 +5586,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>&amp;Recent Databases</source>
<translation>&amp;Скорошни бази данни</translation>
<translation>&amp;Последно използвани хранилища</translation>
</message>
<message>
<source>&amp;Export</source>
@ -5778,7 +5786,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Lock &amp;All Databases</source>
<translation>&amp;Заключване на всички бази данни</translation>
<translation>Заключване на &amp;всички хранилища</translation>
</message>
<message>
<source>&amp;Title</source>
@ -7876,11 +7884,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Import the contents of an XML database.</source>
<translation>Импортиране на съдържанието на XML база данни.</translation>
<translation>Внасяне на съдържание от хранилище в XML.</translation>
</message>
<message>
<source>Path of the XML database export.</source>
<translation>Път на експортирането на XML база данни.</translation>
<translation>Път, в който да бъде изнесено хранилище в XML.</translation>
</message>
<message>
<source>Path of the new database.</source>
@ -8035,7 +8043,7 @@ Available commands:
</message>
<message>
<source>Use the same credentials for both database files.</source>
<translation>Използвайте едни и същи идентификационни данни за двата файла с бази данни.</translation>
<translation>Използване на едно удостоверяване на достъпа за двете хранилища.</translation>
</message>
<message>
<source>Key file of the database to merge from.</source>
@ -8043,7 +8051,7 @@ Available commands:
</message>
<message>
<source>Deactivate password key for the database to merge from.</source>
<translation>Изключване на използваната парола-ключ за обединяването на базите данни .</translation>
<translation>Без използване на парола за хранилището, от което да бъде сливано.</translation>
</message>
<message>
<source>Only print the changes detected by the merge operation.</source>
@ -8059,7 +8067,7 @@ Available commands:
</message>
<message>
<source>Merge two databases.</source>
<translation>Сливане на две бази данни.</translation>
<translation>Сливане на две хранилища.</translation>
</message>
<message>
<source>Path of the database to merge from.</source>
@ -8602,7 +8610,7 @@ Kernel: %3 %4</source>
</message>
<message>
<source>filenames of the password databases to open (*.kdbx)</source>
<translation>файловите имена на базите данни с пароли за отваряне (*.kdbx)</translation>
<translation>файлове или хранилища за пароли (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
@ -8626,7 +8634,7 @@ Kernel: %3 %4</source>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Неуспешно заключване на базите данни.</translation>
<translation>Неуспешно заключване на хранилище.</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
@ -10048,7 +10056,7 @@ Example: JBSWY3DPEHPK3PXP</source>
</message>
<message>
<source>Recent databases</source>
<translation>Скорошни бази данни</translation>
<translation>Последно използвани хранилища</translation>
</message>
<message>
<source>Open a recent database</source>
@ -10108,12 +10116,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Основни:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не е намерен интерфейс за хардуерен ключ със сериен номер %1. За да продължите го вържете.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Хардуерният ключ със сериен %1 не може да бъде намерен. За да продължите го включете.</translation>
</message>
</context>
<context>
@ -10173,10 +10177,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Не е намерен хардуерен ключ за достъп със сериен номер %1. Моля, въведете го, за да продължите.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Хардуерният ключ е заключен или времето за изчакване е изтекло. За да продължите го отключете или го добавете повторно.</translation>

View file

@ -3631,6 +3631,14 @@ Podporovaná rozšíření jsou: %1.</translation>
<source>Select import/export file</source>
<translation>Vybrat importní/exportní soubor</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -8914,7 +8922,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 znak</numerusform><numerusform>%1 znaky</numerusform><numerusform>%1 znaků</numerusform><numerusform>%1 znaků</numerusform></translation>
</message>
<message>
<source>Do you really want to permanently delete the entry &quot;%1&quot;?</source>
@ -9459,7 +9467,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 znak</numerusform><numerusform>%1 znaky</numerusform><numerusform>%1 znaků</numerusform><numerusform>%1 znaků</numerusform></translation>
</message>
</context>
<context>
@ -10088,12 +10096,8 @@ Příklad: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Obecné: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nepodařilo se nalézt rozhraní pro hardwarový klíč se sériovým číslem %1. Připojte ho, aby bylo možné pokračovat.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10153,10 +10157,6 @@ Příklad: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Nepodařilo se nalézt nebo přistoupit k hardwarovému klíči se sériovým číslem %1. Připojte ho, aby bylo možné pokračovat.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Hardwarový klíč je uzamčen nebo byl překročen časový limit. Odemkněte ho nebo připojte, aby bylo možné pokračovat.</translation>

View file

@ -885,7 +885,7 @@
</message>
<message>
<source>Type {URL}</source>
<translation>{URL} eingeben</translation>
<translation>Tippe {URL} </translation>
</message>
<message>
<source>Copy URL</source>
@ -2826,7 +2826,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Confirm Recycle Group</source>
<translation>Wiederverwendung der Gruppe bestätigen</translation>
<translation>Verschiebung der Gruppe bestätigen</translation>
</message>
<message>
<source>Save</source>
@ -3657,6 +3657,14 @@ Unterstützte Erweiterungen sind: %1.</translation>
<source>Select import/export file</source>
<translation>Datei für Import/Export auswählen</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Gruppenstruktur mit gemeinsam genutzter Datenbank beibehalten</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Gruppenstruktur beibehalten</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5752,7 +5760,7 @@ Wollen Sie wirklich mit dieser Datei fortfahren?</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Passwort in die Zwischenablage kopieren</translation>
<translation>Passwort in Zwischenablage kopieren</translation>
</message>
<message>
<source>&amp;Settings</source>
@ -6046,11 +6054,11 @@ Rechnen Sie mit Fehlern und kleineren Problemen. Diese Version ist für Testzwec
</message>
<message>
<source>&amp;XML File</source>
<translation>&amp;XML-Datei</translation>
<translation>&amp;XML-Datei </translation>
</message>
<message>
<source>XML File</source>
<translation>XML-Datei</translation>
<translation>XML-Datei </translation>
</message>
<message>
<source>Copy &amp;URL</source>
@ -6086,11 +6094,11 @@ Rechnen Sie mit Fehlern und kleineren Problemen. Diese Version ist für Testzwec
</message>
<message>
<source>Show Group Panel</source>
<translation>Gruppenpanel anzeigen</translation>
<translation>Gruppen-Panel anzeigen</translation>
</message>
<message>
<source>Toggle Show Group Panel</source>
<translation>&apos;Gruppenpanel anzeigen&apos; umschalten</translation>
<translation>&apos;Gruppen-Panel anzeigen&apos; umschalten</translation>
</message>
<message>
<source>Password Generator</source>
@ -10114,12 +10122,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Allgemein:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Konnte die Schnittstelle für den Hardwareschlüssel mit der Seriennummer %1 nicht finden. Bitte anschließen, um fortzufahren.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Hardwareschlüssel mit der Seriennummer %1 konnte nicht gefunden werden. Bitte schließen Sie ihn an, um fortzufahren.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Konnte den Hardwareschlüssel mit Seriennummer %1 nicht finden oder darauf zugreifen. Zum Fortfahren bitte vorzeigen.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Hardwareschlüssel ist gesperrt oder die Zeit ist abgelaufen. Entsperren Sie ihn oder legen Sie ihn erneut ein, um fortzufahren.</translation>

View file

@ -3641,6 +3641,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Επιλογή αρχείου εισαγωγής/εξαγωγής</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10095,12 +10103,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Γενικά:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Δεν ήταν δυνατή η εύρεση διεπαφής για το κλειδί υλικού με σειριακό αριθμό %1. Συνδέστε το για να συνεχίσετε.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10160,10 +10164,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Δεν ήταν δυνατή η εύρεση ή η πρόσβαση στο κλειδί υλικού με τον σειριακό αριθμό %1. Παρακαλώ παρουσιάστε το για να συνεχίσετε.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Το κλειδί υλικού είναι κλειδωμένο ή έληξε. Ξεκλειδώστε ή παρουσιάστε ξανά για να συνεχίσετε.</translation>

View file

@ -3655,6 +3655,14 @@ Supported extensions are: %1.</translation>
<source>Select import/export file</source>
<translation>Select import/export file</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Maintain group structure with shared database</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Keep Group Structure</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10114,12 +10122,8 @@ Example: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>General: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Could not find interface for hardware key with serial number %1. Please connect it to continue.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Could not find hardware key with serial number %1. Please connect it to continue.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Example: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Could not find or access hardware key with serial number %1. Please present it to continue. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Hardware key is locked or timed out. Unlock or re-present it to continue.</translation>

View file

@ -3655,6 +3655,14 @@ Supported extensions are: %1.</translation>
<source>Select import/export file</source>
<translation>Select import/export file</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Maintain group structure with shared database</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Keep Group Structure</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10114,12 +10122,8 @@ Example: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>General: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Could not find interface for hardware key with serial number %1. Please connect it to continue.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Could not find hardware key with serial number %1. Please connect it to continue.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Example: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Could not find or access hardware key with serial number %1. Please present it to continue. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Hardware key is locked or timed out. Unlock or re-present it to continue.</translation>

View file

@ -3205,7 +3205,7 @@ Would you like to correct it?</source>
</message>
<message>
<source>Remove</source>
<translation>Remover</translation>
<translation>Eliminar</translation>
</message>
<message>
<source>Edit</source>
@ -3657,6 +3657,14 @@ Las extensiones admitidas son: %1.</translation>
<source>Select import/export file</source>
<translation>Seleccione el archivo de importación/exportación</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Mantener la estructura del grupo con una base de datos compartida.</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Mantener la estructura del grupo</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -4020,7 +4028,7 @@ Esto puede causar un mal funcionamiento de los complementos afectados.</translat
</message>
<message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source>
<translation><numerusform>¿Desea eliminar %n dato adjunto?</numerusform><numerusform>¿Desea remover %n datos adjuntos?</numerusform><numerusform>¿Está seguro de que desea eliminar %n el/los archivo(s) adjunto(s)?</numerusform></translation>
<translation><numerusform>¿Desea eliminar %n archivo adjunto?</numerusform><numerusform>¿Desea eliminar %n archivos adjuntos?</numerusform><numerusform>¿Desea eliminar %n archivo adjunto?</numerusform></translation>
</message>
<message>
<source>Save attachments</source>
@ -6128,7 +6136,7 @@ Espere algunos defectos y problemas menores, esta versión está destinada para
</message>
<message numerus="yes">
<source>Move selected entry(s) to the recycle bin</source>
<translation><numerusform>mover apunteseleccionado (s) al papelera</numerusform><numerusform>mover apunteseleccionado (s) al papelera</numerusform><numerusform>Mover apunte seleccionado (s) al papelera</numerusform></translation>
<translation><numerusform>Mover apunte seleccionado a la papelera</numerusform><numerusform>Mover apuntes seleccionados a la papelera</numerusform><numerusform>Mover apunte seleccionado a la papelera</numerusform></translation>
</message>
<message numerus="yes">
<source>Permanently delete the selected entry(s)</source>
@ -8563,7 +8571,7 @@ Núcleo: %3 %4</translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
<translation>¿Desea mover el apunte &quot;%1&quot; a la papelera de reciclaje?</translation>
<translation>¿Desea mover el apunte «%1» a la papelera de reciclaje?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
@ -9715,7 +9723,7 @@ Esta opción está obsoleta, use --set-key-file.</translation>
</message>
<message>
<source>&lt;b&gt;Warning:&lt;/b&gt; </source>
<translation>&lt;b&gt;Atención:&lt;/b&gt;</translation>
<translation>&lt;b&gt;Atención:&lt;/b&gt; </translation>
</message>
<message>
<source>Save current changes to activate the plugin and enable editing of this section.</source>
@ -10117,12 +10125,8 @@ Ejemplo: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>General: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>No se puede encontrar la interfaz para la llave hardware con número de serie %1. Conéctela para continuar.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>No se ha encontrado la llave de hardware con el número de serie %1. Conéctela para continuar.</translation>
</message>
</context>
<context>
@ -10182,10 +10186,6 @@ Ejemplo: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>No se puede encontrar la interfaz para la llave hardware con número de serie %1. Conéctela para continuar.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>La llave hardware está bloqueada o caducada. Desbloquee o vuelva a presentar para continuar.</translation>

View file

@ -3657,6 +3657,14 @@ Toetatud faililaiendid: %1</translation>
<source>Select import/export file</source>
<translation>Imporditava/eksporditava faili valimine</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Säilita jagatud andmebaasis gruppide struktuur</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Säilita gruppide struktuur</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10115,12 +10123,8 @@ Näide: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Üldine: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Riistvaralisele võtmele seerianumbriga %1 ei leitud sobivat liidest. Jätkamiseks tuleb see arvutiga ühendada.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Riistvaralist võtit seerianumbriga %1 ei leidu. Jätkamiseks palun ühenda see arvutiga.</translation>
</message>
</context>
<context>
@ -10180,10 +10184,6 @@ Näide: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Riistvaralist võtit seerianumbriga %1 kas ei leitud või ei pääsetud sellele juurde. Jätkamiseks viipa võtit.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Riistvaraline võti on lukus või ei jõudnud vastust ära oodata. Jätkamiseks ava lukk või viipa võtit uuesti.</translation>

View file

@ -3,7 +3,7 @@
<name>AboutDialog</name>
<message>
<source>About KeePassXC</source>
<translation>Tietoja ohjelmasta KeePassXC</translation>
<translation>Tietoa KeePassXC:stä</translation>
</message>
<message>
<source>About</source>
@ -50,11 +50,11 @@
<name>AccessControlDialog</name>
<message>
<source>KeePassXC - Access Request</source>
<translation>KeePassXC - Pääsypyyntö</translation>
<translation>KeePassXC pääsypyyntö</translation>
</message>
<message>
<source>Non-existing/inaccessible executable path. Please double-check the client is legit.</source>
<translation>Suorituspolkua ei löydy. Tarkista asiakasohjelman todenperäisyys.</translation>
<translation>Ohjelmatiedoston sijaintia ei löydy. Varmista asiakasohjelman luotettavuus.</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%1 &lt;/span&gt;is requesting access to the following entries:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@ -70,7 +70,7 @@
</message>
<message>
<source>Executable</source>
<translation>Suoritettava tiedosto</translation>
<translation>Ohjelmatiedosto</translation>
</message>
<message>
<source>Command Line</source>
@ -90,7 +90,7 @@
</message>
<message>
<source>Your decision will be remembered for the duration while both the requesting client AND KeePassXC are running.</source>
<translation>Valintasi muistetaan pyynnön esittäneen päätteen JA KeePassXC käyntiajan.</translation>
<translation>Valintasi muistetaan pyynnön esittäneen asiakasohjelman JA KeePassXC:n käynnissäoloajan.</translation>
</message>
<message>
<source>Deny All &amp;&amp; Future</source>
@ -152,7 +152,7 @@
</message>
<message>
<source>Use both agents</source>
<translation>Käytä molempia agentteja</translation>
<translation>Käytä kumpaakin agenttia</translation>
</message>
</context>
<context>
@ -167,7 +167,7 @@
</message>
<message>
<source>Zoom</source>
<translation>Zoomaa</translation>
<translation>Lähennä</translation>
</message>
<message>
<source>Bring All to Front</source>
@ -182,7 +182,7 @@
</message>
<message>
<source>General</source>
<translation>Yleistä</translation>
<translation>Perusasetukset</translation>
</message>
<message>
<source>Security</source>
@ -262,7 +262,7 @@
</message>
<message>
<source>Normal</source>
<translation>Normaali</translation>
<translation>Tavallinen</translation>
</message>
<message>
<source>Medium</source>
@ -278,7 +278,7 @@
</message>
<message>
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
<translation>Tätä asetusta ei voi ottaa käyttöön, kun ohjelman pienennys lukituksen avauksen jälkeen on otettu käyttöön.</translation>
<translation>Tätä asetusta ei voi ottaa käyttöön, kun ohjelman pienennys lukituksen avauksen jälkeen on käytössä.</translation>
</message>
</context>
<context>
@ -329,7 +329,7 @@
</message>
<message>
<source>File Management</source>
<translation>Tiedostohallinta</translation>
<translation>Tiedostonhallinta</translation>
</message>
<message>
<source>Automatically save after every change</source>
@ -337,7 +337,7 @@
</message>
<message>
<source>Automatically save when locking database</source>
<translation>Tallenna automaattisesti, kun tietokanta lukitaan</translation>
<translation>Tallenna automaattisesti lukittaessa tietokanta</translation>
</message>
<message>
<source>Automatically save non-data changes when locking database</source>
@ -345,7 +345,7 @@
</message>
<message>
<source>Automatically reload the database when modified externally</source>
<translation>Lataa tietokanta automaattisesti uudelleen jos tietokantaa muokattiin muualla</translation>
<translation>Lataa tietokanta automaattisesti uudelleen, jos sitä on muokattu toisaalla</translation>
</message>
<message>
<source>Backup database file before saving</source>
@ -357,7 +357,7 @@
</message>
<message>
<source>Use alternative saving method (may solve problems with Dropbox, Google Drive, GVFS, etc.)</source>
<translation>Käytä vaihtoehtoista tallennusmetodia (voi ratkaista ongelmia Dropboxin, Google Driven GVFS:n, ymv. kanssa)</translation>
<translation>Käytä vaihtoehtoista tallennustapaa (voi ratkaista ongelmia Dropboxin, Google Driven GVFS:n ym. kanssa)</translation>
</message>
<message>
<source>Temporary file moved into place</source>
@ -393,11 +393,11 @@
</message>
<message>
<source>Favicon download timeout:</source>
<translation>Faviconin latauksen aikakatkaisu:</translation>
<translation>Sivustokuvakkeen latauksen aikakatkaisu:</translation>
</message>
<message>
<source>Website icon download timeout in seconds</source>
<translation>Nettisivun ikonin latauksen aikakatkaisu sekunneissa</translation>
<translation>Sivustokuvakkeen latauksen aikakatkaisu sekunteina</translation>
</message>
<message>
<source> sec</source>
@ -434,27 +434,27 @@
</message>
<message>
<source>Use monospaced font for notes</source>
<translation>Käytä tasalevyistä fonttia muistiinpanoille</translation>
<translation>Käytä muistiinpanoille tasalevyistä fonttia</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
<translation>Minimoi ohjelma sulkemisen sijasta</translation>
<translation>Pienennä ohjelma sulkemisen sijaan</translation>
</message>
<message>
<source>Show a system tray icon</source>
<translation>Näytä ilmoitusalueen kuvake</translation>
<translation>Näytä ilmoitusaluekuvake</translation>
</message>
<message>
<source>Tray icon type</source>
<translation>Ilmoitusalueen ikonin tyyppi</translation>
<translation>Ilmoitusaluekuvakkeen tyyppi</translation>
</message>
<message>
<source>Tray icon type:</source>
<translation>Ilmoitusalueen ikonin tyyppi:</translation>
<translation>Ilmoitusaluekuvakkeen tyyppi:</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Piiloita pienennetty ikkuna ilmoitusalueelle</translation>
<translation>Piilota ikkuna ilmoitusalueelle pienennettäessä</translation>
</message>
<message>
<source>Reset settings to default</source>
@ -482,7 +482,7 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
<translation>Uudelleenlukitse aikaisemmin lukittu tietokanta automaattisyötön jälkeen</translation>
<translation>Lukitse aikaisemmin lukittu tietokanta uudelleen automaattisyötön jälkeen</translation>
</message>
<message>
<source>Auto-Type start delay:</source>
@ -536,7 +536,7 @@
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; is replaced with the filename of the saved database without extension&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; is replaced with the specified time format (default: dd_MM_yyyy_hh-mm-ss)&lt;/p&gt;&lt;p&gt;See the User Guide for more details&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; korvataan tallennettavan tietokannan päätteettömällä tiedostonimellä&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; korvataan määrityksen mukaisella aikaleimalla (oletus: pp_KK_vvvv_tt-mm-ss)&lt;/p&gt;&lt;p&gt;Lisätietoa löytyy käyttöoppaasta&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; korvataan tallennettavan tietokannan päätteettömällä tiedostonimellä&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; korvataan määrityksen mukaisella aikaleimalla (oletus: dd_MM_yyyy_hh-mm-ss)&lt;/p&gt;&lt;p&gt;Lisätietoa löytyy käyttöoppaasta&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Choose folder...</source>
@ -572,15 +572,15 @@
</message>
<message>
<source>Font size:</source>
<translation>Fontti koko:</translation>
<translation>Fonttikoko:</translation>
</message>
<message>
<source>Font size selection</source>
<translation>Fontin koon valinta</translation>
<translation>Fonttikoon valinta</translation>
</message>
<message>
<source>Skip confirmation for main window Auto-Type actions</source>
<translation>Ohita varmistus pääikkunan automaattisyötön toiminnoissa</translation>
<translation>Ohita pääikkunan automaattisyöttötoimintojen vahvistaminen</translation>
</message>
<message>
<source>Double-click action for URL:</source>
@ -632,11 +632,11 @@
</message>
<message>
<source>Clear clipboard after</source>
<translation>Tyhjennä leikepöytä kun on kulunut</translation>
<translation>Tyhjennä leikepöytä ajassa</translation>
</message>
<message>
<source>Clear search query after</source>
<translation>Tyhjennä hakukentän sisältö kun on kulunut</translation>
<translation>Tyhjennä hakukentän sisältö ajassa</translation>
</message>
<message>
<source> min</source>
@ -645,11 +645,11 @@
</message>
<message>
<source>Clipboard clear seconds</source>
<translation>Leikepöydän tyhjentäminen sekunneissa</translation>
<translation>Leikepöydän tyhjennys sekunteina</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Lukitse tietokannat jos on oltu joutilaana</translation>
<translation>Lukitse tietokannat, kun on oltu jouten</translation>
</message>
<message>
<source>Convenience</source>
@ -657,11 +657,11 @@
</message>
<message>
<source>Enable database quick unlock (Touch ID / Windows Hello)</source>
<translation>Käytä tietokannan Pika-avausta (Touch ID/Windows Hello)</translation>
<translation>Käytä tietokannan pika-avausta (Touch ID/Windows Hello)</translation>
</message>
<message>
<source>Lock databases when session is locked or lid is closed</source>
<translation>Lukitse tietokannat kun istunto lukitaan tai kansi suljetaan</translation>
<translation>Lukitse tietokannat istuntoa lukittaessa tai kantta suljettaessa</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@ -673,7 +673,7 @@
</message>
<message>
<source>Use placeholder for empty password fields</source>
<translation>Käytä paikkamerkkiä tyhjissä salasanakentissä</translation>
<translation>Käytä tyhjiin salasanakenttiin paikkamerkkiä</translation>
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
@ -685,7 +685,7 @@
</message>
<message>
<source>Use DuckDuckGo service to download website icons</source>
<translation>Käytä DuckDuckGo:ta sivustojen ikonien lataukseen</translation>
<translation>Käytä DuckDuckGota sivustojen ikonien lataukseen</translation>
</message>
<message>
<source>Hide TOTP in the entry preview panel</source>
@ -693,7 +693,7 @@
</message>
<message>
<source>Lock databases when switching user</source>
<translation>Lukitse tietokanta, jos käyttäjää vaihdetaan</translation>
<translation>Lukitse tietokanta käyttäjää vaihdettaessa</translation>
</message>
<message>
<source>Lock Options</source>
@ -708,11 +708,11 @@
<name>AttachmentWidget</name>
<message>
<source>Attachment Viewer</source>
<translation>Liitetiedostojen katselin</translation>
<translation>Liitekatselin</translation>
</message>
<message>
<source>Unknown attachment type</source>
<translation>Tuntematon liitetiedoston tyyppi</translation>
<translation>Tuntematon liitetyyppi</translation>
</message>
</context>
<context>
@ -743,19 +743,19 @@
</message>
<message>
<source>Bracket imbalance detected, found extra { or }</source>
<translation>Sulkujen määrissä on virhe. Löydettiin ylimääräinen { tai }</translation>
<translation>Sulkeet ovat epätasapainossa: löytyi ylimääräinen { tai }</translation>
</message>
<message>
<source>Too many repetitions detected, max is %1: %2</source>
<translation>Liian monta toistoa, maksimi on %1: %2</translation>
<translation>Liikaa toistoja, enimmäismäärä on %1: %2</translation>
</message>
<message>
<source>Very slow key press detected, max is %1: %2</source>
<translation>Erittäin hidas näppäinpainallus havaittu, maksimi on %1: %2</translation>
<translation>Erittäin hidas näppäinpainallus havaittu, enimmäisaika on %1: %2</translation>
</message>
<message>
<source>Very long delay detected, max is %1: %2</source>
<translation>Erittäin pitkä viive havaittu, maksimi on %1: %2</translation>
<translation>Erittäin pitkä viive havaittu, enimmäisaika on %1: %2</translation>
</message>
<message>
<source>Invalid placeholder: %1</source>
@ -763,7 +763,7 @@
</message>
<message>
<source>Entry does not have attribute for PICKCHARS: %1</source>
<translation>Merkintä ei sisällä attribuuttia PICKCHARS: %1</translation>
<translation>Merkintä ei sisällä PICKCHARS-määritettä: %1</translation>
</message>
<message>
<source>Entry has invalid TOTP settings</source>
@ -812,7 +812,7 @@
<name>AutoTypePlatformX11</name>
<message>
<source>Sequence aborted: Caps Lock is on</source>
<translation>Sekvenssi peruutettu: Caps Lock on päällä</translation>
<translation>Sekvenssi peruutettu: vaihtolukko on käytössä</translation>
</message>
<message>
<source>Sequence aborted: Modifier keys held by user</source>
@ -831,11 +831,11 @@
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassXC</source>
<translation>Automaattisyöttö - KeePassXC</translation>
<translation>Automaattisyöttö KeePassXC</translation>
</message>
<message>
<source>Double click a row to perform Auto-Type or find an entry using the search:</source>
<translation>Tuplaklikkaa riviä suorittaaksesi automaattitäydennyksen, tai etsi tietuetta käyttäen hakua:</translation>
<translation>Automaattitäydennä kaksoisnapsauttamalla tai etsi tietuetta haulla:</translation>
</message>
<message>
<source>Search all open databases</source>
@ -851,7 +851,7 @@
</message>
<message>
<source>Cancel</source>
<translation>Peruuta</translation>
<translation>Peru</translation>
</message>
<message>
<source>Type {USERNAME}</source>
@ -879,7 +879,7 @@
</message>
<message>
<source>Use Virtual Keyboard</source>
<translation>Käytä virtuaalista näppäimistöä</translation>
<translation>Käytä näyttönäppäimistöä</translation>
</message>
<message>
<source>Type {URL}</source>
@ -902,22 +902,22 @@ Ctrl+Shift+2 - Copy password&lt;br/&gt;
Ctrl+Shift+3 - Copy TOTP&lt;br/&gt;
Ctrl+Shift+4 - Copy URL&lt;br/&gt;
&lt;/p&gt;</source>
<translation>&lt;p&gt;Seuraavat pikanäppäimet ovat saatavilla:&lt;br/&gt;
Ctrl+F - Kohdista hakuun&lt;br/&gt;
Ctrl+1 - Kirjoita käyttäjänimi&lt;br/&gt;
Ctrl+2 - Kirjoita salasana&lt;br/&gt;
Ctrl+3 - Kirjoita TOTP&lt;br/&gt;
Ctrl+4 - Kirjoita osoite&lt;br/&gt;
Ctrl+5 - Käytä virtuaalista näppäimistöä (vain Windows)&lt;br/&gt;
Ctrl+Shift+1 - Kopioi käyttäjänimi&lt;br/&gt;
Ctrl+Shift+2 - Kopioi salasana&lt;br/&gt;
Ctrl+Shift+3 - Kopioi TOTP&lt;br/&gt;
Ctrl+Shift+4 - Kopioi osoite&lt;br/&gt;
<translation>&lt;p&gt;Käytettävissä ovat seuraavat pikanäppäimet:&lt;br/&gt;
Ctrl+F Kohdista hakuun&lt;br/&gt;
Ctrl+1 Kirjoita käyttäjänimi&lt;br/&gt;
Ctrl+2 Kirjoita salasana&lt;br/&gt;
Ctrl+3 Kirjoita TOTP&lt;br/&gt;
Ctrl+4 Kirjoita osoite&lt;br/&gt;
Ctrl+5 Käytä näyttönäppäimistöä (vain Windows)&lt;br/&gt;
Ctrl+Vaihto+1 Kopioi käyttäjänimi&lt;br/&gt;
Ctrl+Vaihto+2 Kopioi salasana&lt;br/&gt;
Ctrl+Vaihto+3 Kopioi TOTP&lt;br/&gt;
Ctrl+Vaihto+4 Kopioi osoite&lt;br/&gt;
&lt;/p&gt;</translation>
</message>
<message>
<source>You can use advanced search queries to find any entry in your open databases.</source>
<translation>Voit käyttää lisähakuehtoja löytääksesi minkä tahansa tietueen avoimista tietokannoista.</translation>
<translation>Lisähakuehdoin voi löytää avoimista tietokannoista minkä tahansa tietueen.</translation>
</message>
</context>
<context>
@ -935,7 +935,7 @@ Ctrl+Shift+4 - Kopioi osoite&lt;br/&gt;
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC - Browser Access Request</source>
<translation>KeePassXC - Selaimen pääsypyyntö</translation>
<translation>KeePassXC selaimen pääsypyyntö</translation>
</message>
<message>
<source>%1 is requesting access to the following entries:</source>
@ -943,7 +943,7 @@ Ctrl+Shift+4 - Kopioi osoite&lt;br/&gt;
</message>
<message>
<source>Remember access to checked entries</source>
<translation>Muista pääsylupa merkatuille tietueille</translation>
<translation>Muista pääsylupa valituille tietueille</translation>
</message>
<message>
<source>Remember</source>
@ -988,14 +988,14 @@ Valitse tietokanta, johon tiedot tallennetaan.</translation>
</message>
<message>
<source>KeePassXC - Select Database</source>
<translation>KeePassXC - Valitse tietokanta</translation>
<translation>KeePassXC valitse tietokanta</translation>
</message>
</context>
<context>
<name>BrowserPasskeysConfirmationDialog</name>
<message>
<source>Cancel</source>
<translation>Peruuta</translation>
<translation>Peru</translation>
</message>
<message>
<source>Update</source>
@ -1027,7 +1027,7 @@ Valitse tietokanta, johon tiedot tallennetaan.</translation>
</message>
<message>
<source>KeePassXC - Passkey credentials</source>
<translation>KeePassXC - Suojausavaimen tunnistetiedot</translation>
<translation>KeePassXC suojausavaimen tunnistetiedot</translation>
</message>
<message>
<source>Add to existing entry</source>
@ -3644,6 +3644,14 @@ Tuetut tyypit ovat: %1.</translation>
<source>Select import/export file</source>
<translation>Valitse tuonti-/vientitiedosto</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Ylläpidä ryhmärakennetta jaetulla tietokannalla</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Säilytä ryhmärakenne</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10103,12 +10111,8 @@ Esimerkiksi: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Yleiset:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Laiteavainta sarjanumerolla %1 ei löydetty. Ole hyvä ja liitä se jatkaaksesi.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Sarjanumerolla %1 ei löytynyt laiteavainta. Jatka kytkemällä se.</translation>
</message>
</context>
<context>
@ -10168,10 +10172,6 @@ Esimerkiksi: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Laiteavainta sarjanumerolla %1 ei löydetty. Ole hyvä ja liitä se jatkaaksesi.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Laiteavain on lukittu tai aikakatkaistu. Ole hyvä ja avaa se jatkaaksesi.</translation>

View file

@ -3637,6 +3637,14 @@ Ang mga sinusuportahang extension ay: %1.</translation>
<source>Select import/export file</source>
<translation>Piliin ang import/export na file</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10092,12 +10100,8 @@ Halimbawa: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Pangkalahatan: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Hindi mahanap ang interface para sa hardware key na may serial number na %1. Mangyaring ikonekta ito para magpatuloy.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10157,10 +10161,6 @@ Halimbawa: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Hindi mahanap o ma-access ang hardware key na may serial number na %1. Mangyaring ipakita ito para magpatuloy. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Naka-lock o nag-time out ang hardware key. I-unlock o muling ipakita ito para makapagpatuloy.</translation>

View file

@ -1003,7 +1003,7 @@ Choisissez la base de données dans laquelle enregistrer les identifiants.</tran
</message>
<message>
<source>Authenticate</source>
<translation>Aunthentifier</translation>
<translation>Authentifier</translation>
</message>
<message>
<source>Register new</source>
@ -1270,7 +1270,7 @@ Voulez-vous migrer vos paramètres maintenant?</translation>
</message>
<message>
<source>Return only best-matching credentials</source>
<translation>Retourner que les identifiants qui correspondent le mieux</translation>
<translation>Ne retourner que les identifiants qui correspondent le mieux</translation>
</message>
<message>
<source>Returns expired credentials. String [expired] is added to the title.</source>
@ -3648,6 +3648,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Choisir le fichier dimportation ou dexportation</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Converser la structure du groupe avec la base de données partagée</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Converser la structure du groupe</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10105,12 +10113,8 @@ Exemple : JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Général :</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossible de trouver une interface pour la clé matérielle dont le numéro de série est %1. Connectez-la pour poursuivre.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossible de trouver la clé matérielle dont le numéro de série est %1. Connectez-la pour poursuivre.</translation>
</message>
</context>
<context>
@ -10170,10 +10174,6 @@ Exemple : JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Impossible de trouver la clé matérielle dont le numéro de série est %1 ou dy accéder. Présentez-la pour poursuivre.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>La clé matérielle est verrouillée ou est arrivée au bout de son délai. Déverrouillez-la ou présentez-la de nouveau pour poursuivre.</translation>

View file

@ -1270,7 +1270,7 @@ Voulez-vous migrer vos paramètres maintenant?</translation>
</message>
<message>
<source>Return only best-matching credentials</source>
<translation>Retourner que les identifiants qui correspondent le mieux</translation>
<translation>Ne retourner que les identifiants qui correspondent le mieux</translation>
</message>
<message>
<source>Returns expired credentials. String [expired] is added to the title.</source>
@ -3648,6 +3648,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Choisir le fichier dimportation ou dexportation</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Converser la structure du groupe avec la base de données partagée</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Converser la structure du groupe</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10105,12 +10113,8 @@ Exemple : JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Général :</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossible de trouver une interface pour la clé matérielle dont le numéro de série est %1. Connectez-la pour poursuivre.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossible de trouver la clé matérielle dont le numéro de série est %1. Connectez-la pour poursuivre.</translation>
</message>
</context>
<context>
@ -10170,10 +10174,6 @@ Exemple : JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Impossible de trouver la clé matérielle dont le numéro de série est %1 ou dy accéder. Présentez-la pour poursuivre.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>La clé matérielle est verrouillée ou est arrivée au bout de son délai. Déverrouillez-la ou présentez-la de nouveau pour poursuivre.</translation>

View file

@ -159,19 +159,19 @@
<name>AppKit</name>
<message>
<source>Window</source>
<translation type="unfinished"/>
<translation>חלון</translation>
</message>
<message>
<source>Minimize</source>
<translation type="unfinished"/>
<translation>מזעור</translation>
</message>
<message>
<source>Zoom</source>
<translation type="unfinished"/>
<translation>מיקוד:</translation>
</message>
<message>
<source>Bring All to Front</source>
<translation type="unfinished"/>
<translation>להביא הכל לקידמה</translation>
</message>
</context>
<context>
@ -580,31 +580,31 @@
</message>
<message>
<source>Skip confirmation for main window Auto-Type actions</source>
<translation type="unfinished"/>
<translation>דילוג על אימות בפעולות הקלדה אוטומטית בחלון הראשי</translation>
</message>
<message>
<source>Double-click action for URL:</source>
<translation type="unfinished"/>
<translation>םעולת הקשה כפולה ל־URL:</translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation type="unfinished"/>
<translation>פעולת הקשה כפולה לשדה URL</translation>
</message>
<message>
<source>Edit entry</source>
<translation type="unfinished"/>
<translation>עריכת רשומה</translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation type="unfinished"/>
<translation>פתיחת רשומת URL בדפדפן</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation type="unfinished"/>
<translation>העתקת מען URL ללוח־הגזירים</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation type="unfinished"/>
<translation>איטמוט חילול סיסמה עבור רשומות חדשות</translation>
</message>
<message>
<source> recent files</source>
@ -902,22 +902,33 @@ Ctrl+Shift+2 - Copy password&lt;br/&gt;
Ctrl+Shift+3 - Copy TOTP&lt;br/&gt;
Ctrl+Shift+4 - Copy URL&lt;br/&gt;
&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;זמינים קיצורי המקלדת הבאים:&lt;br/&gt;
Ctrl+F - חיפוש ממוקד&lt;br/&gt;
Ctrl+1 - הזנת שם משתמש&lt;br/&gt;
Ctrl+2 - הזנת סיסמה&lt;br/&gt;
Ctrl+3 - הזנת TOTP&lt;br/&gt;
Ctrl+4 - הזנת URL&lt;br/&gt;
Ctrl+5 - שימוש במקלדת מדומה (Windows Only)&lt;br/&gt;
Ctrl+Shift+1 - העתקת שם משתמש&lt;br/&gt;
Ctrl+Shift+2 - העתקת סיסמה&lt;br/&gt;
Ctrl+Shift+3 - העתקת TOTP&lt;br/&gt;
Ctrl+Shift+4 - העתקת URL&lt;br/&gt;
&lt;/p&gt;</translation>
</message>
<message>
<source>You can use advanced search queries to find any entry in your open databases.</source>
<translation type="unfinished"/>
<translation>ניתן להשתמש בשאילתות חיפוש מתקדם למציאת רשומה כלשהיא במסד הנתונים שפתוח כעת.</translation>
</message>
</context>
<context>
<name>BinaryStream</name>
<message>
<source>Failed to read string data: %1</source>
<translation type="unfinished"/>
<translation>כשל בקריאת נתוני מחרוזת: %1</translation>
</message>
<message>
<source>String length exceeds 10 MiB limit (requested %1)</source>
<translation type="unfinished"/>
<translation>אורך מחרוזת חורג ממגבלת 10 מ&quot;ב (נתבקש %1)</translation>
</message>
</context>
<context>
@ -2431,11 +2442,11 @@ removed from the database.</source>
</message>
<message>
<source>Publicly visible display name used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>שם תצוגה גלוי לכול שמשמש בדו־שיח שחרור נעילה</translation>
</message>
<message>
<source>Publicly visible color used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>צבע גלוי לכול שמשמש בדו־שיח שחרור נעילה</translation>
</message>
</context>
<context>
@ -2801,15 +2812,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Confirm Delete Group</source>
<translation type="unfinished"/>
<translation>אישור מחיקת קבוצה</translation>
</message>
<message>
<source>Do you really want to permanently delete the group &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>האם למחוק לצמיתות את הקבוצה &quot;%1&quot;?</translation>
</message>
<message>
<source>Confirm Recycle Group</source>
<translation type="unfinished"/>
<translation>אישור מחיקת קבוצה</translation>
</message>
<message>
<source>Save</source>
@ -2817,19 +2828,19 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"/>
<translation>לשמור גיבוי מסד נתונים</translation>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation type="unfinished"/>
<translation>מסד־נתונים שנבחר מוזגמ בהצלחה.</translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation type="unfinished"/>
<translation>לא בוצעו שינויים בפעולת המזוג.</translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation type="unfinished"/>
<translation>מיזוג בוטל, לא נעשו שינויים.</translation>
</message>
<message>
<source>Searches and Tags</source>
@ -3640,6 +3651,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>בחירת קובץ ייבוא/ייצוא</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>שמירה על מבנה מקובץ עם מסד נתונים משותף</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>להשאיר מבנה קבוצה</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3886,59 +3905,59 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>כותרת</translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"/>
<translation>שם משתמש</translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"/>
<translation>סיסמה</translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"/>
<translation>URL</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>הערות</translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"/>
<translation>מאפיינים מותאמים אישית</translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"/>
<translation>סמל</translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"/>
<translation>צבע</translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"/>
<translation>תפוגה</translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
<translation>TOTP</translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"/>
<translation>נתונים מותאמים אישית</translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"/>
<translation>צרופות</translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"/>
<translation>הקלדה־אוטומטית</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
<translation>תגים</translation>
</message>
</context>
<context>
@ -4119,7 +4138,7 @@ Would you like to overwrite the existing attachment?</source>
</message>
<message>
<source>New Attachment</source>
<translation type="unfinished"/>
<translation>צרופה חדשה</translation>
</message>
</context>
<context>
@ -4438,7 +4457,7 @@ This will leave your passwords and sensitive information vulnerable!
</message>
<message>
<source>invalid sort order</source>
<translation type="unfinished"/>
<translation>סדר מיון לא תקין</translation>
</message>
</context>
<context>
@ -4626,7 +4645,7 @@ You can enable the DuckDuckGo website icon service in the security section of th
</message>
<message>
<source>Fit</source>
<translation type="unfinished"/>
<translation>התאמה</translation>
</message>
</context>
<context>
@ -6092,31 +6111,31 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>New Entry</source>
<translation type="unfinished"/>
<translation>רשומה חדשה</translation>
</message>
<message>
<source>Edit Entry</source>
<translation type="unfinished"/>
<translation>עריכת רשומה...</translation>
</message>
<message>
<source>E&amp;xpire Entry</source>
<translation type="unfinished"/>
<translation>ת&amp;פוגת רשומה</translation>
</message>
<message>
<source>Expire Entry</source>
<translation type="unfinished"/>
<translation>תפוגת רשומה</translation>
</message>
<message>
<source>&amp;Delete Entry</source>
<translation type="unfinished"/>
<translation>&amp;מחיקת רשומה</translation>
</message>
<message numerus="yes">
<source>Move selected entry(s) to the recycle bin</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>להעביר רשומה שנבחרה לסל מחזור</numerusform><numerusform>להעביר רשומות שנבחרו לסל מחזור</numerusform><numerusform>להעביר רשומות שנבחרו לסל מחזור</numerusform></translation>
</message>
<message numerus="yes">
<source>Permanently delete the selected entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>למחוק לצמיתות רשומה שנבחרה</numerusform><numerusform>למחוק לצמיתות רשומות שנבחרו</numerusform><numerusform>למחוק לצמיתות רשומות שנבחרו</numerusform></translation>
</message>
<message>
<source>View or edit entry</source>
@ -6173,31 +6192,31 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<name>MergeDialog</name>
<message>
<source>Database Merge Confirmation</source>
<translation type="unfinished"/>
<translation>אישור מיזוג מסד־נתונים</translation>
</message>
<message>
<source>Merge</source>
<translation type="unfinished"/>
<translation>מיזוג</translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"/>
<translation>קבוצה</translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>כותרת</translation>
</message>
<message>
<source>UUID</source>
<translation type="unfinished"/>
<translation>UUID</translation>
</message>
<message>
<source>Details</source>
<translation type="unfinished"/>
<translation>פרטים</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"/>
<translation>שינוי</translation>
</message>
</context>
<context>
@ -6216,71 +6235,71 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Added</source>
<translation type="unfinished"/>
<translation>נוספה</translation>
</message>
<message>
<source>Modified</source>
<translation type="unfinished"/>
<translation>הוסגל</translation>
</message>
<message>
<source>Moved</source>
<translation type="unfinished"/>
<translation>הועברה</translation>
</message>
<message>
<source>Deleted</source>
<translation type="unfinished"/>
<translation>נמחקה</translation>
</message>
<message>
<source>Previous location: %1</source>
<translation type="unfinished"/>
<translation>מיקום קודם: %1</translation>
</message>
<message>
<source>Number of entries in group: %1</source>
<translation type="unfinished"/>
<translation>מספר רשומות בקבוצה: %1</translation>
</message>
<message>
<source>Group name</source>
<translation type="unfinished"/>
<translation>שם קבוצה</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>הערות</translation>
</message>
<message>
<source>Icon (UUID)</source>
<translation type="unfinished"/>
<translation>סמל UUID</translation>
</message>
<message>
<source>Icon (Number)</source>
<translation type="unfinished"/>
<translation>סמל (מספר)</translation>
</message>
<message>
<source>Expiry time</source>
<translation type="unfinished"/>
<translation>זמן תפוגה</translation>
</message>
<message>
<source>Modification time</source>
<translation type="unfinished"/>
<translation>מועד הסגלה</translation>
</message>
<message>
<source>%1 (Add local modifications to new entry)</source>
<translation type="unfinished"/>
<translation>%1 (הוספת הסגלה מקומית לרשומה חדשה)</translation>
</message>
<message>
<source>%1 (Add new modifications to existing entry)</source>
<translation type="unfinished"/>
<translation>%1 (הוספת הסגלה חדשה לרשומה קיימת)</translation>
</message>
<message>
<source>Explicit deletion</source>
<translation type="unfinished"/>
<translation>מחיקה מוחלטת</translation>
</message>
<message>
<source>Implicit deletion (e.g. removal of parent group)</source>
<translation type="unfinished"/>
<translation>מחיקה משתמעת (לדוגמה: הסרת קבוצת־הורה)</translation>
</message>
<message>
<source>Adding new icon %1</source>
<translation type="unfinished"/>
<translation>הוספת סמל חדש: %1</translation>
</message>
</context>
<context>
@ -6528,11 +6547,11 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Failed to read key file: %1</source>
<translation type="unfinished"/>
<translation>כשל בקריאת קובץ מפתח: %1</translation>
</message>
<message>
<source>Failed to read public key: %1</source>
<translation type="unfinished"/>
<translation>כשל בקריאת מפתח ציבורי: %1</translation>
</message>
<message>
<source>AES-256/GCM is currently not supported</source>
@ -6593,7 +6612,7 @@ Do you want to overwrite it?
</message>
<message>
<source>Overwrite Existing File?</source>
<translation type="unfinished"/>
<translation>לכתוב על קובץ קיים?</translation>
</message>
</context>
<context>
@ -6687,11 +6706,11 @@ The following data is missing:
</message>
<message>
<source>Open Passkey File</source>
<translation type="unfinished"/>
<translation>לפתוח קובץ Passkey</translation>
</message>
<message>
<source>Passkey Import Failed</source>
<translation type="unfinished"/>
<translation>ייבוא Passkey כשל</translation>
</message>
</context>
<context>
@ -8926,35 +8945,35 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>תו %1</numerusform><numerusform>%1 תווים</numerusform><numerusform>%1 תווים</numerusform></translation>
</message>
<message>
<source>Do you really want to permanently delete the entry &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>האם למחוק לצמיתות את רשומה &quot;%1&quot;?</translation>
</message>
<message numerus="yes">
<source>Do you really want to permanently delete %n entry(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>האם למחוק לצמיתות רשומה %n?</numerusform><numerusform>האם למחוק לצמיתות %n רשומות?</numerusform><numerusform>האם למחוק לצמיתות %n רשומות?</numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Delete Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>אישור מחיקת רשומה</numerusform><numerusform>אישור מחיקת רשומות</numerusform><numerusform>אישור מחיקת רשומות</numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Recycle Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>אישור מחזור רשומה</numerusform><numerusform>אישור מחזור רשומות</numerusform><numerusform>אישור מחזור רשומות</numerusform></translation>
</message>
<message>
<source>Confirm Delete Plugin Data</source>
<translation type="unfinished"/>
<translation>אישור מיקת נתוני מתקע</translation>
</message>
<message numerus="yes">
<source>Delete plugin data from the selected entry(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>האם למחוק נתוני מתקע מהרשומה שנבחרה?</numerusform><numerusform>האם למחוק נתוני מתקע מהרשומות שנבחרו?</numerusform><numerusform>האם למחוק נתוני מתקע מהרשומות שנבחרו?</numerusform></translation>
</message>
<message>
<source>Confirm Replace Entry References</source>
<translation type="unfinished"/>
<translation>אישור החלפת אזכורי רשומות</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
@ -9472,7 +9491,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>תו %1</numerusform><numerusform>%1 תוים</numerusform><numerusform>%1 תוים</numerusform></translation>
</message>
</context>
<context>
@ -10101,12 +10120,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>כללי:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>לא ניתן למצוא מנשק עבור מפתח חומרה עם המספר הסידורי %1. נא לחבר אותו על מנת להמשיך.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>לא ניתן למצוא מפתח חומרה עם מספר סידורי %1. נא לחברו כדי להמשיך.</translation>
</message>
</context>
<context>
@ -10166,10 +10181,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>לא ניתן למצוא או לגשת למפתח חומרה עם המספר הסידורי %1. נא להציגו על מנת להמשיך.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>מפתח חומרה נעול או שפסק־הזמן חלף. נא לשחרר נעילה או להציגו שוב על מנת להמשיך.</translation>
@ -10195,11 +10206,11 @@ Example: JBSWY3DPEHPK3PXP</source>
</message>
<message>
<source>The YubiKey PC/SC interface has not been initialized.</source>
<translation type="unfinished"/>
<translation>מנשק YubiKey PC/SC לא איתחל.</translation>
</message>
<message>
<source>Failed to complete a challenge-response, the PC/SC error code was: %1</source>
<translation type="unfinished"/>
<translation>השלמת אתגר־מענה כשלה,קוד שגיאת PC/SC הייתה: %1</translation>
</message>
</context>
<context>
@ -10247,7 +10258,7 @@ Example: JBSWY3DPEHPK3PXP</source>
<message>
<source>Unknown</source>
<comment>Unknown hardware key name</comment>
<translation type="unfinished"/>
<translation>לא ידוע</translation>
</message>
</context>
</TS>

View file

@ -3653,6 +3653,14 @@ Támogatott kiterjesztések: %1.</translation>
<source>Select import/export file</source>
<translation>Importálási vagy exportálási fájl kijelölése</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Csoportszerkezet megtartása megosztott adatbázissal</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Csoportszerkezet megtartása</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10111,12 +10119,8 @@ Példa: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Általános:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nem található csatolófelület a harverkulcshoz ezzel a sorozatszámmal: %1. A folytatáshoz, kérjük, csatlakoztassa.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nem található hardverkulcs ezzel a sorozatszámmal: %1. Csatlakoztassa a folytatáshoz.</translation>
</message>
</context>
<context>
@ -10176,10 +10180,6 @@ Példa: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Nem található vagy nem elérhető a hardverkulcs ezzel a sorozatszámmal: %1. A folytatáshoz, kérjük, tegye elérhetővé.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>A hardverkulcs zárolva van vagy túllépte az időkorlátot. Kérjük aktiválja vagy tegye újra elérhetővé a folytatáshoz.</translation>

View file

@ -159,19 +159,19 @@
<name>AppKit</name>
<message>
<source>Window</source>
<translation type="unfinished"/>
<translation>Jendela</translation>
</message>
<message>
<source>Minimize</source>
<translation type="unfinished"/>
<translation>Minimalkan</translation>
</message>
<message>
<source>Zoom</source>
<translation type="unfinished"/>
<translation>Perbesar</translation>
</message>
<message>
<source>Bring All to Front</source>
<translation type="unfinished"/>
<translation>Pindahkan Semua ke Depan</translation>
</message>
</context>
<context>
@ -258,23 +258,23 @@
</message>
<message>
<source>Small</source>
<translation type="unfinished"/>
<translation>Kecil</translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"/>
<translation>Normal</translation>
</message>
<message>
<source>Medium</source>
<translation type="unfinished"/>
<translation>Menengah</translation>
</message>
<message>
<source>Large</source>
<translation type="unfinished"/>
<translation>Besar</translation>
</message>
<message>
<source>Custom</source>
<translation type="unfinished"/>
<translation>Kustom</translation>
</message>
<message>
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
@ -572,39 +572,39 @@
</message>
<message>
<source>Font size:</source>
<translation type="unfinished"/>
<translation>Ukuran huruf:</translation>
</message>
<message>
<source>Font size selection</source>
<translation type="unfinished"/>
<translation>Pemilihan ukuran huruf</translation>
</message>
<message>
<source>Skip confirmation for main window Auto-Type actions</source>
<translation type="unfinished"/>
<translation>Lewati konfirmasi untuk jendela utama pada tindakan Auto-Type</translation>
</message>
<message>
<source>Double-click action for URL:</source>
<translation type="unfinished"/>
<translation>Aksi klik ganda untuk URL:</translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation type="unfinished"/>
<translation>Aksi klik ganda untuk kolom alamat web:</translation>
</message>
<message>
<source>Edit entry</source>
<translation type="unfinished"/>
<translation>Edit entri</translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation type="unfinished"/>
<translation>Buka entri alamat web di peramban</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation type="unfinished"/>
<translation>Salin entri alamat web ke papan klip</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation type="unfinished"/>
<translation>Buat kata sandi secara otomatis untuk entri baru</translation>
</message>
<message>
<source> recent files</source>
@ -708,11 +708,11 @@
<name>AttachmentWidget</name>
<message>
<source>Attachment Viewer</source>
<translation type="unfinished"/>
<translation>Penampil Lampiran</translation>
</message>
<message>
<source>Unknown attachment type</source>
<translation type="unfinished"/>
<translation>Tipe lampiran tidak diketahui</translation>
</message>
</context>
<context>
@ -767,7 +767,7 @@
</message>
<message>
<source>Entry has invalid TOTP settings</source>
<translation type="unfinished"/>
<translation>Entri memiliki pengaturan TOTP yang tidak valid</translation>
</message>
</context>
<context>
@ -887,7 +887,7 @@
</message>
<message>
<source>Copy URL</source>
<translation type="unfinished"/>
<translation>Salin alamat web</translation>
</message>
<message>
<source>&lt;p&gt;The following shortcuts are available:&lt;br/&gt;
@ -902,22 +902,22 @@ Ctrl+Shift+2 - Copy password&lt;br/&gt;
Ctrl+Shift+3 - Copy TOTP&lt;br/&gt;
Ctrl+Shift+4 - Copy URL&lt;br/&gt;
&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Berikut adalah pintasan yang tersedia:&lt;br/&gt;Ctrl+F - Pencarian terfokus&lt;br/&gt;Ctrl+1 - Ketik nama pengguna&lt;br/&gt;Ctrl+2 - Ketik kata sandi&lt;br/&gt;Ctrl+3 - Ketik TOTP&lt;br/&gt;Ctrl+4 - Ketik alamat web&lt;br/&gt;Ctrl+5 - Gunakan Kibor Virtual (Hanya Windows)&lt;br/&gt;Ctrl+Shift+1 - Salin nama pengguna&lt;br/&gt;Ctrl+Shift+2 - Salin kata sandi&lt;br/&gt;Ctrl+Shift+3 - Salin TOTP&lt;br/&gt;Ctrl+Shift+4 - Salin alamat web&lt;br/&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>You can use advanced search queries to find any entry in your open databases.</source>
<translation type="unfinished"/>
<translation>Anda dapat menggunakan kueri pencarian lanjutan untuk menemukan entri apa pun dalam basis data Anda yang sedang dibuka.</translation>
</message>
</context>
<context>
<name>BinaryStream</name>
<message>
<source>Failed to read string data: %1</source>
<translation type="unfinished"/>
<translation>Gagal membaca rangkaian data: %1</translation>
</message>
<message>
<source>String length exceeds 10 MiB limit (requested %1)</source>
<translation type="unfinished"/>
<translation>Panjang rangkaian melebihi batas 10 MiB (yang diminta %1)</translation>
</message>
</context>
<context>
@ -1421,7 +1421,7 @@ Apakah Anda ingin memindahkan pengaturan yang ada sekarang?</translation>
</message>
<message>
<source>Browsers installed using Snap or Flatpak are not supported with exception to Firefox installed using Snap.</source>
<translation type="unfinished"/>
<translation>Peramban yang diinstal menggunakan Snap atau Flatpak tidak didukung, kecuali Firefox yang diinstal menggunakan Snap.</translation>
</message>
</context>
<context>
@ -1644,11 +1644,11 @@ Lokasi cadangan basis data ada di %2</translation>
</message>
<message>
<source>Database file read error.</source>
<translation type="unfinished"/>
<translation>Terjadi kesalahan saat membaca berkas database.</translation>
</message>
<message>
<source>No file path was provided.</source>
<translation type="unfinished"/>
<translation>Tidak ada lokasi berkas yang diberikan.</translation>
</message>
</context>
<context>
@ -1843,11 +1843,11 @@ Apakah Anda yakin ingin melanjutkan dengan berkas ini?</translation>
</message>
<message>
<source>Hardware keys found, but no slots are configured.</source>
<translation type="unfinished"/>
<translation>Kunci perangkat keras ditemukan, namun tidak ada slot yang terkonfigurasi.</translation>
</message>
<message>
<source>Press ESC again to close this database</source>
<translation type="unfinished"/>
<translation>Tekan ESC lagi untuk menutup basis data ini</translation>
</message>
<message>
<source>Windows Hello setup was canceled or failed. Quick unlock has not been enabled.</source>
@ -2434,11 +2434,11 @@ dipindahkan dari basis data.</translation>
</message>
<message>
<source>Publicly visible display name used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>Nama tampilan publik yang digunakan pada dialog pembukaan kunci</translation>
</message>
<message>
<source>Publicly visible color used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>Warna tampilan umum yang digunakan pada dialog pembukaan kunci</translation>
</message>
</context>
<context>
@ -2756,63 +2756,63 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally</source>
<translation type="unfinished"/>
<translation>Berkas basis data %1 telah diubah secara eksternal</translation>
</message>
<message>
<source>Do you want to load the changes?</source>
<translation type="unfinished"/>
<translation>Apakah Anda ingin memuat perubahan?</translation>
</message>
<message>
<source>Reloading database</source>
<translation type="unfinished"/>
<translation>Memuat ulang basis data...</translation>
</message>
<message>
<source>Reload canceled</source>
<translation type="unfinished"/>
<translation>Muat ulang dibatalkan</translation>
</message>
<message>
<source>Reload successful</source>
<translation type="unfinished"/>
<translation>Muat ulang berhasil</translation>
</message>
<message>
<source>Reload pending user action</source>
<translation type="unfinished"/>
<translation>Memuat ulang tindakan pengguna yang tertunda</translation>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally.&lt;br&gt;How would you like to proceed?&lt;br&gt;&lt;br&gt;Merge all changes&lt;br&gt;Ignore the changes on disk until save&lt;br&gt;Discard unsaved changes</source>
<translation type="unfinished"/>
<translation>Berkas database %1 telah diubah secara eksternal.&lt;br&gt;Bagaimana Anda ingin melanjutkan?&lt;br&gt;&lt;br&gt;Gabungkan semua perubahan&lt;br&gt;Abaikan perubahan di penyimpanan hingga disimpan&lt;br&gt;Buang perubahan yang belum disimpan</translation>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally.&lt;br&gt;How would you like to proceed?&lt;br&gt;&lt;br&gt;Merge all changes then save&lt;br&gt;Overwrite the changes on disk&lt;br&gt;Discard unsaved changes</source>
<translation type="unfinished"/>
<translation>Berkas database %1 telah diubah secara eksternal.&lt;br&gt;Bagaimana Anda ingin melanjutkan?&lt;br&gt;&lt;br&gt;Gabungkan semua perubahan lalu simpan&lt;br&gt;Mengganti perubahan pada diska&lt;br&gt;Buang perubahan tak tersimpan</translation>
</message>
<message>
<source>Reload database</source>
<translation type="unfinished"/>
<translation>Memuat ulang basis data</translation>
</message>
<message>
<source>Database file overwritten.</source>
<translation type="unfinished"/>
<translation>Berkas basis data telah ditimpa</translation>
</message>
<message>
<source>Database file on disk cannot be unlocked with current credentials.&lt;br&gt;Enter new credentials and/or present hardware key to continue.</source>
<translation type="unfinished"/>
<translation>Berkas basis data di diska tidak dapat dibuka dengan kredensial ini.&lt;br&gt;Masukkan kredensial baru dan/atau masukkan kunci fisik untuk melanjutkan.</translation>
</message>
<message>
<source>Failed to save backup database: %1</source>
<translation type="unfinished"/>
<translation>Gagal menyimpan basis data cadangan: %1</translation>
</message>
<message>
<source>Confirm Delete Group</source>
<translation type="unfinished"/>
<translation>Konfirmasi Penghapusan Grup</translation>
</message>
<message>
<source>Do you really want to permanently delete the group &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>Apakah Anda yakin ingin menghapus grup %1 secara permanen?</translation>
</message>
<message>
<source>Confirm Recycle Group</source>
<translation type="unfinished"/>
<translation>Konfirmasi Pemulihan Grup</translation>
</message>
<message>
<source>Save</source>
@ -2820,19 +2820,19 @@ Nonaktifkan penyimpanan aman dan coba lagi?</translation>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"/>
<translation>Simpan Cadangan Basis data</translation>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation type="unfinished"/>
<translation>Berhasil menggabungkan basis data terpilih</translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation type="unfinished"/>
<translation>Tidak ada perubahan yang dibuat oleh proses penggabungan.</translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation type="unfinished"/>
<translation>Penggabungan dibatalkan, tidak ada perubahan tercipta.</translation>
</message>
<message>
<source>Searches and Tags</source>
@ -3047,7 +3047,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Toggle attribute protection</source>
<translation>Aktif/Nonaktifkan proteksi atribut</translation>
<translation>Sakelar proteksi atribut</translation>
</message>
<message>
<source>Protect</source>
@ -3301,7 +3301,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Toggle expiration</source>
<translation>Aktif/Nonaktifkan kedaluwarsa</translation>
<translation>Sakelar kedaluwarsa</translation>
</message>
<message>
<source>Tags list</source>
@ -3329,7 +3329,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Toggle notes visibility</source>
<translation>Jungkitkan kenampakan catatan</translation>
<translation>Sakelar keterlihatan catatan</translation>
</message>
<message>
<source>T&amp;ags:</source>
@ -3491,7 +3491,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Hide entries from browser extension toggle for this and sub groups</source>
<translation>Sembunyikan entri dari toggle ekstensi peramban untuk entri ini dan subgrup</translation>
<translation>Sembunyikan entri dari sakelar ekstensi peramban untuk ini dan subgrup</translation>
</message>
<message>
<source>Skip Auto-Submit for entries:</source>
@ -3499,7 +3499,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Skip Auto-Submit toggle for this and sub groups</source>
<translation>Lewati toggle Pengiriman-Otomatis untuk entri ini dan sugrup</translation>
<translation>Lewati sakelar Kirim-Otomatis untuk ini dan subgrup</translation>
</message>
<message>
<source>Use entries only with HTTP Basic Auth:</source>
@ -3507,7 +3507,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Only HTTP Auth toggle for this and sub groups</source>
<translation>Hanya toggle Autentifikasi HTTP untuk entri ini dan subgrup</translation>
<translation>Hanya sakelar Autentifikasi HTTP untuk ini dan subgrup</translation>
</message>
<message>
<source>Do not use entries with HTTP Basic Auth:</source>
@ -3515,7 +3515,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Do not use HTTP Auth toggle for this and sub groups</source>
<translation>Jangan gunakan toggle Autentifikasi HTTP untuk entri ini dan subgrup</translation>
<translation>Jangan gunakan sakelar Autentifikasi HTTP untuk ini dan subgrup</translation>
</message>
<message>
<source>Omit WWW subdomain from matching:</source>
@ -3523,7 +3523,7 @@ Apakah Anda ingin mengoreksinya?</translation>
</message>
<message>
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
<translation>Hilangkan subdomain WWW dari toggle yang cocok untuk ini dan subgrup</translation>
<translation>Hapus subdomain WWW dari sakelar pencocokan untuk ini dan subgrup</translation>
</message>
<message>
<source>Restrict matching to given browser key:</source>
@ -3643,6 +3643,14 @@ Ekstensi yang didukung adalah: %1.</translation>
<source>Select import/export file</source>
<translation>Pilih berkas impor/ekspor</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Pertahankan struktur grup dengan basis data yang sama</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Pertahankan Struktur Grup</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3652,7 +3660,7 @@ Ekstensi yang didukung adalah: %1.</translation>
</message>
<message>
<source>Toggle expiration</source>
<translation>Aktif/Nonaktifkan kedaluwarsa</translation>
<translation>Sakelar kedaluwarsa</translation>
</message>
<message>
<source>Expires:</source>
@ -3680,7 +3688,7 @@ Ekstensi yang didukung adalah: %1.</translation>
</message>
<message>
<source>Auto-Type toggle for this and sub groups</source>
<translation>Aktif/Nonaktifkan Ketik-Otomatis untuk ini dan sub grup</translation>
<translation>Sakelar Isi-Otomatis untuk ini dan subgrup</translation>
</message>
<message>
<source>Notes:</source>
@ -3704,7 +3712,7 @@ Ekstensi yang didukung adalah: %1.</translation>
</message>
<message>
<source>Search toggle for this and sub groups</source>
<translation>Aktif/Nonaktifkan pencarian untuk ini dan sub grup</translation>
<translation>Sakelar pencarian untuk ini dan subgrup</translation>
</message>
</context>
<context>
@ -3889,51 +3897,51 @@ Ini mungkin akan menyebabkan pengaya menjadi tidak berfungsi.</translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>Judul</translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"/>
<translation>Nama pengguna</translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"/>
<translation>Kata sandi</translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"/>
<translation>Alamat web</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>Catatan</translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"/>
<translation>Atribut Kustom</translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"/>
<translation>Ikon</translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"/>
<translation>Warna</translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"/>
<translation>Kadaluarsa</translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
<translation>OTP berbasis waktu</translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"/>
<translation>Data Disesuaikan</translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"/>
<translation>Lampiran</translation>
</message>
<message>
<source>Auto-Type</source>
@ -3941,7 +3949,7 @@ Ini mungkin akan menyebabkan pengaya menjadi tidak berfungsi.</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
<translation>Tagar</translation>
</message>
</context>
<context>
@ -3994,7 +4002,7 @@ Ini mungkin akan menyebabkan pengaya menjadi tidak berfungsi.</translation>
</message>
<message>
<source>Save selected attachment to disk</source>
<translation>Simpan lampiran yang dipilih ke diska</translation>
<translation>Simpan lampiran terpilih ke diska</translation>
</message>
<message>
<source>Select files</source>
@ -4104,23 +4112,23 @@ Apakah Anda ingin menimpa lampiran yang sudah ada?</translation>
</message>
<message>
<source>New Text Document</source>
<translation type="unfinished"/>
<translation>Dokumen Teks Baru</translation>
</message>
<message>
<source>Add file</source>
<translation type="unfinished"/>
<translation>Tambah berkas...</translation>
</message>
<message>
<source>Load from Disk</source>
<translation type="unfinished"/>
<translation>Muat dari Diska...</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"/>
<translation>Simpan...</translation>
</message>
<message>
<source>New Attachment</source>
<translation type="unfinished"/>
<translation>Lampiran Baru</translation>
</message>
</context>
<context>
@ -4258,7 +4266,7 @@ Apakah Anda ingin menimpa lampiran yang sudah ada?</translation>
</message>
<message>
<source>Group Path</source>
<translation type="unfinished"/>
<translation>Lokasi Grup</translation>
</message>
</context>
<context>
@ -4438,7 +4446,7 @@ Ini akan membuat rentan kata sandi dan informasi sensitif Anda!
</message>
<message>
<source>invalid sort order</source>
<translation type="unfinished"/>
<translation>urutan penyortiran tidak valid</translation>
</message>
</context>
<context>
@ -4622,11 +4630,11 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
<name>ImageAttachmentsWidget</name>
<message>
<source>Zoom:</source>
<translation type="unfinished"/>
<translation>Perbesar:</translation>
</message>
<message>
<source>Fit</source>
<translation type="unfinished"/>
<translation>Cocok</translation>
</message>
</context>
<context>
@ -4675,7 +4683,7 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>Import File Selection</source>
<translation type="unfinished"/>
<translation> Memilih Berkas yang Diimpor</translation>
</message>
<message>
<source>Password:</source>
@ -4691,7 +4699,7 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>Import Into:</source>
<translation type="unfinished"/>
<translation>Impor ke:</translation>
</message>
<message>
<source>New Database</source>
@ -4699,11 +4707,11 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>No unlocked databases available</source>
<translation type="unfinished"/>
<translation>Tidak ada basis data yang terbuka</translation>
</message>
<message>
<source>Existing Database:</source>
<translation type="unfinished"/>
<translation>Basis data Tersedia</translation>
</message>
<message>
<source>Import File:</source>
@ -4711,23 +4719,23 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>Comma Separated Values (.csv)</source>
<translation type="unfinished"/>
<translation>Nilai yang Dipisahkan Koma (.csv)</translation>
</message>
<message>
<source>1Password Export (.1pux)</source>
<translation type="unfinished"/>
<translation>Ekspor 1Password (.1pux)</translation>
</message>
<message>
<source>1Password Vault (.opvault)</source>
<translation type="unfinished"/>
<translation>Brankas 1Password (.opvault)</translation>
</message>
<message>
<source>Bitwarden (.json)</source>
<translation type="unfinished"/>
<translation>Bitwarden (.json)</translation>
</message>
<message>
<source>KeePass 1 Database (.kdb)</source>
<translation type="unfinished"/>
<translation>Basis data KeePass 1 (.kdb)</translation>
</message>
<message>
<source>Open OPVault</source>
@ -4735,7 +4743,7 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>Select import file</source>
<translation type="unfinished"/>
<translation>Pilih berkas untuk diimpor</translation>
</message>
<message>
<source>All files</source>
@ -4755,27 +4763,27 @@ Anda dapat mengaktifkan layanan ikon situs web DuckDuckGo di bagian keamanan dal
</message>
<message>
<source>1Password Export</source>
<translation type="unfinished"/>
<translation>Ekspor 1Password</translation>
</message>
<message>
<source>Bitwarden JSON Export</source>
<translation type="unfinished"/>
<translation>Ekspor JSON Bitwarden</translation>
</message>
<message>
<source>1Password Vault</source>
<translation type="unfinished"/>
<translation>Brankas 1Password</translation>
</message>
<message>
<source>KeePass1 Database</source>
<translation type="unfinished"/>
<translation>Basis data KeePass1</translation>
</message>
<message>
<source>Proton Pass (.json)</source>
<translation type="unfinished"/>
<translation>Proton Pass (.json)</translation>
</message>
<message>
<source>Proton Pass JSON Export</source>
<translation type="unfinished"/>
<translation>Ekspor JSON Proton Pass</translation>
</message>
</context>
<context>
@ -5910,7 +5918,7 @@ Apakah Anda yakin ingin melanjutkan dengan berkas ini?</translation>
</message>
<message>
<source>Show Menubar</source>
<translation type="unfinished"/>
<translation>Tampilkan Bilah menu</translation>
</message>
<message>
<source>Show Toolbar</source>
@ -5988,7 +5996,7 @@ Ada beberapa kutu dan masalah-masalah kecil, versi ini dimaksudkan untuk penggun
</message>
<message>
<source>Toggle window</source>
<translation>Jungkit jendela</translation>
<translation>Sakelar jendela</translation>
</message>
<message>
<source>Quit KeePassXC</source>
@ -6012,19 +6020,19 @@ Ada beberapa kutu dan masalah-masalah kecil, versi ini dimaksudkan untuk penggun
</message>
<message>
<source>1Password 1PUX...</source>
<translation type="unfinished"/>
<translation>1Password 1PUX...</translation>
</message>
<message>
<source>Import a 1Password 1PUX file</source>
<translation type="unfinished"/>
<translation>Impor berkas 1PUX 1Password</translation>
</message>
<message>
<source>Import</source>
<translation type="unfinished"/>
<translation>Impor...</translation>
</message>
<message>
<source>Passkeys</source>
<translation type="unfinished"/>
<translation>Kunci akses</translation>
</message>
<message numerus="yes">
<source>%1 Entry(s)</source>
@ -6052,23 +6060,23 @@ Ada beberapa kutu dan masalah-masalah kecil, versi ini dimaksudkan untuk penggun
</message>
<message>
<source>Import Passkey</source>
<translation type="unfinished"/>
<translation>Impor Kunci akses</translation>
</message>
<message>
<source>Delete Entry</source>
<translation type="unfinished"/>
<translation>Hapus entri</translation>
</message>
<message>
<source>Remove Passkey From Entry</source>
<translation type="unfinished"/>
<translation>Hapus Kunci akses dari Entri</translation>
</message>
<message>
<source>Empty Recycle Bin</source>
<translation type="unfinished"/>
<translation>Kosongkan Tong Sampah</translation>
</message>
<message>
<source>Toggle Show Menubar</source>
<translation type="unfinished"/>
<translation>Sakelar Penampil Bilah menu</translation>
</message>
<message>
<source>Show Group Panel</source>
@ -6076,7 +6084,7 @@ Ada beberapa kutu dan masalah-masalah kecil, versi ini dimaksudkan untuk penggun
</message>
<message>
<source>Toggle Show Group Panel</source>
<translation type="unfinished"/>
<translation>Sakelar Penampil Panel Grup</translation>
</message>
<message>
<source>Password Generator</source>
@ -7043,7 +7051,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation>Aktif/Nonaktifkan Sandi (%1)</translation>
<translation>Sakelar Kata Sandi (%1)</translation>
</message>
<message>
<source>Generate Password (%1)</source>
@ -7079,7 +7087,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Toggle password visibilty using Control + H. Open the password generator using Control + G.</source>
<translation>Jungkitkan kenampakan kata sandi memakai Control +H. Buka pembangkit kata sandi memakai Control + G.</translation>
<translation>Sakelar keterlihatan kata sandi menggunakan Control + H. Buka pembuat kata sandi menggunakan Control + G.</translation>
</message>
</context>
<context>
@ -10095,12 +10103,8 @@ Contoh: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Umum:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Tidak dapat menemukan antarmuka untuk kunci perangkat keras dengan nomor seri %1. Sambungkan untuk melanjutkan.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10160,10 +10164,6 @@ Contoh: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Tidak dapat menemukan atau mengakses kunci perangkat keras dengan nomor seri %1. Tampilkan untuk melanjutkan. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Kunci perangkat keras terkunci atau kehabisan waktu. Buka kunci atau presentasikan ulang untuk melanjutkan.</translation>

View file

@ -164,15 +164,15 @@ Controlla che il client sia legittimo.</translation>
</message>
<message>
<source>Minimize</source>
<translation type="unfinished"/>
<translation>Minimizza</translation>
</message>
<message>
<source>Zoom</source>
<translation type="unfinished"/>
<translation>Zoom</translation>
</message>
<message>
<source>Bring All to Front</source>
<translation type="unfinished"/>
<translation>Porta tutto in primo piano</translation>
</message>
</context>
<context>
@ -581,31 +581,31 @@ Controlla che il client sia legittimo.</translation>
</message>
<message>
<source>Skip confirmation for main window Auto-Type actions</source>
<translation type="unfinished"/>
<translation>Salta conferma per il completamento automatico nella finestra principale</translation>
</message>
<message>
<source>Double-click action for URL:</source>
<translation type="unfinished"/>
<translation>Azione doppio clic per URL:</translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation type="unfinished"/>
<translation>Azione doppio clic per campo URL</translation>
</message>
<message>
<source>Edit entry</source>
<translation type="unfinished"/>
<translation>Modifica voce</translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation type="unfinished"/>
<translation>Apri l&apos;URL voce nel browser</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation type="unfinished"/>
<translation>Copia l&apos;URL voce negli appunti</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation type="unfinished"/>
<translation>Genera automaticamente password per le nuove voci</translation>
</message>
<message>
<source> recent files</source>
@ -906,22 +906,22 @@ Ctrl+Shift+2 - Copy password&lt;br/&gt;
Ctrl+Shift+3 - Copy TOTP&lt;br/&gt;
Ctrl+Shift+4 - Copy URL&lt;br/&gt;
&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Sono disponibili le seguenti scorciatoie:&lt;br/&gt;Ctrl+F - Attiva ricerca&lt;br/&gt;Ctrl+1 - Digita nome utente&lt;br/&gt;Ctrl+2 - Digita password&lt;br/&gt;Ctrl+3 - Digita TOTP&lt;br/&gt;Ctrl+4 - Digita URL&lt;br/&gt;Ctrl+5 - Usa tastiera virtuale (Solo Windows)&lt;br/&gt;Ctrl+Shift+1 - Copia nome utente&lt;br/&gt;Ctrl+Shift+2 - Copia password&lt;br/&gt;Ctrl+Shift+3 - Copia TOTP&lt;br/&gt;Ctrl+Shift+4 - Copia URL&lt;br/&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>You can use advanced search queries to find any entry in your open databases.</source>
<translation type="unfinished"/>
<translation>Per individuare qualsiasi voce nei database aperti puoi usare query di ricerca avanzate.</translation>
</message>
</context>
<context>
<name>BinaryStream</name>
<message>
<source>Failed to read string data: %1</source>
<translation type="unfinished"/>
<translation>Impossibile leggere i dati della stringa: %1</translation>
</message>
<message>
<source>String length exceeds 10 MiB limit (requested %1)</source>
<translation type="unfinished"/>
<translation>La lunghezza della stringa supera il limite di 10 MiB (richiesto %1)</translation>
</message>
</context>
<context>
@ -1114,7 +1114,7 @@ Vuoi eliminare questa voce?
</message>
<message>
<source>Converting attributes to custom data</source>
<translation>Conversione di attributi in dati personalizzati...</translation>
<translation>Conversione attributi in dati personalizzati...</translation>
</message>
<message>
<source>KeePassXC - New key association request</source>
@ -1166,7 +1166,7 @@ Sono state spostate %2 chiavi nei dati personalizzati.</translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
<translation>KeePassXC: Nessuna voce trovata con gli attributi KeePassHTTP!</translation>
<translation>KeePassXC: nessuna voce trovata con gli attributi KeePassHTTP!</translation>
</message>
<message>
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
@ -1178,7 +1178,7 @@ Sono state spostate %2 chiavi nei dati personalizzati.</translation>
</message>
<message>
<source>KeePassXC: Legacy browser integration settings detected</source>
<translation>KeePassXC: rilevate impostazioni obsolete di integrazione del browser</translation>
<translation>KeePassXC: rilevate impostazioni obsolete integrazione browser</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
@ -1186,7 +1186,7 @@ This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation>Le impostazioni di KeePassXC-Browser devono essere spostate nelle impostazioni del database.
Questo è necessario per mantenere le connessioni del browser attuale.
Si desidera eseguire ora la migrazione delle impostazioni esistenti?</translation>
Vuoi eseguire la migrazione delle impostazioni esistenti?</translation>
</message>
</context>
<context>
@ -1420,8 +1420,7 @@ Si desidera eseguire ora la migrazione delle impostazioni esistenti?</translatio
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2 and %3.</source>
<translation>Per il funzionamento dell&apos;integrazione con il browser è necessario KeePassXC-Browser.
Scaricalo per %1, %2 e %3.</translation>
<translation>Affinché l&apos;integrazione del browser funzioniKeePassXC è necessario KeePassXC. &lt;br /&gt;Scaricalo per %1 e %2 e %3.</translation>
</message>
<message>
<source>Browsers installed using Snap or Flatpak are not supported with exception to Firefox installed using Snap.</source>
@ -1432,7 +1431,7 @@ Scaricalo per %1, %2 e %3.</translation>
<name>CloneDialog</name>
<message>
<source>Clone Entry Options</source>
<translation>Opzioni di inserimento clone</translation>
<translation>Opzioni voci clone</translation>
</message>
<message>
<source>Append &apos; - Clone&apos; to title</source>
@ -1852,7 +1851,7 @@ Sei sicuro di voler continuare con questo file?</translation>
</message>
<message>
<source>Press ESC again to close this database</source>
<translation>Premi nuovamente ESC per chiudere questo database</translation>
<translation>Premi nuovamente &apos;ESC&apos; per chiudere questo database</translation>
</message>
<message>
<source>Windows Hello setup was canceled or failed. Quick unlock has not been enabled.</source>
@ -1918,7 +1917,7 @@ Lo sblocco rapido non è stato abilitato.</translation>
</message>
<message>
<source>Convert KeePassHTTP data</source>
<translation>Convertire i dati KeePassHTTP</translation>
<translation>Converti i dati KeePassHTTP</translation>
</message>
<message>
<source>Convert legacy KeePassHTTP attributes to KeePassXC-Browser compatible custom data</source>
@ -2021,8 +2020,8 @@ Verranno revocate le autorizzazioni per accedere alle voci.</translation>
<message>
<source>Do you really want to convert all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
<translation>Vuoi davvero convertire tutti i dati di integrazione del browser obsoleti allo standard più recente?
Questo è necessario per mantenere la compatibilità con il plug-in del browser.</translation>
<translation>Vuoi convertire tutti i dati integrazione browser obsoleti allo standard più recente?
Questo è necessario per mantenere la compatibilità con il plugin del browser.</translation>
</message>
<message>
<source>Refresh database ID</source>
@ -2440,11 +2439,11 @@ rimosse dal database.</translation>
</message>
<message>
<source>Publicly visible display name used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>Nome visibile pubblicamente nella finestra di sblocco</translation>
</message>
<message>
<source>Publicly visible color used on the unlock dialog</source>
<translation type="unfinished"/>
<translation>Colore visibile pubblicamente nella finestra di sblocco</translation>
</message>
</context>
<context>
@ -2810,15 +2809,15 @@ Vuoi disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>Confirm Delete Group</source>
<translation type="unfinished"/>
<translation>Conferma eliminazione gruppo</translation>
</message>
<message>
<source>Do you really want to permanently delete the group &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>Vuoi eliminare definitivamente il gruppo &quot;%1&quot;?</translation>
</message>
<message>
<source>Confirm Recycle Group</source>
<translation type="unfinished"/>
<translation>Conferma cancellazione gruppo</translation>
</message>
<message>
<source>Save</source>
@ -2826,19 +2825,19 @@ Vuoi disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"/>
<translation>Salva backup database</translation>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation type="unfinished"/>
<translation>Unione database selezionato completata.</translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation type="unfinished"/>
<translation>L&apos;operazione di unione non ha apportato alcuna modifica.</translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation type="unfinished"/>
<translation>Unione annullata, nessuna modifica apportata.</translation>
</message>
<message>
<source>Searches and Tags</source>
@ -3649,6 +3648,14 @@ Le estensioni supportate sono: &apos;%1&apos;.</translation>
<source>Select import/export file</source>
<translation>Seleziona file importazione/esportazione</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Mantieni la struttura del gruppo nel database condiviso</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Mantieni struttura gruppo</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3895,59 +3902,59 @@ Questo potrebbe causare malfunzionamenti ai plugin interessati.</translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>Titolo</translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"/>
<translation>Nome utente</translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"/>
<translation>Password</translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"/>
<translation>URL</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>Note</translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"/>
<translation>Attributi personalizzati</translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"/>
<translation>Icona</translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"/>
<translation>Colore</translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"/>
<translation>Scadenza</translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
<translation>TOTP</translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"/>
<translation>Dati personalizzati</translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"/>
<translation>Allegati</translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"/>
<translation>Completamento automatico</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
<translation>Etichette</translation>
</message>
</context>
<context>
@ -4128,7 +4135,7 @@ Vuoi sovrascrivere l&apos;allegato esistente?</translation>
</message>
<message>
<source>New Attachment</source>
<translation type="unfinished"/>
<translation>Nuovo allegato</translation>
</message>
</context>
<context>
@ -4446,7 +4453,7 @@ Questo lascerà vulnerabili le password e le informazioni sensibili!
</message>
<message>
<source>invalid sort order</source>
<translation type="unfinished"/>
<translation>ordinamento non valido</translation>
</message>
</context>
<context>
@ -4634,7 +4641,7 @@ You can enable the DuckDuckGo website icon service in the security section of th
</message>
<message>
<source>Fit</source>
<translation type="unfinished"/>
<translation>Adatta</translation>
</message>
</context>
<context>
@ -5650,7 +5657,7 @@ Sei sicuro di voler continuare con questo file?</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
<translation>Unire da un altro database KDBX</translation>
<translation>Unisci con un altro database KDBX</translation>
</message>
<message>
<source>&amp;New Entry</source>
@ -5702,7 +5709,7 @@ Sei sicuro di voler continuare con questo file?</translation>
</message>
<message>
<source>Statistics, health check, etc.</source>
<translation>Statistiche, controllo dello stato, ecc.</translation>
<translation>Statistiche, controllo stato, ecc.</translation>
</message>
<message>
<source>&amp;Database Settings</source>
@ -5722,7 +5729,7 @@ Sei sicuro di voler continuare con questo file?</translation>
</message>
<message>
<source>Move entry one step up</source>
<translation>Sposta la voce una posizione in alto</translation>
<translation>Sposta la voce una posizione in su</translation>
</message>
<message>
<source>Move do&amp;wn</source>
@ -5730,7 +5737,7 @@ Sei sicuro di voler continuare con questo file?</translation>
</message>
<message>
<source>Move entry one step down</source>
<translation>Sposta la voce una posizione in basso</translation>
<translation>Sposta la voce una posizione in giù</translation>
</message>
<message>
<source>Copy &amp;Username</source>
@ -6056,7 +6063,7 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
</message>
<message>
<source>Passkeys</source>
<translation>Passkeys</translation>
<translation>Passkey</translation>
</message>
<message>
<source>Import Passkey</source>
@ -6100,31 +6107,31 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
</message>
<message>
<source>New Entry</source>
<translation type="unfinished"/>
<translation>Nuova voce</translation>
</message>
<message>
<source>Edit Entry</source>
<translation type="unfinished"/>
<translation>Modifica voce...</translation>
</message>
<message>
<source>E&amp;xpire Entry</source>
<translation type="unfinished"/>
<translation>Sca&amp;denza voce</translation>
</message>
<message>
<source>Expire Entry</source>
<translation type="unfinished"/>
<translation>Scadenza voce</translation>
</message>
<message>
<source>&amp;Delete Entry</source>
<translation type="unfinished"/>
<translation>&amp;Elimina voce</translation>
</message>
<message numerus="yes">
<source>Move selected entry(s) to the recycle bin</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Sposta voce selezionata nel cestino</numerusform><numerusform>Sposta voci selezionate nel cestino</numerusform><numerusform>Sposta voci selezionate nel cestino</numerusform></translation>
</message>
<message numerus="yes">
<source>Permanently delete the selected entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Elimina definitivamente la voce selezionata</numerusform><numerusform>Elimina definitivamente le voci selezionate</numerusform><numerusform>Elimina definitivamente voci selezionate</numerusform></translation>
</message>
<message>
<source>View or edit entry</source>
@ -6181,31 +6188,31 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
<name>MergeDialog</name>
<message>
<source>Database Merge Confirmation</source>
<translation type="unfinished"/>
<translation>Conferma unione database</translation>
</message>
<message>
<source>Merge</source>
<translation type="unfinished"/>
<translation>Unisci</translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"/>
<translation>Gruppo</translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>Titolo</translation>
</message>
<message>
<source>UUID</source>
<translation type="unfinished"/>
<translation>UUID</translation>
</message>
<message>
<source>Details</source>
<translation type="unfinished"/>
<translation>Dettagli</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"/>
<translation>Modifica</translation>
</message>
</context>
<context>
@ -6224,71 +6231,71 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
</message>
<message>
<source>Added</source>
<translation type="unfinished"/>
<translation>Aggiunto</translation>
</message>
<message>
<source>Modified</source>
<translation type="unfinished"/>
<translation>Modificato</translation>
</message>
<message>
<source>Moved</source>
<translation type="unfinished"/>
<translation>Spostato</translation>
</message>
<message>
<source>Deleted</source>
<translation type="unfinished"/>
<translation>Eliminato</translation>
</message>
<message>
<source>Previous location: %1</source>
<translation type="unfinished"/>
<translation>Percorso precedente: %1</translation>
</message>
<message>
<source>Number of entries in group: %1</source>
<translation type="unfinished"/>
<translation>Numero di voci nel gruppo: %1</translation>
</message>
<message>
<source>Group name</source>
<translation type="unfinished"/>
<translation>Nome gruppo</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>Note</translation>
</message>
<message>
<source>Icon (UUID)</source>
<translation type="unfinished"/>
<translation>Icona (UUID)</translation>
</message>
<message>
<source>Icon (Number)</source>
<translation type="unfinished"/>
<translation>Icona (numero)</translation>
</message>
<message>
<source>Expiry time</source>
<translation type="unfinished"/>
<translation>Scadenza</translation>
</message>
<message>
<source>Modification time</source>
<translation type="unfinished"/>
<translation>Orarto modifica</translation>
</message>
<message>
<source>%1 (Add local modifications to new entry)</source>
<translation type="unfinished"/>
<translation>%1 (aggiungi le modifiche locali alla nuova voce)</translation>
</message>
<message>
<source>%1 (Add new modifications to existing entry)</source>
<translation type="unfinished"/>
<translation>%1 (aggiungi le nuove modifiche alla voce esistente)</translation>
</message>
<message>
<source>Explicit deletion</source>
<translation type="unfinished"/>
<translation>Eliminazione esplicita</translation>
</message>
<message>
<source>Implicit deletion (e.g. removal of parent group)</source>
<translation type="unfinished"/>
<translation>Eliminazione implicita (ad es. rimozione gruppo padre)</translation>
</message>
<message>
<source>Adding new icon %1</source>
<translation type="unfinished"/>
<translation>Aggiunta nuova icona %1</translation>
</message>
</context>
<context>
@ -6536,11 +6543,11 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
</message>
<message>
<source>Failed to read key file: %1</source>
<translation type="unfinished"/>
<translation>Impossibile leggere file chiave: %1</translation>
</message>
<message>
<source>Failed to read public key: %1</source>
<translation type="unfinished"/>
<translation>Impossibile leggere chiave pubblica: %1</translation>
</message>
<message>
<source>AES-256/GCM is currently not supported</source>
@ -6602,7 +6609,7 @@ Vuoi sovrascriverlo?
</message>
<message>
<source>Overwrite Existing File?</source>
<translation type="unfinished"/>
<translation>Vuoi sovrascrivere il file esistente?</translation>
</message>
</context>
<context>
@ -6696,11 +6703,11 @@ Mancano i seguenti dati:
</message>
<message>
<source>Open Passkey File</source>
<translation type="unfinished"/>
<translation>Apri file passkey</translation>
</message>
<message>
<source>Passkey Import Failed</source>
<translation type="unfinished"/>
<translation>Importazione passkey non riuscita</translation>
</message>
</context>
<context>
@ -8938,35 +8945,35 @@ Predefinito è &apos;xml&apos;.</translation>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 carattere</numerusform><numerusform>%1 caratteri</numerusform><numerusform>%1 carattere/i</numerusform></translation>
</message>
<message>
<source>Do you really want to permanently delete the entry &quot;%1&quot;?</source>
<translation type="unfinished"/>
<translation>Vuoi eliminare definitivamente la voce &quot;%1&quot;?</translation>
</message>
<message numerus="yes">
<source>Do you really want to permanently delete %n entry(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Vuoi davvero eliminare definitivamente %n voce?</numerusform><numerusform>Vuoi davvero eliminare definitivamente %n voci?</numerusform><numerusform>Vuoi eliminare definitivamente %n voce/i?</numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Delete Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Conferma eliminazione voce</numerusform><numerusform>Conferma eliminazione voci</numerusform><numerusform>Conferma eliminazione voce/i</numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Recycle Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Conferma riciclo voce</numerusform><numerusform>Conferma riciclo voci</numerusform><numerusform>Conferma riciclo voce/i</numerusform></translation>
</message>
<message>
<source>Confirm Delete Plugin Data</source>
<translation type="unfinished"/>
<translation>Conferma eliminazione dati plugin</translation>
</message>
<message numerus="yes">
<source>Delete plugin data from the selected entry(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Vuoi eliminare i dati del plugin dalla voce selezionata?</numerusform><numerusform>Vuoi eliminare i dati del plugin dalle voci selezionate?</numerusform><numerusform>Vuoi eliminare i dati del plugin dalla/e voce/i selezionata/e?</numerusform></translation>
</message>
<message>
<source>Confirm Replace Entry References</source>
<translation type="unfinished"/>
<translation>Conferma sostituzione riferimento voce</translation>
</message>
<message>
<source>Type: Date(Rep)</source>
@ -9484,7 +9491,7 @@ La funzionalità di rete è richiesta per verificare la password con i database
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 carattere</numerusform><numerusform>%1 caratteri</numerusform><numerusform>%1 carattere/i</numerusform></translation>
</message>
</context>
<context>
@ -9622,7 +9629,7 @@ La funzionalità di rete è richiesta per verificare la password con i database
</message>
<message>
<source>Press Enter to search</source>
<translation>Premi Invio per cercare</translation>
<translation>Premi &apos;Invio&apos; per cercare</translation>
</message>
<message>
<source>Save Search</source>
@ -10114,12 +10121,9 @@ Esempio: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Generali: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossibile trovare l&apos;interfaccia per la chiave fisica con numero di serie %1. Per continuare collegala.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Impossibile trovare la chiave hardware con numero di serie %1.
Per continuare collega la chiave hardware.</translation>
</message>
</context>
<context>
@ -10179,11 +10183,6 @@ Esempio: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Impossibile trovare o accedere alla chiave fisica con numero di serie %1.
Per continuare collegala. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>La chiave fisica è bloccata o scaduta. Per continuare sbloccala o ri-collegala.</translation>
@ -10209,11 +10208,12 @@ Per continuare collegala. </translation>
</message>
<message>
<source>The YubiKey PC/SC interface has not been initialized.</source>
<translation type="unfinished"/>
<translation>L&apos;interfaccia YubiKey PC/SC non è stata inizializzata.</translation>
</message>
<message>
<source>Failed to complete a challenge-response, the PC/SC error code was: %1</source>
<translation type="unfinished"/>
<translation>Impossibile completare challenge-response,
Codice errore PC/SC: %1</translation>
</message>
</context>
<context>
@ -10262,7 +10262,7 @@ Per contiinuare collega una chiave fisica.</translation>
<message>
<source>Unknown</source>
<comment>Unknown hardware key name</comment>
<translation type="unfinished"/>
<translation>Sconosciuto</translation>
</message>
</context>
</TS>

View file

@ -3653,6 +3653,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10111,12 +10119,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10176,10 +10180,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation></translation>

View file

@ -3635,6 +3635,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation> </translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10082,12 +10090,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation> </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10147,10 +10151,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation> </translation>

View file

@ -3643,6 +3643,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/ </translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10101,12 +10109,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 . .</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10166,10 +10170,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 . . </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation> . .</translation>

View file

@ -3628,6 +3628,14 @@ Palaikomi pratęsimai yra: %1.</translation>
<source>Select import/export file</source>
<translation>Pasirinkti importo / eksporto failą</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10083,12 +10091,8 @@ Pavyzdys: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Bendra: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nepavyko rasti aparatinės įrangos rakto sąsajos su serijos numeriu %1. Norėdami tęsti, prijunkite prie jo.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10148,10 +10152,6 @@ Pavyzdys: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Nepavyko rasti arba pasiekti aparatūros rakto su serijos numeriu %1. Prašome pristatyti, kad tęstumėte. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Aparatūros raktas užrakintas arba nustatytas nustatytas laiku. Atrakinkite arba naujo pateikite , kad tęstumėte.</translation>

View file

@ -3622,6 +3622,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/ က </translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10076,12 +10084,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation> -</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 ကကက က က က က</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10141,10 +10145,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 ကကက က က က က </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation> ကက က က က </translation>

View file

@ -3641,6 +3641,14 @@ Støttede utvidelser er: %1.</translation>
<source>Select import/export file</source>
<translation>Velg fil for import/eksport</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10096,12 +10104,8 @@ Eksempel: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Generelt: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Finner ikke grensesnitt til maskinvarenøkkel med serienummer %1. Koble den til for å fortsette.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10161,10 +10165,6 @@ Eksempel: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Kunne ikke finne eller tilgang til maskinvarenøkkelen med serienummer %1. Koble den til for å fortsette.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Maskinvarenøkkelen er låst eller tidsavbrutt. Lås opp eller koble den til nytt for å fortsette.</translation>

View file

@ -3655,6 +3655,14 @@ Ondersteund zijn: %1.</translation>
<source>Select import/export file</source>
<translation>Selecteer import-/exportbestand</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Groepsstructuur behouden met gedeelde database</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Groepsstructuur behouden</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10113,12 +10121,8 @@ Voorbeeld: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Algemeen:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Kan interface voor hardwaresleutel met serienummer %1 niet vinden. Sluit het aan om door te gaan.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Hardwaresleutel met serienummer %1 niet gevonden. Sluit deze aan om door te gaan.</translation>
</message>
</context>
<context>
@ -10178,10 +10182,6 @@ Voorbeeld: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Kan hardwaresleutel met serienummer %1 niet vinden of openen. Presenteer de hardwaresleutel om door te gaan. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>De hardwaresleutel is vergrendeld of er is een time-out. Ontgrendel of presenteer het opnieuw om door te gaan.</translation>

View file

@ -3655,6 +3655,14 @@ Obsługiwane rozszerzenia to: %1.</translation>
<source>Select import/export file</source>
<translation>Wybierz plik importu/eksportu</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Utrzymaj strukturę grupy ze wspólną bazą danych</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Zachowaj strukturę grupy</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10115,12 +10123,8 @@ Przykład: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Ogólne: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nie można znaleźć interfejsu dla klucza sprzętowego o numerze seryjnym %1. Podłącz go, aby kontynuować.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Nie znaleziono klucza sprzętowego o numerze seryjnym %1. Podłącz go, aby kontynuować.</translation>
</message>
</context>
<context>
@ -10180,10 +10184,6 @@ Przykład: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Nie można znaleźć lub uzyskać dostępu do klucza sprzętowego o numerze seryjnym %1. Proszę go okazać, aby kontynuować. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Klucz sprzętowy jest zablokowany lub upłynął limit czasu. Odblokuj lub ponownie go okaż, aby kontynuować.</translation>

View file

@ -3655,6 +3655,14 @@ Extensões suportadas são: %1</translation>
<source>Select import/export file</source>
<translation>Selecione o arquivo de importação/exportação</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Manter estrutura do grupo com a base de dados partilhada</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Manter estrutura do grupo</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10114,12 +10122,8 @@ Exemplo: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Geral:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Não foi possível localizar a interface para o dispositivo com o número de série %1. Introduza o seu dispositivo para continuar.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Não foi possível encontrar a chave de hardware com o número de série %1. Conecte a chave de segurança e continue.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Exemplo: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Não foi possível localizar ou acessar a interface para o dispositivo com o número de série %1. Introduza o seu dispositivo para continuar.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>O dispositivo está bloqueado ou o tempo esgotou. Desbloqueie ou reintroduza o dispositivo para continuar.</translation>

View file

@ -293,11 +293,11 @@
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
<translation>Iniciar apenas uma instância do KeepassXC</translation>
<translation>Iniciar apenas uma instância KeepassXC</translation>
</message>
<message>
<source>Automatically launch KeePassXC at system startup</source>
<translation>Iniciar o KeePassXC no arranque do sistema operativo</translation>
<translation>Iniciar KeePassXC no arranque do sistema operativo</translation>
</message>
<message>
<source>Minimize window at application startup</source>
@ -1326,7 +1326,7 @@ Gostaria de migrar agora as definições?</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
<translation>Ao iniciar, atualizar automaticamente o caminho do KeePassXC ou do binário keepassxc-proxy para os &apos;sripts&apos; nativos de mensagens.</translation>
<translation>Ao iniciar, atualizar automaticamente o caminho do KeePassXC ou do binário keepassxc-proxy para os &apos;scripts&apos; nativos de mensagens.</translation>
</message>
<message>
<source>Update native messaging manifest files at startup</source>
@ -2132,7 +2132,7 @@ Tem a certeza de que deseja continuar?</translation>
</message>
<message>
<source>Format cannot be changed: Your database uses KDBX 4 features</source>
<translation>O formato não pode ser alterado. A base de dados utiliza funcionalidades KDBX 4</translation>
<translation>O formato não pode ser alterado. A base de dados utiliza funcionalidades KDBX 4.</translation>
</message>
<message>
<source>Unless you need to open your database with other programs, always use the latest format.</source>
@ -2156,11 +2156,11 @@ Tem a certeza de que deseja continuar?</translation>
</message>
<message>
<source>Key Derivation Function:</source>
<translation>Função derivação de chave:</translation>
<translation>Função de derivação de chave:</translation>
</message>
<message>
<source>Key derivation function</source>
<translation>Função derivação de chave</translation>
<translation>Função de derivação de chave</translation>
</message>
<message>
<source>Transform rounds:</source>
@ -2418,7 +2418,7 @@ removidas da base de dados.</translation>
</message>
<message>
<source>Display name:</source>
<translation>Nome exibido:</translation>
<translation>Nome a mostrar:</translation>
</message>
<message>
<source>Database public display name</source>
@ -2438,7 +2438,7 @@ removidas da base de dados.</translation>
</message>
<message>
<source>Display icon:</source>
<translation>Ícone exibido:</translation>
<translation>Ícone a mostrar:</translation>
</message>
<message>
<source>Select Database Icon</source>
@ -2561,7 +2561,7 @@ Existe aqui um erro que deve ser reportado aos programadores.</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Base de dados do KeePass 2</translation>
<translation>Base de dados KeePass 2</translation>
</message>
<message>
<source>All files</source>
@ -2735,7 +2735,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Base de dados do KeePass 2</translation>
<translation>Base de dados KeePass 2</translation>
</message>
<message>
<source>Empty recycle bin?</source>
@ -3655,6 +3655,14 @@ As extensões suportadas são: %1.</translation>
<source>Select import/export file</source>
<translation>Selecione o ficheiro de importação/exportação</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Manter estrutura do grupo com a base de dados partilhada</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Manter estrutura do grupo</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5072,7 +5080,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Not a KeePass database.</source>
<translation>Não é uma base de dados do KeePass.</translation>
<translation>Não é uma base de dados KeePass.</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
@ -5234,7 +5242,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Not a KeePass database.</source>
<translation>Não é uma base de dados do KeePass.</translation>
<translation>Não é uma base de dados KeePass.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
@ -5812,11 +5820,11 @@ Tem a certeza de que deseja utilizar este ficheiro?</translation>
</message>
<message>
<source>KeePass 1 Database</source>
<translation>Base de dados do KeePass 1...</translation>
<translation>Base de dados KeePass 1...</translation>
</message>
<message>
<source>Import a KeePass 1 database</source>
<translation>Importar base de dados do KeePass 1</translation>
<translation>Importar base de dados KeePass 1</translation>
</message>
<message>
<source>1Password Vault</source>
@ -5994,7 +6002,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
<translation>Deseja que o KeePassXC procure atualizações ao iniciar?</translation>
<translation>Deseja que KeePassXC procure atualizações ao iniciar?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
@ -6006,7 +6014,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Quit KeePassXC</source>
<translation>Sair do KeePassXC</translation>
<translation>Sair de KeePassXC</translation>
</message>
<message>
<source>Please present or touch your YubiKey to continue</source>
@ -6301,7 +6309,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database</source>
<translation>Criar uma nova base de dados do KeePassXC...</translation>
<translation>Criar uma nova base de dados KeePassXC</translation>
</message>
<message>
<source>Root</source>
@ -8637,7 +8645,7 @@ Kernel: %3 %4</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
<translation> está em execução uma instância do KeePassXC.</translation>
<translation> está em execução uma instância KeePassXC.</translation>
</message>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
@ -10114,12 +10122,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Geral:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Não foi possível localizar a interface para o dispositivo com o número de série %1. Introduza o seu dispositivo para continuar.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Não foi possível encontrar a chave de hardware com o número de série %1. Conecte a chave de segurança e continue.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Não foi possível aceder ao dispositivo com o número de série %1. Introduza ao seu dispositivo para continuar.</translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>O dispositivo está bloqueado ou o tempo limite caducou. Desbloqueie ou reintroduza o dispositivo para continuar.</translation>

View file

@ -112,7 +112,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent integration</source>
<translation>Включить интеграцию SSH-агента</translation>
<translation>Включить интеграцию с браузерами</translation>
</message>
<message>
<source>Use Pageant</source>
@ -148,7 +148,7 @@
</message>
<message>
<source>SSH Agent connection is working!</source>
<translation>Соединение с SSH-агентом активно!</translation>
<translation>SSH-агент соединение работает!</translation>
</message>
<message>
<source>Use both agents</source>
@ -202,11 +202,11 @@
</message>
<message>
<source>Text beside icon</source>
<translation>Текст рядом со значком</translation>
<translation>Текст рядом с значок</translation>
</message>
<message>
<source>Text under icon</source>
<translation>Текст под значком</translation>
<translation>Текст под значок</translation>
</message>
<message>
<source>Follow style</source>
@ -369,7 +369,7 @@
</message>
<message>
<source>Entry Management</source>
<translation>Управление записями</translation>
<translation>Управление входом</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@ -636,7 +636,7 @@
</message>
<message>
<source>Clear search query after</source>
<translation>Задержка очистки поискового запроса:</translation>
<translation>Задержка очистки поискового запроса</translation>
</message>
<message>
<source> min</source>
@ -3651,6 +3651,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Выберите файл для импорта/экспорта</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Сохранять структуру групп при использовании общей базы данных</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Сохранять структуру групп</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5613,7 +5621,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Theme</source>
<translation>Тема</translation>
<translation>Оформление</translation>
</message>
<message>
<source>&amp;Quit</source>
@ -5905,19 +5913,19 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Automatic</source>
<translation>Системная</translation>
<translation>Как в системе</translation>
</message>
<message>
<source>Light</source>
<translation>Светлая</translation>
<translation>Светлое</translation>
</message>
<message>
<source>Dark</source>
<translation>Тёмная</translation>
<translation>Тёмное</translation>
</message>
<message>
<source>Classic (Platform-native)</source>
<translation>Классическая (зависит от платформы)</translation>
<translation>Классическое (зависит от платформы)</translation>
</message>
<message>
<source>Show Menubar</source>
@ -10111,12 +10119,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Общий: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не удалось найти интерфейс для аппаратного ключа с серийным номером %1. Подключите его, чтобы продолжить.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не удалось найти аппаратный ключ с серийным номером %1. Подключите его, чтобы продолжить.</translation>
</message>
</context>
<context>
@ -10176,10 +10180,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Не удалось найти или получить доступ к аппаратному ключу с серийным номером %1. Подключите его для продолжения. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Аппаратный ключ заблокирован или истекло время ожидания. Разблокируйте или подключите его повторно, чтобы продолжить.</translation>

View file

@ -3628,6 +3628,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/ </translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10082,12 +10090,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 . .</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10147,10 +10151,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 . . </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation> . .</translation>

View file

@ -3645,6 +3645,14 @@ Zgjatimet e mbuluara janë: %1.</translation>
<source>Select import/export file</source>
<translation>Përzgjidhni kartelë importim/eksportimi</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10105,12 +10113,8 @@ Shembull: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation> përgjithshme: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Su gjet dot ndërfaqe për kyçin hardware me numrin serial %1. Ju lutemi, vazhdohet, lidheni.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10170,10 +10174,6 @@ Shembull: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Su gjet dot, ose su përdor dot kyç hardware me numër serial %1. vazhdohet, ju lutemi, silleni. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Kyçi hardware është i kyçur, ose mbaroi koha. vazhdohet, shkyçeni, ose riparaqiteni.</translation>

View file

@ -98,7 +98,7 @@
</message>
<message>
<source>Allow All &amp;&amp; &amp;Future</source>
<translation>Tillåt alla &amp;&amp; framtida</translation>
<translation>Tillåt alla &amp;&amp; &amp;framtida</translation>
</message>
</context>
<context>
@ -855,11 +855,11 @@
</message>
<message>
<source>Type {USERNAME}</source>
<translation>Skriv {ANVÄNDARNAMN}</translation>
<translation>Skriv {USERNAME}</translation>
</message>
<message>
<source>Type {PASSWORD}</source>
<translation>Skriv {LÖSENORD}</translation>
<translation>Skriv {PASSWORD}</translation>
</message>
<message>
<source>Type {TOTP}</source>
@ -1045,7 +1045,7 @@ Vill du registrera en ny passnyckel för:</translation>
</message>
<message>
<source>Authenticate passkey credentials for:</source>
<translation>Autentisera passnyckeluppgifter för: </translation>
<translation>Autentisera passnyckeluppgifter för:</translation>
</message>
<message>
<source>Do you want to register a passkey for:</source>
@ -3013,7 +3013,7 @@ Vill du korrigera det?</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%1 timma</numerusform><numerusform>%n timmar</numerusform></translation>
<translation><numerusform>%n timme</numerusform><numerusform>%n timmar</numerusform></translation>
</message>
<message>
<source>Failed to decrypt SSH key, ensure password is correct.</source>
@ -3656,6 +3656,14 @@ Filtyper som stöds är: %1.</translation>
<source>Select import/export file</source>
<translation>Välj import-/exportfil</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Behåll gruppstruktur med delad databas</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Bevara gruppstruktur</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -5032,11 +5040,11 @@ Om detta upprepas, kan din databasfil vara skadad.</translation>
</message>
<message>
<source>Invalid master seed size</source>
<translation type="unfinished"/>
<translation>Ogiltig storlek huvudöverföring</translation>
</message>
<message>
<source>Invalid transform seed size</source>
<translation type="unfinished"/>
<translation>Ogiltig storlek transformeringsöverföring</translation>
</message>
<message>
<source>Invalid transform rounds size</source>
@ -5129,7 +5137,7 @@ Rad %2, kolumn: %3</translation>
</message>
<message>
<source>Null DeleteObject uuid</source>
<translation type="unfinished"/>
<translation>Null DeleteObject uuid</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
@ -5261,7 +5269,7 @@ Rad %2, kolumn: %3</translation>
</message>
<message>
<source>Invalid transform seed size</source>
<translation type="unfinished"/>
<translation>Ogiltig storlek transformeringsöverföring</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@ -5682,7 +5690,7 @@ Vill du verkligen fortsätta med den här filen?</translation>
</message>
<message>
<source>Download All &amp;Favicons</source>
<translation>Ladda ner alla favikoner</translation>
<translation>Ladda ner alla &amp;favikoner</translation>
</message>
<message>
<source>Sort &amp;A-Z</source>
@ -6201,7 +6209,7 @@ Förvänta dig några fel och mindre problem, den här versionen är avsedd för
</message>
<message>
<source>UUID</source>
<translation>UUID: </translation>
<translation>UUID</translation>
</message>
<message>
<source>Details</source>
@ -7432,7 +7440,7 @@ Vill du skriva över den?</translation>
</message>
<message>
<source>Attachment %1 already exists for entry %2.</source>
<translation>Bilagan %1 finns redan i post &amp;2.</translation>
<translation>Bilagan %1 finns redan i post %2.</translation>
</message>
<message>
<source>Could not open attachment file %1.</source>
@ -10113,12 +10121,8 @@ Exempel: JBSWY3DPEHPK3PXP</translation>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Allmänt: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Kunde inte hitta gränssnittet för hårdvarunyckeln med serienummer %1. Anslut den för att fortsätta.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Kunde hitta hårdvarunyckel med serienummer %1. Anslut den för att fortsätta.</translation>
</message>
</context>
<context>
@ -10178,10 +10182,6 @@ Exempel: JBSWY3DPEHPK3PXP</translation>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Kunde inte hitta eller komma åt hårdvarunyckeln med serienummer %1. Var snäll och anslut den för att fortsätta. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Hårdvarunyckeln är låst eller tidsgränsen har uppnåtts. Lås upp eller anslut den igen för att fortsätta.</translation>

View file

@ -3630,6 +3630,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Keep Group Structure</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10085,12 +10093,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -10150,10 +10154,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation> </translation>

View file

@ -3655,6 +3655,14 @@ Desteklenen eklentiler: %1.</translation>
<source>Select import/export file</source>
<translation>İçe/dışa aktarılacak dosyayı seçin</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Paylaşılan veri tabanında grup yapısını korur</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Grup yapısı korunsun</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10114,12 +10122,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Genel:</translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>%1 seri numaralı donanım anahtarı arabirimi bulunamadı. Lütfen ilerlemek için anahtarı takın. </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>%1 seri numaralı donanım anahtarı bulunamadı. İlerlemek için lütfen anahtarı takın.</translation>
</message>
</context>
<context>
@ -10179,10 +10183,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>%1 seri numaralı donanım anahtarı bulunamadı ya da erişilemiyor. Lütfen ilerlemek için anahtarı takın. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Donanımsal anahtar kilitli ya da zaman ımına uğramış. İlerlemek için kilidi ın ya da çıkarıp yeniden takın.</translation>

View file

@ -160,19 +160,19 @@
<name>AppKit</name>
<message>
<source>Window</source>
<translation type="unfinished"/>
<translation>Вікно</translation>
</message>
<message>
<source>Minimize</source>
<translation type="unfinished"/>
<translation>Згорнути</translation>
</message>
<message>
<source>Zoom</source>
<translation type="unfinished"/>
<translation>Збільшити</translation>
</message>
<message>
<source>Bring All to Front</source>
<translation type="unfinished"/>
<translation>Вивести все на передній план</translation>
</message>
</context>
<context>
@ -537,7 +537,7 @@
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; is replaced with the filename of the saved database without extension&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; is replaced with the specified time format (default: dd_MM_yyyy_hh-mm-ss)&lt;/p&gt;&lt;p&gt;See the User Guide for more details&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; замінюється на ім&apos;я файла збереженої бази даних без розширення&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; замінюється на вказаний формат часу (за замовчуванням: дд_ММ_рррр_чч-хх-сс)&lt;/p&gt;&lt;p&gt;Дивіться Посібник користувача для більш детальної інформації&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{DB_FILENAME}&lt;/span&gt; замінюється на ім&apos;я файла збереженої бази даних без розширення&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;{TIME:&amp;lt;format&amp;gt;}&lt;/span&gt; замінюється на вказаний формат часу (за замовчуванням: dd_ММ_yyyy_hh-mm-ss)&lt;/p&gt;&lt;p&gt;Дивіться Посібник користувача для більш детальної інформації&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Choose folder...</source>
@ -585,27 +585,27 @@
</message>
<message>
<source>Double-click action for URL:</source>
<translation type="unfinished"/>
<translation>Дія на подвійне натискання на URL:</translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation type="unfinished"/>
<translation>Дія на подвійне натискання на поле URL</translation>
</message>
<message>
<source>Edit entry</source>
<translation type="unfinished"/>
<translation>Редагувати запис</translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation type="unfinished"/>
<translation>Відкрити URL-адресу запису в браузері</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation type="unfinished"/>
<translation>Скопіювати URL-адресу запису в буфер обміну</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation type="unfinished"/>
<translation>Автоматично генерувати пароль для нових записів</translation>
</message>
<message>
<source> recent files</source>
@ -925,11 +925,11 @@ Ctrl+Shift+4 - Скопіювати URL&lt;br/&gt;
<name>BinaryStream</name>
<message>
<source>Failed to read string data: %1</source>
<translation type="unfinished"/>
<translation>Не вдалося прочитати дані рядка: %1</translation>
</message>
<message>
<source>String length exceeds 10 MiB limit (requested %1)</source>
<translation type="unfinished"/>
<translation>Довжина рядка перевищує обмеження в 10 МБ (потрібно %1)</translation>
</message>
</context>
<context>
@ -1037,20 +1037,19 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Existing passkey found.
Do you want to register a new passkey for:</source>
<translation>Знайдено існуючий пароль.
Ви хочете зареєструвати новий пароль для:</translation>
<translation>Знайдено наявний ключ доступу.Чи хочете ви зареєструвати новий ключ доступу для:</translation>
</message>
<message>
<source>Select the existing passkey and press Update to replace it.</source>
<translation>Виберіть існуючий пароль і натисніть &quot;Оновити&quot;, щоб замінити його.</translation>
<translation>Виберіть наявний ключ доступу і натисніть «Оновити», щоб замінити його.</translation>
</message>
<message>
<source>Authenticate passkey credentials for:</source>
<translation>Аутентифікувати облікові дані пароля для:</translation>
<translation>Аутентифікувати облікові дані ключа доступу для:</translation>
</message>
<message>
<source>Do you want to register a passkey for:</source>
<translation>Ви хочете зареєструвати пароль для:</translation>
<translation>Чи хочете ви зареєструвати ключ доступу для:</translation>
</message>
</context>
<context>
@ -1099,7 +1098,7 @@ Do you want to delete the entry?
</message>
<message>
<source>%1 (Passkey)</source>
<translation>%1 (ключ доступу)</translation>
<translation>%1 (Ключ доступу)</translation>
</message>
<message>
<source>KeePassXC - Create a new group</source>
@ -1131,11 +1130,11 @@ Do you want to delete the entry?
</message>
<message>
<source>KeePassXC - Passkey credentials</source>
<translation>KeePassXC - Облікові дані ключа доступу</translation>
<translation>KeePassXC - Дані ключів доступу</translation>
</message>
<message>
<source>Register a new passkey to this entry:</source>
<translation>Зареєструвати новий пароль для цього запису:</translation>
<translation>Зареєструвати новий ключ доступу для цього запису:</translation>
</message>
<message>
<source>Register</source>
@ -1143,17 +1142,16 @@ Do you want to delete the entry?
</message>
<message>
<source>KeePassXC - Update passkey</source>
<translation>KeePassXC - Оновити пароль</translation>
<translation>KeePassXC - Оновити ключ доступу</translation>
</message>
<message>
<source>Entry already has a passkey.
Do you want to overwrite the passkey in %1 - %2?</source>
<translation>Запис уже має пароль.
Ви хочете перезаписати пароль у %1 - %2?</translation>
<translation>Запис вже має ключ доступу.Чи хочете ви перезаписати пароль у %1 - %2?</translation>
</message>
<message>
<source>Passkey</source>
<translation>Passkey</translation>
<translation>Ключ доступу</translation>
</message>
<message>
<source>Abort</source>
@ -1421,11 +1419,11 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Allows using insecure http://localhost with passkeys for testing purposes.</source>
<translation>Дозволяє використовувати небезпечний http://localhost з паролями для тестування.</translation>
<translation>Дозволяє використовувати небезпечний http://localhost з ключами доступу для тестування.</translation>
</message>
<message>
<source>Allow using localhost with passkeys</source>
<translation>Дозволити використовувати localhost з паролями</translation>
<translation>Дозволити використовувати localhost з ключами доступу</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2 and %3.</source>
@ -2761,11 +2759,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Remove passkey from entry</source>
<translation>Видалити пароль з запису</translation>
<translation>Видалити ключ доступу із запису</translation>
</message>
<message>
<source>Do you want to remove the passkey from this entry?</source>
<translation>Ви хочете видалити пароль з цього запису?</translation>
<translation>Бажаєте видалити ключ доступу з цього запису?</translation>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally</source>
@ -2837,15 +2835,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation type="unfinished"/>
<translation>Вибрану базу даних успішно об&apos;єднано.</translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation type="unfinished"/>
<translation>Операція об&apos;єднання не внесла жодних змін.</translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation type="unfinished"/>
<translation>Об&apos;єднання скасовано, зміни не внесені.</translation>
</message>
<message>
<source>Searches and Tags</source>
@ -3656,6 +3654,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>Вибрати файл імпорту/експорту</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation>Підтримувати структуру групи за допомогою спільної бази даних</translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation>Зберегти структуру групи</translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3884,7 +3890,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Passkey</source>
<translation>Passkey</translation>
<translation>Ключ доступу</translation>
</message>
<message>
<source>Invalid conversion type: %1</source>
@ -3902,59 +3908,59 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>Заголовок</translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"/>
<translation>Ім&apos;я користувача</translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"/>
<translation>Пароль</translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"/>
<translation>URL-адреса</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>Примітки</translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"/>
<translation>Власні атрибути</translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"/>
<translation>Піктограма</translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"/>
<translation>Колір</translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"/>
<translation>Термін дії</translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
<translation>TOTP</translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"/>
<translation>Користувацькі дані</translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"/>
<translation>Вкладення</translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"/>
<translation>Автозаповнення</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
<translation>Мітки</translation>
</message>
</context>
<context>
@ -6068,7 +6074,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Import Passkey</source>
<translation>Імпорт ключа доступу</translation>
<translation>Імпортувати ключ доступу</translation>
</message>
<message>
<source>Delete Entry</source>
@ -6076,7 +6082,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Remove Passkey From Entry</source>
<translation>Видалити пароль з запису</translation>
<translation>Видалити ключ доступу із запису</translation>
</message>
<message>
<source>Empty Recycle Bin</source>
@ -6189,31 +6195,31 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<name>MergeDialog</name>
<message>
<source>Database Merge Confirmation</source>
<translation type="unfinished"/>
<translation>Підтвердження об&apos;єднання бази даних</translation>
</message>
<message>
<source>Merge</source>
<translation type="unfinished"/>
<translation>Об&apos;єднати</translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"/>
<translation>Група</translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"/>
<translation>Заголовок</translation>
</message>
<message>
<source>UUID</source>
<translation type="unfinished"/>
<translation>UUID</translation>
</message>
<message>
<source>Details</source>
<translation type="unfinished"/>
<translation>Подробиці</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"/>
<translation>Змінити</translation>
</message>
</context>
<context>
@ -6232,71 +6238,71 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Added</source>
<translation type="unfinished"/>
<translation>Додано</translation>
</message>
<message>
<source>Modified</source>
<translation type="unfinished"/>
<translation>Змінено</translation>
</message>
<message>
<source>Moved</source>
<translation type="unfinished"/>
<translation>Переміщено</translation>
</message>
<message>
<source>Deleted</source>
<translation type="unfinished"/>
<translation>Видалено</translation>
</message>
<message>
<source>Previous location: %1</source>
<translation type="unfinished"/>
<translation>Попереднє місцезнаходження: %1</translation>
</message>
<message>
<source>Number of entries in group: %1</source>
<translation type="unfinished"/>
<translation>Кількість записів у групі: %1</translation>
</message>
<message>
<source>Group name</source>
<translation type="unfinished"/>
<translation>Назва групи</translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"/>
<translation>Примітки</translation>
</message>
<message>
<source>Icon (UUID)</source>
<translation type="unfinished"/>
<translation>Піктограма (UUID)</translation>
</message>
<message>
<source>Icon (Number)</source>
<translation type="unfinished"/>
<translation>Піктограма (Number)</translation>
</message>
<message>
<source>Expiry time</source>
<translation type="unfinished"/>
<translation>Термін дії</translation>
</message>
<message>
<source>Modification time</source>
<translation type="unfinished"/>
<translation>Час модифікації</translation>
</message>
<message>
<source>%1 (Add local modifications to new entry)</source>
<translation type="unfinished"/>
<translation>%1 (Додати місцеві зміни до нового запису)</translation>
</message>
<message>
<source>%1 (Add new modifications to existing entry)</source>
<translation type="unfinished"/>
<translation>%1 (Додати місцеві зміни до наявного запису)</translation>
</message>
<message>
<source>Explicit deletion</source>
<translation type="unfinished"/>
<translation>Явне видалення</translation>
</message>
<message>
<source>Implicit deletion (e.g. removal of parent group)</source>
<translation type="unfinished"/>
<translation>Неявне видалення (наприклад, видалення батьківської групи)</translation>
</message>
<message>
<source>Adding new icon %1</source>
<translation type="unfinished"/>
<translation>Додавання нової піктограми %1</translation>
</message>
</context>
<context>
@ -6544,11 +6550,11 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Failed to read key file: %1</source>
<translation type="unfinished"/>
<translation>Не вдалося прочитати файл ключа: %1</translation>
</message>
<message>
<source>Failed to read public key: %1</source>
<translation type="unfinished"/>
<translation>Не вдалося прочитати відкритий ключ: %1</translation>
</message>
<message>
<source>AES-256/GCM is currently not supported</source>
@ -6583,7 +6589,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Export the following passkey entries.</source>
<translation>Експортувати наступні записи паролів.</translation>
<translation>Експортувати наступні записи ключів доступу.</translation>
</message>
</context>
<context>
@ -6592,8 +6598,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<source>File &quot;%1.passkey&quot; already exists.
Do you want to overwrite it?
</source>
<translation>Файл &quot;%1.passkey&quot; вже існує.
Хочете перезаписати його?</translation>
<translation>Файл &quot;%1.passkey&quot; вже існує.Хочете перезаписати його?</translation>
</message>
<message>
<source>Cannot open file</source>
@ -6632,7 +6637,7 @@ Do you want to overwrite it?
</message>
<message>
<source>Import Passkey</source>
<translation>Імпорт ключа доступу</translation>
<translation>Імпортувати ключ доступу</translation>
</message>
<message>
<source>Import</source>
@ -6656,22 +6661,22 @@ Do you want to overwrite it?
</message>
<message>
<source>Import the following passkey:</source>
<translation>Імпортувати наступний пароль:</translation>
<translation>Імпортувати наступний ключ доступу:</translation>
</message>
<message>
<source>Import the following passkey to this entry:</source>
<translation>Імпортувати наступний пароль до цього запису:</translation>
<translation>Імпортувати наступний ключ доступу до цього запису:</translation>
</message>
<message>
<source>Default passkeys group (Imported Passkeys)</source>
<translation>Група паролів за замовчуванням (Імпортовані паролі)</translation>
<translation>Група ключів доступу за замовчуванням (Імпортовані ключі доступу)</translation>
</message>
</context>
<context>
<name>PasskeyImporter</name>
<message>
<source>Passkey file</source>
<translation>Файл з ключем</translation>
<translation>Файл ключа доступу</translation>
</message>
<message>
<source>All files</source>
@ -6687,27 +6692,25 @@ Do you want to overwrite it?
</message>
<message>
<source>Cannot import passkey file &quot;%1&quot;. Data is missing.</source>
<translation>Не вдалося імпортувати файл пароля &quot;%1&quot;. Дані відсутні.</translation>
<translation>Не вдалося імпортувати файл ключа доступу «%1». Дані відсутні.</translation>
</message>
<message>
<source>Cannot import passkey file &quot;%1&quot;.
The following data is missing:
%2</source>
<translation>Не вдалося імпортувати файл пароля &quot;%1&quot;.
Відсутні такі дані:
%2</translation>
<translation>Не вдалося імпортувати файл ключа доступу «%1».Відсутні такі дані:%2</translation>
</message>
<message>
<source>Cannot import passkey file &quot;%1&quot;. Private key is missing or malformed.</source>
<translation>Не вдалося імпортувати файл пароля &quot;%1&quot;. Відсутній або пошкоджений приватний ключ.</translation>
<translation>Не вдалося імпортувати файл ключа доступу «%1». Приватний ключ відсутній або пошкоджений.</translation>
</message>
<message>
<source>Open Passkey File</source>
<translation>Відкрити файл Passkey</translation>
<translation>Відкрити файл ключа доступу</translation>
</message>
<message>
<source>Passkey Import Failed</source>
<translation>Помилка імпорту Passkey</translation>
<translation>Помилка імпорту ключа доступу</translation>
</message>
</context>
<context>
@ -8726,7 +8729,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>Passkeys</source>
<translation>Passkeys</translation>
<translation>Ключі доступу</translation>
</message>
<message>
<source>Found unexpected Key type %1</source>
@ -8888,7 +8891,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>Unknown passkeys error</source>
<translation>Невідома помилка паролів</translation>
<translation>Невідома помилка ключів доступу</translation>
</message>
<message>
<source>Encrypted files are not supported.</source>
@ -8900,7 +8903,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>Passkey</source>
<translation>Passkey</translation>
<translation>Ключ доступу</translation>
</message>
<message>
<source>Format to use when exporting. Available choices are &apos;xml&apos;, &apos;csv&apos; or &apos;html&apos;. Defaults to &apos;xml&apos;.</source>
@ -9352,15 +9355,15 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>The passkey file will be vulnerable to theft and unauthorized use, if left unsecured. Are you sure you want to continue?</source>
<translation>Файл пароля буде вразливим до крадіжки та несанкціонованого використання, якщо залишити його незахищеним. Ви впевнені, що хочете продовжити?</translation>
<translation>Файл ключа доступу буде вразливим до крадіжки та несанкціонованого використання, якщо залишити його незахищеним. Ви впевнені, що хочете продовжити?</translation>
</message>
<message>
<source>Please wait, list of entries with passkeys is being updated</source>
<translation>Будь ласка, зачекайте, список записів з паролями оновлюється</translation>
<translation>Будь ласка, зачекайте, список записів з ключами доступу оновлюється</translation>
</message>
<message>
<source>No entries with passkeys.</source>
<translation>Немає записів з паролями.</translation>
<translation>Немає записів з ключами доступу.</translation>
</message>
</context>
<context>
@ -10116,12 +10119,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation>Загальні: </translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не вдалося знайти інтерфейс для апаратного ключа з серійним номером %1. Під&apos;єднайте його, щоб продовжити.</translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation>Не вдалося знайти апаратний ключ із серійним номером %1. Підключіть його, щоб продовжити.</translation>
</message>
</context>
<context>
@ -10181,10 +10180,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>Не вдалося знайти або отримати доступ до апаратного ключа з серійним номером %1. Будь ласка, надайте його, щоб продовжити. </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation>Апаратний ключ заблоковано або завершився час очікування. Розблокуйте його, або надайте повторно, щоб продовжити.</translation>

File diff suppressed because it is too large Load diff

View file

@ -3655,6 +3655,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation></translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation></translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -10109,12 +10117,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation></translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
</message>
</context>
<context>
@ -10174,10 +10178,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation>访 %1 </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation></translation>

View file

@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
<translation>: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
<translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@ -39,7 +39,7 @@
</message>
<message>
<source>Include the following information whenever you report a bug:</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Copy to clipboard</source>
@ -50,11 +50,11 @@
<name>AccessControlDialog</name>
<message>
<source>KeePassXC - Access Request</source>
<translation>KeePassXC - </translation>
<translation>KeePassXC - </translation>
</message>
<message>
<source>Non-existing/inaccessible executable path. Please double-check the client is legit.</source>
<translation></translation>
<translation>/</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%1 &lt;/span&gt;is requesting access to the following entries:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@ -70,7 +70,7 @@
</message>
<message>
<source>Executable</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Command Line</source>
@ -167,11 +167,11 @@
</message>
<message>
<source>Zoom</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Bring All to Front</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -317,7 +317,7 @@
</message>
<message>
<source>Remember database key files and security dongles</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Check for updates at application startup once per week</source>
@ -584,27 +584,27 @@
</message>
<message>
<source>Double-click action for URL:</source>
<translation> URL </translation>
<translation> URL </translation>
</message>
<message>
<source>Double-click action for URL field</source>
<translation> URL </translation>
<translation> URL </translation>
</message>
<message>
<source>Edit entry</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Open entry URL in browser</source>
<translation> URL</translation>
<translation> URL</translation>
</message>
<message>
<source>Copy entry URL to clipboard</source>
<translation> URL </translation>
<translation> URL 簿</translation>
</message>
<message>
<source>Auto-generate password for new entries</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source> recent files</source>
@ -632,11 +632,11 @@
</message>
<message>
<source>Clear clipboard after</source>
<translation>簿</translation>
<translation>簿</translation>
</message>
<message>
<source>Clear search query after</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source> min</source>
@ -645,7 +645,7 @@
</message>
<message>
<source>Clipboard clear seconds</source>
<translation>簿</translation>
<translation>簿</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@ -902,33 +902,33 @@ Ctrl+Shift+2 - Copy password&lt;br/&gt;
Ctrl+Shift+3 - Copy TOTP&lt;br/&gt;
Ctrl+Shift+4 - Copy URL&lt;br/&gt;
&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;br/&gt;
<translation>&lt;p&gt;&lt;br/&gt;
Ctrl+F - &lt;br/&gt;
Ctrl+1 - &lt;br/&gt;
Ctrl+2 - &lt;br/&gt;
Ctrl+3 - TOTP&lt;br/&gt;
Ctrl+4 - URL&lt;br/&gt;
Ctrl+5 - 使 Windows&lt;br/&gt;
Ctrl+Shift+1 - &lt;br/&gt;
Ctrl+Shift+2 - &lt;br/&gt;
Ctrl+Shift+3 - TOTP&lt;br/&gt;
Ctrl+Shift+4 - URL&lt;br/&gt;
Ctrl+1 - 使&lt;br/&gt;
Ctrl+2 - &lt;br/&gt;
Ctrl+3 - TOTP&lt;br/&gt;
Ctrl+4 - URL&lt;br/&gt;
Ctrl+5 - 使 Windows&lt;br/&gt;
Ctrl+Shift+1 - 使&lt;br/&gt;
Ctrl+Shift+2 - &lt;br/&gt;
Ctrl+Shift+3 - TOTP&lt;br/&gt;
Ctrl+Shift+4 - URL&lt;br/&gt;
&lt;/p&gt;</translation>
</message>
<message>
<source>You can use advanced search queries to find any entry in your open databases.</source>
<translation>使</translation>
<translation>使</translation>
</message>
</context>
<context>
<name>BinaryStream</name>
<message>
<source>Failed to read string data: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>String length exceeds 10 MiB limit (requested %1)</source>
<translation> 10 MiB %1</translation>
<translation> 10 MiB %1</translation>
</message>
</context>
<context>
@ -1262,7 +1262,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Match URL scheme (e.g., https://example.com)</source>
<translation> URL (e.g., https://example.com)</translation>
<translation> URL ( https://example.com)</translation>
</message>
<message>
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
@ -1727,17 +1727,17 @@ You can try to open it anyway, but it may be incomplete
and saving any changes may incur data loss.
We recommend you update your KeePassXC installation.</source>
<translation>
<translation>
KeePassXC
KeePassXC</translation>
</message>
<message>
<source>Open database anyway</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Database unlock canceled.</source>
@ -2136,7 +2136,7 @@ Are you sure you want to continue without a password?</source>
</message>
<message>
<source>Unless you need to open your database with other programs, always use the latest format.</source>
<translation>使</translation>
<translation>使</translation>
</message>
<message>
<source>Encryption Algorithm:</source>
@ -2434,7 +2434,7 @@ removed from the database.</source>
</message>
<message>
<source>Clear</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Display icon:</source>
@ -2816,15 +2816,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Confirm Delete Group</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Do you really want to permanently delete the group &quot;%1&quot;?</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Confirm Recycle Group</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Save</source>
@ -2832,19 +2832,19 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Save Database Backup</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Searches and Tags</source>
@ -3000,7 +3000,7 @@ Would you like to correct it?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n </numerusform></translation>
<translation><numerusform>%n </numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
@ -3079,7 +3079,7 @@ Would you like to correct it?</source>
</message>
<message>
<source>If checked, the entry will not appear in reports like Health Check and HIBP even if it doesn&apos;t match the quality requirements.</source>
<translation> HIBP 使</translation>
<translation> HIBP 使</translation>
</message>
<message>
<source>Exclude from database reports</source>
@ -3281,15 +3281,15 @@ Would you like to correct it?</source>
</message>
<message>
<source>Expiration field</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Expiration Presets</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Expiration presets</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Presets</source>
@ -3313,7 +3313,7 @@ Would you like to correct it?</source>
</message>
<message>
<source>Toggle expiration</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Tags list</source>
@ -3445,7 +3445,7 @@ Would you like to correct it?</source>
</message>
<message>
<source>Clear agent</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -3582,11 +3582,11 @@ Would you like to correct it?</source>
</message>
<message>
<source>Clear fields</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Clear</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Inactive</source>
@ -3655,6 +3655,14 @@ Supported extensions are: %1.</source>
<source>Select import/export file</source>
<translation>/</translation>
</message>
<message>
<source>Maintain group structure with shared database</source>
<translation></translation>
</message>
<message>
<source>Keep Group Structure</source>
<translation></translation>
</message>
</context>
<context>
<name>EditGroupWidgetMain</name>
@ -3664,7 +3672,7 @@ Supported extensions are: %1.</source>
</message>
<message>
<source>Toggle expiration</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Expires:</source>
@ -3676,7 +3684,7 @@ Supported extensions are: %1.</source>
</message>
<message>
<source>Expiration field</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Use default Auto-Type sequence of parent group</source>
@ -3901,15 +3909,15 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Title</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Username</source>
<translation></translation>
<translation>使</translation>
</message>
<message>
<source>Password</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>URL</source>
@ -3917,23 +3925,23 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Notes</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Custom Attributes</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Icon</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Color</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Expiration</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>TOTP</source>
@ -3941,7 +3949,7 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Custom Data</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Attachments</source>
@ -3949,11 +3957,11 @@ This may cause the affected plugins to malfunction.</source>
</message>
<message>
<source>Auto-Type</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Tags</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -4296,7 +4304,7 @@ Would you like to overwrite the existing attachment?</source>
</message>
<message>
<source>Expiration</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Tags</source>
@ -4356,7 +4364,7 @@ Would you like to overwrite the existing attachment?</source>
</message>
<message>
<source>Clear</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Never</source>
@ -4449,7 +4457,7 @@ This will leave your passwords and sensitive information vulnerable!
</message>
<message>
<source>invalid sort order</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -4487,7 +4495,7 @@ This will leave your passwords and sensitive information vulnerable!
</message>
<message>
<source>Failed to register service on DBus at path &apos;%1&apos;</source>
<translation> DBus &apos;%1&apos; </translation>
<translation> DBus %1</translation>
</message>
<message>
<source>Failed to register database on DBus under the name &apos;%1&apos;</source>
@ -4503,7 +4511,7 @@ This will leave your passwords and sensitive information vulnerable!
</message>
<message>
<source>Failed to register prompt object on DBus at path &apos;%1&apos;</source>
<translation> DBus &apos;%1&apos; </translation>
<translation> DBus %1</translation>
</message>
</context>
<context>
@ -4637,7 +4645,7 @@ You can enable the DuckDuckGo website icon service in the security section of th
</message>
<message>
<source>Fit</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -5244,7 +5252,7 @@ Line %2, column %3</source>
<message>
<source>Unable to read encryption IV</source>
<comment>IV = Initialization Vector for symmetric cipher</comment>
<translation> IV</translation>
<translation></translation>
</message>
<message>
<source>Invalid number of groups</source>
@ -5484,7 +5492,7 @@ If this reoccurs, then your database file may be corrupt.</source>
<message>
<source>Error loading the key file '%1'
Message: %2</source>
<translation> &apos;%1&apos;
<translation>%1
%2</translation>
</message>
<message>
@ -5901,7 +5909,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Compact Mode</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Automatic</source>
@ -5949,7 +5957,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Clear history</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Access error for config file %1</source>
@ -6095,39 +6103,39 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Clear SSH Agent</source>
<translation> SSH </translation>
<translation> SSH </translation>
</message>
<message>
<source>Clear all identities in ssh-agent</source>
<translation> ssh-agent </translation>
<translation> ssh-agent </translation>
</message>
<message>
<source>New Entry</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Edit Entry</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>E&amp;xpire Entry</source>
<translation>(&amp;X)</translation>
<translation> (&amp;X)</translation>
</message>
<message>
<source>Expire Entry</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>&amp;Delete Entry</source>
<translation>(&amp;D)</translation>
<translation> (&amp;D)</translation>
</message>
<message numerus="yes">
<source>Move selected entry(s) to the recycle bin</source>
<translation><numerusform></numerusform></translation>
<translation><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Permanently delete the selected entry(s)</source>
<translation><numerusform></numerusform></translation>
<translation><numerusform></numerusform></translation>
</message>
<message>
<source>View or edit entry</source>
@ -6184,19 +6192,19 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<name>MergeDialog</name>
<message>
<source>Database Merge Confirmation</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Merge</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Group</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Title</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>UUID</source>
@ -6204,7 +6212,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Details</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Change</source>
@ -6227,19 +6235,19 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Added</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Modified</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Moved</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Deleted</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Previous location: %1</source>
@ -6247,51 +6255,51 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Number of entries in group: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Group name</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Notes</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Icon (UUID)</source>
<translation>UUID</translation>
<translation>UUID</translation>
</message>
<message>
<source>Icon (Number)</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Expiry time</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Modification time</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>%1 (Add local modifications to new entry)</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>%1 (Add new modifications to existing entry)</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Explicit deletion</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Implicit deletion (e.g. removal of parent group)</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Adding new icon %1</source>
<translation> %1</translation>
<translation> %1</translation>
</message>
</context>
<context>
@ -6377,7 +6385,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Unable to read all IV bytes, wanted 16 but got %1</source>
<translation> (IV) 16 %1</translation>
<translation> 16 %1</translation>
</message>
<message>
<source>Unable to init cipher for opdata01: %1</source>
@ -6479,7 +6487,7 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Cipher IV is too short for MD5 kdf</source>
<translation> (IV) MD5 kdf </translation>
<translation> MD5 kdf </translation>
</message>
<message>
<source>Unknown KDF: %1</source>
@ -6539,11 +6547,11 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
</message>
<message>
<source>Failed to read key file: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Failed to read public key: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>AES-256/GCM is currently not supported</source>
@ -6605,7 +6613,7 @@ Do you want to overwrite it?
</message>
<message>
<source>Overwrite Existing File?</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -6699,11 +6707,11 @@ The following data is missing:
</message>
<message>
<source>Open Passkey File</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Passkey Import Failed</source>
<translation></translation>
<translation></translation>
</message>
</context>
<context>
@ -6954,7 +6962,7 @@ The following data is missing:
</message>
<message>
<source>Entropy: %1 bit</source>
<translation>%1 </translation>
<translation>%1 </translation>
</message>
<message>
<source>Failed to delete wordlist</source>
@ -6982,7 +6990,7 @@ The following data is missing:
</message>
<message>
<source>Password Quality: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Poor</source>
@ -7043,8 +7051,8 @@ The following data is missing:
<message>
<source>Wordlist &quot;%1&quot; already exists as a custom wordlist.
Do you want to overwrite it?</source>
<translation> &quot;%1&quot;
?</translation>
<translation>%1
</translation>
</message>
</context>
<context>
@ -7071,7 +7079,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Quality: %1</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message>
<source>Poor</source>
@ -7403,7 +7411,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Could not open output file %1.</source>
<translation> %1</translation>
<translation> %1</translation>
</message>
<message>
<source>Successfully exported attachment %1 of entry %2 to %3.</source>
@ -7435,7 +7443,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Could not open attachment file %1.</source>
<translation> %1</translation>
<translation> %1</translation>
</message>
<message>
<source>Successfully imported attachment %1 as %2 to entry %3.</source>
@ -7477,7 +7485,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Timeout before clearing the clipboard (default is %1 seconds, set to 0 for unlimited).</source>
<translation>簿 %1 0</translation>
<translation>簿 %1 0</translation>
</message>
<message>
<source>Invalid timeout value %1.</source>
@ -7643,7 +7651,7 @@ Do you want to overwrite it?</source>
<message>
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
<translation>Diceware 使
<translation>Diceware 使
[EFF English]</translation>
</message>
<message>
@ -7692,11 +7700,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Password for which to estimate the entropy.</source>
<translation> entropy </translation>
<translation></translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
<translation> entropy</translation>
<translation></translation>
</message>
<message>
<source>Length %1</source>
@ -7832,7 +7840,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Use extended ASCII</source>
<translation> 使 ASCII </translation>
<translation>使 ASCII </translation>
</message>
<message>
<source>Exclude character set</source>
@ -7960,7 +7968,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Number of expired entries</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Unique passwords</source>
@ -8272,11 +8280,11 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>To use okon, you must provide a post-processed file (e.g. file.okon)</source>
<translation>使 okon (e.g. file.okon)</translation>
<translation>使 okon ( file.okon)</translation>
</message>
<message>
<source>Could not start okon process: %1</source>
<translation> okon %1</translation>
<translation> okon %1</translation>
</message>
<message>
<source>Error: okon process did not finish</source>
@ -8404,7 +8412,7 @@ Kernel: %3 %4</source>
</message>
<message numerus="yes">
<source>%1 week(s)</source>
<translation><numerusform>%1 </numerusform></translation>
<translation><numerusform>%1 </numerusform></translation>
</message>
<message numerus="yes">
<source>%1 day(s)</source>
@ -8440,7 +8448,7 @@ Kernel: %3 %4</source>
</message>
<message>
<source>SymmetricCipher::init: Invalid IV size of %1 for %2.</source>
<translation>SymmetricCipher::init: %1 (IV) %2</translation>
<translation>SymmetricCipher::init: 無效 %2 %1</translation>
</message>
<message>
<source>Cipher not initialized prior to use.</source>
@ -8938,35 +8946,35 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation><numerusform>%1 </numerusform></translation>
<translation><numerusform>%1 </numerusform></translation>
</message>
<message>
<source>Do you really want to permanently delete the entry &quot;%1&quot;?</source>
<translation>%1</translation>
<translation>%1</translation>
</message>
<message numerus="yes">
<source>Do you really want to permanently delete %n entry(s)?</source>
<translation><numerusform> %n </numerusform></translation>
<translation><numerusform> %n </numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Delete Entry(s)</source>
<translation><numerusform></numerusform></translation>
<translation><numerusform></numerusform></translation>
</message>
<message numerus="yes">
<source>Confirm Recycle Entry(s)</source>
<translation><numerusform></numerusform></translation>
<translation><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Delete Plugin Data</source>
<translation></translation>
<translation></translation>
</message>
<message numerus="yes">
<source>Delete plugin data from the selected entry(s)?</source>
<translation><numerusform></numerusform></translation>
<translation><numerusform></numerusform></translation>
</message>
<message>
<source>Confirm Replace Entry References</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Type: Date(Rep)</source>
@ -9423,7 +9431,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>Number of expired entries</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>The database contains entries that have expired.</source>
@ -9483,7 +9491,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message numerus="yes">
<source>%1 character(s)</source>
<translation><numerusform>%1 </numerusform></translation>
<translation><numerusform>%1 </numerusform></translation>
</message>
</context>
<context>
@ -9682,7 +9690,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If enabled, any attempt to read a password must be confirmed. Otherwise, clients can read passwords without confirmation when the database is unlocked.&lt;/p&gt;&lt;p&gt;This option only covers the access to the password of an entry. Clients can always enumerate the items of exposed databases and query their attributes.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Confirm when passwords are retrieved by clients</source>
@ -9845,7 +9853,7 @@ This option is deprecated, use --set-key-file instead.</source>
</message>
<message>
<source>Clear Search</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>TOTP Entries</source>
@ -10017,7 +10025,7 @@ Example: JBSWY3DPEHPK3PXP</source>
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Checking for updates</source>
@ -10112,12 +10120,8 @@ Example: JBSWY3DPEHPK3PXP</source>
<context>
<name>YubiKey</name>
<message>
<source>General: </source>
<translation></translation>
</message>
<message>
<source>Could not find interface for hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
<source>Could not find hardware key with serial number %1. Please connect it to continue.</source>
<translation> %1 </translation>
</message>
</context>
<context>
@ -10177,10 +10181,6 @@ Example: JBSWY3DPEHPK3PXP</source>
</context>
<context>
<name>YubiKeyInterfacePCSC</name>
<message>
<source>Could not find or access hardware key with serial number %1. Please present it to continue. </source>
<translation> %1 </translation>
</message>
<message>
<source>Hardware key is locked or timed out. Unlock or re-present it to continue.</source>
<translation></translation>
@ -10206,11 +10206,11 @@ Example: JBSWY3DPEHPK3PXP</source>
</message>
<message>
<source>The YubiKey PC/SC interface has not been initialized.</source>
<translation>YubiKey PC/SC </translation>
<translation>YubiKey PC/SC </translation>
</message>
<message>
<source>Failed to complete a challenge-response, the PC/SC error code was: %1</source>
<translation>PC/SC %1</translation>
<translation>PC/SC %1</translation>
</message>
</context>
<context>
@ -10231,7 +10231,7 @@ Example: JBSWY3DPEHPK3PXP</source>
</message>
<message>
<source>Could not find hardware key with serial number %1. Please plug it in to continue.</source>
<translation> %1 </translation>
<translation> %1 </translation>
</message>
<message>
<source>Hardware key timed out waiting for user interaction.</source>

View file

@ -115,6 +115,8 @@ namespace
{"f14", Qt::Key_F14},
{"f15", Qt::Key_F15},
{"f16", Qt::Key_F16}};
constexpr int s_minWaitDelay = 100; // 100 ms
constexpr int s_maxWaitDelay = 10000; // 10 seconds
} // namespace
AutoType* AutoType::m_instance = nullptr;
@ -312,6 +314,9 @@ void AutoType::executeAutoTypeActions(const Entry* entry,
// Restore executor mode
m_executor->mode = mode;
// Initial Auto-Type delay to allow window to come to foreground
Tools::wait(qBound(s_minWaitDelay, config()->get(Config::AutoTypeStartDelay).toInt(), s_maxWaitDelay));
// Grab the current active window after everything settles
if (window == 0) {
window = m_plugin->activeWindow();
@ -543,16 +548,16 @@ AutoType::parseSequence(const QString& entrySequence, const Entry* entry, QStrin
}
const int maxTypeDelay = 500;
const int maxWaitDelay = 10000;
const int maxRepetition = 100;
int currentTypingDelay = qBound(0, config()->get(Config::AutoTypeDelay).toInt(), maxTypeDelay);
int cumulativeDelay = qBound(0, config()->get(Config::AutoTypeStartDelay).toInt(), maxWaitDelay);
// Take into account the initial delay which is added before any actions are performed
int cumulativeDelay = qBound(s_minWaitDelay, config()->get(Config::AutoTypeStartDelay).toInt(), s_maxWaitDelay);
// Initial actions include start delay and initial inter-key delay
QList<QSharedPointer<AutoTypeAction>> actions;
actions << QSharedPointer<AutoTypeBegin>::create();
actions << QSharedPointer<AutoTypeDelay>::create(currentTypingDelay, true);
actions << QSharedPointer<AutoTypeDelay>::create(cumulativeDelay);
// Replace escaped braces with a template for easier regex
QString sequence = entrySequence;
@ -631,16 +636,16 @@ AutoType::parseSequence(const QString& entrySequence, const Entry* entry, QStrin
actions << QSharedPointer<AutoTypeDelay>::create(qBound(0, delay, maxTypeDelay), true);
} else if (placeholder == "delay") {
// Mid typing delay (wait), repeat represents the desired delay in milliseconds
if (repeat > maxWaitDelay) {
error = tr("Very long delay detected, max is %1: %2").arg(maxWaitDelay).arg(fullPlaceholder);
if (repeat > s_maxWaitDelay) {
error = tr("Very long delay detected, max is %1: %2").arg(s_maxWaitDelay).arg(fullPlaceholder);
return {};
}
cumulativeDelay += repeat;
actions << QSharedPointer<AutoTypeDelay>::create(qBound(0, repeat, maxWaitDelay));
actions << QSharedPointer<AutoTypeDelay>::create(qBound(0, repeat, s_maxWaitDelay));
} else if (placeholder == "clearfield") {
// Platform-specific field clearing
actions << QSharedPointer<AutoTypeClearField>::create();
} else if (placeholder == "totp") {
} else if (placeholder == "totp" || placeholder == "timeotp") {
if (entry->hasValidTotp()) {
// Calculate TOTP at the time of typing including delays
bool isValid = false;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2023 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2013 Francois Ferrand
*
* This program is free software: you can redistribute it and/or modify
@ -53,55 +53,72 @@ void BrowserAccessControlDialog::setEntries(const QList<Entry*>& entriesToConfir
QUrl url(urlString);
m_ui->siteLabel->setText(m_ui->siteLabel->text().arg(
url.toDisplayString(QUrl::RemoveUserInfo | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment)));
m_ui->siteLabel->setToolTip(urlString);
m_ui->rememberDecisionCheckBox->setVisible(!httpAuth);
m_ui->rememberDecisionCheckBox->setChecked(false);
m_ui->itemsTable->setRowCount(entriesToConfirm.count());
m_ui->itemsTable->setColumnCount(2);
m_ui->itemsTable->setColumnCount(3);
int row = 0;
for (const auto& entry : entriesToConfirm) {
addEntryToList(entry, row);
++row;
}
m_ui->itemsTable->resizeColumnsToContents();
m_ui->itemsTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
m_ui->itemsTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
m_ui->itemsTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
m_ui->itemsTable->selectAll();
m_ui->allowButton->setFocus();
}
void BrowserAccessControlDialog::addEntryToList(Entry* entry, int row)
void BrowserAccessControlDialog::addEntryToList(const Entry* entry, int row)
{
auto item = new QTableWidgetItem();
item->setText(entry->resolveMultiplePlaceholders(entry->title()) + " - "
+ entry->resolveMultiplePlaceholders(entry->username()));
item->setData(Qt::UserRole, row);
item->setFlags(item->flags() | Qt::ItemIsSelectable);
m_ui->itemsTable->setItem(row, 0, item);
const auto titleItem = new QTableWidgetItem();
const auto entryTitle = entry->resolveMultiplePlaceholders(entry->title());
const auto entryUrl = entry->resolveMultiplePlaceholders(entry->url());
titleItem->setText(entryTitle);
titleItem->setToolTip(entryUrl);
titleItem->setData(Qt::UserRole, row);
titleItem->setFlags(titleItem->flags() | Qt::ItemIsSelectable);
m_ui->itemsTable->setItem(row, 0, titleItem);
const auto usernameItem = new QTableWidgetItem();
const auto entryUsername = entry->resolveMultiplePlaceholders(entry->username());
usernameItem->setText(entryUsername);
usernameItem->setData(Qt::UserRole, row);
m_ui->itemsTable->setItem(row, 1, usernameItem);
auto disableButton = new QPushButton();
disableButton->setIcon(icons()->icon("entry-delete"));
disableButton->setToolTip(tr("Disable for this site"));
connect(disableButton, &QAbstractButton::pressed, [&, item, disableButton] {
auto font = item->font();
if (item->flags() == Qt::NoItemFlags) {
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
item->setSelected(true);
connect(disableButton, &QAbstractButton::pressed, [&, titleItem, usernameItem, disableButton] {
auto font = titleItem->font();
if (titleItem->flags() == Qt::NoItemFlags) {
titleItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
usernameItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
titleItem->setSelected(true);
usernameItem->setSelected(true);
font.setStrikeOut(false);
item->setFont(font);
titleItem->setFont(font);
usernameItem->setFont(font);
disableButton->setIcon(icons()->icon("entry-delete"));
disableButton->setToolTip(tr("Disable for this site"));
m_ui->rememberDecisionCheckBox->setEnabled(true);
} else {
item->setFlags(Qt::NoItemFlags);
item->setSelected(false);
titleItem->setFlags(Qt::NoItemFlags);
usernameItem->setFlags(Qt::NoItemFlags);
titleItem->setSelected(false);
usernameItem->setSelected(false);
font.setStrikeOut(true);
item->setFont(font);
titleItem->setFont(font);
usernameItem->setFont(font);
disableButton->setIcon(icons()->icon("entry-restore"));
disableButton->setToolTip(tr("Undo"));
@ -112,7 +129,7 @@ void BrowserAccessControlDialog::addEntryToList(Entry* entry, int row)
}
});
m_ui->itemsTable->setCellWidget(row, 1, disableButton);
m_ui->itemsTable->setCellWidget(row, 2, disableButton);
}
bool BrowserAccessControlDialog::remember() const

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2023 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2013 Francois Ferrand
*
* This program is free software: you can redistribute it and/or modify
@ -55,7 +55,7 @@ private slots:
void selectionChanged();
private:
void addEntryToList(Entry* entry, int row);
void addEntryToList(const Entry* entry, int row);
bool areAllDisabled() const;
QList<QTableWidgetItem*> getAllItems() const;

View file

@ -26,7 +26,7 @@
<string>%1 is requesting access to the following entries:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignLeft</set>
</property>
</widget>
</item>

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -79,7 +79,7 @@ PublicKeyCredential BrowserPasskeys::buildRegisterPublicKeyCredential(const QJso
// Credential private key
const auto alg = getAlgorithmFromPublicKey(credentialCreationOptions);
const auto privateKey = buildCredentialPrivateKey(alg, testingVariables.first, testingVariables.second);
const auto privateKey = buildCredentialPrivateKey(alg, testingVariables);
if (privateKey.cborEncodedPublicKey.isEmpty() && privateKey.privateKeyPem.isEmpty()) {
// Key creation failed
return {};
@ -103,6 +103,9 @@ PublicKeyCredential BrowserPasskeys::buildRegisterPublicKeyCredential(const QJso
// Additions for extension side functions
responseObject["authenticatorData"] = browserMessageBuilder()->getBase64FromArray(authenticatorData);
// PublicKey
responseObject["publicKey"] = browserMessageBuilder()->getBase64FromArray(privateKey.spkiPublicKey);
responseObject["publicKeyAlgorithm"] = alg;
// PublicKeyCredential
@ -122,14 +125,16 @@ PublicKeyCredential BrowserPasskeys::buildRegisterPublicKeyCredential(const QJso
QJsonObject BrowserPasskeys::buildGetPublicKeyCredential(const QJsonObject& assertionOptions,
const QString& credentialId,
const QString& userHandle,
const QString& privateKeyPem)
const QString& privateKeyPem,
const bool beFlag,
const bool bsFlag)
{
if (!passkeyUtils()->checkCredentialAssertionOptions(assertionOptions)) {
return {};
}
const auto authenticatorData =
buildAuthenticatorData(assertionOptions["rpId"].toString(), assertionOptions["extensions"].toString());
const auto authenticatorData = buildAuthenticatorData(
assertionOptions["rpId"].toString(), assertionOptions["extensions"].toString(), beFlag, bsFlag);
const auto clientDataJson = assertionOptions["clientDataJson"].toString();
const auto clientDataArray = clientDataJson.toUtf8();
@ -168,8 +173,12 @@ QByteArray BrowserPasskeys::buildAttestationObject(const QJsonObject& credential
result.append(rpIdHash);
// Use default flags
const auto flags = setFlagsFromJson(QJsonObject(
{{"ED", !extensions.isEmpty()}, {"AT", true}, {"BS", false}, {"BE", false}, {"UV", true}, {"UP", true}}));
const auto flags = setFlagsFromJson(QJsonObject({{"ED", !extensions.isEmpty()},
{"AT", true},
{"BS", DEFAULT_BS_FLAG},
{"BE", DEFAULT_BE_FLAG},
{"UV", true},
{"UP", true}}));
result.append(flags);
// Signature counter (not supported, always 0
@ -201,7 +210,10 @@ QByteArray BrowserPasskeys::buildAttestationObject(const QJsonObject& credential
}
// Build a short version of the attestation object for webauthn.get
QByteArray BrowserPasskeys::buildAuthenticatorData(const QString& rpId, const QString& extensions)
QByteArray BrowserPasskeys::buildAuthenticatorData(const QString& rpId,
const QString& extensions,
const bool beFlag,
const bool bsFlag)
{
QByteArray result;
@ -209,7 +221,7 @@ QByteArray BrowserPasskeys::buildAuthenticatorData(const QString& rpId, const QS
result.append(rpIdHash);
const auto flags = setFlagsFromJson(QJsonObject(
{{"ED", !extensions.isEmpty()}, {"AT", false}, {"BS", false}, {"BE", false}, {"UV", true}, {"UP", true}}));
{{"ED", !extensions.isEmpty()}, {"AT", false}, {"BS", bsFlag}, {"BE", beFlag}, {"UV", true}, {"UP", true}}));
result.append(flags);
// Signature counter (not supported, always 0
@ -224,8 +236,7 @@ QByteArray BrowserPasskeys::buildAuthenticatorData(const QString& rpId, const QS
}
// See: https://w3c.github.io/webauthn/#sctn-encoded-credPubKey-examples
AttestationKeyPair
BrowserPasskeys::buildCredentialPrivateKey(int alg, const QString& predefinedFirst, const QString& predefinedSecond)
AttestationKeyPair BrowserPasskeys::buildCredentialPrivateKey(int alg, const TestingVariables& testingVariables)
{
// Only support -7, P256 (EC), -8 (EdDSA) and -257 (RSA) for now
if (alg != WebAuthnAlgorithms::ES256 && alg != WebAuthnAlgorithms::RS256 && alg != WebAuthnAlgorithms::EDDSA) {
@ -234,21 +245,31 @@ BrowserPasskeys::buildCredentialPrivateKey(int alg, const QString& predefinedFir
QByteArray firstPart;
QByteArray secondPart;
QByteArray spki;
QByteArray pem;
if (!predefinedFirst.isEmpty() && !predefinedSecond.isEmpty()) {
firstPart = browserMessageBuilder()->getArrayFromBase64(predefinedFirst);
secondPart = browserMessageBuilder()->getArrayFromBase64(predefinedSecond);
if (!testingVariables.first.isEmpty() && !testingVariables.second.isEmpty()) {
firstPart = browserMessageBuilder()->getArrayFromBase64(testingVariables.first);
secondPart = browserMessageBuilder()->getArrayFromBase64(testingVariables.second);
} else {
if (alg == WebAuthnAlgorithms::ES256) {
try {
Botan::ECDSA_PrivateKey privateKey(*randomGen()->getRng(), Botan::EC_Group("secp256r1"));
// Use predefined data if found (only for testing private key creation)
const auto keyData = !testingVariables.data.isEmpty()
? Botan::BigInt(testingVariables.data.toStdString())
: Botan::BigInt(0);
Botan::ECDSA_PrivateKey privateKey(*randomGen()->getRng(), Botan::EC_Group("secp256r1"), keyData);
const auto& publicPoint = privateKey.public_point();
auto x = publicPoint.get_affine_x();
auto y = publicPoint.get_affine_y();
firstPart = bigIntToQByteArray(x);
secondPart = bigIntToQByteArray(y);
auto publicKey =
Botan::ECDSA_PublicKey(privateKey.algorithm_identifier(), privateKey.public_key_bits());
auto publicKeySpki = publicKey.subject_public_key();
spki = browserMessageBuilder()->getQByteArray(publicKeySpki.data(), publicKeySpki.size());
auto privateKeyPem = Botan::PKCS8::PEM_encode(privateKey);
pem = QByteArray::fromStdString(privateKeyPem);
} catch (std::exception& e) {
@ -263,6 +284,10 @@ BrowserPasskeys::buildCredentialPrivateKey(int alg, const QString& predefinedFir
firstPart = bigIntToQByteArray(modulus);
secondPart = bigIntToQByteArray(exponent);
auto publicKey = Botan::RSA_PublicKey(privateKey.algorithm_identifier(), privateKey.public_key_bits());
auto publicKeySpki = publicKey.subject_public_key();
spki = browserMessageBuilder()->getQByteArray(publicKeySpki.data(), publicKeySpki.size());
auto privateKeyPem = Botan::PKCS8::PEM_encode(privateKey);
pem = QByteArray::fromStdString(privateKeyPem);
} catch (std::exception& e) {
@ -271,17 +296,22 @@ BrowserPasskeys::buildCredentialPrivateKey(int alg, const QString& predefinedFir
}
} else if (alg == WebAuthnAlgorithms::EDDSA) {
try {
Botan::Ed25519_PrivateKey key(*randomGen()->getRng());
auto publicKey = key.get_public_key();
Botan::Ed25519_PrivateKey privateKey(*randomGen()->getRng());
auto publicKeyBits = privateKey.get_public_key();
#ifdef WITH_XC_BOTAN3
auto privateKey = key.raw_private_key_bits();
auto privateKeyBits = privateKey.raw_private_key_bits();
#else
auto privateKey = key.get_private_key();
auto privateKeyBits = privateKey.get_private_key();
#endif
firstPart = browserMessageBuilder()->getQByteArray(publicKey.data(), publicKey.size());
secondPart = browserMessageBuilder()->getQByteArray(privateKey.data(), privateKey.size());
firstPart = browserMessageBuilder()->getQByteArray(publicKeyBits.data(), publicKeyBits.size());
secondPart = browserMessageBuilder()->getQByteArray(privateKeyBits.data(), privateKeyBits.size());
auto privateKeyPem = Botan::PKCS8::PEM_encode(key);
auto publicKey =
Botan::Ed25519_PublicKey(privateKey.algorithm_identifier(), privateKey.public_key_bits());
auto publicKeySpki = publicKey.subject_public_key();
spki = browserMessageBuilder()->getQByteArray(publicKeySpki.data(), publicKeySpki.size());
auto privateKeyPem = Botan::PKCS8::PEM_encode(privateKey);
pem = QByteArray::fromStdString(privateKeyPem);
} catch (std::exception& e) {
qWarning("BrowserWebAuthn::buildCredentialPrivateKey: Could not create EdDSA private key: %s",
@ -299,6 +329,7 @@ BrowserPasskeys::buildCredentialPrivateKey(int alg, const QString& predefinedFir
AttestationKeyPair attestationKeyPair;
attestationKeyPair.cborEncodedPublicKey = result;
attestationKeyPair.privateKeyPem = pem;
attestationKeyPair.spkiPublicKey = spki;
return attestationKeyPair;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -25,6 +25,8 @@
#include <botan/asn1_obj.h>
#include <botan/bigint.h>
#define DEFAULT_BE_FLAG true
#define DEFAULT_BS_FLAG true
#define ID_BYTES 32
#define HASH_BYTES 32
#define RSA_BITS 2048
@ -61,6 +63,7 @@ struct AttestationKeyPair
{
QByteArray cborEncodedPublicKey;
QByteArray privateKeyPem;
QByteArray spkiPublicKey;
};
// Predefined variables used for testing the class
@ -69,6 +72,7 @@ struct TestingVariables
QString credentialId;
QString first;
QString second;
QString data;
};
class BrowserPasskeys : public QObject
@ -81,11 +85,13 @@ public:
static BrowserPasskeys* instance();
PublicKeyCredential buildRegisterPublicKeyCredential(const QJsonObject& credentialCreationOptions,
const TestingVariables& predefinedVariables = {});
const TestingVariables& testingVariables = {});
QJsonObject buildGetPublicKeyCredential(const QJsonObject& assertionOptions,
const QString& credentialId,
const QString& userHandle,
const QString& privateKeyPem);
const QString& privateKeyPem,
const bool beFlag = DEFAULT_BE_FLAG,
const bool bsFlag = DEFAULT_BE_FLAG);
static const QString AAGUID;
@ -110,11 +116,12 @@ private:
const QString& extensions,
const QString& credentialId,
const QByteArray& cborEncodedPublicKey,
const TestingVariables& predefinedVariables = {});
QByteArray buildAuthenticatorData(const QString& rpId, const QString& extensions);
AttestationKeyPair buildCredentialPrivateKey(int alg,
const QString& predefinedFirst = QString(),
const QString& predefinedSecond = QString());
const TestingVariables& testingVariables = {});
QByteArray buildAuthenticatorData(const QString& rpId,
const QString& extensions,
const bool beFlag = DEFAULT_BE_FLAG,
const bool bsFlag = DEFAULT_BE_FLAG);
AttestationKeyPair buildCredentialPrivateKey(int alg, const TestingVariables& testingVariables = {});
QByteArray
buildSignature(const QByteArray& authenticatorData, const QByteArray& clientData, const QString& privateKeyPem);
QJsonObject parseAuthData(const QByteArray& authData) const;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com>
* Copyright (C) 2013 Francois Ferrand
*
@ -774,8 +774,20 @@ QJsonObject BrowserService::showPasskeysAuthenticationPrompt(const QJsonObject&
const auto credentialId = passkeyUtils()->getCredentialIdFromEntry(selectedEntry);
const auto userHandle = selectedEntry->attributes()->value(EntryAttributes::KPEX_PASSKEY_USER_HANDLE);
auto publicKeyCredential =
browserPasskeys()->buildGetPublicKeyCredential(assertionOptions, credentialId, userHandle, privateKeyPem);
// Get BE and BS flags if present
const auto beFlag =
selectedEntry->attributes()->hasKey(EntryAttributes::KPEX_PASSKEY_FLAG_BE)
? selectedEntry->attributes()->value(EntryAttributes::KPEX_PASSKEY_FLAG_BE) == "1"
|| selectedEntry->attributes()->value(EntryAttributes::KPEX_PASSKEY_FLAG_BE) == TRUE_STR
: DEFAULT_BE_FLAG;
const auto bsFlag =
selectedEntry->attributes()->hasKey(EntryAttributes::KPEX_PASSKEY_FLAG_BS)
? selectedEntry->attributes()->value(EntryAttributes::KPEX_PASSKEY_FLAG_BS) == "1"
|| selectedEntry->attributes()->value(EntryAttributes::KPEX_PASSKEY_FLAG_BS) == TRUE_STR
: DEFAULT_BS_FLAG;
auto publicKeyCredential = browserPasskeys()->buildGetPublicKeyCredential(
assertionOptions, credentialId, userHandle, privateKeyPem, beFlag, bsFlag);
if (publicKeyCredential.isEmpty()) {
return getPasskeyError(ERROR_PASSKEYS_UNKNOWN_ERROR);
}
@ -855,6 +867,8 @@ void BrowserService::addPasskeyToEntry(Entry* entry,
entry->attributes()->set(EntryAttributes::KPEX_PASSKEY_PRIVATE_KEY_PEM, privateKey, true);
entry->attributes()->set(EntryAttributes::KPEX_PASSKEY_RELYING_PARTY, rpId);
entry->attributes()->set(EntryAttributes::KPEX_PASSKEY_USER_HANDLE, userHandle, true);
entry->attributes()->set(EntryAttributes::KPEX_PASSKEY_FLAG_BE, "1");
entry->attributes()->set(EntryAttributes::KPEX_PASSKEY_FLAG_BS, "1");
entry->addTag(tr("Passkey"));
entry->endUpdate();
@ -1012,8 +1026,8 @@ QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
}
for (const auto& group : rootGroup->groupsRecursive(true)) {
if (group->isRecycled()
|| group->resolveCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY) == Group::Enable) {
const auto groupOptionHideEntry = group->resolveCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY);
if (group->isRecycled() || groupOptionHideEntry == Group::Enable) {
continue;
}
@ -1028,7 +1042,8 @@ QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
for (auto* entry : group->entries()) {
if (entry->isRecycled()
|| (entry->customData()->contains(BrowserService::OPTION_HIDE_ENTRY)
|| (groupOptionHideEntry == Group::Inherit
&& entry->customData()->contains(BrowserService::OPTION_HIDE_ENTRY)
&& entry->customData()->value(BrowserService::OPTION_HIDE_ENTRY) == TRUE_STR)) {
continue;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -149,7 +149,6 @@ void CustomData::copyDataFrom(const CustomData* other)
m_data = other->m_data;
updateLastModified();
emit reset();
emitModified();
}

View file

@ -1585,6 +1585,7 @@ Entry::PlaceholderType Entry::placeholderType(const QString& placeholder) const
{QStringLiteral("{PASSWORD}"), PlaceholderType::Password},
{QStringLiteral("{NOTES}"), PlaceholderType::Notes},
{QStringLiteral("{TOTP}"), PlaceholderType::Totp},
{QStringLiteral("{TIMEOTP}"), PlaceholderType::Totp},
{QStringLiteral("{URL}"), PlaceholderType::Url},
{QStringLiteral("{UUID}"), PlaceholderType::Uuid},
{QStringLiteral("{URL:RMVSCM}"), PlaceholderType::UrlWithoutScheme},

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
@ -46,6 +46,8 @@ const QString EntryAttributes::KPEX_PASSKEY_RELYING_PARTY = QStringLiteral("KPEX
const QString EntryAttributes::KPEX_PASSKEY_USER_HANDLE = QStringLiteral("KPEX_PASSKEY_USER_HANDLE");
const QString EntryAttributes::KPEX_PASSKEY_PRIVATE_KEY_START = QStringLiteral("-----BEGIN PRIVATE KEY-----");
const QString EntryAttributes::KPEX_PASSKEY_PRIVATE_KEY_END = QStringLiteral("-----END PRIVATE KEY-----");
const QString EntryAttributes::KPEX_PASSKEY_FLAG_BE = QStringLiteral("KPEX_PASSKEY_FLAG_BE");
const QString EntryAttributes::KPEX_PASSKEY_FLAG_BS = QStringLiteral("KPEX_PASSKEY_FLAG_BS");
// For compatibility with StrongBox
const QString EntryAttributes::KPEX_PASSKEY_GENERATED_USER_ID = QStringLiteral("KPEX_PASSKEY_GENERATED_USER_ID");

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
@ -75,6 +75,8 @@ public:
static const QString KPEX_PASSKEY_USER_HANDLE;
static const QString KPEX_PASSKEY_PRIVATE_KEY_START;
static const QString KPEX_PASSKEY_PRIVATE_KEY_END;
static const QString KPEX_PASSKEY_FLAG_BE;
static const QString KPEX_PASSKEY_FLAG_BS;
static bool isDefaultAttribute(const QString& key);
static bool isPasskeyAttribute(const QString& key);

View file

@ -261,6 +261,48 @@ namespace
return entry.take();
}
Group* createGroup(Group* rootGroup, const QString& folderName)
{
Group* currentParentGroup = rootGroup;
Group* result = nullptr;
const auto groups = folderName.split("/", Qt::SkipEmptyParts);
// Returns the group name based on depth
const auto getGroupName = [&](const int depth) {
QString groupName;
for (int i = 0; i < depth + 1; ++i) {
groupName.append((i == 0 ? "" : "/") + groups[i]);
}
return groupName;
};
// Create new group(s) always when the path is not found
for (int i = 0; i < groups.length(); ++i) {
const auto groupName = getGroupName(i);
const auto tempGroup = rootGroup->findGroupByPath(groupName);
if (!tempGroup) {
const auto newGroup = new Group();
newGroup->setName(groups[i]);
newGroup->setUuid(QUuid::createUuid());
newGroup->setParent(currentParentGroup);
currentParentGroup = newGroup;
if (groupName == folderName) {
result = newGroup;
}
continue;
}
if (groupName == folderName) {
result = tempGroup;
}
currentParentGroup = tempGroup;
}
return result;
}
void writeVaultToDatabase(const QJsonObject& vault, QSharedPointer<Database> db)
{
auto folderField = QString("folders");
@ -277,12 +319,12 @@ namespace
// Create groups from folders and store a temporary map of id -> uuid
QMap<QString, Group*> folderMap;
for (const auto& folder : vault.value(folderField).toArray()) {
auto group = new Group();
group->setUuid(QUuid::createUuid());
group->setName(folder.toObject().value("name").toString());
group->setParent(db->rootGroup());
const auto folderId = folder.toObject().value("id").toString();
const auto folderName = folder.toObject().value("name").toString();
folderMap.insert(folder.toObject().value("id").toString(), group);
if (const auto group = createGroup(db->rootGroup(), folderName)) {
folderMap.insert(folderId, group);
}
}
QString folderId;

View file

@ -153,8 +153,6 @@ void Application::bootstrap(const QString& uiLanguage)
{
Bootstrap::bootstrap(uiLanguage);
applyFontSize();
osUtils->registerNativeEventFilter();
MessageBox::initializeButtonDefs();
@ -200,6 +198,7 @@ void Application::applyTheme()
stylesheetFile.close();
}
}
applyFontSize();
}
void Application::applyFontSize()

View file

@ -392,6 +392,9 @@ void EntryPreviewWidget::updateEntryGeneralTab()
m_ui->entryNotesTextEdit->setFont(Font::defaultFont());
}
m_ui->entryNotesTextEdit->setTabStopDistance(
QFontMetrics(m_ui->entryNotesTextEdit->font()).horizontalAdvance(QString(4, ' ')));
m_ui->entryUrlLabel->setRawText(m_currentEntry->displayUrl().toHtmlEscaped());
const QString url = m_currentEntry->url();
if (!url.isEmpty()) {

View file

@ -137,7 +137,6 @@
<widget class="QLabel" name="entryTotpLabel">
<property name="font">
<font>
<pointsize>10</pointsize>
<bold>true</bold>
</font>
</property>
@ -434,9 +433,6 @@
<property name="readOnly">
<bool>true</bool>
</property>
<property name="tabStopDistance">
<double>10.000000000000000</double>
</property>
<property name="blendIn" stdset="0">
<bool>true</bool>
</property>

View file

@ -2031,7 +2031,6 @@ void MainWindow::initViewMenu()
restartApp(tr("You must restart the application to apply this setting. Would you like to restart now?"));
} else {
kpxcApp->applyTheme();
kpxcApp->applyFontSize();
}
});

View file

@ -351,25 +351,31 @@ void EditEntryWidget::updateBrowser()
return;
}
auto changeValue = [&](const QString& option, const bool newValue) {
// If value is false and no customData exists, make no edits
if (!m_customData->hasKey(option) && !newValue) {
return;
}
// If customData exists, set the value
m_customData->set(option, (newValue ? TRUE_STR : FALSE_STR));
};
// Only update the custom data if no group level settings are used (checkbox is enabled)
if (m_browserUi->hideEntryCheckbox->isEnabled()) {
auto hide = m_browserUi->hideEntryCheckbox->isChecked();
m_customData->set(BrowserService::OPTION_HIDE_ENTRY, (hide ? TRUE_STR : FALSE_STR));
changeValue(BrowserService::OPTION_HIDE_ENTRY, m_browserUi->hideEntryCheckbox->isChecked());
}
if (m_browserUi->skipAutoSubmitCheckbox->isEnabled()) {
auto skip = m_browserUi->skipAutoSubmitCheckbox->isChecked();
m_customData->set(BrowserService::OPTION_SKIP_AUTO_SUBMIT, (skip ? TRUE_STR : FALSE_STR));
changeValue(BrowserService::OPTION_SKIP_AUTO_SUBMIT, m_browserUi->skipAutoSubmitCheckbox->isChecked());
}
if (m_browserUi->onlyHttpAuthCheckbox->isEnabled()) {
auto onlyHttpAuth = m_browserUi->onlyHttpAuthCheckbox->isChecked();
m_customData->set(BrowserService::OPTION_ONLY_HTTP_AUTH, (onlyHttpAuth ? TRUE_STR : FALSE_STR));
changeValue(BrowserService::OPTION_ONLY_HTTP_AUTH, m_browserUi->onlyHttpAuthCheckbox->isChecked());
}
if (m_browserUi->notHttpAuthCheckbox->isEnabled()) {
auto notHttpAuth = m_browserUi->notHttpAuthCheckbox->isChecked();
m_customData->set(BrowserService::OPTION_NOT_HTTP_AUTH, (notHttpAuth ? TRUE_STR : FALSE_STR));
changeValue(BrowserService::OPTION_NOT_HTTP_AUTH, m_browserUi->notHttpAuthCheckbox->isChecked());
}
}
@ -943,6 +949,9 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
m_mainUi->notesEdit->setFont(Font::defaultFont());
}
m_mainUi->notesEdit->setTabStopDistance(
QFontMetrics(m_mainUi->notesEdit->font()).horizontalAdvance(QString(4, ' ')));
m_advancedUi->attachmentsWidget->setReadOnly(m_history);
m_advancedUi->addAttributeButton->setEnabled(!m_history);
m_advancedUi->editAttributeButton->setEnabled(false);
@ -1037,55 +1046,26 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
setupBrowser();
}
auto hideEntriesCheckBoxEnabled = true;
auto skipAutoSubmitCheckBoxEnabled = true;
auto onlyHttpAuthCheckBoxEnabled = true;
auto notHttpAuthCheckBoxEnabled = true;
auto hideEntries = false;
auto skipAutoSubmit = false;
auto onlyHttpAuth = false;
auto notHttpAuth = false;
const auto group = m_entry->group();
if (group) {
hideEntries = group->resolveCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY) == Group::Enable;
skipAutoSubmit = group->resolveCustomDataTriState(BrowserService::OPTION_SKIP_AUTO_SUBMIT) == Group::Enable;
onlyHttpAuth = group->resolveCustomDataTriState(BrowserService::OPTION_ONLY_HTTP_AUTH) == Group::Enable;
notHttpAuth = group->resolveCustomDataTriState(BrowserService::OPTION_NOT_HTTP_AUTH) == Group::Enable;
m_browserUi->messageWidget->showMessage(
tr("Some Browser Integration settings are overridden by group settings."), MessageWidget::Information);
m_browserUi->messageWidget->setVisible(false);
hideEntriesCheckBoxEnabled =
group->resolveCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY) == Group::Inherit;
skipAutoSubmitCheckBoxEnabled =
group->resolveCustomDataTriState(BrowserService::OPTION_SKIP_AUTO_SUBMIT) == Group::Inherit;
onlyHttpAuthCheckBoxEnabled =
group->resolveCustomDataTriState(BrowserService::OPTION_ONLY_HTTP_AUTH) == Group::Inherit;
notHttpAuthCheckBoxEnabled =
group->resolveCustomDataTriState(BrowserService::OPTION_NOT_HTTP_AUTH) == Group::Inherit;
}
auto updateCheckBoxValue = [&](QCheckBox* checkBox, const QString& option) {
const auto optionEnabledInGroup = group ? group->resolveBrowserOptionEnabled(option) : false;
const auto optionInherited = group ? group->resolveCustomDataTriState(option) == Group::Inherit : true;
// Show information about group level settings
if (!hideEntriesCheckBoxEnabled || !skipAutoSubmitCheckBoxEnabled || !onlyHttpAuthCheckBoxEnabled
|| !notHttpAuthCheckBoxEnabled) {
m_browserUi->messageWidget->showMessage(
tr("Some Browser Integration settings are overridden by group settings."), MessageWidget::Information);
m_browserUi->messageWidget->setVisible(true);
}
if (!optionInherited) {
m_browserUi->messageWidget->setVisible(true);
}
// Disable checkboxes based on group level settings
updateBrowserIntegrationCheckbox(
m_browserUi->hideEntryCheckbox, hideEntriesCheckBoxEnabled, hideEntries, BrowserService::OPTION_HIDE_ENTRY);
updateBrowserIntegrationCheckbox(m_browserUi->skipAutoSubmitCheckbox,
skipAutoSubmitCheckBoxEnabled,
skipAutoSubmit,
BrowserService::OPTION_SKIP_AUTO_SUBMIT);
updateBrowserIntegrationCheckbox(m_browserUi->onlyHttpAuthCheckbox,
onlyHttpAuthCheckBoxEnabled,
onlyHttpAuth,
BrowserService::OPTION_ONLY_HTTP_AUTH);
updateBrowserIntegrationCheckbox(m_browserUi->notHttpAuthCheckbox,
notHttpAuthCheckBoxEnabled,
notHttpAuth,
BrowserService::OPTION_NOT_HTTP_AUTH);
updateBrowserIntegrationCheckbox(checkBox, optionInherited, optionEnabledInGroup, option);
};
updateCheckBoxValue(m_browserUi->hideEntryCheckbox, BrowserService::OPTION_HIDE_ENTRY);
updateCheckBoxValue(m_browserUi->skipAutoSubmitCheckbox, BrowserService::OPTION_SKIP_AUTO_SUBMIT);
updateCheckBoxValue(m_browserUi->onlyHttpAuthCheckbox, BrowserService::OPTION_ONLY_HTTP_AUTH);
updateCheckBoxValue(m_browserUi->notHttpAuthCheckbox, BrowserService::OPTION_NOT_HTTP_AUTH);
m_browserUi->addURLButton->setEnabled(!m_history);
m_browserUi->removeURLButton->setEnabled(false);
@ -1534,7 +1514,7 @@ void EditEntryWidget::updateAutoTypeEnabled()
m_autoTypeUi->inheritSequenceButton->setEnabled(!m_history && autoTypeEnabled);
m_autoTypeUi->customSequenceButton->setEnabled(!m_history && autoTypeEnabled);
m_autoTypeUi->sequenceEdit->setEnabled(autoTypeEnabled && m_autoTypeUi->customSequenceButton->isChecked());
m_autoTypeUi->openHelpButton->setEnabled(autoTypeEnabled && m_autoTypeUi->customSequenceButton->isChecked());
m_autoTypeUi->openHelpButton->setEnabled(autoTypeEnabled);
m_autoTypeUi->assocView->setEnabled(autoTypeEnabled);
m_autoTypeUi->assocAddButton->setEnabled(!m_history);

View file

@ -90,9 +90,6 @@
</item>
<item>
<widget class="QToolButton" name="openHelpButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Open Auto-Type help webpage</string>
</property>

View file

@ -1,386 +1,383 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EditEntryWidgetMain</class>
<widget class="QScrollArea" name="EditEntryWidgetMain">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>523</height>
</rect>
</property>
<property name="windowTitle">
<string>Edit Entry</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="container">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>523</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>10</number>
</property>
<property name="verticalSpacing">
<number>8</number>
</property>
<item row="0" column="1">
<widget class="QLineEdit" name="titleEdit">
<property name="accessibleName">
<string>Title field</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="usernameLabel">
<property name="text">
<string>&amp;Username:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>usernameComboBox</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="PasswordWidget" name="passwordEdit" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Password field</string>
</property>
</widget>
</item>
<item row="8" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="notesEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="accessibleName">
<string>Notes field</string>
</property>
<property name="tabStopDistance">
<double>10.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QLabel" name="titleLabel">
<property name="text">
<string>&amp;Title:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>titleEdit</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>&amp;Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>passwordEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="usernameComboBox">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Username field</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="TagsEdit" name="tagsList" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Tags list</string>
</property>
</widget>
</item>
<item row="7" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1,0">
<property name="spacing">
<number>8</number>
</property>
<item>
<widget class="QCheckBox" name="expireCheck">
<property name="toolTip">
<string>Toggle expiration</string>
</property>
<property name="accessibleName">
<string>Toggle expiration</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QDateTimeEdit" name="expireDatePicker">
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Expiration field</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="expirePresets">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Expiration Presets</string>
</property>
<property name="accessibleName">
<string>Expiration presets</string>
</property>
<property name="text">
<string>Presets</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QLabel" name="urlLabel">
<property name="text">
<string>UR&amp;L:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>urlEdit</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>8</number>
</property>
<item>
<widget class="URLEdit" name="urlEdit">
<property name="accessibleName">
<string>Url field</string>
</property>
<property name="placeholderText">
<string notr="true">https://example.com</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="fetchFaviconButton">
<property name="toolTip">
<string>Download favicon for URL</string>
</property>
<property name="accessibleName">
<string>Download favicon for URL</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="8" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="notesLabel">
<property name="text">
<string>&amp;Notes:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>notesEdit</cstring>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="topMargin">
<number>6</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>5</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="revealNotesButton">
<property name="toolTip">
<string>Toggle notes visibility</string>
</property>
<property name="accessibleName">
<string>Toggle notes visibility</string>
</property>
<property name="iconSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="5" column="0">
<widget class="QLabel" name="tagsLabel">
<property name="text">
<string>T&amp;ags:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>tagsList</cstring>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="expireLabel">
<property name="text">
<string>&amp;Expires:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>expireCheck</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>TagsEdit</class>
<extends>QWidget</extends>
<header>gui/tag/TagsEdit.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>URLEdit</class>
<extends>QLineEdit</extends>
<header>gui/URLEdit.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>PasswordWidget</class>
<extends>QWidget</extends>
<header>gui/PasswordWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>titleEdit</tabstop>
<tabstop>usernameComboBox</tabstop>
<tabstop>passwordEdit</tabstop>
<tabstop>urlEdit</tabstop>
<tabstop>fetchFaviconButton</tabstop>
<tabstop>tagsList</tabstop>
<tabstop>expireCheck</tabstop>
<tabstop>expireDatePicker</tabstop>
<tabstop>expirePresets</tabstop>
<tabstop>revealNotesButton</tabstop>
<tabstop>notesEdit</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EditEntryWidgetMain</class>
<widget class="QScrollArea" name="EditEntryWidgetMain">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>523</height>
</rect>
</property>
<property name="windowTitle">
<string>Edit Entry</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="container">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>523</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>10</number>
</property>
<property name="verticalSpacing">
<number>8</number>
</property>
<item row="0" column="1">
<widget class="QLineEdit" name="titleEdit">
<property name="accessibleName">
<string>Title field</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="usernameLabel">
<property name="text">
<string>&amp;Username:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>usernameComboBox</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="PasswordWidget" name="passwordEdit" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Password field</string>
</property>
</widget>
</item>
<item row="8" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="notesEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="accessibleName">
<string>Notes field</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QLabel" name="titleLabel">
<property name="text">
<string>&amp;Title:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>titleEdit</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>&amp;Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>passwordEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="usernameComboBox">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Username field</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="TagsEdit" name="tagsList" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Tags list</string>
</property>
</widget>
</item>
<item row="7" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1,0">
<property name="spacing">
<number>8</number>
</property>
<item>
<widget class="QCheckBox" name="expireCheck">
<property name="toolTip">
<string>Toggle expiration</string>
</property>
<property name="accessibleName">
<string>Toggle expiration</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QDateTimeEdit" name="expireDatePicker">
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Expiration field</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="expirePresets">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Expiration Presets</string>
</property>
<property name="accessibleName">
<string>Expiration presets</string>
</property>
<property name="text">
<string>Presets</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QLabel" name="urlLabel">
<property name="text">
<string>UR&amp;L:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>urlEdit</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>8</number>
</property>
<item>
<widget class="URLEdit" name="urlEdit">
<property name="accessibleName">
<string>Url field</string>
</property>
<property name="placeholderText">
<string notr="true">https://example.com</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="fetchFaviconButton">
<property name="toolTip">
<string>Download favicon for URL</string>
</property>
<property name="accessibleName">
<string>Download favicon for URL</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="8" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="notesLabel">
<property name="text">
<string>&amp;Notes:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>notesEdit</cstring>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="topMargin">
<number>6</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>5</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="revealNotesButton">
<property name="toolTip">
<string>Toggle notes visibility</string>
</property>
<property name="accessibleName">
<string>Toggle notes visibility</string>
</property>
<property name="iconSize">
<size>
<width>14</width>
<height>14</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="5" column="0">
<widget class="QLabel" name="tagsLabel">
<property name="text">
<string>T&amp;ags:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>tagsList</cstring>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="expireLabel">
<property name="text">
<string>&amp;Expires:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>expireCheck</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>TagsEdit</class>
<extends>QWidget</extends>
<header>gui/tag/TagsEdit.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>URLEdit</class>
<extends>QLineEdit</extends>
<header>gui/URLEdit.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>PasswordWidget</class>
<extends>QWidget</extends>
<header>gui/PasswordWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>titleEdit</tabstop>
<tabstop>usernameComboBox</tabstop>
<tabstop>passwordEdit</tabstop>
<tabstop>urlEdit</tabstop>
<tabstop>fetchFaviconButton</tabstop>
<tabstop>tagsList</tabstop>
<tabstop>expireCheck</tabstop>
<tabstop>expireDatePicker</tabstop>
<tabstop>expirePresets</tabstop>
<tabstop>revealNotesButton</tabstop>
<tabstop>notesEdit</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View file

@ -27,6 +27,7 @@
#include <QLineEdit>
#include <QMenu>
#include <QMimeData>
#include <QRegExp>
#include <QStandardPaths>
#include <QTemporaryFile>
@ -368,8 +369,9 @@ void EntryAttachmentsWidget::saveSelectedAttachments()
QStringList errors;
for (const QModelIndex& index : indexes) {
const QString filename = m_attachmentsModel->keyByIndex(index);
const QString attachmentPath = saveDir.absoluteFilePath(filename);
QString attachmentKey = m_attachmentsModel->keyByIndex(index);
const QString fileNameSanitized = attachmentKey.replace(QRegExp("[/\\\\]"), "");
const QString attachmentPath = saveDir.absoluteFilePath(fileNameSanitized);
if (QFileInfo::exists(attachmentPath)) {
@ -382,7 +384,7 @@ void EntryAttachmentsWidget::saveSelectedAttachments()
tr("Are you sure you want to overwrite the existing file \"%1\" with the attachment?"));
auto result = MessageBox::question(
this, tr("Confirm overwrite"), questionText.arg(filename), buttons, MessageBox::Cancel);
this, tr("Confirm overwrite"), questionText.arg(fileNameSanitized), buttons, MessageBox::Cancel);
if (result == MessageBox::Skip) {
continue;
@ -392,11 +394,11 @@ void EntryAttachmentsWidget::saveSelectedAttachments()
}
QFile file(attachmentPath);
const QByteArray attachmentData = m_entryAttachments->value(filename);
const QByteArray attachmentData = m_entryAttachments->value(attachmentKey);
const bool saveOk = file.open(QIODevice::WriteOnly) && file.setPermissions(QFile::ReadUser | QFile::WriteUser)
&& file.write(attachmentData) == attachmentData.size();
if (!saveOk) {
errors.append(QString("%1 - %2").arg(filename, file.errorString()));
errors.append(QString("%1 - %2").arg(fileNameSanitized, file.errorString()));
}
}

View file

@ -56,4 +56,7 @@ void TextAttachmentsEditWidget::updateUi()
{
m_ui->attachmentsTextEdit->setPlainText(m_attachment.data);
m_ui->attachmentsTextEdit->setReadOnly(m_mode == attachments::OpenMode::ReadOnly);
m_ui->attachmentsTextEdit->setTabStopDistance(
QFontMetrics(m_ui->attachmentsTextEdit->font()).horizontalAdvance(QString(4, ' ')));
}

View file

@ -57,11 +57,7 @@
</layout>
</item>
<item>
<widget class="QTextEdit" name="attachmentsTextEdit">
<property name="tabStopDistance">
<double>10.000000000000000</double>
</property>
</widget>
<widget class="QTextEdit" name="attachmentsTextEdit"/>
</item>
</layout>
</widget>

View file

@ -99,6 +99,9 @@ void TextAttachmentsPreviewWidget::initTypeCombobox()
// Configure text browser to open external links
m_ui->previewTextBrowser->setOpenExternalLinks(true);
m_ui->previewTextBrowser->setTabStopDistance(
QFontMetrics(m_ui->previewTextBrowser->font()).horizontalAdvance(QString(4, ' ')));
m_ui->typeComboBox->setCurrentIndex(m_ui->typeComboBox->findData(PlainText));
onTypeChanged(m_ui->typeComboBox->currentIndex());

View file

@ -61,11 +61,7 @@
</layout>
</item>
<item>
<widget class="QTextBrowser" name="previewTextBrowser">
<property name="tabStopDistance">
<double>10.000000000000000</double>
</property>
</widget>
<widget class="QTextBrowser" name="previewTextBrowser"/>
</item>
</layout>
</widget>

View file

@ -121,8 +121,6 @@ void DarkStyle::polish(QWidget* widget)
palette.setColor(QPalette::Inactive, QPalette::Window, QRgb(0x2D2D2D));
palette.setColor(QPalette::Disabled, QPalette::Window, QRgb(0x2D2D2D));
}
#elif defined(Q_OS_WIN)
palette.setColor(QPalette::All, QPalette::Window, QRgb(0x2F2F30));
#else
palette.setColor(QPalette::Active, QPalette::Window, QRgb(0x2F2F30));
palette.setColor(QPalette::Inactive, QPalette::Window, QRgb(0x313133));

View file

@ -121,8 +121,6 @@ void LightStyle::polish(QWidget* widget)
palette.setColor(QPalette::Inactive, QPalette::Window, QRgb(0xF5F5F5));
palette.setColor(QPalette::Disabled, QPalette::Window, QRgb(0xF5F5F5));
}
#elif defined(Q_OS_WIN)
palette.setColor(QPalette::All, QPalette::Window, QRgb(0xFFFFFF));
#else
palette.setColor(QPalette::Active, QPalette::Window, QRgb(0xEFF0F1));
palette.setColor(QPalette::Inactive, QPalette::Window, QRgb(0xEFF0F1));

View file

@ -53,6 +53,14 @@ int main(int argc, char** argv)
{
QT_REQUIRE_VERSION(argc, argv, QT_VERSION_STR)
#ifdef Q_OS_WIN
// Set OPENSSL_* variables to an invalid location to prevent DLL injection via openssl.cnf.
// vcpkg by default hard-codes this to its packages location, which may be user-writable.
qputenv("OPENSSL_CONF", "::");
qputenv("OPENSSL_MODULES", "::");
qputenv("OPENSSL_ENGINES", "::");
#endif
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) && defined(Q_OS_WIN)

View file

@ -216,7 +216,7 @@ add_unit_test(NAME testdatabase SOURCES TestDatabase.cpp
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testtools SOURCES TestTools.cpp
LIBS ${TEST_LIBRARIES})
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testconfig SOURCES TestConfig.cpp
LIBS testsupport ${TEST_LIBRARIES})

View file

@ -19,6 +19,7 @@
#include "TestAutoType.h"
#include <QPluginLoader>
#include <QRegularExpression>
#include <QTest>
#include "autotype/AutoType.h"
@ -473,7 +474,7 @@ void TestAutoType::testAutoTypeEmptyWindowAssociation()
QVERIFY(assoc.isEmpty());
}
void TestAutoType::testAutoTypeTotpDelay()
void TestAutoType::testAutoTypeTotp()
{
// Get the TOTP time step in milliseconds
auto totpStep = m_entry1->totpSettings()->step * 1000;
@ -492,4 +493,24 @@ void TestAutoType::testAutoTypeTotpDelay()
QString("Typed TOTP (%1) should differ from current TOTP (%2) due to delay")
.arg(totpParts[0], totpParts[1])
.toLatin1());
m_test->clearActions();
// Test TIMEOTP placeholder (KeePass2 Compatibility)
m_autoType->performAutoTypeWithSequence(m_entry1, "{TIMEOTP}");
typedChars = m_test->actionChars();
QCOMPARE(typedChars.size(), m_entry1->totpSettings()->digits);
// Verify that the typedchars are all numbers
QRegularExpression re("^\\d+$");
QVERIFY(re.match(typedChars).hasMatch());
m_test->clearActions();
// Test that TIMEOTP also works as an entry placeholder
m_entry1->setPassword("{TIMEOTP}");
m_autoType->performAutoTypeWithSequence(m_entry1, "{PASSWORD}");
typedChars = m_test->actionChars();
QCOMPARE(typedChars.size(), m_entry1->totpSettings()->digits);
// Verify that the typedchars are all numbers
QVERIFY(re.match(typedChars).hasMatch());
}

View file

@ -52,7 +52,7 @@ private slots:
void testAutoTypeSyntaxChecks();
void testAutoTypeEffectiveSequences();
void testAutoTypeEmptyWindowAssociation();
void testAutoTypeTotpDelay();
void testAutoTypeTotp();
private:
AutoTypePlatformInterface* m_platform;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -854,3 +854,56 @@ void TestBrowser::testRestrictBrowserKey()
QCOMPARE(sorted[2]->url(), QString("https://example.com/2"));
QCOMPARE(sorted[3]->url(), QString("https://example.com/0"));
}
void TestBrowser::testHideEntry()
{
const auto db = QSharedPointer<Database>::create();
auto* root = db->rootGroup();
const auto entry = new Entry();
entry->setGroup(root);
entry->beginUpdate();
entry->setUrl(QString("https://github.com/"));
entry->setUsername(QString("User 1"));
entry->setUuid(QUuid::createUuid());
entry->setTitle(QString("Name_ 1"));
entry->endUpdate();
// Entry should be found normally
auto result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 1);
QCOMPARE(result[0]->url(), QString("https://github.com/"));
// Hide entry from entry settings, group setting is inherited
entry->customData()->set(BrowserService::OPTION_HIDE_ENTRY, TRUE_STR);
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 0);
// Disable hide from group settings, entry should be found
root->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Disable);
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 1);
// Enable hide from group setting, entry should not be found
root->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Enable);
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 0);
// Remove the hide settings from entry, return group setting to inherit
entry->customData()->set(BrowserService::OPTION_HIDE_ENTRY, FALSE_STR);
root->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Inherit);
// Entry should be found again
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 1);
// Enable hide from group setting, entry should not be found
root->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Enable);
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 0);
// Disable hide from group settings, entry should be found
root->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Disable);
result = m_browserService->searchEntries(db, "https://github.com", "https://github.com/session");
QCOMPARE(result.length(), 1);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -51,6 +51,7 @@ private slots:
void testBestMatchingCredentials();
void testBestMatchingWithAdditionalURLs();
void testRestrictBrowserKey();
void testHideEntry();
private:
QList<Entry*> createEntries(QStringList& urls, Group* root, bool additionalUrl = false) const;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -327,6 +327,106 @@ void TestImports::testBitwardenPasskey()
QStringLiteral("aTFtdmFnOHYtS2dxVEJ0by1rSFpLWGg0enlTVC1iUVJReDZ5czJXa3c2aw"));
}
void TestImports::testBitwardenNestedFolders()
{
auto bitwardenPath =
QStringLiteral("%1/%2").arg(KEEPASSX_TEST_DATA_DIR, QStringLiteral("/bitwarden_nested_export.json"));
BitwardenReader reader;
auto db = reader.convert(bitwardenPath);
QVERIFY2(!reader.hasError(), qPrintable(reader.errorString()));
QVERIFY(db);
/* The group tree should be:
/
- Example
- Test Authentication
/SecondTest
- GMail entry
/Test
- Gmail test 2
/Subfolder
- Webauthn.io test 2
/Subfolder
- Test Account
/SubFolder
- WebAuthn.io test
/AnotherSubFolder
- Another test account
- Webauthn.io test 3
*/
// Verify groups
auto secondTestGroup = db->rootGroup()->findGroupByPath("/SecondTest");
QVERIFY(secondTestGroup);
auto testGroup = db->rootGroup()->findGroupByPath("/Test");
QVERIFY(testGroup);
auto testSubfolderLowercaseGroup = db->rootGroup()->findGroupByPath("/Test/Subfolder");
QVERIFY(testSubfolderLowercaseGroup);
auto testSubFolderGroup = db->rootGroup()->findGroupByPath("/Test/SubFolder");
QVERIFY(testSubFolderGroup);
auto longGroup = db->rootGroup()->findGroupByPath("/Test/SubFolder/AnotherSubFolder");
QVERIFY(longGroup);
// Verify entries and the groups they belong to
// GMail entry
auto entry = db->rootGroup()->findEntryByPath("/SecondTest/GMail entry");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("example@gmail.com"));
QCOMPARE(entry->group(), secondTestGroup);
// Test Authentication
entry = db->rootGroup()->findEntryByPath("/Test Authentication");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("test@testauthentication.com"));
QCOMPARE(entry->group(), db->rootGroup());
// Gmail test 2
entry = db->rootGroup()->findEntryByPath("/Test/Gmail test 2");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("example2@gmail.com"));
QCOMPARE(entry->group(), testGroup);
// Example
entry = db->rootGroup()->findEntryByPath("/Example");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("user@example.com"));
QCOMPARE(entry->group(), db->rootGroup());
// WebAuthn.io test
entry = db->rootGroup()->findEntryByPath("/Test/SubFolder/WebAuthn.io test");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("testUser"));
QCOMPARE(entry->group(), testSubFolderGroup);
// Webauthn.io test 2
entry = db->rootGroup()->findEntryByPath("/Test/Subfolder/Webauthn.io test 2");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("testUser2"));
QCOMPARE(entry->group(), testSubfolderLowercaseGroup);
// Webauthn.io test 3
entry = db->rootGroup()->findEntryByPath("/Test/SubFolder/AnotherSubFolder/Webauthn.io test 3");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("testUser3"));
QCOMPARE(entry->group(), longGroup);
// Test Account
// There are two groups with an identical name. The group for this entry should not be the same group with the
// Webauthn.io test 2, but we cannot distinguish these.
entry = db->rootGroup()->findEntryByPath("/Test/Subfolder/Test Account");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("test-account"));
QCOMPARE(entry->group(), testSubfolderLowercaseGroup);
// Another test account
entry = db->rootGroup()->findEntryByPath("/Test/SubFolder/AnotherSubFolder/Another test account");
QVERIFY(entry);
QCOMPARE(entry->username(), QStringLiteral("anotherUser"));
QCOMPARE(entry->group(), longGroup);
}
void TestImports::testProtonPass()
{
auto protonPassPath =

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -31,6 +31,7 @@ private slots:
void testBitwarden();
void testBitwardenEncrypted();
void testBitwardenPasskey();
void testBitwardenNestedFolders();
void testProtonPass();
};

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2026 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -77,7 +77,7 @@ const QString PublicKeyCredential = R"(
"id": "yrzFJ5lwcpTwYMOdXSmxF5b5cYQlqBMzbbU_d-oFLO8",
"rawId": "cabcc52799707294f060c39d5d29b11796f9718425a813336db53f77ea052cef",
"response": {
"attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YVikdKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBFAAAAAP2xQbJdhEQ-ijVGmMIFpQIAIMq8xSeZcHKU8GDDnV0psReW-XGEJagTM221P3fqBSzvpQECAyYgASFYIAbsrzRbYpFhbRlZA6ZQKsoxxJWoaeXwh-XUuDLNCIXdIlgg4u5_6Q8O6R0Hg0oDCdtCJLEL0yX_GDLhU5m3HUIE54M",
"attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YVikdKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvBdAAAAAP2xQbJdhEQ-ijVGmMIFpQIAIMq8xSeZcHKU8GDDnV0psReW-XGEJagTM221P3fqBSzvpQECAyYgASFYIHK1iVimeR02UYipyiEKrKhhfhJRMew8EbDWGKtMZ2wUIlggbtZ70X11SLx17QFDWVAR3_qqk5OqrRS--Whc7hyw9YU",
"clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoibFZlSHpWeFdzcjhNUXhNa1pGMHRpNkZYaGRnTWxqcUt6Z0EtcV96azJNbmlpM2VKNDdWRjk3c3FVb1lrdFZDODVXQVoxdUlBU20tYV9sREZad3NMZnciLCJvcmlnaW4iOiJodHRwczovL3dlYmF1dGhuLmlvIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ"
},
"type": "public-key"
@ -185,11 +185,13 @@ void TestPasskeys::testDecodeResponseData()
QCOMPARE(authData["rpIdHash"].toString(), QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvA"));
QCOMPARE(flags["AT"], true);
QCOMPARE(flags["UP"], true);
QCOMPARE(flags["BE"], true);
QCOMPARE(flags["BS"], true);
QCOMPARE(publicKey["1"], 2);
QCOMPARE(publicKey["3"], -7);
QCOMPARE(publicKey["-1"], 1);
QCOMPARE(publicKey["-2"], QString("BuyvNFtikWFtGVkDplAqyjHElahp5fCH5dS4Ms0Ihd0"));
QCOMPARE(publicKey["-3"], QString("4u5_6Q8O6R0Hg0oDCdtCJLEL0yX_GDLhU5m3HUIE54M"));
QCOMPARE(publicKey["-2"], QString("crWJWKZ5HTZRiKnKIQqsqGF-ElEx7DwRsNYYq0xnbBQ"));
QCOMPARE(publicKey["-3"], QString("btZ70X11SLx17QFDWVAR3_qqk5OqrRS--Whc7hyw9YU"));
}
void TestPasskeys::testLoadingECPrivateKeyFromPem()
@ -276,23 +278,27 @@ void TestPasskeys::testCreatingAttestationObjectWithEC()
auto rpIdHash = browserMessageBuilder()->getSha256HashAsBase64(QString("webauthn.io"));
QCOMPARE(rpIdHash, QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvA"));
TestingVariables testingVariables = {id, predefinedFirst, predefinedSecond};
TestingVariables testingVariables = {id, predefinedFirst, predefinedSecond, QString()};
const auto alg = browserPasskeys()->getAlgorithmFromPublicKey(credentialCreationOptions);
const auto credentialPrivateKey =
browserPasskeys()->buildCredentialPrivateKey(alg, predefinedFirst, predefinedSecond);
const auto credentialPrivateKey = browserPasskeys()->buildCredentialPrivateKey(alg, testingVariables);
auto result = browserPasskeys()->buildAttestationObject(
credentialCreationOptions, "", id, credentialPrivateKey.cborEncodedPublicKey, testingVariables);
QCOMPARE(
result,
QString("\xA3"
"cfmtdnonegattStmt\xA0hauthDataX\xA4t\xA6\xEA\x92\x13\xC9\x9C/t\xB2$\x92\xB3 \xCF@&*\x94\xC1\xA9P\xA0"
"9\x7F)%\x0B`\x84\x1E\xF0"
"E\x00\x00\x00\x01\x01\x02\x03\x04\x05\x06\x07\b\x01\x02\x03\x04\x05\x06\x07\b\x00 \x8B\xB0\xCA"
"6\x17\xD6\xDE\x01\x11|\xEA\x94\r\xA0R\xC0\x80_\xF3r\xFBr\xB5\x02\x03:"
"\xBAr\x0Fi\x81\xFE\xA5\x01\x02\x03& \x01!X "
"e\xE2\xF2\x1F:cq\xD3G\xEA\xE0\xF7\x1F\xCF\xFA\\\xABO\xF6\x86\x88\x80\t\xAE\x81\x8BT\xB2\x9B\x15\x85~"
"\"X \\\x8E\x1E@\xDB\x97T-\xF8\x9B\xB0\xAD"
"5\xDC\x12^\xC3\x95\x05\xC6\xDF^\x03\xCB\xB4Q\x91\xFF|\xDB\x94\xB7"));
"9\x7F)%\x0B`\x84\x1E\xF0]\x00\x00\x00\x00\xFD\xB1"
"A\xB2]\x84"
"D>\x8A"
"5F\x98\xC2\x05\xA5\x02\x00 \xCA\xBC\xC5'\x99pr\x94\xF0`\xC3\x9D])\xB1\x17\x96\xF9q\x84%\xA8\x13"
"3m\xB5?w\xEA\x05,\xEF\xA5\x01\x02\x03& \x01!X \x06\xEC\xAF"
"4[b\x91"
"am\x19Y\x03\xA6P*\xCA"
"1\xC4\x95\xA8i\xE5\xF0\x87\xE5\xD4\xB8"
"2\xCD\b\x85\xDD\"X \xE2\xEE\x7F\xE9\x0F\x0E\xE9\x1D\x07\x83J\x03\t\xDB"
"B$\xB1\x0B\xD3%\xFF\x18"
"2\xE1S\x99\xB7\x1D"
"B\x04\xE7\x83"));
// Double check that the result can be decoded
BrowserCbor browserCbor;
@ -313,6 +319,8 @@ void TestPasskeys::testCreatingAttestationObjectWithEC()
QCOMPARE(authData["rpIdHash"].toString(), QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvA"));
QCOMPARE(flags["AT"], true);
QCOMPARE(flags["UP"], true);
QCOMPARE(flags["BE"], true);
QCOMPARE(flags["BS"], true);
QCOMPARE(publicKey["1"], WebAuthnCoseKeyType::EC2);
QCOMPARE(publicKey["3"], WebAuthnAlgorithms::ES256);
QCOMPARE(publicKey["-1"], 1);
@ -344,10 +352,9 @@ void TestPasskeys::testCreatingAttestationObjectWithRSA()
auto rpIdHash = browserMessageBuilder()->getSha256HashAsBase64(QString("webauthn.io"));
QCOMPARE(rpIdHash, QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvA"));
TestingVariables testingVariables = {id, predefinedModulus, predefinedExponent};
TestingVariables testingVariables = {id, predefinedModulus, predefinedExponent, QString()};
const auto alg = browserPasskeys()->getAlgorithmFromPublicKey(credentialCreationOptions);
auto credentialPrivateKey =
browserPasskeys()->buildCredentialPrivateKey(alg, predefinedModulus, predefinedExponent);
auto credentialPrivateKey = browserPasskeys()->buildCredentialPrivateKey(alg, testingVariables);
auto result = browserPasskeys()->buildAttestationObject(
credentialCreationOptions, "", id, credentialPrivateKey.cborEncodedPublicKey, testingVariables);
@ -370,6 +377,8 @@ void TestPasskeys::testCreatingAttestationObjectWithRSA()
QCOMPARE(authData["rpIdHash"].toString(), QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvA"));
QCOMPARE(flags["AT"], true);
QCOMPARE(flags["UP"], true);
QCOMPARE(flags["BE"], true);
QCOMPARE(flags["BS"], true);
QCOMPARE(publicKey["1"], WebAuthnCoseKeyType::RSA);
QCOMPARE(publicKey["3"], WebAuthnAlgorithms::RS256);
QCOMPARE(publicKey["-1"], predefinedModulus);
@ -380,8 +389,7 @@ void TestPasskeys::testRegister()
{
// Predefined values for a desired outcome
const auto predefinedId = QString("yrzFJ5lwcpTwYMOdXSmxF5b5cYQlqBMzbbU_d-oFLO8");
const auto predefinedX = QString("BuyvNFtikWFtGVkDplAqyjHElahp5fCH5dS4Ms0Ihd0");
const auto predefinedY = QString("4u5_6Q8O6R0Hg0oDCdtCJLEL0yX_GDLhU5m3HUIE54M");
const auto predefinedData = QString("0x4B0E8AB07B1E62CCD4CB7B9D5BC9DE7B6EED7A3C8A3D466DB12897755E3D7E6D");
const auto origin = QString("https://webauthn.io");
const auto testDataPublicKey = browserMessageBuilder()->getJsonObject(PublicKeyCredential.toUtf8());
const auto testDataResponse = testDataPublicKey["response"];
@ -392,7 +400,7 @@ void TestPasskeys::testRegister()
publicKeyCredentialOptions, origin, &credentialCreationOptions);
QVERIFY(creationResult == 0);
TestingVariables testingVariables = {predefinedId, predefinedX, predefinedY};
TestingVariables testingVariables = {predefinedId, QString(), QString(), predefinedData};
auto result = browserPasskeys()->buildRegisterPublicKeyCredential(credentialCreationOptions, testingVariables);
auto publicKeyCredential = result.response;
QCOMPARE(publicKeyCredential["type"], QString("public-key"));
@ -402,6 +410,9 @@ void TestPasskeys::testRegister()
auto response = publicKeyCredential["response"].toObject();
auto attestationObject = response["attestationObject"].toString();
auto clientDataJson = response["clientDataJSON"].toString();
QCOMPARE(response["publicKey"],
QString("MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcrWJWKZ5HTZRiKnKIQqsqGF-"
"ElEx7DwRsNYYq0xnbBRu1nvRfXVIvHXtAUNZUBHf-qqTk6qtFL75aFzuHLD1hQ"));
QCOMPARE(attestationObject, testDataResponse["attestationObject"].toString());
// Parse clientDataJSON
@ -438,14 +449,14 @@ void TestPasskeys::testGet()
QCOMPARE(publicKeyCredential["id"].toString(), id);
auto response = publicKeyCredential["response"].toObject();
QCOMPARE(response["authenticatorData"].toString(), QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvAFAAAAAA"));
QCOMPARE(response["authenticatorData"].toString(), QString("dKbqkhPJnC90siSSsyDPQCYqlMGpUKA5fyklC2CEHvAdAAAAAA"));
QCOMPARE(response["clientDataJSON"].toString(),
QString("eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiOXozNnZUZlFUTDk1TGY3V25aZ3l0ZTdvaEdlRi1YUmlMeGtML"
"Ux1R1Uxem9wUm1NSVVBMUxWd3pHcHlJbTFmT0JuMVFuUmEwUUgyN0FEQWFKR0h5c1EiLCJvcmlnaW4iOiJodHRwczovL3dlYm"
"F1dGhuLmlvIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ"));
QCOMPARE(
response["signature"].toString(),
QString("MEYCIQCpbDaYJ4b2ofqWBxfRNbH3XCpsyao7Iui5lVuJRU9HIQIhAPl5moNZgJu5zmurkKK_P900Ct6wd3ahVIqCEqTeeRdE"));
QString("MEUCIQCvg3nXO2fiNK9ockxscgPtoM9_u6ERaW2-F1L99YasOAIgNhYOjPJyKJ-W8roV531kC59ss1USas7jy8TfRnbJLtg"));
auto clientDataJson = response["clientDataJSON"].toString();
auto clientDataByteArray = browserMessageBuilder()->getArrayFromBase64(clientDataJson);

View file

@ -19,6 +19,7 @@
#include "core/Clock.h"
#include "core/Tools.h"
#include "mock/MockClock.h"
#include <QFileInfo>
#include <QRegularExpression>
@ -33,8 +34,23 @@ namespace
{
return wholes + QLocale().decimalPoint() + fractions + " " + unit;
}
MockClock* s_clock = nullptr;
} // namespace
void TestTools::initTestCase()
{
Q_ASSERT(s_clock == nullptr);
s_clock = new MockClock(2026, 3, 8, 21, 45, 05);
MockClock::setup(s_clock);
}
void TestTools::cleanupTestCase()
{
MockClock::teardown();
s_clock = nullptr;
}
void TestTools::testHumanReadableFileSize()
{
constexpr auto kibibyte = 1024u;

View file

@ -24,6 +24,8 @@ class TestTools : public QObject
{
Q_OBJECT
private slots:
void initTestCase();
void cleanupTestCase();
void testHumanReadableFileSize();
void testIsHex();
void testIsBase64();

View file

@ -0,0 +1,249 @@
{
"encrypted": false,
"folders": [
{
"id": "53f3c6e7-a167-47e2-91bb-b3f900a377a3",
"name": "SecondTest"
},
{
"id": "14f22922-b8ed-4e9c-814b-b3f900a36a92",
"name": "Test"
},
{
"id": "da442766-39b4-4fb1-a2f3-b3f900a3a36d",
"name": "Test/Subfolder"
},
{
"id": "0504d89b-00aa-41a5-9355-b3f900a3b43f",
"name": "Test/Subfolder"
},
{
"id": "c96cf0e9-fd44-4a7e-9619-b3f900a58e59",
"name": "Test/SubFolder"
},
{
"id": "5d262faf-329d-4197-9e8d-b3f900a3934c",
"name": "Test/SubFolder/AnotherSubFolder"
}
],
"items": [
{
"passwordHistory": [],
"revisionDate": "2026-02-22T09:57:23.033Z",
"creationDate": "2026-02-17T16:55:23.210Z",
"id": "6b154a7d-4b62-44aa-ae0d-b3f40116e266",
"folderId": "53f3c6e7-a167-47e2-91bb-b3f900a377a3",
"type": 1,
"reprompt": 0,
"name": "GMail entry",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://accounts.google.com"
}
],
"fido2Credentials": [],
"username": "example@gmail.com",
"password": "examplePassword",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-20T17:45:32.670Z",
"creationDate": "2026-02-20T17:45:32.670Z",
"id": "6ccafb74-ecab-482f-88b2-b3f70124a91b",
"type": 1,
"reprompt": 0,
"name": "Test Authentication",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://testauthentication.com/login"
}
],
"fido2Credentials": [],
"username": "test@testauthentication.com",
"password": "testPassword",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-22T09:57:15.540Z",
"creationDate": "2026-02-06T19:22:48.860Z",
"id": "a9f00893-346e-4be6-ac4e-b3e9013f6065",
"folderId": "14f22922-b8ed-4e9c-814b-b3f900a36a92",
"type": 1,
"reprompt": 0,
"name": "Gmail test 2",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://accounts.google.com"
}
],
"fido2Credentials": [],
"username": "example2@gmail.com",
"password": "examplePassword2",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-09T13:15:16.370Z",
"creationDate": "2026-02-09T13:15:16.113Z",
"id": "b375fe89-756a-41be-bcec-b3ec00da6d55",
"type": 1,
"reprompt": 0,
"name": "Example",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://www.example.com/"
}
],
"username": "user@example.com",
"password": "examplePassword",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-22T10:03:05.596Z",
"creationDate": "2026-02-09T13:15:45.020Z",
"id": "b42284e2-a103-4dd0-982c-b3ec00da8f36",
"folderId": "c96cf0e9-fd44-4a7e-9619-b3f900a58e59",
"type": 1,
"reprompt": 0,
"name": "WebAuthn.io test",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://webauthn.io/"
}
],
"username": "testUser",
"password": "testPassword",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-22T09:56:58.923Z",
"creationDate": "2024-10-23T16:38:08.606Z",
"id": "a8e579f0-98c2-4ac9-a126-b212011225f8",
"folderId": "da442766-39b4-4fb1-a2f3-b3f900a3a36d",
"type": 1,
"reprompt": 0,
"name": "Webauthn.io test 2",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://webauthn.io/"
}
],
"username": "testUser2",
"password": "testPassword2",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-22T09:56:46.026Z",
"creationDate": "2025-10-29T06:13:55.333Z",
"id": "a88363cf-9fea-43d8-a3dd-b3850066b36a",
"folderId": "5d262faf-329d-4197-9e8d-b3f900a3934c",
"type": 1,
"reprompt": 0,
"name": "Webauthn.io test 3",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://webauthn.io/"
}
],
"username": "testUser3",
"password": "testPassword3",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2025-09-12T16:25:15.850Z",
"creationDate": "2025-09-12T16:25:15.850Z",
"id": "d2946603-1bfc-4eee-8805-b356010e9c65",
"folderId": "0504d89b-00aa-41a5-9355-b3f900a3b43f",
"type": 1,
"reprompt": 0,
"name": "Test Account",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://testsite.com/"
}
],
"fido2Credentials": [],
"username": "test-account",
"password": "test",
"totp": null
},
"collectionIds": null
},
{
"passwordHistory": [],
"revisionDate": "2026-02-22T09:56:52.673Z",
"creationDate": "2024-10-23T19:17:45.433Z",
"id": "4e3b570e-3ead-4557-b5be-b212013dfcd0",
"folderId": "5d262faf-329d-4197-9e8d-b3f900a3934c",
"type": 1,
"reprompt": 0,
"name": "Another test account",
"notes": null,
"favorite": false,
"fields": [],
"login": {
"uris": [
{
"uri": "https://anothertestsite.org/"
}
],
"username": "anotherUser",
"password": "anotherPassword",
"totp": null
},
"collectionIds": null
}
]
}

View file

@ -346,8 +346,8 @@ void TestGui::testMergeDatabase()
fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx"));
triggerAction("actionDatabaseMerge");
QTRY_COMPARE(QApplication::focusWidget()->objectName(), QString("passwordEdit"));
auto* editPasswordMerge = QApplication::focusWidget();
QWidget* editPasswordMerge;
QTRY_VERIFY((editPasswordMerge = QApplication::focusWidget()) && editPasswordMerge->objectName() == "passwordEdit");
QVERIFY(editPasswordMerge->isVisible());
QTest::keyClicks(editPasswordMerge, "a");
@ -1931,18 +1931,28 @@ void TestGui::testTrayRestoreHide()
trayIcon->activated(QSystemTrayIcon::Trigger);
QTRY_VERIFY(m_mainWindow->isVisible());
// Wait out window hide grace period before triggering tray icon again
int gracePeriod = 250;
#ifdef Q_OS_WIN
// Windows requires a shorter grace period
gracePeriod = 50;
#endif
Tools::wait(gracePeriod);
trayIcon->activated(QSystemTrayIcon::Trigger);
QTRY_VERIFY(!m_mainWindow->isVisible());
trayIcon->activated(QSystemTrayIcon::MiddleClick);
QTRY_VERIFY(m_mainWindow->isVisible());
Tools::wait(gracePeriod);
trayIcon->activated(QSystemTrayIcon::MiddleClick);
QTRY_VERIFY(!m_mainWindow->isVisible());
trayIcon->activated(QSystemTrayIcon::DoubleClick);
QTRY_VERIFY(m_mainWindow->isVisible());
Tools::wait(gracePeriod);
trayIcon->activated(QSystemTrayIcon::DoubleClick);
QTRY_VERIFY(!m_mainWindow->isVisible());

View file

@ -43,10 +43,7 @@ void TestImageAttachmentsWidget::testFitInView()
auto zoomFactor = m_imageAttachmentsView->transform();
m_widget->setMinimumSize(m_widget->size() + QSize{100, 100});
QCoreApplication::processEvents();
QVERIFY(zoomFactor != m_imageAttachmentsView->transform());
QTRY_VERIFY(zoomFactor != m_imageAttachmentsView->transform());
}
void TestImageAttachmentsWidget::testZoomCombobox()
@ -56,10 +53,7 @@ void TestImageAttachmentsWidget::testZoomCombobox()
QVERIFY(index != -1);
m_zoomCombobox->setCurrentIndex(index);
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(zoom, zoom));
QTRY_COMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(zoom, zoom));
}
}
@ -67,10 +61,7 @@ void TestImageAttachmentsWidget::testEditZoomCombobox()
{
for (double i = 0.25; i < 5; i += 0.25) {
m_zoomCombobox->setCurrentText(QString::number(i * 100));
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
QTRY_COMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
}
}
@ -79,19 +70,13 @@ void TestImageAttachmentsWidget::testEditWithPercentZoomCombobox()
// Example 100 %
for (double i = 0.25; i < 5; i += 0.25) {
m_zoomCombobox->setCurrentText(QString("%1 %").arg(i * 100));
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
QTRY_COMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
}
// Example 100%
for (double i = 0.25; i < 5; i += 0.25) {
m_zoomCombobox->setCurrentText(QString("%1%").arg(i * 100));
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
QTRY_COMPARE(m_imageAttachmentsView->transform(), QTransform::fromScale(i, i));
}
}
@ -108,10 +93,7 @@ void TestImageAttachmentsWidget::testInvalidValueZoomCombobox()
for (const auto& invalidValue : {"Help", "3,4", "", ".", "% 100"}) {
m_zoomCombobox->setCurrentText(invalidValue);
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), expectedTransform);
QTRY_COMPARE(m_imageAttachmentsView->transform(), expectedTransform);
}
}
@ -208,10 +190,7 @@ void TestImageAttachmentsWidget::testZoomLowerBound()
true);
QCoreApplication::sendEvent(m_imageAttachmentsView->viewport(), &event);
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), expectTransform);
QTRY_COMPARE(m_imageAttachmentsView->transform(), expectTransform);
}
void TestImageAttachmentsWidget::testZoomUpperBound()
@ -237,8 +216,5 @@ void TestImageAttachmentsWidget::testZoomUpperBound()
true);
QCoreApplication::sendEvent(m_imageAttachmentsView->viewport(), &event);
QCoreApplication::processEvents();
QCOMPARE(m_imageAttachmentsView->transform(), expectTransform);
QTRY_COMPARE(m_imageAttachmentsView->transform(), expectTransform);
}

View file

@ -1,70 +0,0 @@
#!/usr/bin/env python3
from collections import defaultdict
import json
import sys
from pathlib import Path
from urllib import request
txrc = Path.home() / '.transifexrc'
if not txrc.exists():
print('No Transifex config found. Run tx init first.')
sys.exit(1)
org = 'o:keepassxc'
proj = f'{org}:p:keepassxc'
resource = f'{proj}:r:share-translations-keepassxc-en-ts--master'
token = [l for l in open(txrc, 'r') if l.startswith('token')][0].split('=', 1)[1].strip()
member_blacklist = ['u:droidmonkey', 'u:phoerious']
def get_url(url):
req = request.Request(url)
req.add_header('Content-Type', 'application/vnd.api+json')
req.add_header('Authorization', f'Bearer {token}')
with request.urlopen(req) as resp:
return json.load(resp)
print('Fetching languages...', file=sys.stderr)
languages_json = get_url(f'https://rest.api.transifex.com/projects/{proj}/languages')
languages = {}
for lang in languages_json['data']:
languages[lang['id']] = lang['attributes']['name']
print('Fetching language stats...', file=sys.stderr)
language_stats_json = get_url('https://rest.api.transifex.com/resource_language_stats?'
f'filter[project]={proj}&filter[resource]={resource}')
completion = {}
for stat in language_stats_json['data']:
completion = stat['attributes']['translated_strings'] / stat['attributes']['total_strings']
if completion < .6:
languages.pop(stat['relationships']['language']['data']['id'])
print('Fetching language members...', end='', file=sys.stderr)
members_json = get_url(f'https://rest.api.transifex.com/team_memberships?filter[organization]={org}')
members = defaultdict(set)
for member in members_json['data']:
print('.', end='', file=sys.stderr)
if member['relationships']['user']['data']['id'] in member_blacklist:
continue
lid = member['relationships']['language']['data']['id']
if lid not in languages:
continue
user = get_url(member['relationships']['user']['links']['related'])['data']['attributes']['username']
members[lid].add(user)
print(file=sys.stderr)
print('<ul>')
for lang in sorted(languages, key=lambda x: languages[x]):
if not members[lang]:
continue
lines = [f' <li><strong>{languages[lang]}:</strong> ']
for i, m in enumerate(sorted(members[lang], key=lambda x: x.lower())):
if len(lines[-1]) + len(m) >= 120:
lines.append(' ')
lines[-1] += m
if i < len(members[lang]) - 1:
lines[-1] += ', '
lines[-1] += '</li>'
print('\n'.join(lines))
print('</ul>')

View file

@ -1,7 +1,7 @@
{
"name": "keepassxc",
"version-string": "2.7.11",
"builtin-baseline": "dfb72f61c5a066ab75cd0bdcb2e007228bfc3270",
"version-string": "2.7.12",
"builtin-baseline": "66c0373dc7fca549e5803087b9487edfe3aca0a1",
"dependencies": [
{
"name": "argon2",