From 790fd62f90f4550dea4e3e1a6573c70ad735a2a2 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Sat, 30 Mar 2019 12:53:40 +0100 Subject: [PATCH 01/12] Fixed ignored sites in firefox --- keepassxc-browser/keepassxc-browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js index 08eb047..786ea98 100755 --- a/keepassxc-browser/keepassxc-browser.js +++ b/keepassxc-browser/keepassxc-browser.js @@ -1559,7 +1559,7 @@ cip.initCredentialFields = function(forceCall) { cip.initializeSitePreferences(); if (cip.settings.sitePreferences) { for (const site of cip.settings.sitePreferences) { - if (site.url === document.location.href || siteMatch(site.url, document.location.href)) { + if (site.url === document.location.href || siteMatch(site.url, window.top.location.href)) { if (site.ignore === IGNORE_FULL) { return; } From 0f8e365cc7eb929ee176e3d03b968929de57ffd0 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Sat, 30 Mar 2019 13:30:26 +0100 Subject: [PATCH 02/12] Fixes droidmonkey's comments --- keepassxc-browser/keepassxc-browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js index 786ea98..af1cc73 100755 --- a/keepassxc-browser/keepassxc-browser.js +++ b/keepassxc-browser/keepassxc-browser.js @@ -1559,7 +1559,7 @@ cip.initCredentialFields = function(forceCall) { cip.initializeSitePreferences(); if (cip.settings.sitePreferences) { for (const site of cip.settings.sitePreferences) { - if (site.url === document.location.href || siteMatch(site.url, window.top.location.href)) { + if (site.url === window.top.location.href || siteMatch(site.url, window.top.location.href)) { if (site.ignore === IGNORE_FULL) { return; } From 87ac8fa21d313c406262ed9255f8ec9bc6079b2b Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Fri, 5 Apr 2019 00:09:23 -0700 Subject: [PATCH 03/12] Remove source map link from browser-polyfill.min.js --- keepassxc-browser/browser-polyfill.min.js | 1 - 1 file changed, 1 deletion(-) diff --git a/keepassxc-browser/browser-polyfill.min.js b/keepassxc-browser/browser-polyfill.min.js index c756281..eb5440e 100644 --- a/keepassxc-browser/browser-polyfill.min.js +++ b/keepassxc-browser/browser-polyfill.min.js @@ -1,5 +1,4 @@ (function(a,b){if("function"==typeof define&&define.amd)define("webextension-polyfill",["module"],b);else if("undefined"!=typeof exports)b(module);else{var c={exports:{}};b(c),a.browser=c.exports}})(this,function(a){"use strict";if("undefined"==typeof browser||Object.getPrototypeOf(browser)!==Object.prototype){a.exports=(e=>{const f={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getBrowserInfo:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(f).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class g extends WeakMap{constructor(v,w=void 0){super(w),this.createItem=v}get(v){return this.has(v)||this.set(v,this.createItem(v)),super.get(v)}}const h=v=>{return v&&"object"==typeof v&&"function"==typeof v.then},i=(v,w)=>{return(...x)=>{e.runtime.lastError?v.reject(e.runtime.lastError):w.singleCallbackArg||1>=x.length?v.resolve(x[0]):v.resolve(x)}},j=v=>1==v?"argument":"arguments",k=(v,w)=>{return function(y,...z){if(z.lengthw.maxArgs)throw new Error(`Expected at most ${w.maxArgs} ${j(w.maxArgs)} for ${v}(), got ${z.length}`);return new Promise((A,B)=>{if(w.fallbackToNoCallback)try{y[v](...z,i({resolve:A,reject:B},w))}catch(C){console.warn(`${v} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",C),y[v](...z),w.fallbackToNoCallback=!1,w.noCallback=!0,A()}else w.noCallback?(y[v](...z),A()):y[v](...z,i({resolve:A,reject:B},w))})}},l=(v,w,x)=>{return new Proxy(w,{apply(y,z,A){return x.call(z,v,...A)}})};let m=Function.call.bind(Object.prototype.hasOwnProperty);const n=(v,w={},x={})=>{let y=Object.create(null),z={has(B,C){return C in v||C in y},get(B,C){if(C in y)return y[C];if(C in v){let E=v[C];if("function"==typeof E){if("function"==typeof w[C])E=l(v,v[C],w[C]);else if(m(x,C)){let F=k(C,x[C]);E=l(v,v[C],F)}else E=E.bind(v);}else if("object"==typeof E&&null!==E&&(m(w,C)||m(x,C)))E=n(E,w[C],x[C]);else return Object.defineProperty(y,C,{configurable:!0,enumerable:!0,get(){return v[C]},set(F){v[C]=F}}),E;return y[C]=E,E}},set(B,C,D){return C in y?y[C]=D:v[C]=D,!0},defineProperty(B,C,D){return Reflect.defineProperty(y,C,D)},deleteProperty(B,C){return Reflect.deleteProperty(y,C)}},A=Object.create(v);return new Proxy(A,z)},o=v=>({addListener(w,x,...y){w.addListener(v.get(x),...y)},hasListener(w,x){return w.hasListener(v.get(x))},removeListener(w,x){w.removeListener(v.get(x))}});let p=!1;const q=new g(v=>{return"function"==typeof v?function(x,y,z){let B,D,A=!1,C=new Promise(G=>{B=function(H){p||(console.warn("Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)",new Error().stack),p=!0),A=!0,G(H)}});try{D=v(x,y,B)}catch(G){D=Promise.reject(G)}const E=!0!==D&&h(D);if(!0!==D&&!E&&!A)return!1;const F=G=>{G.then(H=>{z(H)},H=>{let I;I=H&&(H instanceof Error||"string"==typeof H.message)?H.message:"An unexpected error occurred",z({__mozWebExtensionPolyfillReject__:!0,message:I})}).catch(H=>{console.error("Failed to send onMessage rejected reply",H)})};return E?F(D):F(C),!0}:v}),r=({reject:v,resolve:w},x)=>{e.runtime.lastError?e.runtime.lastError.message==="The message port closed before a response was received."?w():v(e.runtime.lastError):x&&x.__mozWebExtensionPolyfillReject__?v(new Error(x.message)):w(x)},s=(v,w,x,...y)=>{if(y.lengthw.maxArgs)throw new Error(`Expected at most ${w.maxArgs} ${j(w.maxArgs)} for ${v}(), got ${y.length}`);return new Promise((z,A)=>{const B=r.bind(null,{resolve:z,reject:A});y.push(B),x.sendMessage(...y)})},t={runtime:{onMessage:o(q),onMessageExternal:o(q),sendMessage:s.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:s.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},u={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return f.privacy={network:{networkPredictionEnabled:u,webRTCIPHandlingPolicy:u},services:{passwordSavingEnabled:u},websites:{hyperlinkAuditingEnabled:u,referrersEnabled:u}},n(e,t,f)})(chrome)}else a.exports=browser}); -//# sourceMappingURL=browser-polyfill.min.js.map // webextension-polyfill v.0.3.1 (https://github.com/mozilla/webextension-polyfill) From 21a1d68490dc0806c28de1d9f5091b85cd7aa188 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Fri, 5 Apr 2019 00:09:40 -0700 Subject: [PATCH 04/12] Remove source map link from bootstrap.min.js --- keepassxc-browser/options/bootstrap.min.css | 1 - 1 file changed, 1 deletion(-) diff --git a/keepassxc-browser/options/bootstrap.min.css b/keepassxc-browser/options/bootstrap.min.css index ed3905e..73bd8ae 100644 --- a/keepassxc-browser/options/bootstrap.min.css +++ b/keepassxc-browser/options/bootstrap.min.css @@ -3,4 +3,3 @@ * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file From 4971307c4d67c16997555dd417480f93a0237716 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Sat, 19 Jan 2019 10:46:16 +0200 Subject: [PATCH 05/12] No jQuery --- .gitignore | 1 + keepassxc-browser/_locales/en/messages.json | 58 +- keepassxc-browser/background/browserAction.js | 10 +- keepassxc-browser/background/event.js | 10 +- keepassxc-browser/background/httpauth.js | 8 +- keepassxc-browser/background/init.js | 11 +- keepassxc-browser/background/keepass.js | 89 +- keepassxc-browser/background/page.js | 40 +- keepassxc-browser/content/autocomplete.js | 188 ++ keepassxc-browser/content/define.js | 382 +++ .../content/keepassxc-browser.js | 1496 +++++++++++ keepassxc-browser/content/pwgen.js | 407 +++ keepassxc-browser/content/ui.js | 67 + keepassxc-browser/css/autocomplete.css | 19 + keepassxc-browser/css/button.css | 48 + keepassxc-browser/css/define.css | 110 + keepassxc-browser/css/pwgen.css | 114 + keepassxc-browser/global.js | 16 +- keepassxc-browser/jquery-ui.min.css | 7 - keepassxc-browser/jquery-ui.min.js | 13 - keepassxc-browser/keepassxc-browser.css | 255 -- keepassxc-browser/keepassxc-browser.js | 2258 ----------------- keepassxc-browser/manifest.json | 35 +- keepassxc-browser/options/options.html | 11 +- keepassxc-browser/options/options.js | 9 +- keepassxc-browser/options/shortcuts.js | 4 +- keepassxc-browser/popups/popup.css | 12 +- keepassxc-browser/popups/popup.html | 27 +- keepassxc-browser/popups/popup_httpauth.html | 17 +- keepassxc-browser/popups/popup_httpauth.js | 2 +- keepassxc-browser/popups/popup_login.html | 17 +- .../popups/popup_multiple-fields.html | 15 +- keepassxc-browser/popups/popup_remember.html | 15 +- keepassxc-browser/popups/popup_remember.js | 4 +- keepassxc-browser/popups/throbber.gif | Bin 583 -> 673 bytes 35 files changed, 3060 insertions(+), 2715 deletions(-) create mode 100644 keepassxc-browser/content/autocomplete.js create mode 100644 keepassxc-browser/content/define.js create mode 100755 keepassxc-browser/content/keepassxc-browser.js create mode 100644 keepassxc-browser/content/pwgen.js create mode 100644 keepassxc-browser/content/ui.js create mode 100644 keepassxc-browser/css/autocomplete.css create mode 100644 keepassxc-browser/css/button.css create mode 100644 keepassxc-browser/css/define.css create mode 100644 keepassxc-browser/css/pwgen.css delete mode 100644 keepassxc-browser/jquery-ui.min.css delete mode 100644 keepassxc-browser/jquery-ui.min.js delete mode 100644 keepassxc-browser/keepassxc-browser.css delete mode 100755 keepassxc-browser/keepassxc-browser.js diff --git a/.gitignore b/.gitignore index 5737441..a667390 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ .bz .bz2 .xz +node_modules/* diff --git a/keepassxc-browser/_locales/en/messages.json b/keepassxc-browser/_locales/en/messages.json index 8c0033d..633ba7f 100644 --- a/keepassxc-browser/_locales/en/messages.json +++ b/keepassxc-browser/_locales/en/messages.json @@ -112,7 +112,7 @@ "description": "Checkbox text below the password generator input field." }, "passwordGeneratorBits": { - "message": "??? Bits", + "message": "$1 Bits", "description": "Bits of the generated password." }, "passwordGeneratorTitle": { @@ -123,6 +123,10 @@ "message": "Generate", "description": "Generate button text in password generator." }, + "passwordGeneratorTryAgain": { + "message": "Try again", + "description": "Generate button text in password generator when not connected." + }, "passwordGeneratorCopy": { "message": "Copy", "description": "Copy button text in password generator." @@ -132,7 +136,15 @@ "description": "Fill and copy button text in password generator." }, "passwordGeneratorErrorTooLong": { - "message": "Error:\nThe generated password is longer than the allowed length!\nIt has been cut to fit the length.\n\nPlease remember the new password!", + "message": "Error: The generated password is longer than the allowed length!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorErrorTooLongCut": { + "message": "It has been cut to fit the length.", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorErrorTooLongRemember": { + "message": "Please remember the new password!", "description": "A warning text shown in the password generator." }, "passwordGeneratorGenerateText": { @@ -140,7 +152,11 @@ "description": "Password icon title text." }, "passwordGeneratorError": { - "message": "Cannot receive generated password.
Is KeePassXC running?", + "message": "Cannot receive generated password.", + "description": "Password generator error text when KeePassXC is closed." + }, + "passwordGeneratorErrorIsRunning": { + "message": "Is KeePassXC running and connected?", "description": "Password generator error text when KeePassXC is closed." }, "defineDismiss": { @@ -208,27 +224,31 @@ "description": "Shown when no username is set in the credentials." }, "credentialsNoLoginsFound": { - "message": "Error:\nNo logins found.", + "message": "Error: No logins found.", "description": "Shown when no credentials are found for the current page." }, "credentialsMultipleFound": { - "message": "Error:\nMore than one login was found in KeePassXC!\nPress the KeePassXC-Browser icon for more options.", + "message": "Error: More than one login was found in KeePassXC!", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsMultipleFoundSecondLine": { + "message": "Press the KeePassXC-Browser icon for more options.", "description": "Alert message when trying to fill username and/or password when multiple credentials are found." }, "credentialsNoUsernameFound": { - "message": "Error:\nNo credentials for the given username found.", + "message": "Error: No credentials for the given username found.", "description": "Alert message when no credentials are found for the given username." }, "fieldsFill": { - "message": "Error:\nCannot find fields to fill in.", + "message": "Error: Cannot find fields to fill in.", "description": "Alert message when no fields are found to fill in." }, "fieldsNoPasswordField": { - "message": "Error:\nUnable to find a password field.", + "message": "Error: Unable to find a password field.", "description": "Message shown when no password fields are found." }, "rememberNothingChanged": { - "message": "Error:\nCould not detect changed credentials.", + "message": "Error: Could not detect changed credentials.", "description": "Message shown when trying to save credentials that haven't changed." }, "popupTitle": { @@ -323,12 +343,12 @@ "message": "Please choose the group you want to add the new credentials.", "description": "A popup message shown choosing what group user wants to use for new credentials." }, - "popupRememberErrorDefaultGroupNotFound": { - "message": "Error: Specified default group not found. Creating all necessary groups.", - "description": "Error message shown when default group set cannot be found." + "popupRememberInfoDefaultGroupNotFound": { + "message": "Info: Default group created in connected database.", + "description": "Info message shown when default group set cannot be found." }, "popupRememberErrorCreatingNewGroup": { - "message": "New group(s) cannot be created.", + "message": "Error: New group(s) cannot be created.", "description": "Error message shown when new groups cannot be created." }, "popupRememberErrorPasswordNotChanged": { @@ -503,6 +523,10 @@ "message": "Automatically retrieve credentials.", "description": "Automatically retrieve credentials checkbox text." }, + "optionsCheckboxAutomaticReconnect": { + "message": "Automatically reconnect to KeePassXC.", + "description": "Auto-reconnect checkbox text." + }, "optionsCheckboxAutoFillSingleEntry": { "message": "Automatically fill in single-credential entries.", "description": "Automatically fill-in single credential entry checkbox text." @@ -579,6 +603,10 @@ "message": "KeePassXC-Browser will immediately retrieve credentials when a tab is activated.", "description": "Auto-Retrive Credentials option help text." }, + "optionsAutomaticReconnectHelpText": { + "message": "Reconnects automatically to KeePassXC when it is detected.", + "description": "Auto-reconnect option help text." + }, "optionsAutoFillSingleEntryHelpText": { "message": "Let KeePassXC-Browser automatically fill in credentials if it receives only a single entry.", "description": "Auto-Fill Single Entry option help text." @@ -731,6 +759,10 @@ "message": "Go to the page and click on the KeePassXC-Browser icon, then select ", "description": "Saved custom login fields info text, second part." }, + "optionsCustomFieldsTabHelpTextThird": { + "message": "On this page you can manage saved custom login fields.", + "description": "Saved custom login fields info text, third part." + }, "optionsCustomFieldsRemove": { "message": "Remove saved custom login fields?", "description": "Confirmation text when removing saved custom login fields." diff --git a/keepassxc-browser/background/browserAction.js b/keepassxc-browser/background/browserAction.js index c3e8b1b..4f8e7ac 100755 --- a/keepassxc-browser/background/browserAction.js +++ b/keepassxc-browser/background/browserAction.js @@ -193,7 +193,7 @@ browserAction.removeRememberPopup = function(callback, tab, removeImmediately) { const currentMS = Date.now(); if (removeImmediately || (data.visibleForPageUpdates <= 0 && data.redirectOffset > 0)) { browserAction.stackPop(tab.id); - browserAction.show(null, { 'id': tab.id }); + browserAction.show(null, { 'id': tab.id } ); page.clearCredentials(tab.id); } else if (!isNaN(data.visibleForPageUpdates) && data.redirectOffset > 0 && currentMS >= data.redirectOffset) { data.visibleForPageUpdates -= 1; @@ -205,7 +205,7 @@ browserAction.setRememberPopup = function(tabId, username, password, url, userna browser.storage.local.get({ 'settings': {} }).then(function(item) { const settings = item.settings; - // Don't show anything if the site is in the ignore + // Don't show anything if the site is in the ignore if (settings.sitePreferences !== undefined) { for (const site of settings.sitePreferences) { if (site.ignore === IGNORE_NORMAL && (site.url === url || siteMatch(site.url, url))) { @@ -233,7 +233,7 @@ browserAction.setRememberPopup = function(tabId, username, password, url, userna index: 0, counter: 0, max: 2, - icons: [ 'icon_remember_red_background_19x19.png', 'icon_remember_red_lock_19x19.png' ] + icons: ['icon_remember_red_background_19x19.png', 'icon_remember_red_lock_19x19.png'] }, icon: 'icon_remember_red_background_19x19.png', popup: 'popup_remember.html' @@ -271,8 +271,8 @@ browserAction.setRememberPopup = function(tabId, username, password, url, userna 'buttons': buttons }); - browser.notifications.onButtonClicked.addListener((id, index) => { - browser.notifications.clear(id); + browser.notifications.onButtonClicked.addListener((notificationId, index) => { + browser.notifications.clear(notificationId); if (index === 1) { browserAction.ignoreSite(url); } diff --git a/keepassxc-browser/background/event.js b/keepassxc-browser/background/event.js index 3414888..17b91de 100755 --- a/keepassxc-browser/background/event.js +++ b/keepassxc-browser/background/event.js @@ -99,7 +99,7 @@ kpxcEvent.showStatus = function(configured, tab, callback) { keePassXCAvailable: keepass.isKeePassXCAvailable, encryptionKeyUnrecognized: keepass.isEncryptionKeyUnrecognized, associated: keepass.isAssociated(), - error: errorMessage ? errorMessage : null + error: errorMessage || null }); }; @@ -192,16 +192,16 @@ kpxcEvent.onGetConnectedDatabase = function(callback, tab) { kpxcEvent.onGetKeePassXCVersions = function(callback, tab) { if (keepass.currentKeePassXC === '') { keepass.getDatabaseHash((res) => { - callback({'current': keepass.currentKeePassXC, 'latest': keepass.latestKeePassXC.version}); + callback({ 'current': keepass.currentKeePassXC, 'latest': keepass.latestKeePassXC.version }); }, tab); } else { - callback({'current': keepass.currentKeePassXC, 'latest': keepass.latestKeePassXC.version}); + callback({ 'current': keepass.currentKeePassXC, 'latest': keepass.latestKeePassXC.version }); } }; kpxcEvent.onCheckUpdateKeePassXC = function(callback, tab) { keepass.checkForNewKeePassXCVersion(); - callback({current: keepass.currentKeePassXC.version, latest: keepass.latestKeePassXC.version}); + callback({ current: keepass.currentKeePassXC.version, latest: keepass.latestKeePassXC.version }); }; kpxcEvent.onUpdateAvailableKeePassXC = function(callback, tab) { @@ -285,6 +285,8 @@ kpxcEvent.messageHandlers = { 'associate': keepass.associate, 'check_update_keepassxc': kpxcEvent.onCheckUpdateKeePassXC, 'create_new_group': keepass.createNewGroup, + 'enable_automatic_reconnect': keepass.enableAutomaticReconnect, + 'disable_automatic_reconnect': keepass.disableAutomaticReconnect, 'generate_password': keepass.generatePassword, 'get_connected_database': kpxcEvent.onGetConnectedDatabase, 'get_database_groups': keepass.getDatabaseGroups, diff --git a/keepassxc-browser/background/httpauth.js b/keepassxc-browser/background/httpauth.js index cf9caef..367dc43 100755 --- a/keepassxc-browser/background/httpauth.js +++ b/keepassxc-browser/background/httpauth.js @@ -20,11 +20,11 @@ httpAuth.init = function() { browser.webRequest.onErrorOccurred.removeListener(httpAuth.requestCompleted); } - // only intercept http auth requests if the option is turned on. + // Only intercept http auth requests if the option is turned on. if (page.settings.autoFillAndSend) { - const opts = { urls: [''] }; + const opts = { urls: [ '' ] }; - browser.webRequest.onAuthRequired.addListener(handleReq, opts, [reqType]); + browser.webRequest.onAuthRequired.addListener(handleReq, opts, [ reqType ]); browser.webRequest.onCompleted.addListener(httpAuth.requestCompleted, opts); browser.webRequest.onErrorOccurred.addListener(httpAuth.requestCompleted, opts); } @@ -75,7 +75,7 @@ httpAuth.processPendingCallbacks = async function(details, resolve, reject) { httpAuth.loginOrShowCredentials = function(logins, details, resolve, reject) { // At least one login found --> use first to login - if (logins.length > 0 && page.settings.autoFillAndSend) { + if (logins.length > 0 && page.settings.autoFillAndSend) { if (logins.length === 1) { resolve({ authCredentials: { diff --git a/keepassxc-browser/background/init.js b/keepassxc-browser/background/init.js index c603f9f..bce352b 100644 --- a/keepassxc-browser/background/init.js +++ b/keepassxc-browser/background/init.js @@ -7,6 +7,7 @@ keepass.migrateKeyRing().then(() => { keepass.connectToNative(); keepass.generateNewKeyPair(); keepass.changePublicKeys(null).then((pkRes) => { + keepass.enableAutomaticReconnect(); keepass.getDatabaseHash((gdRes) => {}, null); }); }); @@ -85,11 +86,11 @@ const contextMenuItems = [ { title: tr('contextMenuFillPassword'), action: 'fill_password' }, { title: tr('contextMenuFillTOTP'), action: 'fill_totp' }, { title: tr('contextMenuShowPasswordGeneratorIcons'), action: 'activate_password_generator' }, - { title: tr('contextMenuSaveCredentials'), action: 'remember_credentials' }, - { title: tr('contextMenuShowPasswordGenerator'), action: 'show_password_generator' } + { title: tr('contextMenuShowPasswordGenerator'), action: 'show_password_generator' }, + { title: tr('contextMenuSaveCredentials'), action: 'remember_credentials' } ]; -const menuContexts = ['editable']; +const menuContexts = [ 'editable' ]; if (isFirefox()) { menuContexts.push('password'); @@ -103,8 +104,8 @@ for (const item of contextMenuItems) { onclick: (info, tab) => { browser.tabs.sendMessage(tab.id, { action: item.action - }).catch((e) => { - console.log(e); + }).catch((err) => { + console.log(err); }); } }); diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 4b18c4d..c49e6c8 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -1,8 +1,8 @@ 'use strict'; const keepass = {}; -keepass.associated = {'value': false, 'hash': null}; -keepass.keyPair = {publicKey: null, secretKey: null}; +keepass.associated = { 'value': false, 'hash': null }; +keepass.keyPair = { publicKey: null, secretKey: null }; keepass.serverPublicKey = ''; keepass.clientID = ''; keepass.isConnected = false; @@ -22,6 +22,7 @@ keepass.keyId = 'keepassxc-browser-cryptokey-name'; keepass.keyBody = 'keepassxc-browser-key'; keepass.messageTimeout = 500; // Milliseconds keepass.nonce = nacl.util.encodeBase64(nacl.randomBytes(keepass.keySize)); +keepass.reconnectLoop = null; const kpActions = { SET_LOGIN: 'set-login', @@ -80,11 +81,9 @@ const kpErrors = { } }; -browser.storage.local.get({ - 'latestKeePassXC': { 'version': '', 'lastChecked': null }, - 'keyRing': {}}).then((item) => { - keepass.latestKeePassXC = item.latestKeePassXC; - keepass.keyRing = item.keyRing; +browser.storage.local.get({ 'latestKeePassXC': { 'version': '', 'lastChecked': null }, 'keyRing': {} }).then((item) => { + keepass.latestKeePassXC = item.latestKeePassXC; + keepass.keyRing = item.keyRing; }); keepass.sendNativeMessage = function(request, enableTimeout = false) { @@ -134,7 +133,6 @@ keepass.addCredentials = function(callback, tab, username, password, url, group, }; keepass.updateCredentials = function(callback, tab, entryId, username, password, url, group, groupUuid) { - page.debug('keepass.updateCredentials(callback, {1}, {2}, {3}, [password], {4})', tab.id, entryId, username, url); if (tab && page.tabs[tab.id]) { page.tabs[tab.id].errorMessage = null; } @@ -199,8 +197,6 @@ keepass.updateCredentials = function(callback, tab, entryId, username, password, }; keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallback, triggerUnlock = false, httpAuth = false) { - page.debug('keepass.retrieveCredentials(callback, {1}, {2}, {3}, {4})', tab.id, url, submiturl, forceCallback); - keepass.testAssociation((response) => { if (!response) { browserAction.showDefault(null, tab); @@ -220,12 +216,12 @@ keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallb } let entries = []; - let keys = []; + const keys = []; const kpAction = kpActions.GET_LOGINS; const nonce = keepass.getNonce(); const incrementedNonce = keepass.incrementedNonce(nonce); const { dbid } = keepass.getCryptoKey(); - + for (const keyHash in keepass.keyRing) { keys.push({ id: keepass.keyRing[keyHash].id, @@ -279,7 +275,6 @@ keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallb } else { console.log('RetrieveCredentials for ' + url + ' rejected'); } - page.debug('keepass.retrieveCredentials() => entries.length = {1}', entries.length); } else if (response.error && response.errorCode) { keepass.handleError(tab, response.errorCode, response.error); callback([]); @@ -291,7 +286,7 @@ keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallb }, tab, false, triggerUnlock); }; -keepass.generatePassword = function(callback, tab, forceCallback) { +keepass.generatePassword = function(callback, tab) { if (!keepass.isConnected) { callback([]); return; @@ -300,9 +295,7 @@ keepass.generatePassword = function(callback, tab, forceCallback) { keepass.testAssociation((taresponse) => { if (!taresponse) { browserAction.showDefault(null, tab); - if (forceCallback) { - callback([]); - } + callback([]); return; } @@ -359,7 +352,7 @@ keepass.associate = function(callback, tab) { return; } - keepass.getDatabaseHash((res) => { + keepass.getDatabaseHash((hash) => { if (keepass.isDatabaseClosed || !keepass.isKeePassXCAvailable) { callback([]); return; @@ -421,11 +414,22 @@ keepass.associate = function(callback, tab) { }, tab); }; -keepass.testAssociation = function(callback, tab, enableTimeout = false, triggerUnlock = false) { +keepass.testAssociation = async function(callback, tab, enableTimeout = false, triggerUnlock = false) { if (tab && page.tabs[tab.id]) { page.tabs[tab.id].errorMessage = null; } + if (!keepass.isKeePassXCAvailable && !page.settings.automaticReconnect) { + try { + keepass.connectToNative(); + await keepass.reconnect(); + } catch (err) { + keepass.handleError(tab, kpErrors.PUBLIC_KEY_NOT_FOUND); + callback(false); + return false; + } + } + keepass.getDatabaseHash((dbHash) => { if (!dbHash) { callback(false); @@ -622,8 +626,8 @@ keepass.changePublicKeys = function(tab, enableTimeout = false) { if (!keepass.verifyKeyResponse(response, key, incrementedNonce)) { if (tab && page.tabs[tab.id]) { keepass.handleError(tab, kpErrors.KEY_CHANGE_FAILED); - reject(false); } + reject(false); } else { keepass.isKeePassXCAvailable = true; console.log('Server public key: ' + nacl.util.encodeBase64(keepass.serverPublicKey)); @@ -846,10 +850,10 @@ keepass.migrateKeyRing = function() { // Change dates to numbers, for compatibilty with Chromium based browsers if (keyring) { let num = 0; - for (let keyHash in keyring) { - let key = keyring[keyHash]; - ['created', 'lastUsed'].forEach((fld) => { - let v = key[fld]; + for (const keyHash in keyring) { + const key = keyring[keyHash]; + [ 'created', 'lastUsed' ].forEach((fld) => { + const v = key[fld]; if (v instanceof Date && v.valueOf() >= 0) { key[fld] = v.valueOf(); num++; @@ -1127,25 +1131,32 @@ keepass.decrypt = function(input, nonce) { }; keepass.enableAutomaticReconnect = function() { - setInterval(() => { - if (!keepass.isKeePassXCAvailable) { - keepass.connectToNative(); - keepass.reconnect(); - } - }, 1000); + // Disable for Windows if KeePassXC is older than 2.3.4 + if (!page.settings.automaticReconnect || + (navigator.platform.toLowerCase().includes('win') && !keepass.compareVersion('2.3.4', keepass.currentKeePassXC))) { + return; + } + + if (keepass.reconnectLoop === null) { + keepass.reconnectLoop = setInterval(() => { + if (!keepass.isKeePassXCAvailable) { + keepass.connectToNative(); + keepass.reconnect().catch((e) => {}); + } + }, 1000); + } +}; + +keepass.disableAutomaticReconnect = function() { + clearInterval(keepass.reconnectLoop); + keepass.reconnectLoop = null; }; keepass.reconnect = function(callback, tab) { return new Promise((resolve, reject) => { keepass.generateNewKeyPair(); - keepass.changePublicKeys(tab).then((pkRes) => { - // Database hash should be received if the reconnection succeeded + keepass.changePublicKeys(tab, true).then((pkRes) => { keepass.getDatabaseHash((gdRes) => { - if (!gdRes) { - reject(false); - return; - } - keepass.testAssociation((response) => { keepass.isConfigured().then((configured) => { resolve(configured); @@ -1155,6 +1166,8 @@ keepass.reconnect = function(callback, tab) { }); }, tab); }, null); + }).catch((e) => { + reject(e); }); }); }; @@ -1178,7 +1191,7 @@ keepass.updateDatabase = function() { if (tabs.length) { browser.tabs.sendMessage(tabs[0].id, { action: 'check_database_hash', - hash: {old: keepass.previousDatabaseHash, new: keepass.databaseHash} + hash: { old: keepass.previousDatabaseHash, new: keepass.databaseHash } }); keepass.previousDatabaseHash = keepass.databaseHash; } diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index 4db0bc4..313d8df 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -10,6 +10,7 @@ const defaultSettings = { showNotifications: true, showLoginNotifications: true, saveDomainOnly: true, + automaticReconnect: true, defaultGroup: '', defaultGroupAlwaysAsk: false }; @@ -51,6 +52,9 @@ page.initSettings = function() { if (!('saveDomainOnly' in page.settings)) { page.settings.saveDomainOnly = defaultSettings.saveDomainOnly; } + if (!('automaticReconnect' in page.settings)) { + page.settings.automaticReconnect = defaultSettings.automaticReconnect; + } if (!('defaultGroup' in page.settings)) { page.settings.defaultGroup = defaultSettings.defaultGroup; } @@ -71,13 +75,13 @@ page.initOpenedTabs = function() { } // Set initial tab-ID - browser.tabs.query({ 'active': true, 'currentWindow': true }).then((t) => { - if (t.length === 0) { + browser.tabs.query({ 'active': true, 'currentWindow': true }).then((currentTabs) => { + if (currentTabs.length === 0) { resolve(); return; // For example: only the background devtools or a popup are opened } - page.currentTabId = t[0].id; - browserAction.show(null, t[0]); + page.currentTabId = currentTabs[0].id; + browserAction.show(null, currentTabs[0]); resolve(); }); }); @@ -147,31 +151,3 @@ page.removePageInformationFromNotExistingTabs = function() { }); } }; - -page.debugConsole = function() { - if (arguments.length > 1) { - console.log(page.sprintf(arguments[0], arguments)); - } else { - console.log(arguments[0]); - } -}; - -page.sprintf = function(input, args) { - return input.replace(/{(\d+)}/g, (match, number) => { - return typeof args[number] !== 'undefined' ? (typeof args[number] === 'object' ? JSON.stringify(args[number]) : args[number]) : match; - }); -}; - -page.debugDummy = function() {}; - -page.debug = page.debugDummy; - -page.setDebug = function(bool) { - if (bool) { - page.debug = page.debugConsole; - return 'Debug mode enabled'; - } else { - page.debug = page.debugDummy; - return 'Debug mode disabled'; - } -}; diff --git a/keepassxc-browser/content/autocomplete.js b/keepassxc-browser/content/autocomplete.js new file mode 100644 index 0000000..a91b63c --- /dev/null +++ b/keepassxc-browser/content/autocomplete.js @@ -0,0 +1,188 @@ +'use strict'; + +var kpxcAutocomplete = {}; +kpxcAutocomplete.elements = []; + +kpxcAutocomplete.create = function(input, showListInstantly = false) { + let _index = -1; + + input.addEventListener('click', function(e) { + if (!e.isTrusted) { + return; + } + + if (input.value !== '') { + input.select(); + } + showList(input); + }); + + input.addEventListener('keydown', keyPress); + input.setAttribute('autocomplete', 'off'); + + if (showListInstantly) { + showList(input); + } + + function showList(input) { + closeList(); + const div = kpxcUI.createElement('div', 'kpxcAutocomplete-items', { 'id': 'kpxcAutocomplete-list' }); + + // Element position + const rect = input.getBoundingClientRect(); + div.style.top = String((rect.top + document.body.scrollTop) + input.offsetHeight) + 'px'; + div.style.left = String((rect.left + document.body.scrollLeft)) + 'px'; + div.style.minWidth = String(input.offsetWidth) + 'px'; + div.style.zIndex = '2147483646'; + document.body.append(div); + + for (const c of kpxcAutocomplete.elements) { + const item = document.createElement('div'); + item.textContent += c.label; + const itemInput = kpxcUI.createElement('input', '', { 'type': 'hidden', 'value': c.value }); + item.append(itemInput); + item.addEventListener('click', function(e) { + if (!e.isTrusted) { + return; + } + + // Save index for combination.loginId + const index = Array.prototype.indexOf.call(e.currentTarget.parentElement.childNodes, e.currentTarget); + input.value = this.getElementsByTagName('input')[0].value; + fillPassword(input.value, index); + closeList(); + input.focus(); + }); + + // These events prevent the double hover effect if both keyboard and mouse are used + item.addEventListener('mouseover', function(e) { + removeItem(getAllItems()); + item.classList.add('kpxcAutocomplete-active'); + _index = Array.from(div.childNodes).indexOf(item); + }); + item.addEventListener('mouseout', function(e) { + item.classList.remove('kpxcAutocomplete-active'); + }); + + div.appendChild(item); + } + + // Activate the first item automatically + const items = getAllItems(); + _index = 0; + activateItem(items); + }; + + function activateItem(item) { + if (!item || item.length === 0) { + return; + } + + removeItem(item); + if (_index >= item.length) { + _index = 0; + } + + if (_index < 0) { + _index = item.length - 1; + } + + if (item[_index] !== undefined) { + item[_index].classList.add('kpxcAutocomplete-active'); + } + }; + + function removeItem(items) { + for (const item of items) { + item.classList.remove('kpxcAutocomplete-active'); + } + }; + + function closeList(elem) { + const items = document.getElementsByClassName('kpxcAutocomplete-items'); + for (const item of items) { + if (elem !== item && input) { + item.parentNode.removeChild(item); + } + } + }; + + function getAllItems() { + const list = document.getElementById('kpxcAutocomplete-list'); + if (!list) { + return []; + } + return list.getElementsByTagName('div'); + }; + + /** + * Keyboard shortcuts for autocomplete menu: + * - ArrowDown shows the list or selects item below, or the first item (last is active) + * - ArrowUp selects item above, or the last item (first is active) + * - Enter or Tab selects the item + * - Backspace and Delete shows the list if input field is empty. First item is activated + */ + function keyPress(e) { + if (!e.isTrusted) { + return; + } + + const item = getAllItems(); + if (e.key === 'ArrowDown') { + // If the list is now shown, show it + if (item.length === 0) { + _index = -1; + showList(input); + } else { + // Activate next item + ++_index; + activateItem(item); + } + } else if (e.key === 'ArrowUp') { + --_index; + activateItem(item); + } else if (e.key === 'Enter' || e.key === 'Tab') { + if (input.value === '' && e.key === 'Enter') { + e.preventDefault(); + } + + if (_index >= 0 && item && item[_index] !== undefined) { + input.value = e.currentTarget.value; + fillPassword(input.value, _index); + closeList(); + } + } else if (e.key === 'Escape') { + closeList(); + } else if ((e.key === 'Backspace' || e.key === 'Delete') && input.value === '') { + // Show menu when input field has no value and backspace is pressed + _index = -1; + showList(input); + } + }; + + function fillPassword(value, index) { + const fieldId = input.getAttribute('data-kpxc-id'); + kpxcFields.prepareId(fieldId); + const combination = kpxcFields.getCombination('username', fieldId); + combination.loginId = index; + + kpxc.fillInCredentials(combination, false, false); + input.setAttribute('fetched', true); + }; + + // Detect click outside autocomplete + document.addEventListener('click', function(e) { + if (!e.isTrusted) { + return; + } + + const list = document.getElementById('kpxcAutocomplete-list'); + if (!list) { + return; + } + + if (e.target !== input && (e.target.nodeName !== input.nodeName)) { + closeList(e.target); + } + }); +}; diff --git a/keepassxc-browser/content/define.js b/keepassxc-browser/content/define.js new file mode 100644 index 0000000..69b0e3a --- /dev/null +++ b/keepassxc-browser/content/define.js @@ -0,0 +1,382 @@ +'use strict'; + +var kpxcDefine = {}; + +kpxcDefine.selection = { + username: null, + password: null, + fields: [] +}; +kpxcDefine.eventFieldClick = null; +kpxcDefine.dialog = null; +kpxcDefine.startPosX = 0; +kpxcDefine.startPosY = 0; +kpxcDefine.diffX = 0; +kpxcDefine.diffY = 0; +kpxcDefine.keyDown = null; + +kpxcDefine.init = function() { + const backdrop = kpxcUI.createElement('div', 'kpxcDefine-modal-backdrop', { 'id': 'kpxcDefine-backdrop' }); + const chooser = kpxcUI.createElement('div', '', { 'id': 'kpxcDefine-fields' }); + const description = kpxcUI.createElement('div', '', { 'id': 'kpxcDefine-description' }); + + backdrop.append(description); + document.body.append(backdrop); + document.body.append(chooser); + + kpxcFields.getAllFields(); + kpxcFields.prepareVisibleFieldsWithID('select'); + + kpxcDefine.initDescription(); + kpxcDefine.resetSelection(); + kpxcDefine.prepareStep1(); + kpxcDefine.markAllUsernameFields('#kpxcDefine-fields'); + + kpxcDefine.dialog = $('#kpxcDefine-description');; + kpxcDefine.dialog.onmousedown = function(e) { + kpxcDefine.mouseDown(e); + }; + + document.addEventListener('keydown', kpxcDefine.keyDown); +}; + +kpxcDefine.close = function() { + $('#kpxcDefine-backdrop').remove(); + $('#kpxcDefine-fields').remove(); + document.removeEventListener('keydown', kpxcDefine.keyDown); +}; + +kpxcDefine.mouseDown = function(e) { + kpxcDefine.selected = kpxcDefine.dialog; + kpxcDefine.startPosX = e.clientX; + kpxcDefine.startPosY = e.clientY; + kpxcDefine.diffX = kpxcDefine.startPosX - kpxcDefine.dialog.offsetLeft; + kpxcDefine.diffY = kpxcDefine.startPosY - kpxcDefine.dialog.offsetTop; + return false; +}; + +kpxcDefine.initDescription = function() { + const description = $('#kpxcDefine-description'); + const h1 = kpxcUI.createElement('div', '', { 'id': 'kpxcDefine-chooser-headline' }); + const help = kpxcUI.createElement('div', 'kpxcDefine-chooser-help', { 'id': 'kpxcDefine-help' }); + + // Show keyboard shortcuts help text + const keyboardHelp = kpxcUI.createElement('div', 'kpxcDefine-keyboardHelp', {}, `${tr('optionsKeyboardShortcutsHeader')}:`); + keyboardHelp.style.marginBottom = '5px'; + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'Escape'), ' ' + tr('defineDismiss')); + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'S'), ' ' + tr('defineSkip')); + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'A'), ' ' + tr('defineAgain')); + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'C'), ' ' + tr('defineConfirm')); + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'M'), ' ' + tr('defineMore')); + keyboardHelp.appendMultiple(document.createElement('br'), kpxcUI.createElement('kbd', '', {}, 'D'), ' ' + tr('defineDiscard')); + + description.appendMultiple(h1, help, keyboardHelp); + + const buttonDismiss = kpxcUI.createElement('button', 'kpxc-button kpxc-red-button', { 'id': 'kpxcDefine-btn-dismiss' }, tr('defineDismiss')); + buttonDismiss.addEventListener('click', kpxcDefine.close); + + const buttonSkip = kpxcUI.createElement('button', 'kpxc-button kpxc-orange-button', { 'id': 'kpxcDefine-btn-skip' }, tr('defineSkip')); + buttonSkip.style.marginRight = '5px'; + buttonSkip.addEventListener('click', kpxcDefine.skip); + + const buttonMore = kpxcUI.createElement('button', 'kpxc-button kpxc-orange-button', { 'id': 'kpxcDefine-btn-more' }, tr('defineMore')); + buttonMore.style.marginRight = '5px'; + buttonMore.style.marginLeft = '5px'; + buttonMore.addEventListener('click', kpxcDefine.more); + + const buttonAgain = kpxcUI.createElement('button', 'kpxc-button kpxc-blue-button', { 'id': 'kpxcDefine-btn-again' }, tr('defineAgain')); + buttonAgain.style.marginRight = '5px'; + buttonAgain.addEventListener('click', kpxcDefine.again); + + const buttonConfirm = kpxcUI.createElement('button', 'kpxc-button kpxc-green-button', { 'id': 'kpxcDefine-btn-confirm' }, tr('defineConfirm')); + buttonConfirm.style.marginRight = '15px'; + buttonConfirm.style.display = 'none'; + buttonConfirm.addEventListener('click', kpxcDefine.confirm); + + description.appendMultiple(buttonConfirm, buttonSkip, buttonMore, buttonAgain, buttonDismiss); + + const location = kpxc.getDocumentLocation(); + if (kpxc.settings['defined-custom-fields'] && kpxc.settings['defined-custom-fields'][location]) { + const div = kpxcUI.createElement('div', 'alreadySelected', {}); + const defineDiscard = kpxcUI.createElement('p', '', {}, tr('defineAlreadySelected')); + const buttonDiscard = kpxcUI.createElement('button', 'kpxc-button kpxc-red-button', { 'id': 'kpxcDefine-btn-discard' }, tr('defineDiscard')); + buttonDiscard.style.marginTop = '5px'; + buttonDiscard.addEventListener('click', kpxcDefine.discard); + + div.appendMultiple(defineDiscard, buttonDiscard); + description.append(div); + } +}; + +kpxcDefine.resetSelection = function() { + kpxcDefine.selection = { + username: null, + password: null, + fields: [] + }; + + const fields = $('#kpxcDefine-fields'); + if (fields) { + fields.textContent = ''; + } +}; + +kpxcDefine.isFieldSelected = function(kpxcId) { + if (kpxcId) { + return ( + kpxcId === kpxcDefine.selection.username || + kpxcId === kpxcDefine.selection.password || + kpxcId in kpxcDefine.selection.fields + ); + } + return false; +}; + +kpxcDefine.markAllUsernameFields = function(chooser) { + kpxcDefine.eventFieldClick = function(e, elem) { + const field = elem || e.currentTarget; + kpxcDefine.selection.username = field.getAttribute('data-kpxc-id'); + field.classList.add('kpxcDefine-fixed-username-field'); + field.textContent = tr('username'); + field.onclick = null; + kpxcDefine.prepareStep2(); + kpxcDefine.markAllPasswordFields('#kpxcDefine-fields'); + }; + kpxcDefine.markFields(chooser, kpxcFields.inputQueryPattern); +}; + +kpxcDefine.markAllPasswordFields = function(chooser, more) { + kpxcDefine.eventFieldClick = function(e, elem) { + const field = elem || e.currentTarget; + kpxcDefine.selection.password = field.getAttribute('data-kpxc-id'); + field.classList.add('kpxcDefine-fixed-password-field'); + field.textContent = tr('password'); + field.onclick = null; + kpxcDefine.prepareStep3(); + kpxcDefine.markAllStringFields('#kpxcDefine-fields'); + }; + if (more) { + kpxcDefine.markFields(chooser, kpxcFields.inputQueryPattern); + } else { + kpxcDefine.markFields(chooser, 'input[type=\'password\']'); + } +}; + +kpxcDefine.markAllStringFields = function(chooser) { + kpxcDefine.eventFieldClick = function(e, elem) { + const field = elem || e.currentTarget; + const value = field.getAttribute('data-kpxc-id'); + kpxcDefine.selection.fields[value] = true; + + const count = Object.keys(kpxcDefine.selection.fields).length; + field.classList.add('kpxcDefine-fixed-string-field'); + field.textContent = tr('defineStringField') + String(count); + field.onclick = null; + }; + kpxcDefine.markFields(chooser, kpxcFields.inputQueryPattern + ', select'); +}; + +kpxcDefine.markFields = function(chooser, pattern) { + let index = 1; + let firstInput = null; + const inputs = document.querySelectorAll(pattern); + + for (const i of inputs) { + if (kpxcDefine.isFieldSelected(i.getAttribute('data-kpxc-id'))) { + return true; + } + + if (kpxcFields.isVisible(i)) { + const field = kpxcUI.createElement('div', 'kpxcDefine-fixed-field', { 'data-kpxc-id': i.getAttribute('data-kpxc-id') }); + const rect = i.getBoundingClientRect(); + field.style.top = rect.top + 'px'; + field.style.left = rect.left + 'px'; + field.style.width = rect.width + 'px'; + field.style.height = rect.height + 'px'; + field.textContent = String(index); + field.onclick = function(e) { + kpxcDefine.eventFieldClick(e); + }; + field.onmouseenter = function() { + field.classList.add('kpxcDefine-fixed-hover-field'); + }; + field.onmouseleave = function() { + field.classList.remove('kpxcDefine-fixed-hover-field'); + }; + i.onfocus = function() { + field.classList.add('kpxcDefine-fixed-hover-field'); + } + i.onblur = function() { + field.classList.remove('kpxcDefine-fixed-hover-field'); + }; + const elem = $(chooser); + if (elem) { + elem.append(field); + firstInput = field; + ++index; + } + } + } + + if (firstInput) { + firstInput.focus(); + } +}; + +kpxcDefine.prepareStep1 = function() { + const help = $('#kpxcDefine-help'); + help.style.marginBottom = '10px'; + help.textContent = tr('defineKeyboardText'); + + removeContent('div#kpxcDefine-fixed-field'); + $('#kpxcDefine-chooser-headline').textContent = tr('defineChooseUsername'); + kpxcDefine.dataStep = 1; + $('#kpxcDefine-btn-skip').style.display = 'inline-block'; + $('#kpxcDefine-btn-confirm').style.display = 'none'; + $('#kpxcDefine-btn-again').style.display = 'none'; + $('#kpxcDefine-btn-more').style.display = 'none'; +}; + +kpxcDefine.prepareStep2 = function() { + const help = $('#kpxcDefine-help'); + help.style.marginBottom = '10px'; + help.textContent = tr('defineKeyboardText'); + + removeContent('div.kpxcDefine-fixed-field:not(.kpxcDefine-fixed-username-field)'); + $('#kpxcDefine-chooser-headline').textContent = tr('defineChoosePassword'); + kpxcDefine.dataStep = 2; + $('#kpxcDefine-btn-again').style.display = 'inline-block'; + $('#kpxcDefine-btn-more').style.display = 'inline-block'; +}; + +kpxcDefine.prepareStep3 = function() { + $('#kpxcDefine-help').style.marginBottom = '10px'; + $('#kpxcDefine-help').textContent = tr('defineHelpText'); + + removeContent('div.kpxcDefine-fixed-field:not(.kpxcDefine-fixed-username-field):not(.kpxcDefine-fixed-password-field)'); + $('#kpxcDefine-chooser-headline').textContent = tr('defineConfirmSelection'); + kpxcDefine.dataStep = 3; + $('#kpxcDefine-btn-skip').style.display = 'none'; + $('#kpxcDefine-btn-more').style.display = 'none'; + $('#kpxcDefine-btn-again').style.display = 'inline-block'; + $('#kpxcDefine-btn-confirm').style.display = 'inline-block'; +}; + +kpxcDefine.skip = function() { + if (kpxcDefine.dataStep === 1) { + kpxcDefine.selection.username = null; + kpxcDefine.prepareStep2(); + kpxcDefine.markAllPasswordFields('#kpxcDefine-fields'); + } else if (kpxcDefine.dataStep === 2) { + kpxcDefine.selection.password = null; + kpxcDefine.prepareStep3(); + kpxcDefine.markAllStringFields('#kpxcDefine-fields'); + } +}; + +kpxcDefine.again = function() { + kpxcDefine.resetSelection(); + kpxcDefine.prepareStep1(); + kpxcDefine.markAllUsernameFields('#kpxcDefine-fields'); +}; + +kpxcDefine.more = function() { + if (kpxcDefine.dataStep === 2) { + kpxcDefine.prepareStep2(); + kpxcDefine.markAllPasswordFields('#kpxcDefine-fields', true); + } +}; + +kpxcDefine.confirm = function() { + if (kpxcDefine.dataStep !== 3) { + return; + } + + if (!kpxc.settings['defined-custom-fields']) { + kpxc.settings['defined-custom-fields'] = {}; + } + + if (kpxcDefine.selection.username) { + kpxcDefine.selection.username = kpxcFields.prepareId(kpxcDefine.selection.username); + } + + if (kpxcDefine.selection.password) { + kpxcDefine.selection.password = kpxcFields.prepareId(kpxcDefine.selection.password); + } + + const fieldIds = []; + const fieldKeys = Object.keys(kpxcDefine.selection.fields); + for (const i of fieldKeys) { + fieldIds.push(kpxcFields.prepareId(i)); + } + + const location = kpxc.getDocumentLocation(); + kpxc.settings['defined-custom-fields'][location] = { + username: kpxcDefine.selection.username, + password: kpxcDefine.selection.password, + fields: fieldIds + }; + + browser.runtime.sendMessage({ + action: 'save_settings', + args: [ kpxc.settings ] + }); + + kpxcDefine.close(); +}; + +kpxcDefine.discard = function() { + const location = kpxc.getDocumentLocation(); + delete kpxc.settings['defined-custom-fields'][location]; + + browser.runtime.sendMessage({ + action: 'save_settings', + args: [ kpxc.settings ] + }); + + browser.runtime.sendMessage({ + action: 'load_settings' + }); + + $('div.alreadySelected').remove(); +}; + +// Handle the keyboard events +kpxcDefine.keyDown = function(e) { + if (e.key === 'Escape') { + kpxcDefine.close(); + } else if (e.key === 'Enter') { + e.preventDefault(); + } else if (e.keyCode >= 49 && e.keyCode <= 57) { + // Select input field by number + e.preventDefault(); + const index = e.keyCode - 48; + const inputFields = document.querySelectorAll('div.kpxcDefine-fixed-field:not(.kpxcDefine-fixed-username-field):not(.kpxcDefine-fixed-password-field)'); + + if (inputFields.length >= index) { + kpxcDefine.eventFieldClick(e, inputFields[index - 1]); + } + } else if (e.key === 's') { + e.preventDefault(); + kpxcDefine.skip(); + } else if (e.key === 'a') { + e.preventDefault(); + kpxcDefine.again(); + } else if (e.key === 'c') { + e.preventDefault(); + kpxcDefine.confirm(); + } else if (e.key === 'm') { + e.preventDefault(); + kpxcDefine.more(); + } else if (e.key === 'd') { + e.preventDefault(); + kpxcDefine.discard(); + } +}; + +const removeContent = function(pattern) { + const elems = document.querySelectorAll(pattern); + for (const e of elems) { + e.remove(); + } +}; diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js new file mode 100755 index 0000000..7eb916d --- /dev/null +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -0,0 +1,1496 @@ +'use strict'; + +// contains already called method names +var _called = {}; +_called.retrieveCredentials = false; +_called.clearLogins = false; +_called.manualFillRequested = 'none'; +let _loginId = -1; +let _singleInputEnabledForPage = false; +const _maximumInputs = 100; + +// Count of detected form fields on the page +var _detectedFields = 0; + +// Element id's containing input fields detected by MutationObserver +var _observerIds = []; + +// Document URL +let _documentURL = document.location.href; + +// These are executed in each frame +browser.runtime.onMessage.addListener(function(req, sender) { + if ('action' in req) { + if (req.action === 'fill_user_pass_with_specific_login') { + if (kpxc.credentials[req.id]) { + let combination = null; + if (kpxc.u) { + kpxc.setValueWithChange(kpxc.u, kpxc.credentials[req.id].login); + combination = kpxcFields.getCombination('username', kpxc.u); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ req.id ] + }); + kpxc.u.focus(); + } + if (kpxc.p) { + kpxc.setValueWithChange(kpxc.p, kpxc.credentials[req.id].password); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ req.id ] + }); + combination = kpxcFields.getCombination('password', kpxc.p); + } + + let list = []; + if (kpxc.fillInStringFields(combination.fields, kpxc.credentials[req.id].stringFields, list)) { + kpxcForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); + } + } + } else if (req.action === 'fill_username_password') { + _called.manualFillRequested = 'both'; + kpxc.receiveCredentialsIfNecessary().then((response) => { + kpxc.fillInFromActiveElement(false); + }); + } else if (req.action === 'fill_password') { + _called.manualFillRequested = 'pass'; + kpxc.receiveCredentialsIfNecessary().then((response) => { + kpxc.fillInFromActiveElement(false, true); // passOnly to true + }); + } else if (req.action === 'fill_totp') { + kpxc.receiveCredentialsIfNecessary().then((response) => { + kpxc.fillInFromActiveElementTOTPOnly(false); + }); + } else if (req.action === 'clear_credentials') { + kpxcEvents.clearCredentials(); + return Promise.resolve(); + } else if (req.action === 'activated_tab') { + kpxcEvents.triggerActivatedTab(); + return Promise.resolve(); + } else if (req.action === 'ignore_site') { + kpxc.ignoreSite(req.args); + } else if (req.action === 'check_database_hash' && 'hash' in req) { + kpxc.detectDatabaseChange(req.hash); + } else if (req.action === 'activate_password_generator') { + kpxc.initPasswordGenerator(kpxcFields.getAllFields()); + } else if (req.action === 'remember_credentials') { + kpxc.contextMenuRememberCredentials(); + } else if (req.action === 'choose_credential_fields') { + kpxcDefine.init(); + } else if (req.action === 'redetect_fields') { + browser.runtime.sendMessage({ + action: 'load_settings', + }).then((response) => { + kpxc.settings = response; + kpxc.initCredentialFields(true); + }); + } else if (req.action === 'show_password_generator') { + kpxcPassword.trigger(); +} + } +}); + +function _f(fieldId) { + const inputs = document.querySelectorAll('input[data-kpxc-id=\'' + fieldId + '\']'); + return inputs.length > 0 ? inputs[0] : null; +} + +function _fs(fieldId) { + const inputs = document.querySelectorAll('input[data-kpxc-id=\'' + fieldId + '\'], select[data-kpxc-id=\'' + fieldId + '\']'); + return inputs.length > 0 ? inputs[0] : null; +} + + +var kpxcForm = {}; + +kpxcForm.init = function(form, credentialFields) { + if (!form.getAttribute('kpxcForm-initialized') && (credentialFields.password || credentialFields.username)) { + form.setAttribute('kpxcForm-initialized', true); + kpxcForm.setInputFields(form, credentialFields); + form.addEventListener('submit', kpxcForm.onSubmit); + } +}; + +kpxcForm.destroy = function(form, credentialFields) { + if (form === false && credentialFields) { + const field = _f(credentialFields.password) || _f(credentialFields.username); + if (field) { + form = field.closest('form'); + } + } + + if (form && form.length > 0) { + form.onsubmit = null; + } +}; + +kpxcForm.setInputFields = function(form, credentialFields) { + form.setAttribute('kpxcUsername', credentialFields.username); + form.setAttribute('kpxcPassword', credentialFields.password); +}; + +kpxcForm.onSubmit = function() { + const usernameId = this.getAttribute('kpxcUsername'); + const passwordId = this.getAttribute('kpxcPassword'); + + let usernameValue = ''; + let passwordValue = ''; + + const usernameField = _f(usernameId); + const passwordField = _f(passwordId); + + if (usernameField) { + usernameValue = usernameField.value; + } + if (passwordField) { + passwordValue = passwordField.value; + } + + kpxc.rememberCredentials(usernameValue, passwordValue); +}; + + +var kpxcFields = {}; + +kpxcFields.inputQueryPattern = 'input[type=\'text\'], input[type=\'email\'], input[type=\'password\'], input[type=\'tel\'], input[type=\'number\'], input:not([type])'; +// Unique number as new IDs for input fields +kpxcFields.uniqueNumber = 342845638; +// Objects with combination of username + password fields +kpxcFields.combinations = []; + +kpxcFields.setUniqueId = function(field) { + if (field && !field.getAttribute('data-kpxc-id')) { + // Use ID of field if it is unique + const fieldId = field.getAttribute('id'); + if (fieldId) { + const foundIds = document.querySelectorAll('input#' + kpxcFields.prepareId(fieldId)); + if (foundIds.length === 1) { + field.setAttribute('data-kpxc-id', fieldId); + return; + } + } + + // Create own ID if no ID is set for this field + kpxcFields.uniqueNumber += 1; + field.setAttribute('data-kpxc-id', 'kpxcpw' + String(kpxcFields.uniqueNumber)); + } +}; + +kpxcFields.prepareId = function(id) { + return id.replace(/[:#.,\[\]\(\)' "]/g, function(m) { + return '\\' + m; + }); +}; + +/** + * Returns the first parent element satifying the {@code predicate} mapped by {@code resultFn} or else {@code defaultVal}. + * @param {HTMLElement} element The start element (excluded, starting with the parents) + * @param {function} predicate Matcher for the element to find, type (HTMLElement) => boolean + * @param {function} resultFn Callback function of type (HTMLElement) => {*} called for the first matching element + * @param {fun} defaultValFn Fallback return value supplier, if no element matching the predicate can be found + */ +kpxcFields.traverseParents = function(element, predicate, resultFn = () => true, defaultValFn = () => false) { + for (let f = element.parentElement; f !== null; f = f.parentElement) { + if (predicate(f)) { + return resultFn(f); + } + } + return defaultValFn(); +}; + +kpxcFields.getOverflowHidden = function(field) { + return kpxcFields.traverseParents(field, f => f.style.overflow === 'hidden'); +}; + +// Checks if input field is a search field. Attributes or form action containing 'search', or parent element holding +// role="search" will be identified as a search field. +kpxcFields.isSearchField = function(target) { + const attributes = target.attributes; + + // Check element attributes + for (const attr of attributes) { + if ((attr.value && (attr.value.toLowerCase().includes('search')) || attr.value === 'q')) { + return true; + } + } + + // Check closest form + const closestForm = target.closest('form'); + if (closestForm) { + // Check form action + const formAction = closestForm.getAttribute('action'); + if (formAction && (formAction.toLowerCase().includes('search') && + !formAction.toLowerCase().includes('research'))) { + return true; + } + + // Check form class and id + const closestFormId = closestForm.getAttribute('id'); + const closestFormClass = closestForm.className; + if (closestFormClass && (closestForm.className.toLowerCase().includes('search') || + (closestFormId && closestFormId.toLowerCase().includes('search') && !closestFormId.toLowerCase().includes('research')))) { + return true; + } + } + + // Check parent elements for role="search" + const roleFunc = f => f.getAttribute('role'); + const roleValue = kpxcFields.traverseParents(target, roleFunc, roleFunc, () => null); + if (roleValue && roleValue === 'search') { + return true; + } + + return false; +}; + +kpxcFields.isVisible = function(field) { + const rect = field.getBoundingClientRect(); + + // Check CSS visibility + const fieldStyle = getComputedStyle(field); + if (fieldStyle.visibility && (fieldStyle.visibility === 'hidden' || fieldStyle.visibility === 'collapse')) { + return false; + } + + // Check element position and size + if (rect.x < 0 || rect.y < 0 || rect.width < 8 || rect.height < 8) { + return false; + } + + return true; +}; + +kpxcFields.getAllFields = function() { + const fields = []; + const inputs = kpxcObserverHelper.getInputs(document); + for (const i of inputs) { + if (kpxcFields.isVisible(i) && !kpxcFields.isSearchField(i)) { + kpxcFields.setUniqueId(i); + fields.push(i); + } + } + + _detectedFields = fields.length; + return fields; +}; + +kpxcFields.prepareVisibleFieldsWithID = function(pattern) { + const patterns = document.querySelectorAll(pattern); + for (const i of patterns) { + if (kpxcFields.isVisible(i) && i.style.visibility !== 'hidden' && i.style.visibility !== 'collapsed') { + kpxcFields.setUniqueId(i); + } + } +}; + +kpxcFields.getAllCombinations = function(inputs) { + const fields = []; + let uField = null; + + for (const i of inputs) { + if (i) { + if (i.getAttribute('type') && i.getAttribute('type').toLowerCase() === 'password') { + const uId = (!uField || uField.length < 1) ? null : uField.getAttribute('data-kpxc-id'); + + const combination = { + username: uId, + password: i.getAttribute('data-kpxc-id') + }; + fields.push(combination); + + // Reset selected username field + uField = null; + } else { + // Username field + uField = i; + } + } + } + + if (_singleInputEnabledForPage && fields.length === 0 && uField) { + const combination = { + username: uField.getAttribute('data-kpxc-id'), + password: null + }; + fields.push(combination); + } + + return fields; +}; + +kpxcFields.getCombination = function(givenType, fieldId) { + if (kpxcFields.combinations.length === 0) { + if (kpxcFields.useDefinedCredentialFields()) { + return kpxcFields.combinations[0]; + } + } + // Use defined credential fields (already loaded into combinations) + const location = kpxc.getDocumentLocation(); + if (kpxc.settings['defined-custom-fields'] && kpxc.settings['defined-custom-fields'][location]) { + return kpxcFields.combinations[0]; + } + + for (let c of kpxcFields.combinations) { + if (c[givenType] === fieldId) { + return c; + } + } + + // Find new combination + let combination = { + username: null, + password: null + }; + + let newCombi = false; + if (givenType === 'username') { + const passwordField = kpxcFields.getPasswordField(fieldId, true); + let passwordId = null; + if (passwordField && passwordField.value.length > 0) { + passwordId = kpxcFields.prepareId(passwordField.getAttribute('data-kpxc-id')); + } + combination = { + username: fieldId, + password: passwordId + }; + newCombi = true; + } else if (givenType === 'password') { + const usernameField = kpxcFields.getUsernameField(fieldId, true); + let usernameId = null; + if (usernameField && usernameField.value.length > 0) { + usernameId = kpxcFields.prepareId(usernameField.getAttribute('data-kpxc-id')); + } + combination = { + username: usernameId, + password: fieldId + }; + newCombi = true; + } + + if (combination.username || combination.password) { + kpxcFields.combinations.push(combination); + } + + if (combination.username) { + if (kpxc.credentials.length > 0) { + kpxc.preparePageForMultipleCredentials(kpxc.credentials); + } + } + + if (newCombi) { + combination.isNew = true; + } + return combination; +}; + +/** +* Return the username field or null if it not exists +*/ +kpxcFields.getUsernameField = function(passwordId, checkDisabled) { + const passwordField = _f(passwordId); + if (!passwordField) { + return null; + } + + const form = passwordField.closest('form'); + let usernameField = null; + + // Search all inputs on this one form + if (form) { + const inputs = form.querySelectorAll(kpxcFields.inputQueryPattern); + for (const i of inputs) { + kpxcFields.setUniqueId(i); + if (i.getAttribute('data-kpxc-id') === passwordId) { + return false; // Break + } + + if (i.getAttribute('type') && i.getAttribute('type').toLowerCase() === 'password') { + return true; // Continue + } + + usernameField = i; + } + } else { + // Search all inputs on page + const inputs = kpxcFields.getAllFields(); + kpxc.initPasswordGenerator(inputs); + for (const i of inputs) { + if (i.getAttribute('data-kpxc-id') === passwordId) { + break; + } + + if (i.getAttribute('type') && i.getAttribute('type').toLowerCase() === 'password') { + continue; + } + + usernameField = i; + } + } + + if (usernameField && !checkDisabled) { + const usernameId = usernameField.getAttribute('data-kpxc-id'); + // Check if usernameField is already used by another combination + for (const c of kpxcFields.combinations) { + if (c.username === usernameId) { + usernameField = null; + break; + } + } + } + + kpxcFields.setUniqueId(usernameField); + return usernameField; +}; + +/** +* Return the password field or null if it not exists +*/ +kpxcFields.getPasswordField = function(usernameId, checkDisabled) { + const usernameField = _f(usernameId); + if (!usernameField) { + return null; + } + + const form = usernameField.closest('form'); + let passwordField = null; + + // Search all inputs on this one form + if (form) { + const inputs = form.querySelectorAll('input[type=\'password\']'); + if (inputs.length > 0) { + passwordField = inputs[0]; + } + if (passwordField && passwordField.length < 1) { + passwordField = null; + } + + if (kpxc.settings.usePasswordGenerator) { + kpxcPassword.init(); + kpxcPassword.initField(passwordField); + } + } else { + // Search all inputs on page + const inputs = kpxcFields.getAllFields(); + kpxc.initPasswordGenerator(inputs); + + let active = false; + for (const i of inputs) { + if (i.getAttribute('data-kpxc-id') === usernameId) { + active = true; + } + if (active && i.getAttribute('type') && i.getAttribute('type').toLowerCase() === 'password') { + passwordField = i; + break; + } + } + } + + if (passwordField && !checkDisabled) { + const passwordId = passwordField.getAttribute('data-kpxc-id'); + // Check if passwordField is already used by another combination + for (const c of kpxcFields.combinations) { + if (c.password === passwordId) { + passwordField = null; + break; + } + } + } + + kpxcFields.setUniqueId(passwordField); + return passwordField; +}; + +kpxcFields.prepareCombinations = function(combinations) { + for (const c of combinations) { + const pwField = _f(c.password); + // Needed for auto-complete: don't overwrite manually filled-in password field + if (pwField && !pwField.getAttribute('kpxcFields-onChange')) { + pwField.setAttribute('kpxcFields-onChange', true); + pwField.onchange = function() { + this.setAttribute('unchanged', false); + } + } + + // Initialize form-submit for remembering credentials + const fieldId = c.password || c.username; + const field = _f(fieldId); + if (field) { + const form = field.closest('form'); + if (form && form.length > 0) { + kpxcForm.init(form, c); + } + } + } +}; + +kpxcFields.useDefinedCredentialFields = function() { + const location = kpxc.getDocumentLocation(); + if (kpxc.settings['defined-credential-fields'] && kpxc.settings['defined-credential-fields'][location]) { + const creds = kpxc.settings['defined-credential-fields'][location]; + + let found = _f(creds.username) || _f(creds.password); + for (const i of creds.fields) { + if (_fs(i)) { + found = true; + break; + } + } + + if (found) { + const fields = { + username: creds.username, + password: creds.password, + fields: creds.fields + }; + kpxcFields.combinations = []; + kpxcFields.combinations.push(fields); + + return true; + } + } + + return false; +}; + +var kpxcObserverHelper = {}; +kpxcObserverHelper.inputTypes = [ + 'text', + 'email', + 'password', + 'tel', + 'number', + null // Input field can be without any type. Include these to the list. +]; + +// Ignores all nodes that doesn't contain elements +kpxcObserverHelper.ignoredNode = function(target) { + if (target.nodeType === Node.ATTRIBUTE_NODE || + target.nodeType === Node.TEXT_NODE || + target.nodeType === Node.CDATA_SECTION_NODE || + target.nodeType === Node.PROCESSING_INSTRUCTION_NODE || + target.nodeType === Node.COMMENT_NODE || + target.nodeType === Node.DOCUMENT_TYPE_NODE || + target.nodeType === Node.NOTATION_NODE) { + return true; + } + return false; +}; + +kpxcObserverHelper.getInputs = function(target) { + // Ignores target element if it's not an element node + if (kpxcObserverHelper.ignoredNode(target)) { + return []; + } + + // Filter out any input fields with type 'hidden' right away + const inputFields = []; + Array.from(target.getElementsByTagName('input')).forEach((e) => { + if (e.type !== 'hidden') { + inputFields.push(e); + } + }); + + // Do not allow more visible inputs than _maximumInputs (default value: 100) + if (inputFields.length === 0 || inputFields.length > _maximumInputs) { + return []; + } + + // Only include input fields that match with kpxcObserverHelper.inputTypes + const inputs = []; + for (const i of inputFields) { + let type = i.getAttribute('type'); + if (type) { + type = type.toLowerCase(); + } + + if (kpxcObserverHelper.inputTypes.includes(type)) { + inputs.push(i); + } + } + return inputs; +}; + +kpxcObserverHelper.getId = function(target) { + return target.classList.length === 0 ? target.id : target.classList; +}; + +kpxcObserverHelper.ignoredElement = function(target) { + // Ignore elements that do not have a className (including SVG) + if (typeof target.className !== 'string') { + return true; + } + + // Ignore KeePassXC-Browser classes + if (target.className && target.className !== undefined && + (target.className.includes('kpxc') || target.className.includes('ui-helper'))) { + return true; + } + + return false; +}; + +kpxcObserverHelper.handleObserverAdd = function(target) { + if (kpxcObserverHelper.ignoredElement(target)) { + return; + } + + const inputs = kpxcObserverHelper.getInputs(target); + if (inputs.length === 0) { + return; + } + + const neededLength = _detectedFields === 1 ? 0 : 1; + const id = kpxcObserverHelper.getId(target); + if (inputs.length > neededLength && !_observerIds.includes(id)) { + // Save target element id for preventing multiple calls to initCredentialsFields() + _observerIds.push(id); + + // Sometimes the settings haven't been loaded before new input fields are detected + if (Object.keys(kpxc.settings).length === 0) { + kpxc.init(); + } else { + kpxc.initCredentialFields(true); + } + } +}; + +kpxcObserverHelper.handleObserverRemove = function(target) { + if (kpxcObserverHelper.ignoredElement(target)) { + return; + } + + const inputs = kpxcObserverHelper.getInputs(target); + if (inputs.length === 0) { + return; + } + + // Remove target element id from the list + const id = kpxcObserverHelper.getId(target); + if (_observerIds.includes(id)) { + const index = _observerIds.indexOf(id); + if (index >= 0) { + _observerIds.splice(index, 1); + } + } +}; + +kpxcObserverHelper.detectURLChange = function() { + if (_documentURL !== document.location.href) { + _documentURL = document.location.href; + kpxcEvents.clearCredentials(); + kpxc.initCredentialFields(true); + } +}; + +MutationObserver = window.MutationObserver || window.WebKitMutationObserver; + +// Detects DOM changes in the document +let observer = new MutationObserver(function(mutations, observer) { + if (document.visibilityState === 'hidden') { + return; + } + + for (const mut of mutations) { + // Skip text nodes + if (mut.target.nodeType === Node.TEXT_NODE) { + continue; + } + + // Check document URL change and detect new fields + kpxcObserverHelper.detectURLChange(); + + // Handle attributes only if CSS display is modified + if (mut.type === 'attributes') { + const newValue = mut.target.getAttribute(mut.attributeName); + if (newValue && (newValue.includes('display') || newValue.includes('z-index'))) { + if (mut.target.style.display !== 'none') { + kpxcObserverHelper.handleObserverAdd(mut.target); + } else { + kpxcObserverHelper.handleObserverRemove(mut.target); + } + } + } else if (mut.type === 'childList') { + kpxcObserverHelper.handleObserverAdd((mut.addedNodes.length > 0) ? mut.addedNodes[0] : mut.target); + kpxcObserverHelper.handleObserverRemove((mut.removedNodes.length > 0) ? mut.removedNodes[0] : mut.target); + } + } +}); + +// define what element should be observed by the observer +// and what types of mutations trigger the callback +observer.observe(document, { + subtree: true, + attributes: true, + childList: true, + characterData: true, + attributeFilter: ['style'] +}); + +var kpxc = {}; +kpxc.settings = {}; +kpxc.u = null; +kpxc.p = null; +kpxc.url = null; +kpxc.submitUrl = null; +kpxc.credentials = []; + +const initcb = function() { + browser.runtime.sendMessage({ + action: 'load_settings', + }).then((response) => { + kpxc.settings = response; + kpxc.initCredentialFields(); + }); +}; + +if (document.readyState === 'complete' || (document.readyState !== 'loading' && !document.documentElement.doScroll)) { + initcb(); +} else { + document.addEventListener('DOMContentLoaded', initcb); +} + +kpxc.init = function() { + initcb(); +}; + +// Clears all from the content and background scripts, including autocomplete +kpxc.clearAllFromPage = function() { + kpxcEvents.clearCredentials(); + + browser.runtime.sendMessage({ + action: 'page_clear_logins' + }); + + // Switch back to default popup + browser.runtime.sendMessage({ + action: 'get_status', + args: [ true ] // Set polling to true, this is an internal function call + }); +}; + +// Switch credentials if database is changed or closed +kpxc.detectDatabaseChange = function(response) { + kpxc.clearAllFromPage(); + if (document.visibilityState !== 'hidden') { + if (response.new !== '' && response.new !== response.old) { + _called.retrieveCredentials = false; + browser.runtime.sendMessage({ + action: 'load_settings' + }).then((settings) => { + kpxc.settings = settings; + kpxc.initCredentialFields(true); + + // If user has requested a manual fill through context menu the actual credential filling + // is handled here when the opened database has been regognized. It's not a pretty hack. + if (_called.manualFillRequested && _called.manualFillRequested !== 'none') { + kpxc.fillInFromActiveElement(false, _called.manualFillRequested === 'pass'); + _called.manualFillRequested = 'none'; + } + }); + } + } +}; + +kpxc.initCredentialFields = function(forceCall) { + if (_called.initCredentialFields && !forceCall) { + return; + } + _called.initCredentialFields = true; + + browser.runtime.sendMessage({ 'action': 'page_clear_logins', args: [ _called.clearLogins ] }).then(() => { + _called.clearLogins = true; + + // Check site preferences + kpxc.initializeSitePreferences(); + if (kpxc.settings.sitePreferences) { + for (const site of kpxc.settings.sitePreferences) { + if (site.url === window.top.location.href || siteMatch(site.url, window.top.location.href)) { + if (site.ignore === IGNORE_FULL) { + return; + } + + _singleInputEnabledForPage = site.usernameOnly; + } + } + } + + const inputs = kpxcFields.getAllFields(); + if (inputs.length === 0) { + return; + } + + kpxcFields.prepareVisibleFieldsWithID('select'); + kpxc.initPasswordGenerator(inputs); + + if (!kpxcFields.useDefinedCredentialFields()) { + // Get all combinations of username + password fields + kpxcFields.combinations = kpxcFields.getAllCombinations(inputs); + } + kpxcFields.prepareCombinations(kpxcFields.combinations); + + if (kpxcFields.combinations.length === 0 && inputs.length === 0) { + browser.runtime.sendMessage({ + action: 'show_default_browseraction' + }); + return; + } + + kpxc.url = document.location.origin; + kpxc.submitUrl = kpxc.getFormActionUrl(kpxcFields.combinations[0]); + + // Get submitUrl for a single input + if (!kpxc.submitUrl && kpxcFields.combinations.length === 1 && inputs.length === 1) { + kpxc.submitUrl = kpxc.getFormActionUrlFromSingleInput(inputs[0]); + } + + if (kpxc.settings.autoRetrieveCredentials && _called.retrieveCredentials === false && (kpxc.url && kpxc.submitUrl)) { + browser.runtime.sendMessage({ + action: 'retrieve_credentials', + args: [ kpxc.url, kpxc.submitUrl ] + }).then(kpxc.retrieveCredentialsCallback).catch((e) => { + console.log(e); + }); + } else if (_singleInputEnabledForPage) { + kpxc.preparePageForMultipleCredentials(kpxc.credentials); + } + }); +}; + +kpxc.initPasswordGenerator = function(inputs) { + if (kpxc.settings.usePasswordGenerator) { + kpxcPassword.init(); + + for (let i = 0; i < inputs.length; i++) { + if (inputs[i] && inputs[i].getAttribute('type') && inputs[i].getAttribute('type').toLowerCase() === 'password') { + kpxcPassword.initField(inputs[i], inputs, i); + } + } + } +}; + +kpxc.receiveCredentialsIfNecessary = function() { + return new Promise((resolve, reject) => { + if (kpxc.credentials.length === 0 && _called.retrieveCredentials === false) { + browser.runtime.sendMessage({ + action: 'retrieve_credentials', + args: [ kpxc.url, kpxc.submitUrl, false, true ] // Sets triggerUnlock to true + }).then((credentials) => { + // If the database was locked, this is scope never met. In these cases the response is met at kpxc.detectDatabaseChange + _called.manualFillRequested = 'none'; + kpxc.retrieveCredentialsCallback(credentials, false); + resolve(credentials); + }); + } else { + resolve(kpxc.credentials); + } + }); +}; + +kpxc.retrieveCredentialsCallback = function(credentials, dontAutoFillIn) { + if (kpxcFields.combinations.length > 0) { + kpxc.u = _f(kpxcFields.combinations[0].username); + kpxc.p = _f(kpxcFields.combinations[0].password); + } + + if (credentials && credentials.length > 0) { + kpxc.credentials = credentials; + kpxc.prepareFieldsForCredentials(!Boolean(dontAutoFillIn)); + _called.retrieveCredentials = true; + } +}; + +kpxc.prepareFieldsForCredentials = function(autoFillInForSingle) { + // only one login for this site + if (autoFillInForSingle && kpxc.settings.autoFillSingleEntry && kpxc.credentials.length === 1) { + let combination = null; + if (!kpxc.p && !kpxc.u && kpxcFields.combinations.length > 0) { + kpxc.u = _f(kpxcFields.combinations[0].username); + kpxc.p = _f(kpxcFields.combinations[0].password); + combination = kpxcFields.combinations[0]; + } + if (kpxc.u) { + kpxc.setValueWithChange(kpxc.u, kpxc.credentials[0].login); + combination = kpxcFields.getCombination('username', kpxc.u); + } + if (kpxc.p) { + kpxc.setValueWithChange(kpxc.p, kpxc.credentials[0].password); + combination = kpxcFields.getCombination('password', kpxc.p); + } + + if (combination) { + let list = []; + if (kpxc.fillInStringFields(combination.fields, kpxc.credentials[0].stringFields, list)) { + kpxcForm.destroy(false, {'password': list.list[0], 'username': list.list[1]}); + } + } + + // Generate popup-list of usernames + descriptions + browser.runtime.sendMessage({ + action: 'popup_login', + args: [ [ kpxc.credentials[0].login + ' (' + kpxc.credentials[0].name + ')' ]] + }); + } else if (kpxc.credentials.length > 1 || (kpxc.credentials.length > 0 && (!kpxc.settings.autoFillSingleEntry || !autoFillInForSingle))) { + kpxc.preparePageForMultipleCredentials(kpxc.credentials); + } +}; + +kpxc.preparePageForMultipleCredentials = function(credentials) { + // add usernames + descriptions to autocomplete-list and popup-list + const usernames = []; + kpxcAutocomplete.elements = []; + let visibleLogin; + for (let i = 0; i < credentials.length; i++) { + visibleLogin = (credentials[i].login.length > 0) ? credentials[i].login : tr('credentialsNoUsername'); + usernames.push(visibleLogin + ' (' + credentials[i].name + ')'); + const item = { + label: visibleLogin + ' (' + credentials[i].name + ')', + value: credentials[i].login, + loginId: i + }; + kpxcAutocomplete.elements.push(item); + } + + // Generate popup-list of usernames + descriptions + browser.runtime.sendMessage({ + action: 'popup_login', + args: [ usernames ] + }); + + // Initialize autocomplete for username fields + if (kpxc.settings.autoCompleteUsernames) { + for (const i of kpxcFields.combinations) { + // Both username and password fields are visible + if (_detectedFields >= 2) { + if (_f(i.username)) { + kpxcAutocomplete.create(_f(i.username)); + } + } else if (_detectedFields === 1) { + if (_f(i.username)) { + kpxcAutocomplete.create(_f(i.username)); + } + if (_f(i.password)) { + kpxcAutocomplete.create(_f(i.password)); + } + } + } + } +}; + +kpxc.getFormActionUrl = function(combination) { + if (!combination) { + return null; + } + + const field = _f(combination.password) || _f(combination.username); + if (field === null) { + return null; + } + + const form = field.closest('form'); + let action = null; + + if (form && form.length > 0) { + action = form[0].action; + } + + if (typeof(action) !== 'string' || action === '') { + action = document.location.origin + document.location.pathname; + } + + return action; +}; + +kpxc.getFormActionUrlFromSingleInput = function(field) { + if (!field) { + return null; + } + + let action = field.formAction; + + if (typeof(action) !== 'string' || action === '') { + action = document.location.origin + document.location.pathname; + } + + return action; +}; + +kpxc.fillInCredentials = function(combination, onlyPassword, suppressWarnings) { + const action = kpxc.getFormActionUrl(combination); + const u = _f(combination.username); + const p = _f(combination.password); + + if (combination.isNew) { + // Initialize form-submit for remembering credentials + const fieldId = combination.password || combination.username; + const field = _f(fieldId); + if (field) { + const form2 = field.closest('form'); + if (form2 && form2.length > 0) { + kpxcForm.init(form2, combination); + } + } + } + + if (u) { + kpxc.u = u; + } + if (p) { + kpxc.p = p; + } + + if (kpxc.url === document.location.origin && kpxc.submitUrl === action && kpxc.credentials.length > 0) { + kpxc.fillIn(combination, onlyPassword, suppressWarnings); + } else { + kpxc.url = document.location.origin; + kpxc.submitUrl = action; + + browser.runtime.sendMessage({ + action: 'retrieve_credentials', + args: [ kpxc.url, kpxc.submitUrl, false, true ] + }).then((credentials) => { + kpxc.retrieveCredentialsCallback(credentials, true); + kpxc.fillIn(combination, onlyPassword, suppressWarnings); + }); + } +}; + +kpxc.fillInFromActiveElement = function(suppressWarnings, passOnly = false) { + const el = document.activeElement; + if (el.tagName.toLowerCase() !== 'input') { + if (kpxcFields.combinations.length > 0) { + kpxc.fillInCredentials(kpxcFields.combinations[0], false, suppressWarnings); + } + return; + } + + kpxcFields.setUniqueId(el); + const fieldId = kpxcFields.prepareId(el.getAttribute('data-kpxc-id')); + let combination = null; + if (el.getAttribute('type') === 'password') { + combination = kpxcFields.getCombination('password', fieldId); + } else { + combination = kpxcFields.getCombination('username', fieldId); + } + + if (passOnly) { + if (!_f(combination.password)) { + const message = tr('fieldsNoPasswordField'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + return; + } + } + + delete combination.loginId; + + kpxc.fillInCredentials(combination, passOnly, suppressWarnings); +}; + +kpxc.fillInFromActiveElementTOTPOnly = function(suppressWarnings) { + const el = document.activeElement; + kpxcFields.setUniqueId(el); + const fieldId = kpxcFields.prepareId(el.getAttribute('data-kpxc-id')); + + browser.runtime.sendMessage({ + action: 'page_get_login_id' + }).then((pos) => { + if (pos >= 0 && kpxc.credentials[pos]) { + // Check the value from stringFields (to be removed) + const currentField = _fs(fieldId); + if (kpxc.credentials[pos].stringFields && kpxc.credentials[pos].stringFields.length > 0) { + const stringFields = kpxc.credentials[pos].stringFields; + for (const s of stringFields) { + const val = s['KPH: {TOTP}']; + if (val) { + kpxc.setValue(currentField, val); + } + } + } else if (kpxc.credentials[pos].totp && kpxc.credentials[pos].totp.length > 0) { + kpxc.setValue(currentField, kpxc.credentials[pos].totp); + } + } + }); +}; + +kpxc.setValue = function(field, value) { + if (field.matches('select')) { + value = value.toLowerCase().trim(); + const options = field.querySelectorAll('option'); + for (const o of options) { + if (o.test().toLowerCase().trim() === value) { + kpxc.setValueWithChange(field, o.value); + return false; + } + } + } else { + kpxc.setValueWithChange(field, value); + } +}; + +kpxc.fillInStringFields = function(fields, stringFields, filledInFields) { + let filledIn = false; + + filledInFields.list = []; + if (fields && stringFields && fields.length > 0 && stringFields.length > 0) { + for (let i = 0; i < fields.length; i++) { + const currentField = _fs(fields[i]); + const stringFieldValue = Object.values(stringFields[i]); + if (currentField && stringFieldValue[0]) { + kpxc.setValue(currentField, stringFieldValue[0]); + filledInFields.list.push(fields[i]); + filledIn = true; + } + } + } + + return filledIn; +}; + +kpxc.setValueWithChange = function(field, value) { + if (kpxc.settings.respectMaxLength === true) { + const attributeMaxlength = field.getAttribute('maxlength'); + if (attributeMaxlength && !isNaN(attributeMaxlength) && attributeMaxlength > 0) { + value = value.substr(0, attributeMaxlength); + } + } + + field.value = value; + field.dispatchEvent(new Event('input', { 'bubbles': true })); + field.dispatchEvent(new Event('change', { 'bubbles': true })); +}; + +kpxc.fillIn = function(combination, onlyPassword, suppressWarnings) { + // No credentials available + if (kpxc.credentials.length === 0 && !suppressWarnings) { + const message = tr('credentialsNoLoginsFound'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + return; + } + + const uField = _f(combination.username); + const pField = _f(combination.password); + + // Exactly one pair of credentials available + if (kpxc.credentials.length === 1) { + let filledIn = false; + if (uField && (!onlyPassword || _singleInputEnabledForPage)) { + kpxc.setValueWithChange(uField, kpxc.credentials[0].login); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ 0 ] + }); + filledIn = true; + } + if (pField) { + pField.setAttribute('type', 'password'); + kpxc.setValueWithChange(pField, kpxc.credentials[0].password); + pField.setAttribute('unchanged', true); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ 0 ] + }); + filledIn = true; + } + + let list = []; + if (kpxc.fillInStringFields(combination.fields, kpxc.credentials[0].stringFields, list)) { + kpxcForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); + filledIn = true; + } + + if (!filledIn) { + if (!suppressWarnings) { + const message = tr('fieldsFill'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + } + } + } else if (combination.loginId !== undefined && kpxc.credentials[combination.loginId]) { + // Specific login ID given + let filledIn = false; + if (uField) { + kpxc.setValueWithChange(uField, kpxc.credentials[combination.loginId].login); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ combination.loginId ] + }); + filledIn = true; + } + + if (pField) { + kpxc.setValueWithChange(pField, kpxc.credentials[combination.loginId].password); + pField.setAttribute('unchanged', true); + browser.runtime.sendMessage({ + action: 'page_set_login_id', args: [ combination.loginId ] + }); + filledIn = true; + } + + let list = []; + if (kpxc.fillInStringFields(combination.fields, kpxc.credentials[combination.loginId].stringFields, list)) { + kpxcForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); + filledIn = true; + } + + if (!filledIn) { + if (!suppressWarnings) { + const message = tr('fieldsFill'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + } + } + } else { // Multiple credentials available + // Check if only one password for given username exists + let countPasswords = 0; + + if (uField) { + let valPassword = ''; + let valUsername = ''; + let valStringFields = []; + const valQueryUsername = uField.value.toLowerCase(); + + // Find passwords to given username (even those with empty username) + for (const c of kpxc.credentials) { + if (c.login.toLowerCase() === valQueryUsername) { + countPasswords += 1; + valPassword = c.password; + valUsername = c.login; + valStringFields = c.stringFields; + } + } + + // For the correct notification message: 0 = no logins, X > 1 = too many logins + if (countPasswords === 0) { + countPasswords = kpxc.credentials.length; + } + + // Only one mapping username found + if (countPasswords === 1) { + if (!onlyPassword) { + kpxc.setValueWithChange(uField, valUsername); + } + + if (pField) { + kpxc.setValueWithChange(pField, valPassword); + pField.setAttribute('unchanged', true); + } + + let list = []; + if (kpxc.fillInStringFields(combination.fields, valStringFields, list)) { + kpxcForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); + } + } + + // User has to select correct credentials by himself + if (countPasswords > 1) { + if (!suppressWarnings) { + const target = onlyPassword ? pField : uField; + kpxcAutocomplete.create(target, true); + target.focus(); + } + } else if (countPasswords < 1) { + if (!suppressWarnings) { + const message = tr('credentialsNoUsernameFound'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + } + } + } else { + if (!suppressWarnings) { + const target = onlyPassword ? pField : uField; + kpxcAutocomplete.create(target, true); + target.focus(); + } + } + } +}; + +kpxc.contextMenuRememberCredentials = function() { + const el = document.activeElement; + if (el.tagName.toLowerCase() !== 'input') { + return; + } + + kpxcFields.setUniqueId(el); + const fieldId = kpxcFields.prepareId(el.getAttribute('data-kpxc-id')); + let combination = null; + if (el.getAttribute('type') === 'password') { + combination = kpxcFields.getCombination('password', fieldId); + } else { + combination = kpxcFields.getCombination('username', fieldId); + } + + let usernameValue = ''; + let passwordValue = ''; + + const usernameField = _f(combination.username); + const passwordField = _f(combination.password); + + if (usernameField) { + usernameValue = usernameField.value; + } + if (passwordField) { + passwordValue = passwordField.value; + } + + if (!kpxc.rememberCredentials(usernameValue, passwordValue)) { + const message = tr('rememberNothingChanged'); + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + } +}; + +kpxc.rememberCredentials = function(usernameValue, passwordValue) { + // No password given or field cleaned by a site-running script + // --> no password to save + if (passwordValue === '') { + return false; + } + + let usernameExists = false; + let nothingChanged = false; + + for (const c of kpxc.credentials) { + if (c.login === usernameValue && c.password === passwordValue) { + nothingChanged = true; + break; + } + + if (c.login === usernameValue) { + usernameExists = true; + } + } + + if (!nothingChanged) { + if (!usernameExists) { + for (const c of kpxc.credentials) { + if (c.login === usernameValue) { + usernameExists = true; + break; + } + } + } + const credentialsList = []; + for (const c of kpxc.credentials) { + credentialsList.push({ + login: c.login, + name: c.name, + uuid: c.uuid + }); + } + + let url = this.action; + if (!url) { + url = kpxc.getDocumentLocation(); + if (url.indexOf('?') > 0) { + url = url.substring(0, url.indexOf('?')); + if (url.length < document.location.origin.length) { + url = document.location.origin; + } + } + } + + browser.runtime.sendMessage({ + action: 'set_remember_credentials', + args: [ usernameValue, passwordValue, url, usernameExists, credentialsList ] + }); + + return true; + } + + return false; +}; + +kpxc.ignoreSite = function(sites) { + if (!sites || sites.length === 0) { + return; + } + + let site = sites[0]; + kpxc.initializeSitePreferences(); + + if (slashNeededForUrl(site)) { + site += '/'; + } + + // Check if the site already exists + let siteExists = false; + for (const existingSite of kpxc.settings['sitePreferences']) { + if (existingSite.url === site) { + existingSite.ignore = IGNORE_NORMAL; + siteExists = true; + } + } + + if (!siteExists) { + kpxc.settings['sitePreferences'].push({ + url: site, + ignore: IGNORE_NORMAL, + usernameOnly: false + }); + } + + browser.runtime.sendMessage({ + action: 'save_settings', + args: [ kpxc.settings ] + }); +}; + +// Delete previously created Object if it exists. It will be replaced by an Array +kpxc.initializeSitePreferences = function() { + if (kpxc.settings['sitePreferences'] !== undefined && kpxc.settings['sitePreferences'].constructor === Object) { + delete kpxc.settings['sitePreferences']; + } + + if (!kpxc.settings['sitePreferences']) { + kpxc.settings['sitePreferences'] = []; + } +}; + +kpxc.getDocumentLocation = function() { + return kpxc.settings.saveDomainOnly ? document.location.origin : document.location.href; +}; + + +var kpxcEvents = {}; + +kpxcEvents.clearCredentials = function() { + kpxc.credentials = []; + kpxcAutocomplete.elements = []; + _called.retrieveCredentials = false; + + if (kpxc.settings.autoCompleteUsernames) { + for (const c of kpxcFields.combinations) { + const uField = _f(c.username); + if (uField) { + if (uField.classList.contains('ui-autocomplete-input')) { + uField.autocomplete('destroy'); + } + } + } + } +}; + +kpxcEvents.triggerActivatedTab = function() { + // Doesn't run a second time because of _called.initCredentialFields set to true + kpxc.init(); + + // initCredentialFields calls also "retrieve_credentials", to prevent it + // check of init() was already called + if (_called.initCredentialFields && (kpxc.url && kpxc.submitUrl) && kpxc.settings.autoRetrieveCredentials) { + browser.runtime.sendMessage({ + action: 'retrieve_credentials', + args: [ kpxc.url, kpxc.submitUrl ] + }).then(kpxc.retrieveCredentialsCallback).catch((e) => { + console.log(e); + }); + } +}; diff --git a/keepassxc-browser/content/pwgen.js b/keepassxc-browser/content/pwgen.js new file mode 100644 index 0000000..dff2a0a --- /dev/null +++ b/keepassxc-browser/content/pwgen.js @@ -0,0 +1,407 @@ +'use strict'; + +var kpxcPassword = {}; +kpxcPassword.created = false; +kpxcPassword.icon = null; +kpxcPassword.inputField = null; +kpxcPassword.selected = null; +kpxcPassword.startPosX = 0; +kpxcPassword.startPosY = 0; +kpxcPassword.diffX = 0; +kpxcPassword.diffY = 0; +kpxcPassword.dialog = null; +kpxcPassword.titleBar = null; + +const DOMRectToArray = function(domRect) { + return [ domRect.bottom, domRect.height, domRect.left, domRect.right, domRect.top, domRect.width, domRect.x, domRect.y ]; +}; + +/** +* Detects if the input field appears or disappears -> show/hide the icon +* - boundingClientRect with slightly (< -10) negative values -> hidden +* - intersectionRatio === 0 -> hidden +* - isIntersecting === false -> hidden +* - intersectionRatio > 0 -> shown +* - isIntersecting === true -> shown +*/ +kpxcPassword.observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const rect = DOMRectToArray(entry.boundingClientRect); + + if ((entry.intersectionRatio === 0 && !entry.isIntersecting) || (rect.some(x => x < -10))) { + kpxcPassword.icon.style.display = 'none'; + } else if (entry.intersectionRatio > 0 && entry.isIntersecting) { + kpxcPassword.icon.style.display = 'block'; + + // Wait for possible DOM animations + setTimeout(() => { + kpxcPassword.setIconPosition(kpxcPassword.icon, entry.target) + }, 500); + } + } +}); + +kpxcPassword.init = function() { + if ('initPasswordGenerator' in _called) { + return; + } + + _called.initPasswordGenerator = true; +}; + +kpxcPassword.initField = function(field, inputs, pos) { + if (!field) { + return; + } + + // Observer the visibility + kpxcPassword.observer.observe(field); + + if (field.getAttribute('kpxc-password-generator')) { + return; + } + + field.setAttribute('kpxc-password-generator', true); + + kpxcPassword.createIcon(field); + kpxcPassword.inputField = field; + + let found = false; + if (inputs) { + for (let i = pos + 1; i < inputs.length; i++) { + if (inputs[i] && inputs[i].getAttribute('type') && inputs[i].getAttribute('type').toLowerCase() === 'password') { + field.setAttribute('kpxc-pwgen-next-field-id', inputs[i].getAttribute('data-kpxc-id')); + field.setAttribute('kpxc-pwgen-next-is-password-field', (i === 0)); + found = true; + break; + } + } + } + + field.setAttribute('kpxc-pwgen-next-field-exists', found); +}; + +kpxcPassword.createIcon = function(field) { + const className = (isFirefox() ? 'key-moz' : 'key'); + const size = (field.offsetHeight > 28) ? 24 : 16; + let offset = Math.floor((field.offsetHeight - size) / 3); + offset = (offset < 0) ? 0 : offset; + + const icon = kpxcUI.createElement('div', 'kpxc kpxc-pwgen-icon ' + className, + { + 'title': tr('passwordGeneratorGenerateText'), + 'alt': tr('passwordGeneratorIcon'), + 'size': size, + 'offset': offset, + 'kpxc-pwgen-field-id': field.getAttribute('data-kpxc-id') + }); + icon.style.zIndex = '9999'; + icon.style.width = String(size) + 'px'; + icon.style.height = String(size) + 'px'; + + icon.addEventListener('click', function(e) { + e.preventDefault(); + kpxcPassword.showDialog(field, icon); + }); + + kpxcPassword.setIconPosition(icon, field); + kpxcPassword.icon = icon; + document.body.appendChild(icon); +}; + +kpxcPassword.setIconPosition = function(icon, field) { + const rect = field.getBoundingClientRect(); + const offset = Number(icon.getAttribute('offset')); + const size = Number(icon.getAttribute('size')); + + icon.style.top = String((rect.top + document.scrollingElement.scrollTop) + offset + 1) + 'px'; + icon.style.left = String((rect.left + document.scrollingElement.scrollLeft) + field.offsetWidth - size - offset) + 'px'; +}; + +kpxcPassword.createDialog = function() { + if (kpxcPassword.created) { + // If database is open again, generate a new password right away + const input = $('.kpxc-pwgen-input'); + if (input.style.display === 'none') { + kpxcPassword.generate(); + } + return; + } + kpxcPassword.created = true; + + const wrapper = kpxcUI.createElement('div', 'kpxc'); + const dialog = kpxcUI.createElement('div', 'kpxc kpxc-pwgen-dialog'); + const titleBar = kpxcUI.createElement('div', 'kpxc-pwgen-titlebar', {}, tr('passwordGeneratorTitle')); + const closeButton = kpxcUI.createElement('div', 'kpxc-pwgen-close', {}, '×'); + closeButton.onclick = function(e) { + kpxcPassword.openDialog(); + }; + titleBar.append(closeButton); + + const passwordRow = kpxcUI.createElement('div', 'kpxc-pwgen-password-row'); + const input = kpxcUI.createElement('input', 'kpxc-pwgen-input', { 'placeholder': tr('passwordGeneratorPlaceholder'), 'type': 'text', 'tabindex': '-1' }); + const inputLabel = kpxcUI.createElement('label', 'kpxc-pwgen-bits', {}, tr('passwordGeneratorBits', '???')); + passwordRow.appendMultiple(input, inputLabel); + + const nextFillRow = kpxcUI.createElement('div', 'kpxc-pwgen-nextfill-row'); + const checkbox = kpxcUI.createElement('input', 'kpxc-pwgen-checkbox', { 'id': 'kpxc-pwgen-checkbox', 'type': 'checkbox' }); + const checkboxLabel = kpxcUI.createElement('label', 'kpxc-pwgen-checkbox-label', { 'for': 'kpxc-pwgen-checkbox' }, tr('passwordGeneratorLabel')); + nextFillRow.appendMultiple(checkbox, checkboxLabel); + + // Buttons + const buttonsRow = kpxcUI.createElement('div', 'kpxc-pwgen-buttons'); + const generateButton = kpxcUI.createElement('button', 'kpxc-button kpxc-white-button', { 'id': 'kpxc-pwgen-btn-generate' }, tr('passwordGeneratorGenerate')); + const copyButton = kpxcUI.createElement('button', 'kpxc-button', { 'id': 'kpxc-pwgen-btn-copy' }, tr('passwordGeneratorCopy')); + const fillButton = kpxcUI.createElement('button', 'kpxc-button', { 'id': 'kpxc-pwgen-btn-fill' }, tr('passwordGeneratorFillAndCopy')); + + generateButton.onclick = function(e) { + kpxcPassword.generate(e); + }; + + copyButton.onclick = function(e) { + kpxcPassword.copy(e); + }; + + fillButton.onclick = function(e) { + kpxcPassword.fill(e); + }; + + buttonsRow.appendMultiple(generateButton, copyButton, fillButton); + dialog.appendMultiple(titleBar, passwordRow, nextFillRow, buttonsRow); + wrapper.append(dialog); + + const icon = $('.kpxc-pwgen-icon'); + dialog.style.top = String(icon.offsetTop + icon.offsetHeight) + 'px'; + dialog.style.left = icon.style.left; + + document.body.append(wrapper); + + kpxcPassword.dialog = dialog; + kpxcPassword.titleBar = titleBar; + kpxcPassword.titleBar.onmousedown = function(e) { + kpxcPassword.mouseDown(e); + }; + + kpxcPassword.generate(); +}; + +kpxcPassword.mouseDown = function(e) { + kpxcPassword.selected = kpxcPassword.titleBar; + kpxcPassword.startPosX = e.clientX; + kpxcPassword.startPosY = e.clientY; + kpxcPassword.diffX = kpxcPassword.startPosX - kpxcPassword.dialog.offsetLeft; + kpxcPassword.diffY = kpxcPassword.startPosY - kpxcPassword.dialog.offsetTop; + return false; +}; + +kpxcPassword.openDialog = function() { + if (kpxcPassword.dialog.style.display === '' || kpxcPassword.dialog.style.display === 'none') { + kpxcPassword.dialog.style.display = 'block'; + } else { + kpxcPassword.dialog.style.display = 'none'; + } +}; + +kpxcPassword.trigger = function() { + kpxcPassword.showDialog(kpxcPassword.inputField, kpxcPassword.icon); +}; + +kpxcPassword.showDialog = function(field, icon) { + if (!kpxcFields.isVisible(field)) { + document.body.removeChild(icon); + field.removeAttribute('kpxc-password-generator'); + return; + } + + kpxcPassword.createDialog(); + kpxcPassword.openDialog(); + + // Adjust the dialog location + if (kpxcPassword.dialog) { + kpxcPassword.dialog.style.top = String(icon.offsetTop + icon.offsetHeight) + 'px'; + kpxcPassword.dialog.style.left = icon.style.left; + + kpxcPassword.dialog.setAttribute('kpxc-pwgen-field-id', field.getAttribute('data-kpxc-id')); + kpxcPassword.dialog.setAttribute('kpxc-pwgen-next-field-id', field.getAttribute('kpxc-pwgen-next-field-id')); + kpxcPassword.dialog.setAttribute('kpxc-pwgen-next-is-password-field', field.getAttribute('kpxc-pwgen-next-is-password-field')); + + const fieldExists = Boolean(field.getAttribute('kpxc-pwgen-next-field-exists')); + const checkbox = $('.kpxc-pwgen-checkbox'); + if (checkbox) { + checkbox.setAttribute('checked', fieldExists); + if (fieldExists) { + checkbox.removeAttribute('disabled'); + } else { + checkbox.setAttribute('disabled', ''); + } + } + } +}; + +kpxcPassword.generate = function(e) { + if (e) { + e.preventDefault(); + } + + browser.runtime.sendMessage({ + action: 'generate_password' + }).then(kpxcPassword.callbackGeneratedPassword).catch((err) => { + console.log(err); + }); +}; + +kpxcPassword.copy = function(e) { + e.preventDefault(); + if (kpxcPassword.copyPasswordToClipboard()) { + kpxcPassword.greenButton('#kpxc-pwgen-btn-copy'); + kpxcPassword.whiteButton('#kpxc-pwgen-btn-fill'); + } +}; + +kpxcPassword.fill = function(e) { + e.preventDefault(); + + let field = null; + const inputs = document.querySelectorAll('input[type=\'password\']'); + for (const i of inputs) { + if (i.getAttribute('data-kpxc-id')) { + field = i; + break; + } + } + + if (field) { + const password = $('.kpxc-pwgen-input'); + if (field.getAttribute('maxlength')) { + if (password.value.length > field.getAttribute('maxlength')) { + const message = tr('passwordGeneratorErrorTooLong') + '\r\n' + + tr('passwordGeneratorErrorTooLongCut') + '\r\n' + tr('passwordGeneratorErrorTooLongRemember'); + message.style.whiteSpace = 'pre'; + browser.runtime.sendMessage({ + action: 'show_notification', + args: [ message ] + }); + return; + } + } + + field.value = password.value; + if ($('.kpxc-pwgen-checkbox').checked) { + if (field.getAttribute('kpxc-pwgen-next-field-id')) { + const nextFieldId = field.getAttribute('kpxc-pwgen-next-field-id'); + const nextField = $('input[data-kpxc-id=\'' + nextFieldId + '\']'); + if (nextField) { + nextField.value = password.value; + } + } + } + + if (kpxcPassword.copyPasswordToClipboard()) { + kpxcPassword.greenButton('#kpxc-pwgen-btn-fill'); + kpxcPassword.whiteButton('#kpxc-pwgen-btn-copy'); + } + } +}; + +kpxcPassword.copyPasswordToClipboard = function() { + $('.kpxc-pwgen-input').select(); + try { + return document.execCommand('copy'); + } + catch (err) { + console.log('Could not copy password to clipboard: ' + err); + } + return false; +}; + +kpxcPassword.callbackGeneratedPassword = function(entries) { + if (entries && entries.length >= 1) { + const errorMessage = $('#kpxc-pwgen-error'); + if (errorMessage) { + kpxcPassword.enableButtons(); + + $('.kpxc-pwgen-checkbox').parentElement.style.display = 'block'; + $('.kpxc-pwgen-bits').style.display = 'block'; + + const input = $('.kpxc-pwgen-input'); + input.style.display = 'block'; + errorMessage.remove(); + } + + kpxcPassword.whiteButton('#kpxc-pwgen-btn-fill'); + kpxcPassword.whiteButton('#kpxc-pwgen-btn-copy'); + $('.kpxc-pwgen-input').value = entries[0].password; + $('.kpxc-pwgen-bits').textContent = tr('passwordGeneratorBits', (isNaN(entries[0].login) ? '???' : entries[0].login)); + } else { + if (document.querySelectorAll('div#kpxc-pwgen-error').length === 0) { + $('.kpxc-pwgen-checkbox').parentElement.style.display = 'none'; + $('.kpxc-pwgen-bits').style.display = 'none'; + + const input = $('.kpxc-pwgen-input'); + input.style.display = 'none'; + + const errorMessage = kpxcUI.createElement('div', '', { 'id': 'kpxc-pwgen-error' }, + tr('passwordGeneratorError') + '\r\n' + tr('passwordGeneratorErrorIsRunning')); + errorMessage.style.whiteSpace = 'pre'; + input.parentElement.append(errorMessage); + + kpxcPassword.disableButtons(); + } + } +}; + +kpxcPassword.onRequestPassword = function() { + browser.runtime.sendMessage({ + action: 'generate_password' + }).then(kpxcPassword.callbackGeneratedPassword); +}; + +kpxcPassword.greenButton = function(button) { + $(button).classList.remove('kpxc-white-button'); + $(button).classList.add('kpxc-green-button'); +}; + +kpxcPassword.whiteButton = function(button) { + $(button).classList.remove('kpxc-green-button'); + $(button).classList.add('kpxc-white-button'); +}; + +kpxcPassword.enableButtons = function() { + $('#kpxc-pwgen-btn-generate').textContent = tr('passwordGeneratorGenerate'); + $('#kpxc-pwgen-btn-copy').style.display = 'inline-block'; + $('#kpxc-pwgen-btn-fill').style.display = 'inline-block'; +}; + +kpxcPassword.disableButtons = function() { + $('#kpxc-pwgen-btn-generate').textContent = tr('passwordGeneratorTryAgain'); + $('#kpxc-pwgen-btn-copy').style.display = 'none'; + $('#kpxc-pwgen-btn-fill').style.display = 'none'; +}; + +// Handle icon position on window resize +window.addEventListener('resize', function(e) { + if (kpxcPassword.inputField && kpxcPassword.icon) { + kpxcPassword.setIconPosition(kpxcPassword.icon, kpxcPassword.inputField); + } +}); + +// Handle icon position on scroll +window.addEventListener('scroll', function(e) { + if (kpxcPassword.inputField && kpxcPassword.icon) { + kpxcPassword.setIconPosition(kpxcPassword.icon, kpxcPassword.inputField); + } +}); + +// Closes the dialog when clicked outside of it) +document.onclick = function(e) { + if (kpxcPassword.dialog && kpxcPassword.dialog.style.display === 'block') { + const dialogEndX = kpxcPassword.dialog.offsetLeft + kpxcPassword.dialog.offsetWidth; + const dialogEndY = kpxcPassword.dialog.offsetTop + kpxcPassword.dialog.offsetHeight; + + if ((e.clientX < kpxcPassword.dialog.offsetLeft || e.clientX > dialogEndX) || + (e.clientY < kpxcPassword.dialog.offsetTop || e.clientY > dialogEndY) && + !e.target.classList.contains('kpxc-pwgen-icon')) { + kpxcPassword.openDialog(); + } + } +}; diff --git a/keepassxc-browser/content/ui.js b/keepassxc-browser/content/ui.js new file mode 100644 index 0000000..7b87973 --- /dev/null +++ b/keepassxc-browser/content/ui.js @@ -0,0 +1,67 @@ +'use strict'; + +// jQuery style wrapper for querySelector() +var $ = function(elem) +{ + return document.querySelector(elem); +}; + +var kpxcUI = {}; + +// Wrapper for creating elements +kpxcUI.createElement = function(type, classes, attributes, textContent) { + const element = document.createElement(type); + + if (classes) { + const splitted = classes.split(' '); + for (const c of splitted) { + element.classList.add(c); + } + } + + if (attributes !== undefined) { + Object.keys(attributes).forEach((key) => { + element.setAttribute(key, attributes[key]); + }); + } + + if (textContent !== undefined) { + element.textContent = textContent; + } + + return element; +}; + +// Enables dragging +document.onmousemove = function(e) { + if (kpxcPassword.selected === kpxcPassword.titleBar) { + const x_pos = e.clientX - kpxcPassword.diffX; + const y_pos = e.clientY - kpxcPassword.diffY; + + if (kpxcPassword.selected !== null) { + kpxcPassword.dialog.style.left = x_pos + 'px'; + kpxcPassword.dialog.style.top = y_pos + 'px'; + } + } + + if (kpxcDefine.selected === kpxcDefine.dialog) { + const x_pos = e.clientX - kpxcDefine.diffX; + const y_pos = e.clientY - kpxcDefine.diffY; + + if (kpxcDefine.selected !== null) { + kpxcDefine.dialog.style.left = x_pos + 'px'; + kpxcDefine.dialog.style.top = y_pos + 'px'; + } + } +}; + +document.onmouseup = function() { + kpxcPassword.selected = null; + kpxcDefine.selected = null; +}; + +HTMLDivElement.prototype.appendMultiple = function(...args) { + for (const a of args) { + this.append(a); + } +}; diff --git a/keepassxc-browser/css/autocomplete.css b/keepassxc-browser/css/autocomplete.css new file mode 100644 index 0000000..fe5d99f --- /dev/null +++ b/keepassxc-browser/css/autocomplete.css @@ -0,0 +1,19 @@ +.kpxcAutocomplete-items { + position: absolute !important; + border: 1px solid #d4d4d4; +} + +.kpxcAutocomplete-items div { + padding: 5px; + cursor: pointer; + background-color: #fff; + border-bottom: 1px solid #d4d4d4; + width: auto; + color: #000; + font-size: .9em !important; +} + +.kpxcAutocomplete-active { + background-color: #6cac4d !important; + color: #ffffff !important; +} \ No newline at end of file diff --git a/keepassxc-browser/css/button.css b/keepassxc-browser/css/button.css new file mode 100644 index 0000000..16945ad --- /dev/null +++ b/keepassxc-browser/css/button.css @@ -0,0 +1,48 @@ +.kpxc-button { + font-size: 12px !important; + font-family: 'Lato', sans-serif !important; + height: 28px !important; + margin: .2em !important; + background-color: #fff; + border: 1px solid #888 !important; + border-radius: 4px !important; +} + +.kpxc-white-button { + color: #333 !important; + background-color: #fff !important; + border-color: #ccc !important; +} + +.kpxc-red-button { + color: #fff !important; + background-color: #d9534f !important; + border-color: #d43f3a !important; +} + +.kpxc-orange-button { + color: #fff !important; + background-color: #f0ad4e !important; + border-color: #eea236 !important; +} + +.kpxc-blue-button { + color: #fff !important; + background-color: #337ab7 !important; + border-color: #2e6da4 !important; +} + +.kpxc-green-button { + color: #fff !important; + background-color: #5cb85c !important; + border-color: #4cae4c !important; +} + +.kpxc-button:hover { + background-color: #eee; + cursor: pointer; +} + +.kpxc-button:active { + background-color: #ddd; +} \ No newline at end of file diff --git a/keepassxc-browser/css/define.css b/keepassxc-browser/css/define.css new file mode 100644 index 0000000..55525d5 --- /dev/null +++ b/keepassxc-browser/css/define.css @@ -0,0 +1,110 @@ +.kpxcDefine-modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 2147483645; +} + +.kpxcDefine-modal-backdrop:after { + content: ''; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #000000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +#kpxcDefine-fields { + z-index: 2147483646; +} + +#kpxcDefine-description { + z-index: 2147483646; + color: #efefef; + border: 2px solid #555555; + padding: 7px 5px; + position: absolute; + top: 100px; + left: 150px; + text-align: left; + cursor: pointer; + background-color: rgba(0,0,0,0.8); + font-size: 15px; + user-select: none; +} + +#kpxcDefine-description div:first-of-type { + margin-top: 0; + padding-top: 0; + text-align: left; + color: #efefef; + padding-bottom: 8px; + font-weight: bold; + font-size: 120%; +} + +#kpxcDefine-description p { + margin-top: 10px; + padding-top: 10px; + color: #efefef; + border-top: 2px solid #666666; + line-height: 110%; +} + +#kpxcDefine-help { + margin-bottom: 3px; +} + +.kpxcDefine-keyboardHelp { + font-size: 0.75em; +} + +.kpxcDefine-keyboardHelp kbd { + background-color: #eee; + border-radius: 3px; + border: 1px solid #b4b4b4; + color: #333; + display: inline-block; + line-height: 1; + padding: 2px 4px; + white-space: nowrap; +} + +.kpxcDefine-fixed-field { + position: absolute; + border: 2px solid #efefef; + color: #fff; + cursor: pointer; + z-index: 2147483646; + text-align: center; + font-weight: bold; + background-color: rgba(239,239,239,0.4); +} + +.kpxcDefine-fixed-hover-field { + border: 2px solid orange; + background-color: rgba(255,165,239,0.4); +} + +.kpxcDefine-fixed-password-field { + border: 2px solid red; + color: #efefef; + background-color: rgba(255,0,0,0.4); +} + +.kpxcDefine-fixed-username-field { + border: 2px solid limegreen; + color: #efefef; + background-color: rgba(50,205,50,0.4); +} + +.kpxcDefine-fixed-string-field { + border: 2px solid deepskyblue; + color: #efefef; + background-color: rgba(30,144,255,0.4); +} diff --git a/keepassxc-browser/css/pwgen.css b/keepassxc-browser/css/pwgen.css new file mode 100644 index 0000000..40b6ee0 --- /dev/null +++ b/keepassxc-browser/css/pwgen.css @@ -0,0 +1,114 @@ +.kpxc-pwgen-dialog { + font-family: 'Lato', sans-serif !important; + width: 350px; + min-height: 80px; + background-color: white; + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: 0 4px 6px 0 hsla(0, 0%, 0%, 0.2); + z-index: 2147483645; + padding: .1em .2em .1em .2em; + position: absolute !important; +} + +.kpxc-pwgen-titlebar { + font-size: 14px !important; + background-color: #6cac4d; + color: #fff; + padding: .4em .2em .4em .8em; + margin: .2em 0 .2em 0; + position: relative; + cursor: move; +} + +.kpxc-pwgen-password-row { + color: #fff; + padding: .4em 1em; + margin: .2em 0 .2em 0; + display: flex; +} + +.kpxc-pwgen-nextfill-row { + font-size: 12px !important; + color: #000; + padding: .4em 1em; + margin: .2em 0 .2em 0; +} + +.kpxc-pwgen-buttons { + color: #fff; + padding: .4em 1em; + margin: .2em 0 .2em 0; + border-top: 1px solid #ccc; + display: flex; + align-items: center; + justify-content: center; +} + +.kpxc-pwgen-bits { + font-size: 12px !important; + font-style: normal !important; + font-weight: normal !important; + text-align: center; + color: #000; + background-color: #eee; + border: 1px solid #ccc; + padding: .4em; + border-radius: 4px; + min-width: 60px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-collapse: separate; + vertical-align: middle; + white-space: nowrap; +} + +.kpxc-pwgen-close { + color: #fff; + float: right; + font-size: inherit; + font-weight: bold; + text-align: center; + min-width: 20px; +} + +.kpxc-pwgen-close:hover { + background-color: #6cac4d !important; + color: #fff; + cursor: pointer; +} + +.kpxc-pwgen-input { + width: 100%; + font-size: 12px !important; + font-weight: normal !important; +} + +.kpxc-pwgen-checkbox-label { + font-style: normal !important; + font-weight: normal !important; +} + +.kpxc #kpxc-pwgen-error { + color: #000; + font-size: 12px !important; + font-style: normal !important; + font-weight: normal !important; + text-align: center; + width: 100%; +} + +.kpxc-pwgen-icon { + position: absolute; + cursor: pointer; +} + +.kpxc-pwgen-icon.key { + background: url('chrome-extension://__MSG_@@extension_id__/icons/key.svg') right no-repeat; + background-size: contain; +} + +.kpxc-pwgen-icon.key-moz { + background: url('moz-extension://__MSG_@@extension_id__/icons/key.svg') right no-repeat; + background-size: contain; +} diff --git a/keepassxc-browser/global.js b/keepassxc-browser/global.js index 0e8b264..887a290 100755 --- a/keepassxc-browser/global.js +++ b/keepassxc-browser/global.js @@ -4,15 +4,12 @@ const IGNORE_NOTHING = 'ignoreNothing'; const IGNORE_NORMAL = 'ignoreNormal'; const IGNORE_FULL = 'ignoreFull'; -var schemeSegment = '(\\*|http|https|ws|wss|file|ftp)'; -var hostSegment = '(\\*|(?:\\*\\.)?(?:[^/*]+))?'; -var pathSegment = '(.*)'; +const schemeSegment = '(\\*|http|https|ws|wss|file|ftp)'; +const hostSegment = '(\\*|(?:\\*\\.)?(?:[^/*]+))?'; +const pathSegment = '(.*)'; var isFirefox = function() { - if (!(/Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor))) { - return true; - } - return false; + return navigator.userAgent.indexOf('Firefox') !== -1 || navigator.userAgent.indexOf('Gecko/') !== -1; }; var showNotification = function(message) { @@ -45,12 +42,12 @@ var matchPatternToRegExp = function(pattern) { let match = matchPatternRegExp.exec(pattern); if (!match) { - throw new TypeError(pattern + ' is not a valid MatchPattern'); + throw new TypeError('"${pattern}" is not a valid MatchPattern'); } let [, scheme, host, path] = match; if (!host) { - throw new TypeError(pattern + ' does not have a valid host'); + throw new TypeError('"${pattern}" does not have a valid host'); } let regex = '^'; @@ -92,7 +89,6 @@ var siteMatch = function(site, url) { return url.match(rx); }; -// Checks if URL has only scheme and host without the last / char. var slashNeededForUrl = function(pattern) { const matchPattern = new RegExp(`^${schemeSegment}://${hostSegment}$`); return matchPattern.exec(pattern); diff --git a/keepassxc-browser/jquery-ui.min.css b/keepassxc-browser/jquery-ui.min.css deleted file mode 100644 index ced6235..0000000 --- a/keepassxc-browser/jquery-ui.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! jQuery UI - v1.12.1 - 2017-11-16 -* http://jqueryui.com -* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=.kpxc&folderName=kpxc&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -.kpxc .ui-draggable-handle{-ms-touch-action:none;touch-action:none}.kpxc .ui-helper-hidden{display:none}.kpxc .ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.kpxc .ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.kpxc .ui-helper-clearfix:before,.kpxc .ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.kpxc .ui-helper-clearfix:after{clear:both}.kpxc .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.kpxc .ui-front{z-index:100}.kpxc .ui-state-disabled{cursor:default!important;pointer-events:none}.kpxc .ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.kpxc .ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.kpxc .ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.kpxc .ui-resizable{position:relative}.kpxc .ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.kpxc .ui-resizable-disabled .ui-resizable-handle,.kpxc .ui-resizable-autohide .ui-resizable-handle{display:none}.kpxc .ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.kpxc .ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.kpxc .ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.kpxc .ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.kpxc .ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.kpxc .ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.kpxc .ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.kpxc .ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.kpxc .ui-selectable{-ms-touch-action:none;touch-action:none}.kpxc .ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.kpxc .ui-sortable-handle{-ms-touch-action:none;touch-action:none}.kpxc .ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.kpxc .ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.kpxc .ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.kpxc .ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.kpxc .ui-menu .ui-menu{position:absolute}.kpxc .ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.kpxc .ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.kpxc .ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.kpxc .ui-menu .ui-state-focus,.kpxc .ui-menu .ui-state-active{margin:-1px}.kpxc .ui-menu-icons{position:relative}.kpxc .ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.kpxc .ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.kpxc .ui-menu .ui-menu-icon{left:auto;right:0}.kpxc .ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.kpxc .ui-button,.kpxc .ui-button:link,.kpxc .ui-button:visited,.kpxc .ui-button:hover,.kpxc .ui-button:active{text-decoration:none}.kpxc .ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.kpxc .ui-button.ui-button-icon-only{text-indent:0}.kpxc .ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.kpxc .ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.kpxc .ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.kpxc .ui-button::-moz-focus-inner,button.kpxc .ui-button::-moz-focus-inner{border:0;padding:0}.kpxc .ui-controlgroup{vertical-align:middle;display:inline-block}.kpxc .ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.kpxc .ui-controlgroup > .ui-controlgroup-item:focus,.kpxc .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.kpxc .ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.kpxc .ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.kpxc .ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.kpxc .ui-controlgroup .ui-controlgroup-label span{font-size:80%}.kpxc .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.kpxc .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.kpxc .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.kpxc .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.kpxc .ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.kpxc .ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.kpxc .ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.kpxc .ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.kpxc .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.kpxc .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.kpxc .ui-checkboxradio-disabled{pointer-events:none}.kpxc .ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.kpxc .ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.kpxc .ui-datepicker .ui-datepicker-prev,.kpxc .ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.kpxc .ui-datepicker .ui-datepicker-prev-hover,.kpxc .ui-datepicker .ui-datepicker-next-hover{top:1px}.kpxc .ui-datepicker .ui-datepicker-prev{left:2px}.kpxc .ui-datepicker .ui-datepicker-next{right:2px}.kpxc .ui-datepicker .ui-datepicker-prev-hover{left:1px}.kpxc .ui-datepicker .ui-datepicker-next-hover{right:1px}.kpxc .ui-datepicker .ui-datepicker-prev span,.kpxc .ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.kpxc .ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.kpxc .ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.kpxc .ui-datepicker select.ui-datepicker-month,.kpxc .ui-datepicker select.ui-datepicker-year{width:45%}.kpxc .ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.kpxc .ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.kpxc .ui-datepicker td{border:0;padding:1px}.kpxc .ui-datepicker td span,.kpxc .ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.kpxc .ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.kpxc .ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.kpxc .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.kpxc .ui-datepicker.ui-datepicker-multi{width:auto}.kpxc .ui-datepicker-multi .ui-datepicker-group{float:left}.kpxc .ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.kpxc .ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.kpxc .ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.kpxc .ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.kpxc .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.kpxc .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.kpxc .ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.kpxc .ui-datepicker-row-break{clear:both;width:100%;font-size:0}.kpxc .ui-datepicker-rtl{direction:rtl}.kpxc .ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.kpxc .ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.kpxc .ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.kpxc .ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.kpxc .ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.kpxc .ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.kpxc .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.kpxc .ui-datepicker-rtl .ui-datepicker-group{float:right}.kpxc .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.kpxc .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.kpxc .ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.kpxc .ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.kpxc .ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.kpxc .ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.kpxc .ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.kpxc .ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.kpxc .ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.kpxc .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.kpxc .ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.kpxc .ui-dialog .ui-resizable-n{height:2px;top:0}.kpxc .ui-dialog .ui-resizable-e{width:2px;right:0}.kpxc .ui-dialog .ui-resizable-s{height:2px;bottom:0}.kpxc .ui-dialog .ui-resizable-w{width:2px;left:0}.kpxc .ui-dialog .ui-resizable-se,.kpxc .ui-dialog .ui-resizable-sw,.kpxc .ui-dialog .ui-resizable-ne,.kpxc .ui-dialog .ui-resizable-nw{width:7px;height:7px}.kpxc .ui-dialog .ui-resizable-se{right:0;bottom:0}.kpxc .ui-dialog .ui-resizable-sw{left:0;bottom:0}.kpxc .ui-dialog .ui-resizable-ne{right:0;top:0}.kpxc .ui-dialog .ui-resizable-nw{left:0;top:0}.kpxc .ui-draggable .ui-dialog-titlebar{cursor:move}.kpxc .ui-progressbar{height:2em;text-align:left;overflow:hidden}.kpxc .ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.kpxc .ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.kpxc .ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.kpxc .ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.kpxc .ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.kpxc .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.kpxc .ui-selectmenu-open{display:block}.kpxc .ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.kpxc .ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.kpxc .ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.kpxc .ui-slider{position:relative;text-align:left}.kpxc .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.kpxc .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.kpxc .ui-slider.ui-state-disabled .ui-slider-handle,.kpxc .ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.kpxc .ui-slider-horizontal{height:.8em}.kpxc .ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.kpxc .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.kpxc .ui-slider-horizontal .ui-slider-range-min{left:0}.kpxc .ui-slider-horizontal .ui-slider-range-max{right:0}.kpxc .ui-slider-vertical{width:.8em;height:100px}.kpxc .ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.kpxc .ui-slider-vertical .ui-slider-range{left:0;width:100%}.kpxc .ui-slider-vertical .ui-slider-range-min{bottom:0}.kpxc .ui-slider-vertical .ui-slider-range-max{top:0}.kpxc .ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.kpxc .ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.kpxc .ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.kpxc .ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.kpxc .ui-spinner-up{top:0}.kpxc .ui-spinner-down{bottom:0}.kpxc .ui-tabs{position:relative;padding:.2em}.kpxc .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.kpxc .ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.kpxc .ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.kpxc .ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.kpxc .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.kpxc .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.kpxc .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.kpxc .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.kpxc .ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.kpxc .ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .kpxc .ui-tooltip{border-width:2px}.kpxc .ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.kpxc .ui-widget .ui-widget{font-size:1em}.kpxc .ui-widget input,.kpxc .ui-widget select,.kpxc .ui-widget textarea,.kpxc .ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.kpxc .ui-widget.ui-widget-content{border:1px solid #c5c5c5}.kpxc .ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.kpxc .ui-widget-content a{color:#333}.kpxc .ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.kpxc .ui-widget-header a{color:#333}.kpxc .ui-state-default,.kpxc .ui-widget-content .ui-state-default,.kpxc .ui-widget-header .ui-state-default,.kpxc .ui-button,html .kpxc .ui-button.ui-state-disabled:hover,html .kpxc .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.kpxc .ui-state-default a,.kpxc .ui-state-default a:link,.kpxc .ui-state-default a:visited,a.kpxc .ui-button,a:link.kpxc .ui-button,a:visited.kpxc .ui-button,.kpxc .ui-button{color:#454545;text-decoration:none}.kpxc .ui-state-hover,.kpxc .ui-widget-content .ui-state-hover,.kpxc .ui-widget-header .ui-state-hover,.kpxc .ui-state-focus,.kpxc .ui-widget-content .ui-state-focus,.kpxc .ui-widget-header .ui-state-focus,.kpxc .ui-button:hover,.kpxc .ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.kpxc .ui-state-hover a,.kpxc .ui-state-hover a:hover,.kpxc .ui-state-hover a:link,.kpxc .ui-state-hover a:visited,.kpxc .ui-state-focus a,.kpxc .ui-state-focus a:hover,.kpxc .ui-state-focus a:link,.kpxc .ui-state-focus a:visited,a.kpxc .ui-button:hover,a.kpxc .ui-button:focus{color:#2b2b2b;text-decoration:none}.kpxc .ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.kpxc .ui-state-active,.kpxc .ui-widget-content .ui-state-active,.kpxc .ui-widget-header .ui-state-active,a.kpxc .ui-button:active,.kpxc .ui-button:active,.kpxc .ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.kpxc .ui-icon-background,.kpxc .ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.kpxc .ui-state-active a,.kpxc .ui-state-active a:link,.kpxc .ui-state-active a:visited{color:#fff;text-decoration:none}.kpxc .ui-state-highlight,.kpxc .ui-widget-content .ui-state-highlight,.kpxc .ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.kpxc .ui-state-checked{border:1px solid #dad55e;background:#fffa90}.kpxc .ui-state-highlight a,.kpxc .ui-widget-content .ui-state-highlight a,.kpxc .ui-widget-header .ui-state-highlight a{color:#777620}.kpxc .ui-state-error,.kpxc .ui-widget-content .ui-state-error,.kpxc .ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.kpxc .ui-state-error a,.kpxc .ui-widget-content .ui-state-error a,.kpxc .ui-widget-header .ui-state-error a{color:#5f3f3f}.kpxc .ui-state-error-text,.kpxc .ui-widget-content .ui-state-error-text,.kpxc .ui-widget-header .ui-state-error-text{color:#5f3f3f}.kpxc .ui-priority-primary,.kpxc .ui-widget-content .ui-priority-primary,.kpxc .ui-widget-header .ui-priority-primary{font-weight:bold}.kpxc .ui-priority-secondary,.kpxc .ui-widget-content .ui-priority-secondary,.kpxc .ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.kpxc .ui-state-disabled,.kpxc .ui-widget-content .ui-state-disabled,.kpxc .ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.kpxc .ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.kpxc .ui-icon{width:16px;height:16px}.kpxc .ui-icon,.kpxc .ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.kpxc .ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.kpxc .ui-state-hover .ui-icon,.kpxc .ui-state-focus .ui-icon,.kpxc .ui-button:hover .ui-icon,.kpxc .ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.kpxc .ui-state-active .ui-icon,.kpxc .ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.kpxc .ui-state-highlight .ui-icon,.kpxc .ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.kpxc .ui-state-error .ui-icon,.kpxc .ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.kpxc .ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.kpxc .ui-icon-blank{background-position:16px 16px}.kpxc .ui-icon-caret-1-n{background-position:0 0}.kpxc .ui-icon-caret-1-ne{background-position:-16px 0}.kpxc .ui-icon-caret-1-e{background-position:-32px 0}.kpxc .ui-icon-caret-1-se{background-position:-48px 0}.kpxc .ui-icon-caret-1-s{background-position:-65px 0}.kpxc .ui-icon-caret-1-sw{background-position:-80px 0}.kpxc .ui-icon-caret-1-w{background-position:-96px 0}.kpxc .ui-icon-caret-1-nw{background-position:-112px 0}.kpxc .ui-icon-caret-2-n-s{background-position:-128px 0}.kpxc .ui-icon-caret-2-e-w{background-position:-144px 0}.kpxc .ui-icon-triangle-1-n{background-position:0 -16px}.kpxc .ui-icon-triangle-1-ne{background-position:-16px -16px}.kpxc .ui-icon-triangle-1-e{background-position:-32px -16px}.kpxc .ui-icon-triangle-1-se{background-position:-48px -16px}.kpxc .ui-icon-triangle-1-s{background-position:-65px -16px}.kpxc .ui-icon-triangle-1-sw{background-position:-80px -16px}.kpxc .ui-icon-triangle-1-w{background-position:-96px -16px}.kpxc .ui-icon-triangle-1-nw{background-position:-112px -16px}.kpxc .ui-icon-triangle-2-n-s{background-position:-128px -16px}.kpxc .ui-icon-triangle-2-e-w{background-position:-144px -16px}.kpxc .ui-icon-arrow-1-n{background-position:0 -32px}.kpxc .ui-icon-arrow-1-ne{background-position:-16px -32px}.kpxc .ui-icon-arrow-1-e{background-position:-32px -32px}.kpxc .ui-icon-arrow-1-se{background-position:-48px -32px}.kpxc .ui-icon-arrow-1-s{background-position:-65px -32px}.kpxc .ui-icon-arrow-1-sw{background-position:-80px -32px}.kpxc .ui-icon-arrow-1-w{background-position:-96px -32px}.kpxc .ui-icon-arrow-1-nw{background-position:-112px -32px}.kpxc .ui-icon-arrow-2-n-s{background-position:-128px -32px}.kpxc .ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.kpxc .ui-icon-arrow-2-e-w{background-position:-160px -32px}.kpxc .ui-icon-arrow-2-se-nw{background-position:-176px -32px}.kpxc .ui-icon-arrowstop-1-n{background-position:-192px -32px}.kpxc .ui-icon-arrowstop-1-e{background-position:-208px -32px}.kpxc .ui-icon-arrowstop-1-s{background-position:-224px -32px}.kpxc .ui-icon-arrowstop-1-w{background-position:-240px -32px}.kpxc .ui-icon-arrowthick-1-n{background-position:1px -48px}.kpxc .ui-icon-arrowthick-1-ne{background-position:-16px -48px}.kpxc .ui-icon-arrowthick-1-e{background-position:-32px -48px}.kpxc .ui-icon-arrowthick-1-se{background-position:-48px -48px}.kpxc .ui-icon-arrowthick-1-s{background-position:-64px -48px}.kpxc .ui-icon-arrowthick-1-sw{background-position:-80px -48px}.kpxc .ui-icon-arrowthick-1-w{background-position:-96px -48px}.kpxc .ui-icon-arrowthick-1-nw{background-position:-112px -48px}.kpxc .ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.kpxc .ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.kpxc .ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.kpxc .ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.kpxc .ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.kpxc .ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.kpxc .ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.kpxc .ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.kpxc .ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.kpxc .ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.kpxc .ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.kpxc .ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.kpxc .ui-icon-arrowreturn-1-w{background-position:-64px -64px}.kpxc .ui-icon-arrowreturn-1-n{background-position:-80px -64px}.kpxc .ui-icon-arrowreturn-1-e{background-position:-96px -64px}.kpxc .ui-icon-arrowreturn-1-s{background-position:-112px -64px}.kpxc .ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.kpxc .ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.kpxc .ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.kpxc .ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.kpxc .ui-icon-arrow-4{background-position:0 -80px}.kpxc .ui-icon-arrow-4-diag{background-position:-16px -80px}.kpxc .ui-icon-extlink{background-position:-32px -80px}.kpxc .ui-icon-newwin{background-position:-48px -80px}.kpxc .ui-icon-refresh{background-position:-64px -80px}.kpxc .ui-icon-shuffle{background-position:-80px -80px}.kpxc .ui-icon-transfer-e-w{background-position:-96px -80px}.kpxc .ui-icon-transferthick-e-w{background-position:-112px -80px}.kpxc .ui-icon-folder-collapsed{background-position:0 -96px}.kpxc .ui-icon-folder-open{background-position:-16px -96px}.kpxc .ui-icon-document{background-position:-32px -96px}.kpxc .ui-icon-document-b{background-position:-48px -96px}.kpxc .ui-icon-note{background-position:-64px -96px}.kpxc .ui-icon-mail-closed{background-position:-80px -96px}.kpxc .ui-icon-mail-open{background-position:-96px -96px}.kpxc .ui-icon-suitcase{background-position:-112px -96px}.kpxc .ui-icon-comment{background-position:-128px -96px}.kpxc .ui-icon-person{background-position:-144px -96px}.kpxc .ui-icon-print{background-position:-160px -96px}.kpxc .ui-icon-trash{background-position:-176px -96px}.kpxc .ui-icon-locked{background-position:-192px -96px}.kpxc .ui-icon-unlocked{background-position:-208px -96px}.kpxc .ui-icon-bookmark{background-position:-224px -96px}.kpxc .ui-icon-tag{background-position:-240px -96px}.kpxc .ui-icon-home{background-position:0 -112px}.kpxc .ui-icon-flag{background-position:-16px -112px}.kpxc .ui-icon-calendar{background-position:-32px -112px}.kpxc .ui-icon-cart{background-position:-48px -112px}.kpxc .ui-icon-pencil{background-position:-64px -112px}.kpxc .ui-icon-clock{background-position:-80px -112px}.kpxc .ui-icon-disk{background-position:-96px -112px}.kpxc .ui-icon-calculator{background-position:-112px -112px}.kpxc .ui-icon-zoomin{background-position:-128px -112px}.kpxc .ui-icon-zoomout{background-position:-144px -112px}.kpxc .ui-icon-search{background-position:-160px -112px}.kpxc .ui-icon-wrench{background-position:-176px -112px}.kpxc .ui-icon-gear{background-position:-192px -112px}.kpxc .ui-icon-heart{background-position:-208px -112px}.kpxc .ui-icon-star{background-position:-224px -112px}.kpxc .ui-icon-link{background-position:-240px -112px}.kpxc .ui-icon-cancel{background-position:0 -128px}.kpxc .ui-icon-plus{background-position:-16px -128px}.kpxc .ui-icon-plusthick{background-position:-32px -128px}.kpxc .ui-icon-minus{background-position:-48px -128px}.kpxc .ui-icon-minusthick{background-position:-64px -128px}.kpxc .ui-icon-close{background-position:-80px -128px}.kpxc .ui-icon-closethick{background-position:-96px -128px}.kpxc .ui-icon-key{background-position:-112px -128px}.kpxc .ui-icon-lightbulb{background-position:-128px -128px}.kpxc .ui-icon-scissors{background-position:-144px -128px}.kpxc .ui-icon-clipboard{background-position:-160px -128px}.kpxc .ui-icon-copy{background-position:-176px -128px}.kpxc .ui-icon-contact{background-position:-192px -128px}.kpxc .ui-icon-image{background-position:-208px -128px}.kpxc .ui-icon-video{background-position:-224px -128px}.kpxc .ui-icon-script{background-position:-240px -128px}.kpxc .ui-icon-alert{background-position:0 -144px}.kpxc .ui-icon-info{background-position:-16px -144px}.kpxc .ui-icon-notice{background-position:-32px -144px}.kpxc .ui-icon-help{background-position:-48px -144px}.kpxc .ui-icon-check{background-position:-64px -144px}.kpxc .ui-icon-bullet{background-position:-80px -144px}.kpxc .ui-icon-radio-on{background-position:-96px -144px}.kpxc .ui-icon-radio-off{background-position:-112px -144px}.kpxc .ui-icon-pin-w{background-position:-128px -144px}.kpxc .ui-icon-pin-s{background-position:-144px -144px}.kpxc .ui-icon-play{background-position:0 -160px}.kpxc .ui-icon-pause{background-position:-16px -160px}.kpxc .ui-icon-seek-next{background-position:-32px -160px}.kpxc .ui-icon-seek-prev{background-position:-48px -160px}.kpxc .ui-icon-seek-end{background-position:-64px -160px}.kpxc .ui-icon-seek-start{background-position:-80px -160px}.kpxc .ui-icon-seek-first{background-position:-80px -160px}.kpxc .ui-icon-stop{background-position:-96px -160px}.kpxc .ui-icon-eject{background-position:-112px -160px}.kpxc .ui-icon-volume-off{background-position:-128px -160px}.kpxc .ui-icon-volume-on{background-position:-144px -160px}.kpxc .ui-icon-power{background-position:0 -176px}.kpxc .ui-icon-signal-diag{background-position:-16px -176px}.kpxc .ui-icon-signal{background-position:-32px -176px}.kpxc .ui-icon-battery-0{background-position:-48px -176px}.kpxc .ui-icon-battery-1{background-position:-64px -176px}.kpxc .ui-icon-battery-2{background-position:-80px -176px}.kpxc .ui-icon-battery-3{background-position:-96px -176px}.kpxc .ui-icon-circle-plus{background-position:0 -192px}.kpxc .ui-icon-circle-minus{background-position:-16px -192px}.kpxc .ui-icon-circle-close{background-position:-32px -192px}.kpxc .ui-icon-circle-triangle-e{background-position:-48px -192px}.kpxc .ui-icon-circle-triangle-s{background-position:-64px -192px}.kpxc .ui-icon-circle-triangle-w{background-position:-80px -192px}.kpxc .ui-icon-circle-triangle-n{background-position:-96px -192px}.kpxc .ui-icon-circle-arrow-e{background-position:-112px -192px}.kpxc .ui-icon-circle-arrow-s{background-position:-128px -192px}.kpxc .ui-icon-circle-arrow-w{background-position:-144px -192px}.kpxc .ui-icon-circle-arrow-n{background-position:-160px -192px}.kpxc .ui-icon-circle-zoomin{background-position:-176px -192px}.kpxc .ui-icon-circle-zoomout{background-position:-192px -192px}.kpxc .ui-icon-circle-check{background-position:-208px -192px}.kpxc .ui-icon-circlesmall-plus{background-position:0 -208px}.kpxc .ui-icon-circlesmall-minus{background-position:-16px -208px}.kpxc .ui-icon-circlesmall-close{background-position:-32px -208px}.kpxc .ui-icon-squaresmall-plus{background-position:-48px -208px}.kpxc .ui-icon-squaresmall-minus{background-position:-64px -208px}.kpxc .ui-icon-squaresmall-close{background-position:-80px -208px}.kpxc .ui-icon-grip-dotted-vertical{background-position:0 -224px}.kpxc .ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.kpxc .ui-icon-grip-solid-vertical{background-position:-32px -224px}.kpxc .ui-icon-grip-solid-horizontal{background-position:-48px -224px}.kpxc .ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.kpxc .ui-icon-grip-diagonal-se{background-position:-80px -224px}.kpxc .ui-corner-all,.kpxc .ui-corner-top,.kpxc .ui-corner-left,.kpxc .ui-corner-tl{border-top-left-radius:3px}.kpxc .ui-corner-all,.kpxc .ui-corner-top,.kpxc .ui-corner-right,.kpxc .ui-corner-tr{border-top-right-radius:3px}.kpxc .ui-corner-all,.kpxc .ui-corner-bottom,.kpxc .ui-corner-left,.kpxc .ui-corner-bl{border-bottom-left-radius:3px}.kpxc .ui-corner-all,.kpxc .ui-corner-bottom,.kpxc .ui-corner-right,.kpxc .ui-corner-br{border-bottom-right-radius:3px}.kpxc .ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.kpxc .ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/keepassxc-browser/jquery-ui.min.js b/keepassxc-browser/jquery-ui.min.js deleted file mode 100644 index 0a0a38c..0000000 --- a/keepassxc-browser/jquery-ui.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/*! jQuery UI - v1.12.1 - 2017-11-16 -* http://jqueryui.com -* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("
"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var l=0,h=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=h.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=h.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,l,h=i.nodeName.toLowerCase();return"area"===h?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(h)?(r=!i.disabled,r&&(l=t(i).closest("fieldset")[0],l&&(r=!l.disabled))):r="a"===h?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on("mouseup",function(){c=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("
").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) -},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&u(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var u=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,l=a+e.helperProportions.height,h=i.offset.left,c=i.offset.top,u=h+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=h&&u>=r&&a>=c&&d>=l;case"intersect":return o+e.helperProportions.width/2>h&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,h,i.proportions().width);case"touch":return(a>=c&&d>=a||l>=c&&d>=l||c>a&&l>d)&&(o>=h&&u>=o||r>=h&&u>=r||h>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&u(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=u(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,l=this._change[o];return this._updatePrevProperties(),l?(i=l.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,l,h=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,h.animate||this.element.css(t.extend(a,{top:l,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!h.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&c&&(t.top=l-e.minHeight),n&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,l={width:i.size.width-r,height:i.size.height-a},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&h?{top:c,left:h}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,l=t(this).resizable("instance"),h=l.options,c=l.element,u=h.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(l.containerElement=t(d),/document/.test(u)||u===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=l._num(e.css("padding"+s))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=l.containerOffset,n=l.containerSize.height,o=l.containerSize.width,a=l._hasScroll(d,"left")?d.scrollWidth:o,r=l._hasScroll(d)?d.scrollHeight:n,l.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,l=a.containerOffset,h=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=l),h.left<(a._helper?l.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-l.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?l.left:0),h.top<(a._helper?l.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-l.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?l.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-l.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-l.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),l=a.outerWidth()-e.sizeDiff.width,h=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0}; -t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,l="number"==typeof s.grid?[s.grid,s.grid]:s.grid,h=l[0]||1,c=l[1]||1,u=Math.round((n.width-o.width)/h)*h,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=l,_&&(p+=h),v&&(f+=c),g&&(p-=h),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-h)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-h>0?(i.size.width=p,i.position.left=a.left-u):(p=h-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("
"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,l=e.pageY;return o>r&&(i=r,r=o,o=i),a>l&&(i=l,l=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:l-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),h=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?h=!(c.left>r||o>c.right||c.top>l||a>c.bottom):"fit"===n.tolerance&&(h=c.left>o&&r>c.right&&c.top>a&&l>c.bottom),h?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons")) -},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],l=r&&n.collapsible,h=l?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:l?t():a,newPanel:h};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=l?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
    ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
    ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
    ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
    ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
    ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var d=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"
    ",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var l=n[s]("widget");t.data(l[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(l[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(d,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t(""),this.iconSpace=t(" "),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon) -},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"").addClass(this._triggerClass).html(o?t("").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,l,h,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t(""),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(l=document.documentElement.clientWidth,h=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+c,h/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),p===n&&(p=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,l,h=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):h?"all"===i?t.extend({},h.settings):this._get(h,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),h&&(this._curInst===h&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(h,"min"),l=this._getMinMaxDate(h,"max"),a(h.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(h.settings.minDate=this._formatDate(h,r)),null!==l&&void 0!==n.dateFormat&&void 0===n.maxDate&&(h.settings.maxDate=this._formatDate(h,l)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),h),this._autoSize(h),this._setDate(h,o),this._updateAlternate(h),this._updateDatepicker(h)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,l,h,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),l={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),l=t.datepicker._checkOffset(s,l,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:l.left+"px",top:l.top+"px"}),s.inline||(h=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?s.dpDiv.show(h,t.datepicker._get(s,"showOptions"),c):s.dpDiv[h||"show"](h?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,l=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),h=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>l&&l>n?Math.abs(i.left+n-l):0),i.top-=Math.min(i.top,i.top+o>h&&h>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,l=0,h=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof h?h:(new Date).getFullYear()%100+parseInt(h,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(l).match(o);if(!a)throw"Missing number at position "+l;return l+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(l,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],l+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+l},x=function(){if(i.charAt(l)!==e.charAt(n))throw"Unexpected literal at position "+l;l++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>l&&(a=i.substr(l),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,l=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},h=function(t,e,i){var s=""+e;if(l(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return l(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||l("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=h("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=h("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=h("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=l("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":l("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),l=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,h=l.exec(i);h;){switch(h[2]||"d"){case"d":case"D":r+=parseInt(h[1],10);break;case"w":case"W":r+=7*parseInt(h[1],10);break;case"m":case"M":a+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}h=l.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,l,h,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,T,I,M,P,S,N,H,A,z,O,E,W,F,L,R=new Date,Y=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),B=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),X=this._get(t,"stepMonths"),$=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),J=this._getMinMaxDate(t,"min"),Q=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),Q)for(e=this._daylightSavingAdjust(new Date(Q.getFullYear(),Q.getMonth()-U[0]*U[1]+1,Q.getDate())),e=J&&J>e?J:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-X,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?""+i+"":q?"":""+i+"",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+X,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?""+n+"":q?"":""+n+"",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:Y,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,l=t.inline?"":"",h=j?"
    "+(B?l:"")+(this._isInRange(t,r)?"":"")+(B?"":l)+"
    ":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),T=" ui-corner-all",I="",$){if(I+="
    "}for(I+="
    "+(/all|left/.test(T)&&0===k?B?o:s:"")+(/all|right/.test(T)&&0===k?B?s:o:"")+this._generateMonthYearHeader(t,Z,te,J,Q,k>0||C>0,f,g)+"
    "+"",M=u?"":"",w=0;7>w;w++)P=(w+c)%7,M+="";for(I+=M+"",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),N=(this._getFirstDayOfMonth(te,Z)-c+7)%7,H=Math.ceil((N+S)/7),A=$?this.maxRows>H?this.maxRows:H:H,this.maxRows=A,z=this._daylightSavingAdjust(new Date(te,Z,1-N)),O=0;A>O;O++){for(I+="",E=u?"":"",w=0;7>w;w++)W=m?m.apply(t.input?t.input[0]:null,[z]):[!0,""],F=z.getMonth()!==Z,L=F&&!v||!W[0]||J&&J>z||Q&&z>Q,E+="",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);I+=E+""}Z++,Z>11&&(Z=0,te++),I+="
    "+this._get(t,"weekHeader")+"=5?" class='ui-datepicker-week-end'":"")+">"+""+p[P]+"
    "+this._get(t,"calculateWeek")(z)+""+(F&&!_?" ":L?""+z.getDate()+"":""+z.getDate()+"")+"
    "+($?"
    "+(U[0]>0&&C===U[1]-1?"
    ":""):""),x+=I}y+=x}return y+=h,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var l,h,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="
    ",y="";if(o||!m)y+=""+a[e]+"";else{for(l=s&&s.getFullYear()===i,h=n&&n.getFullYear()===i,y+=""}if(v||(b+=y+(!o&&m&&_?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!_)b+=""+i+"";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":" ")+y),b+="
    "},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,l=this._get(t,"yearRange");return l&&(i=l.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("
    ").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("
    "),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("").button({label:t("").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html(" ")},_createButtonPane:function(){this.uiDialogButtonPane=t("
    "),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("
    ").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),l=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(l>=0?"+":"")+l,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("
    ").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("
    ").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("
    ").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("
    ").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("").parent().append("")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),l=t(s).closest("li"),h=l.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=l.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),h&&l.data("ui-tabs-aria-controls",h),l.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("
    ").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,l=r?t():this._getPanelForTab(o),h=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:h,newTab:r?t():o,newPanel:l};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),h.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},l=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),l(n,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("
    ").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){h.of=t,a.is(":hidden")||a.position(h)}var o,a,r,l,h=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),l=t("
    ").html(a.find(".ui-tooltip-content").html()),l.removeAttr("name").find("[name]").removeAttr("name"),l.removeAttr("id").find("[id]").removeAttr("id"),l.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(h.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e] -}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("
    ").attr("role","tooltip"),s=t("
    ").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f="ui-effects-",g="ui-effects-style",m="ui-effects-animated",_=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,o){var a,r=o.re.exec(i),l=r&&o.parse(r),h=o.space||"rgba";return l?(a=s[h](l),s[c[h].cache]=a[c[h].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("

    ")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,a,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,l],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),o=c[n],a=0===this.alpha()?h("transparent"):this,r=a[o.cache]||o.to(a._rgba),l=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],h=s[o],c=u[n.type]||{};null!==h&&(null===a?l[o]=h:(c.mod&&(h-a>c.mod/2?a+=c.mod:a-h>c.mod/2&&(a-=c.mod)),l[o]=i((h-a)*e+a,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),l=Math.min(s,n,o),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-o)/h+360:n===r?60*(o-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[a]&&(this[a]=l(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[a]=d,n):h(d)},f(o,function(e,i){h.fn[e]||(h.fn[e]=function(n){var o,a=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=h(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(_),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(_.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var l=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",h=l.children?a.find("*").addBack():a;h=h.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),h=h.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(f+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||"",t.removeData(g)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(f+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=f+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(m),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(l)&&l.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[h](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===h:"show"===h)?(r[h](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",l=s.complete,h=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,h)||o;i.data(m,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?h?this[h](s.duration,l):this.each(function(){l&&l.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,l=o?a.scrollLeft():0,h=n.offset(),c={top:h.top-r,left:h.left-l,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
    ").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-l,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var v=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},l=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),l&&l.css(t.effects.clipToBox(r)),r.clip=a),l&&l.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,l="hide"===r,h="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(h||l?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),h&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),l&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=l?2*u:u/2;l&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,l=r||"horizontal"===a,h=r||"vertical"===a;s=o.cssClip(),n.clip={top:h?(s.bottom-s.top)/2:s.top,right:l?(s.right-s.left)/2:s.right,bottom:h?(s.bottom-s.top)/2:s.bottom,left:l?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",l="up"===r||"down"===r?"top":"left",h="up"===r||"left"===r?"-=":"+=",c="+="===h?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,u[l]=h+s,a&&(n.css(u),u[l]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,l,h,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(l=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,h=a-(d-1)/2,p.clone().appendTo("body").wrap("
    ").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?h*_:0),top:l+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:h*_),top:l+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,l=/([0-9]+)%/.exec(r),h=!!e.horizFirst,c=h?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;l&&(r=parseInt(l[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],l=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,l,n.from.y,_),v=t.effects.setTransition(a,l,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,h,n.from.x,_),v=t.effects.setTransition(a,h,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(l=l.concat(["marginTop","marginBottom"]).concat(r),h=h.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,l,n.from.y,o),a=t.effects.setTransition(i,l,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,h,n.from.x,o),a=t.effects.setTransition(i,h,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,l=2*(e.times||5)+(r?1:0),h=e.duration/l,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);l>u;u++)s.animate({opacity:c},h,e.easing),c=1-c;s.animate({opacity:c},h,e.easing),s.queue(i),t.effects.unshift(s,d,l+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,l=2*r+1,h=Math.round(e.duration/l),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,h,e.easing);r>s;s++)n.animate(p,h,e.easing).animate(f,h,e.easing);n.animate(p,h,e.easing).animate(d,h/2,e.easing).queue(i),t.effects.unshift(n,g,l+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,l=e.direction||"left",h="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,u=e.distance||o["top"===h?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[h],d[h]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[l][1]]=d.clip[a[l][0]],"show"===r&&(o.cssClip(d.clip),o.css(h,d[h]),d.clip=s,d[h]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var v;t.uiBackCompat!==!1&&(v=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))}); \ No newline at end of file diff --git a/keepassxc-browser/keepassxc-browser.css b/keepassxc-browser/keepassxc-browser.css deleted file mode 100644 index b1fb5ff..0000000 --- a/keepassxc-browser/keepassxc-browser.css +++ /dev/null @@ -1,255 +0,0 @@ -.kpxc .ui-autocomplete li.ui-menu-item { - text-align: left !important; - font-size: .9em !important; - font-weight: normal !important; - font-style: normal !important; - font-family: 'Lato',sans-serif !important; - color: #222222 !important; -} - -.kpxc .ui-menu { - z-index: 10000; -} - -.ui-helper-hidden-accessible { - display: none !important; -} - -.kpxc .ui-dialog-titlebar-close { - visibility: hidden !important; -} - -.kpxc .ui-dialog { - font-size: 12px !important; - box-shadow: 0 4px 6px 0 hsla(0, 0%, 0%, 0.2); - z-index: 2147483645; -} - -.kpxc .ui-widget-overlay { - opacity: 0.0 !important; -} - -.kpxc .dialog-form .ui-dialog-content .ui-widget-content { - max-height: 80px !important; -} - -.kpxc .ui-dialog-titlebar { - font-family: 'Lato',sans-serif; - background-color: #6cac4d; - color: #fff; -} - -.kpxc .ui-dialog .ui-dialog-buttonpane { - text-align: center !important; -} - -.kpxc .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: none !important; -} - -.kpxc .ui-button .ui-button-text .ui-button { - font-size: .10em !important; -} - -input.genpw-text { - font-size: .9em !important; - padding: .4em; - border-radius: 4px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-collapse: separate; - width: 100%; -} - -.genpw-input-group-addon { - font-size: .9em !important; - background-color: #eee; - border: 1px solid #ccc; - padding: .2em; - border-radius: 4px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - white-space: nowrap; - vertical-align: middle; - display: table-cell; - border-collapse: separate; -} - -.kpxc .genpw-input-group { - position: relative; - display: table; - border-collapse: separate; - width: 100%; -} - -.cip-genpw-icon { - position: absolute; - cursor: pointer; -} - -.cip-genpw-icon.key { - background: url('chrome-extension://__MSG_@@extension_id__/icons/key.svg') right no-repeat; - background-size: contain; -} - -.cip-genpw-icon.key-moz { - background: url('moz-extension://__MSG_@@extension_id__/icons/key.svg') right no-repeat; - background-size: contain; -} - -.kpxc .cip-genpw-checkbox { - -webkit-appearance: checkbox !important; - -moz-appearance: checkbox !important; - appearance: checkbox !important; -} - -#cip-genpw-btn-fillin { - margin-right: 5px; -} - -#cip-genpw-quality { - text-align: center; -} - -.b2c-modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 2147483645; -} - -.b2c-modal-backdrop:after { - content: ''; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #000000; - opacity: 0.5; - filter: alpha(opacity=50); -} - -#b2c-cipDefine-fields { - z-index: 2147483646; -} - -#b2c-cipDefine-description { - z-index: 2147483646; - color: #efefef; - border: 2px solid #555555; - padding: 7px 5px; - position: absolute; - top: 100px; - left: 150px; - text-align: left; - cursor: pointer; - background-color: rgba(0,0,0,0.8); - font-size: 15px; -} - -#b2c-cipDefine-description div:first-of-type { - margin-top: 0; - padding-top: 0; - text-align: left; - color: #efefef; - padding-bottom: 8px; - font-weight: bold; - font-size: 160%; -} - -#b2c-cipDefine-description p { - margin-top: 10px; - padding-top: 10px; - color: #efefef; - border-top: 2px solid #666666; - line-height: 110%; -} - -#b2c-help { - margin-bottom: 3px; -} - -#b2c-keyboardHelp { - font-size: 0.75em; -} - -#b2c-keyboardHelp kbd { - background-color: #eee; - border-radius: 3px; - border: 1px solid #b4b4b4; - color: #333; - display: inline-block; - line-height: 1; - padding: 2px 4px; - white-space: nowrap; -} - -.b2c-fixed-field { - position: absolute; - border: 2px solid #efefef; - color: #fff; - cursor: pointer; - z-index: 2147483646; - text-align: center; - font-weight: bold; - background-color:rgba(239,239,239,0.4); -} - -.b2c-fixed-hover-field { - border: 2px solid orange; - background-color:rgba(255,165,239,0.4); -} - -.b2c-fixed-password-field { - border: 2px solid red; - color: #efefef; - background-color:rgba(255,0,0,0.4); -} - -.b2c-fixed-username-field { - border: 2px solid limegreen; - color: #efefef; - background-color:rgba(50,205,50,0.4); -} - -.b2c-fixed-string-field { - border: 2px solid deepskyblue; - color: #efefef; - background-color:rgba(30,144,255,0.4); -} - -.b2c-input-append { - display: inline-block; - margin-bottom: 10px; - white-space: nowrap; - vertical-align: middle; -} - -.b2c-input-append input, -.b2c-input-append select, -.b2c-input-append .b2c-uneditable-input, -.b2c-input-append .b2c-dropdown-menu, -.b2c-input-append .b2c-popover { - font-size: 14px; -} - -.b2c-input-append input, -.b2c-input-append select, -.b2c-input-append .b2c-uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.b2c-input-append input:focus, -.b2c-input-append select:focus, -.b2c-input-append .b2c-b2c-uneditable-input:focus { - z-index: 2; -} diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js deleted file mode 100755 index af1cc73..0000000 --- a/keepassxc-browser/keepassxc-browser.js +++ /dev/null @@ -1,2258 +0,0 @@ -'use strict'; - -// contains already called method names -var _called = {}; -_called.retrieveCredentials = false; -_called.clearLogins = false; -_called.manualFillRequested = 'none'; -let _loginId = -1; -let _singleInputEnabledForPage = false; -const _maximumInputs = 100; - -// Count of detected form fields on the page -var _detectedFields = 0; - -// Element id's containing input fields detected by MutationObserver -var _observerIds = []; - -// Document URL -let _documentURL = document.location.href; - -function _f(fieldId) { - const field = (fieldId) ? jQuery('input[data-cip-id=\'' + fieldId + '\']:first') : []; - return (field.length > 0) ? field : null; -} - -function _fs(fieldId) { - const field = (fieldId) ? jQuery('input[data-cip-id=\'' + fieldId + '\']:first,select[data-cip-id=\'' + fieldId + '\']:first').first() : []; - return (field.length > 0) ? field : null; -} - -browser.runtime.onMessage.addListener(function(req, sender, callback) { - if ('action' in req) { - if (req.action === 'fill_user_pass_with_specific_login') { - if (cip.credentials[req.id]) { - let combination = null; - if (cip.u) { - cip.setValueWithChange(cip.u, cip.credentials[req.id].login); - combination = cipFields.getCombination('username', cip.u); - browser.runtime.sendMessage({ - action: 'page_set_login_id', args: [ req.id ] - }); - cip.u.focus(); - } - if (cip.p) { - cip.setValueWithChange(cip.p, cip.credentials[req.id].password); - browser.runtime.sendMessage({ - action: 'page_set_login_id', args: [ req.id ] - }); - combination = cipFields.getCombination('password', cip.p); - } - - let list = []; - if (cip.fillInStringFields(combination.fields, cip.credentials[req.id].stringFields, list)) { - cipForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); - } - } - } else if (req.action === 'fill_username_password') { - _called.manualFillRequested = 'both'; - cip.receiveCredentialsIfNecessary().then((response) => { - cip.fillInFromActiveElement(false); - }); - } else if (req.action === 'fill_password') { - _called.manualFillRequested = 'pass'; - cip.receiveCredentialsIfNecessary().then((response) => { - cip.fillInFromActiveElement(false, true); // passOnly to true - }); - } else if (req.action === 'fill_totp') { - cip.receiveCredentialsIfNecessary().then((response) => { - cip.fillInFromActiveElementTOTPOnly(false); - }); - } else if (req.action === 'activate_password_generator') { - cip.initPasswordGenerator(cipFields.getAllFields()); - } else if (req.action === 'remember_credentials') { - cip.contextMenuRememberCredentials(); - } else if (req.action === 'choose_credential_fields') { - cipDefine.init(); - } else if (req.action === 'clear_credentials') { - cipEvents.clearCredentials(); - return Promise.resolve(); - } else if (req.action === 'activated_tab') { - cipEvents.triggerActivatedTab(); - return Promise.resolve(); - } else if (req.action === 'redetect_fields') { - browser.runtime.sendMessage({ - action: 'load_settings', - }).then((response) => { - cip.settings = response; - cip.initCredentialFields(true); - }); - } else if (req.action === 'ignore-site') { - cip.ignoreSite(req.args); - } else if (req.action === 'check_database_hash' && 'hash' in req) { - cip.detectDatabaseChange(req.hash); - } else if (req.action === 'show_password_generator') { - cipPassword.showDialog(); - } - } -}); - - -var cipAutocomplete = {}; - -// objects of username + description for autocomplete -cipAutocomplete.elements = []; - -cipAutocomplete.init = function(field) { - if (cip.settings.autoFillSingleEntry && cip.credentials.length === 1 && field.hasClass('ui-autocomplete-input')) { - field.autocomplete('destroy'); - } - - const acMenu = jQuery('#kpxc-ac-menu'); - if (acMenu.length === 0) { - jQuery('
    ').appendTo('body'); - } - - field - .addClass('kpxc') - .autocomplete({ - appendTo: '#kpxc-ac-menu', - minLength: 0, - source: cipAutocomplete.onSource, - select: cipAutocomplete.onSelect, - open: cipAutocomplete.onOpen - }); - field - .click(cipAutocomplete.onClick) - .blur(cipAutocomplete.onBlur) - .focus(cipAutocomplete.onFocus); -}; - -cipAutocomplete.onClick = function(e) { - if (!cipAutocomplete.isTrusted(e)) { - return; - } - jQuery(this).autocomplete('search', jQuery(this).val()); -}; - -cipAutocomplete.onOpen = function(e, ui) { - if (!cipAutocomplete.isTrusted(e)) { - return; - } - jQuery('ul.ui-autocomplete.ui-menu').css('z-index', 2147483636); -}; - -cipAutocomplete.onSource = function(request, callback) { - const matches = jQuery.map(cipAutocomplete.elements, (tag) => { - if (tag.label.toUpperCase().indexOf(request.term.toUpperCase()) === 0) { - return tag; - } - }); - callback(matches); -}; - -cipAutocomplete.onSelect = function(e, ui) { - if (!cipAutocomplete.isTrusted(e)) { - return; - } - e.preventDefault(); - cip.setValueWithChange(jQuery(this), ui.item.value); - const fieldId = cipFields.prepareId(jQuery(this).attr('data-cip-id')); - const combination = cipFields.getCombination('username', fieldId); - combination.loginId = ui.item.loginId; - cip.fillInCredentials(combination, true, false); - jQuery(this).data('fetched', true); -}; - -cipAutocomplete.onBlur = function() { - if (jQuery(this).data('fetched') === true) { - jQuery(this).data('fetched', false); - } else { - const fieldId = cipFields.prepareId(jQuery(this).attr('data-cip-id')); - const fields = cipFields.getCombination('username', fieldId); - const fieldValue = jQuery(this).val(); - - // Check if the manually inserted value is one of the retrieved credentials - const fieldFound = cipAutocomplete.elements.some(e => e.value === fieldValue); - - if (_f(fields.password) && _f(fields.password).data('unchanged') !== true && fieldFound && _detectedFields > 1) { - cip.fillInCredentials(fields, true, true); - } - } -}; - -cipAutocomplete.onFocus = function(e) { - if (!cipAutocomplete.isTrusted(e)) { - return; - } - cip.u = jQuery(this); - - if (jQuery(this).val() === '') { - jQuery(this).autocomplete('search', ''); - } -}; - -// Search for isTrusted from jQuery's originalEvent -cipAutocomplete.isTrusted = function(e) { - for (let f = e.originalEvent; f; f = f.originalEvent) { - if (f.isTrusted !== undefined) { - return f.isTrusted; - } - } - return false; -}; - - -var cipPassword = {}; -cipPassword.observedIcons = []; -cipPassword.observingLock = false; - -cipPassword.init = function() { - if ('initPasswordGenerator' in _called) { - return; - } - - _called.initPasswordGenerator = true; - - window.setInterval(function() { - cipPassword.checkObservedElements(); - }, 400); -}; - -cipPassword.initField = function(field, inputs, pos) { - if (!field || field.length !== 1) { - return; - } - if (field.data('cip-password-generator')) { - return; - } - - field.data('cip-password-generator', true); - - cipPassword.createIcon(field); - - let $found = false; - if (inputs) { - for (let i = pos + 1; i < inputs.length; i++) { - if (inputs[i] && inputs[i].attr('type') && inputs[i].attr('type').toLowerCase() === 'password') { - field.data('cip-genpw-next-field-id', inputs[i].data('cip-id')); - field.data('cip-genpw-next-is-password-field', (i === 0)); - $found = true; - break; - } - } - } - - field.data('cip-genpw-next-field-exists', $found); -}; - -cipPassword.createDialog = function() { - if ('passwordCreateDialog' in _called) { - return; - } - - _called.passwordCreateDialog = true; - - const $dialog = jQuery('
    ') - .addClass('dialog-form') - .attr('id', 'cip-genpw-dialog'); - - const $inputDiv = jQuery('
    ').addClass('form-group'); - const $inputGroup = jQuery('
    ').addClass('genpw-input-group'); - const $textfieldPassword = jQuery('') - .attr('id', 'cip-genpw-textfield-password') - .attr('type', 'text') - .attr('aria-describedby', 'cip-genpw-quality') - .attr('placeholder', tr('passwordGeneratorPlaceholder')) - .attr('tabindex', -1) - .addClass('genpw-text ui-widget-content ui-corner-all') - .on('change keypress paste textInput input', function() { - jQuery('#cip-genpw-btn-clipboard:first').removeClass('btn-success'); - }); - const $quality = jQuery('') - .addClass('genpw-input-group-addon') - .addClass('b2c-add-on') - .attr('id', 'cip-genpw-quality') - .text(tr('passwordGeneratorBits')); - $inputGroup.append($textfieldPassword).append($quality); - - const $checkGroup = jQuery('
    ').addClass('genpw-input-group'); - const $checkboxNextField = jQuery('') - .attr('id', 'cip-genpw-checkbox-next-field') - .attr('type', 'checkbox') - .addClass('cip-genpw-checkbox'); - const $labelNextField = jQuery('
    ') - .addClass('kpxc') - .addClass('cip-genpw-icon') - .addClass($className) - .attr('title', tr('passwordGeneratorGenerateText')) - .attr('alt', tr('passwordGeneratorIcon')) - .css('z-index', '9999') - .css('width', $size) - .css('height', $size) - .data('size', $size) - .data('offset', $offset) - .data('cip-genpw-field-id', field.data('cip-id')); - cipPassword.setIconPosition($icon, field); - $icon.click(function(e) { - e.preventDefault(); - - if (!field.is(':visible')) { - $icon.remove(); - field.removeData('cip-password-generator'); - return; - } - - cipPassword.createDialog(); - const $dialog = jQuery('#cip-genpw-dialog'); - if ($dialog.dialog('isOpen')) { - $dialog.dialog('close'); - } - - $dialog.dialog('option', 'position', { my: 'left-10px top', at: 'center bottom', of: jQuery(this) }); - $dialog.data('cip-genpw-field-id', field.data('cip-id')); - $dialog.data('cip-genpw-next-field-id', field.data('cip-genpw-next-field-id')); - $dialog.data('cip-genpw-next-is-password-field', field.data('cip-genpw-next-is-password-field')); - - const $bool = Boolean(field.data('cip-genpw-next-field-exists')); - jQuery('input#cip-genpw-checkbox-next-field:first') - .attr('checked', $bool) - .attr('disabled', !$bool); - - $dialog.dialog('open'); - }); - - cipPassword.observedIcons.push($icon); - jQuery('body').append($icon); -}; - -cipPassword.showDialog = function() { - $('.cip-genpw-icon').click(); -}; - -cipPassword.setIconPosition = function($icon, $field) { - $icon.css('top', $field.offset().top + $icon.data('offset') + 1) - .css('left', $field.offset().left + $field.outerWidth() - $icon.data('size') - $icon.data('offset')); -}; - -cipPassword.copyPasswordToClipboard = function(e) { - if (e) { - e.preventDefault(); - } - - const input = jQuery('input#cip-genpw-textfield-password'); - input.select(); - try { - const success = document.execCommand('copy'); - if (success) { - jQuery('#cip-genpw-btn-clipboard').addClass('b2c-btn-success'); - } - jQuery('#cip-genpw-dialog').select(); - input.value = ''; - } - catch (err) { - console.log('Could not copy password to clipboard: ' + err); - } -}; - -cipPassword.callbackPasswordCopied = function(bool) { - if (bool) { - jQuery('#cip-genpw-btn-clipboard').addClass('btn-success'); - } -}; - -cipPassword.callbackGeneratedPassword = function(entries) { - if (entries && entries.length >= 1) { - jQuery('#cip-genpw-btn-clipboard:first').removeClass('btn-success'); - jQuery('input#cip-genpw-textfield-password:first').val(entries[0].password); - if (isNaN(entries[0].login)) { - jQuery('#cip-genpw-quality:first').text('??? Bits'); - } else { - jQuery('#cip-genpw-quality:first').text(entries[0].login + ' Bits'); - } - } else { - if (jQuery('div#cip-genpw-error:first').length === 0) { - jQuery('button#cip-genpw-btn-generate:first').after('
    ' + tr('passwordGeneratorError') + '
    '); - jQuery('input#cip-genpw-textfield-password:first').parent().hide(); - jQuery('input#cip-genpw-checkbox-next-field:first').parent('label').hide(); - jQuery('button#cip-genpw-btn-generate').hide(); - jQuery('button#cip-genpw-btn-clipboard').hide(); - jQuery('button#cip-genpw-btn-fillin').hide(); - } - } -}; - -cipPassword.onRequestPassword = function() { - browser.runtime.sendMessage({ - action: 'generate_password' - }).then(cipPassword.callbackGeneratedPassword); -}; - -cipPassword.checkObservedElements = function() { - if (cipPassword.observingLock) { - return; - } - - cipPassword.observingLock = true; - jQuery.each(cipPassword.observedIcons, (index, iconField) => { - if (iconField && iconField.length === 1) { - const fieldId = iconField.data('cip-genpw-field-id'); - const field = jQuery('input[data-cip-id=\'' + fieldId + '\']:first'); - if (!field || field.length !== 1) { - iconField.remove(); - cipPassword.observedIcons.splice(index, 1); - } else if (!field.is(':visible')) { - iconField.hide(); - } else if (field.is(':visible')) { - iconField.show(); - cipPassword.setIconPosition(iconField, field); - field.data('cip-password-generator', true); - } - - - } else { - cipPassword.observedIcons.splice(index, 1); - } - }); - cipPassword.observingLock = false; -}; - - - -var cipForm = {}; - -cipForm.init = function(form, credentialFields) { - // Not already initialized && password-field is not null - if (!form.data('cipForm-initialized') && (credentialFields.password || (_singleInputEnabledForPage && credentialFields.username))) { - form.data('cipForm-initialized', true); - cipForm.setInputFields(form, credentialFields); - form.submit(cipForm.onSubmit); - } -}; - -cipForm.destroy = function(form, credentialFields) { - if (form === false && credentialFields) { - const field = _f(credentialFields.password) || _f(credentialFields.username); - if (field) { - form = field.closest('form'); - } - } - - if (form && jQuery(form).length > 0) { - jQuery(form).unbind('submit', cipForm.onSubmit); - } -}; - -cipForm.setInputFields = function(form, credentialFields) { - form.data('cipUsername', credentialFields.username); - form.data('cipPassword', credentialFields.password); -}; - -cipForm.onSubmit = function() { - const usernameId = jQuery(this).data('cipUsername'); - const passwordId = jQuery(this).data('cipPassword'); - - let usernameValue = ''; - let passwordValue = ''; - - const usernameField = _f(usernameId); - const passwordField = _f(passwordId); - - if (usernameField) { - usernameValue = usernameField.val(); - } - if (passwordField) { - passwordValue = passwordField.val(); - } - - cip.rememberCredentials(usernameValue, passwordValue); -}; - - - -var cipDefine = {}; - -cipDefine.selection = { - username: null, - password: null, - fields: [] -}; -cipDefine.eventFieldClick = null; -cipDefine.keyDown = null; - -cipDefine.init = function() { - const $backdrop = jQuery('
    ').attr('id', 'b2c-backdrop').addClass('b2c-modal-backdrop'); - jQuery('body').append($backdrop); - - const $chooser = jQuery('
    ').attr('id', 'b2c-cipDefine-fields'); - jQuery('body').append($chooser); - - const $description = jQuery('
    ').attr('id', 'b2c-cipDefine-description'); - $backdrop.append($description); - - cipFields.getAllFields(); - cipFields.prepareVisibleFieldsWithID('select'); - - cipDefine.initDescription(); - - cipDefine.resetSelection(); - cipDefine.prepareStep1(); - cipDefine.markAllUsernameFields($chooser); - - document.addEventListener('keydown', cipDefine.keyDown); -}; - -cipDefine.close = function() { - $('div#b2c-backdrop').remove(); - $('div#b2c-cipDefine-fields').remove(); - document.removeEventListener('keydown', cipDefine.keyDown); -}; - -cipDefine.initDescription = function() { - const $description = jQuery('div#b2c-cipDefine-description'); - const $h1 = jQuery('
    ').addClass('b2c-chooser-headline'); - $description.append($h1); - const $help = jQuery('
    ').addClass('b2c-chooser-help').attr('id', 'b2c-help'); - $description.append($help); - const $keyboardHelp = jQuery('
    ').addClass('b2c-chooser-help').attr('id', 'b2c-keyboardHelp'); - $description.append($keyboardHelp); - - // Show keyboard shortcuts help text - jQuery('div#b2c-keyboardHelp').text(`${tr('optionsKeyboardShortcutsHeader')}:`).css('margin-bottom', '5px'); - jQuery('div#b2c-keyboardHelp').append($('
    Escape')).append(' ' + tr('defineDismiss')); - jQuery('div#b2c-keyboardHelp').append($('
    S')).append(' ' + tr('defineSkip')); - jQuery('div#b2c-keyboardHelp').append($('
    A')).append(' ' + tr('defineAgain')); - jQuery('div#b2c-keyboardHelp').append($('
    C')).append(' ' + tr('defineConfirm')); - jQuery('div#b2c-keyboardHelp').append($('
    M')).append(' ' + tr('defineMore')); - jQuery('div#b2c-keyboardHelp').append($('
    D')).append(' ' + tr('defineDiscard')); - - const $btnDismiss = jQuery('


    +

    +

    + + +
    +

    +

    @@ -30,18 +32,18 @@
    - diff --git a/keepassxc-browser/popups/popup_httpauth.html b/keepassxc-browser/popups/popup_httpauth.html index 1d8a53a..37d7410 100644 --- a/keepassxc-browser/popups/popup_httpauth.html +++ b/keepassxc-browser/popups/popup_httpauth.html @@ -1,15 +1,17 @@ + - - - - - - + + + + + + + @@ -33,6 +35,5 @@

    - diff --git a/keepassxc-browser/popups/popup_httpauth.js b/keepassxc-browser/popups/popup_httpauth.js index 04732cd..5072079 100644 --- a/keepassxc-browser/popups/popup_httpauth.js +++ b/keepassxc-browser/popups/popup_httpauth.js @@ -3,7 +3,7 @@ const getLoginData = function() { return new Promise((resolve, reject) => { browser.runtime.getBackgroundPage().then((global) => { - browser.tabs.query({ 'active': true, 'currentWindow': true }).then((tabs) => { + browser.tabs.query({'active': true, 'currentWindow': true}).then((tabs) => { resolve(global.page.tabs[tabs[0].id].loginList); }); }); diff --git a/keepassxc-browser/popups/popup_login.html b/keepassxc-browser/popups/popup_login.html index 902d4e8..676fb4a 100644 --- a/keepassxc-browser/popups/popup_login.html +++ b/keepassxc-browser/popups/popup_login.html @@ -1,15 +1,17 @@ + - - - - - - + + + + + + +
    @@ -21,7 +23,7 @@

    - . + .
    @@ -44,6 +46,5 @@
    - diff --git a/keepassxc-browser/popups/popup_multiple-fields.html b/keepassxc-browser/popups/popup_multiple-fields.html index 10a2c89..ae930e1 100644 --- a/keepassxc-browser/popups/popup_multiple-fields.html +++ b/keepassxc-browser/popups/popup_multiple-fields.html @@ -1,14 +1,16 @@ + - - - - - + + + + + +
    @@ -20,7 +22,7 @@

    - . + .
    @@ -31,6 +33,5 @@

    - diff --git a/keepassxc-browser/popups/popup_remember.html b/keepassxc-browser/popups/popup_remember.html index d7904a7..61ebc23 100644 --- a/keepassxc-browser/popups/popup_remember.html +++ b/keepassxc-browser/popups/popup_remember.html @@ -1,15 +1,17 @@ + - - - - - - + + + + + + +
    @@ -43,6 +45,5 @@

      - diff --git a/keepassxc-browser/popups/popup_remember.js b/keepassxc-browser/popups/popup_remember.js index b494dde..37cddfa 100644 --- a/keepassxc-browser/popups/popup_remember.js +++ b/keepassxc-browser/popups/popup_remember.js @@ -50,7 +50,7 @@ function _initialize(tab) { // Another group name has been specified const [ gname, guuid ] = getDefaultGroup(result.groups[0].children, result.defaultGroup); if (gname === '' && guuid === '') { - showNotification(tr('popupRememberErrorDefaultGroupNotFound')); + showNotification(tr('popupRememberInfoDefaultGroupNotFound')); // Create a new group browser.runtime.sendMessage({ @@ -216,7 +216,7 @@ function _initialize(tab) { const currentTab = tabs[0]; browser.runtime.getBackgroundPage().then((global) => { browser.tabs.sendMessage(currentTab.id, { - action: 'ignore-site', + action: 'ignore_site', args: [ _tab.credentials.url ] }); _close(); diff --git a/keepassxc-browser/popups/throbber.gif b/keepassxc-browser/popups/throbber.gif index 3bc13d10a6e63b0b6dc363f67355014ba0bfc4c3..951ad19fa79a0d6e5e5b5c62f867282a99e8ba5a 100644 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q?%g{E28OL$x7ym;0vXZK(Up~z9UUEt|D>FYQWHy3QxwWG zOEMG^vl1(E@)J|^GV{{%85DoAFmM5tEB@#9a}5c0b_{Se(lcOY1PbW@G0D8JzOW7Eb1{;*gxf?l&Wi({-cap7;r7l!E}X+)Eqz!)jo2f+oR?VMR6u=p2PZ6D-9amptEdYo3ARahV5- zdQRKso(f;H$dHGPTckK~_XgANQyCi#HgI|}DR^^EXzVP; zcee@)rY3aUO`LPrWLm4E+ff6N2??{eG4iq;auAqp*l_6Dxrs1i*fER&#{BA3rz>+b wugh_899HN%UdYE{Xt46shIIiFhk(%)c55k}AOHXW literal 583 zcmZ?wbhEHb6krfwIK;*P1h%%e(b3VBm6aVG9b30J)#naB?xQGw6UcfwVI)8&~YQ^UvUvXSTMYh!g|I9Cp7MX`)RV43F;OxOrgPJHsQa zju&*bc`WZPV^`#1WAVy^{38Yerz4K+SMav5Q9&_*0dB%B(ZFn0h9)g%ldS#%=7$c)A8=e$<$2;N z@b=TbmySG%u_6U$kL;hD$G(R_7}YO)Kr=vY*ku}|ttWVB!g7I2uU22!nA>U~!pOkF zWys?)Wu4c;R?`^|BXU2_kT$6&&Rd~903=S9G+6u0lh@u}Bidq$`LVvHd6;t23THsNd6u7?ku2 zurPhDd%u8%K|my{{q?e$s*IojU<5}d69XI6`8pN5YC?7QiQjA~y(q*K#_E^=^nH(o c*3(E1XA2&d8++##blf+3A}O$DIWQKj0hD#FumAu6 From f041703315ec1089d685ff939e40fbcd707bc572 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Thu, 28 Mar 2019 13:27:44 +0200 Subject: [PATCH 06/12] Improve the build script --- .tx/config | 9 ++ build.js | 11 +- keepassxc-browser/icons/keepassxc-dark.svg | 154 ++++++++++++++++++++ keepassxc-browser/icons/keepassxc.svg | 113 ++++++++++++++ keepassxc-browser/icons/keepassxc_18x18.png | Bin 0 -> 1984 bytes keepassxc-browser/icons/keepassxc_36x36.png | Bin 0 -> 3216 bytes keepassxc-browser/icons/keepassxc_96x96.png | Bin 0 -> 9678 bytes keepassxc-browser/manifest.json | 9 +- package-lock.json | 4 +- package.json | 2 +- 10 files changed, 295 insertions(+), 7 deletions(-) create mode 100644 .tx/config create mode 100644 keepassxc-browser/icons/keepassxc-dark.svg create mode 100644 keepassxc-browser/icons/keepassxc.svg create mode 100644 keepassxc-browser/icons/keepassxc_18x18.png create mode 100644 keepassxc-browser/icons/keepassxc_36x36.png create mode 100644 keepassxc-browser/icons/keepassxc_96x96.png diff --git a/.tx/config b/.tx/config new file mode 100644 index 0000000..da01a97 --- /dev/null +++ b/.tx/config @@ -0,0 +1,9 @@ +[main] +host = https://www.transifex.com + +[keepassxc-browser.messagesjson] +file_filter = keepassxc-browser/_locales//messages.json +minimum_perc = 60 +source_file = keepassxc-browser/_locales/en/messages.json +source_lang = en +type = CHROME diff --git a/build.js b/build.js index f654cbb..e9134f2 100644 --- a/build.js +++ b/build.js @@ -2,6 +2,8 @@ const fs = require('fs'); const extra = require('fs-extra'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); const zaf = require('zip-a-folder'); const DEST = 'keepassxc-browser'; @@ -31,7 +33,14 @@ function adjustManifest(manifest) { return `keepassxc-browser_${data['version']}_${browser}.zip`; } +async function updateTranslations() { + console.log('Pulling translations from Transifex, please wait...'); + const { stdout } = await exec('tx pull -af'); + console.log(stdout); +} + (async() => { + await updateTranslations(); fs.copyFileSync(`${DEST}/manifest.json`, `./${DEFAULT}`); for (const browser in BROWSERS) { @@ -45,4 +54,4 @@ function adjustManifest(manifest) { } fs.renameSync(DEFAULT, `${DEST}/manifest.json`); -})() +})(); diff --git a/keepassxc-browser/icons/keepassxc-dark.svg b/keepassxc-browser/icons/keepassxc-dark.svg new file mode 100644 index 0000000..a000706 --- /dev/null +++ b/keepassxc-browser/icons/keepassxc-dark.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/keepassxc-browser/icons/keepassxc.svg b/keepassxc-browser/icons/keepassxc.svg new file mode 100644 index 0000000..d93dee4 --- /dev/null +++ b/keepassxc-browser/icons/keepassxc.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/keepassxc-browser/icons/keepassxc_18x18.png b/keepassxc-browser/icons/keepassxc_18x18.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6cf12c2820d93c9328ab8f6e6abb8c4dbd167d GIT binary patch literal 1984 zcmZWq3pkW%8~#RRG%F&tl4?wJ*q9mP@SDjnHG>(agfLk#%?!pE-|Woz%@m448!1t1 zP(;=*haAF&D2Gt%m_zuPS&4o&vPE07SN?D0vb)z_*Y|wi`#$&m-tY51&+}g2_inBZ zn-F>k001`8s1$eTtF1IORp{;2mFx`wDxMrqACZrXGl2>6&D4zOE646&G;=|5OhXt{xvs1V)KqOwm}(U+K`X)?)b^Tg>49gUl9l z0_}X(_)HF;feztgl-*61AhXRr*s|gN=+=Wu&l(E)D~3k2X?`%L#JB0WAsc=<@QeJ!VGD`(Pre;3 z+D+3+3fiPtr~mXbo9`s^4JgkMcht&G( z4`XyNsD1FO1P$m)Z{$qO=@_>dR_j7b%$jQqH4C1op<37CEv^d7Wd+zMc@%Ck%YpCBcZ7k{u(DTtHo2oU|?yq_8 zzw??8ALT*&E)7ir0lHFd)DNGM$9L7`J9ep0jnVsSX5~rbE!r7Zln&{W zo8`WD=iOz;nz5yC&X1hIEG?zU?#XLD7FcCjUAR7@y(>xPwK#=V2lP4#(D>NF0V91^ z{iffWJkn&ouOGe`U6*rnwl@0iOP0fIOOZ}(7l@y}=!1kd+fWy&Fn>vU;y<8p`E-bS~;QzNQ6p!BIOFXvUWoOAuRcL>~`0 z*T4Q$x!Rq{I=oiQzzCx1{{7(E(%ml=L)&5xhp4;1T&~?r%84Ywq6!*c6)c+TYJQkd zKZ5N!`7n?^I1^a1&G3r;(48mLkTaoA41O;?4|~Ub?kTBBN>2+&BF7j=CasEigDRud z-Vb=Al|o^DRq2-Ls~7hn%}J^18Iy7qVD!!Qfn2#tk6}X3If``*1iNKmN`|Y6&tS$^ zY_>;@>kakZtOZ&#>hhf8(~~MF<}hr|YuA)3swj6-`QBQOuY2@{7M`W{P6Ida0IPEN z%*V*_&a9pCn>@~iP2@IhSrb$`-X@4Z>(&JA^A~ft4Qs(ywDrrMINf z5mSk!x4?#~7`zLD_P75_Ud-8G*(Ha}0laA(X%mSAYvT*|u@DSx~)J6B5S Ik$~9$1BmQki2wiq literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/keepassxc_36x36.png b/keepassxc-browser/icons/keepassxc_36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..5da45189ce63556cd8469be1321a81a8fec16caf GIT binary patch literal 3216 zcmZWs2{@EnA3q}%Q;{s!7Sp7Zm_dwvxyCjwZq`WBm>G;^W|}2q2~or-5n_a!aupd% zX+ic~NY=Or$ybUPONhSF?dg8sbI>-S-q;hi7JH!5PyoOljHRhP z@2Rjg1$OY(agde<0G}h#(S`0}W37uL2OzL`vL^w-450Ar0O%VrDOj8zfe!N|coRtm z@VSa=IE;ulfS=T~QMI9<2|h&2U@E~O*wzsj?1$6A!;K7~`b=FOK>&e{g)syCNiq%zN4d8H|9rlBqPW1YRokaT)J}(i-Eelc&p^E%pI4`W9zWg7WiKYAtOkfhd%v^rr zaYPCh;Y&eossDw=GI%-q5#;|7|3vc;f4j2fm@Xy&>rJpGki6+W25>cX?e9+hV>wC0 z|F41Pwl11Vz|zT7M>5&p0KSz+BFT@2!%_%a+5Eo!Z+~@ptTY=kp1^~BSMxsnUB?rV zTh&4SC=ajB$e)Gg2|rtfK;rcWmDdOdD~0<3fJ73}=o2)13lkW|42@FLL7`OC5o!P& zNn|8;9jnL6Hhajx9|-Q;8IyZ%NW+1}QYZGlVjrz1tk2#YdN;hHhvBq2*-cCgT&#{L zpgPA{wl+4VKP|2@91AErw61?4t7|66sB5~18!A_9UTS4aUNlB{ysU#%;|$B+_=M$( z97E}zYZi0gFMK(&x2$NVvR5T7qwGWW`oPdWj638v*5|Yw-|gc^$KRa#RWs=1Q@7TJ zeRb1y2phzaQ1XX)_3HFn2yQ~_DFuBL`A;iEUxOVL3(yZ z%An#X%Qg*!$yy(8>i6N{w*g*YBnLeTY}bK zArBq%Zt33@Bg8w>f)q5cmjrxQqVT`RJ@iMQZ#pAu0sBCROX%?+aW0~>c_?rYu%}hG# z*vc6u0t)e$Ktx+x+XAlnn##Sx!j1Gk-;t#0um13y4#VssJz1gO?~?mRhnuvjHX=o? zT0A5@@XgnL9sJk5kx4b*6=wX6LdD%q4iE7;^Y;e7EblT8ArIq6&EScG*#KAI(E z_+)q_{%CC0lzL44{HtsG^^|(BALO1k2xo=uV&8^i4_kICmf}+3Ec^i$zBT<`oZ*3e zUXdE;+S;CKb-L}P#3sdcW8)4PEfTO!eg%LATgAA!Y$0g?YcDlmyeqIge-UHc z85b94=H%o=02FV!@z)vd;aHIaHw5{1%B*DQ{w~I!OLLd?`HQ@d|IeY->Ar+qy*p8S zAU{99O-V^f0z$FnD}C*M?D-jTP*Bh_anQMvr75-Tu54&Yb>`^T&zfA4M)EJc&;N6s z$?f%fm%DksjezzvE?yB81-EST`X=X-hy5Rm--uAaoSNo!I7o}AX+CKvwr`t@-0ag4 zE4>7=CKoak_R+$txlp1luS@bJb1Hf7UQqKjtlB;4F2l0XCY2C`VK5jNrCBeZ(Cdkd zpFfb`>0^TEDF2d3_412N;$p9auL>7aLL2BQFYs~+d8VlZEwF2wYCZ4#sWp8B6s_PG z1@j{f@gj5%ZpNd!>rR_X>XWCc&=0@Gt7@PuL5<`?y-ZuZ2q_8RTronzB81uB;L{xtXtB-P{!pn~FSPKFt4z<+00vL8Kb{hB3V8r-nNSmN2OXq;4(b2KR>_)_ z*dFk5(YXou!fOJ&ex zVQ%i&qu~UWb&kJ-#zJG1RSr%`1|ar4njZ@-!6z27sz2M=fon7F5-96&a zW$tvB1w7G`4>;?W#knf9x%DPF>5G@jMsP;vB=SYNTqO^sDx^|=EJI@f~u0q-WebK$~; z0m!A}5UFyG{NNMvSTSct34Hy$`YE+^qVxeNyH&Xd?XdSXzMv)Vr1R-$dHrv3+gsl{ zt;~%XJ(yWTCI(j!BqCXvnVH@)($eOj#;c^KpRHwDQl|ZT?hbrwTp%jztdN^j2H%l9 z+mbR#H^0%nC{`x;jk$`PDLoMhsWM9amc<>lZ3j{Ewh_9-Q*c$XI^NoRr^ zvS0Nw1kT2f^d8CiYx?&t*IJj-mU>l&?5D4V^Vy%B%>PghsyH1#rxGsZs zUGX2Q+W7G1%^MP^*MUGJ<#?m|++-6?2IWt2DRd4R73C7gA9%lLUm3F0Dr+sebVXJ5 z{EdlNyDH`~)e9=Bi2T<5WwAO>synJERCjj7M^e_cA|?B+HM0p7G7$;(uYh`L6J*>-IAQ})iKX>tvUIb+;b{*A+u!}*`vCd zOGfazHpS{zkAZp|~=bXc>_H*Rk|H^sg{xgE(l^E`OwHag~A zZcG?>DqnrDeC}~t?QmY>^TGW)!28HsVUIfynSRbjt173~#E}`U>VXUKqoboOj{}Bx zWMpKF^)WUCl7^Ek4#RWE(;-#`Y^B+2dls@@dV4j0dRRHR>^dsC_M%b`)sk1$;aQTl zV3z$VJ-N(Z;Ic_V<<@HD;NWnN!~`VcEF4i8R%;z9dOF puY%5+sFbYew^nnB5bNA;kedq)h`KlB>RUe&7&BW_j>*}`{{q8TvwQ#m literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/keepassxc_96x96.png b/keepassxc-browser/icons/keepassxc_96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..874a98c5868f7f305f52e50bdb7ed23e92b74248 GIT binary patch literal 9678 zcmZWv1z1(zvfqbpDG3ST(A`LPrviuWknTg*K>?+u8w8|FP$Z>O6zMLd8>IVf|M!0P zzW2TToegL2HGB4~nOSRoGjk%JYbfGkJ;4G109RQ_P7C~R{`bT{1ONU`_YndBBprJl zeYn25nuwLFGpB{MtECO6ud^FC4gg}3zHSy)jy7-_OB-8z7jfueOFNXt-dY^0C!o%) z?j~zvXRqY%VWaJ@p=0ImXeDe7m6X5|^A!OZINQK2XndWWTs%d5#i9T36#>8hz0C!s z`G*AVC=S(Ee@-Lo>S048z$w7V4VA#65%aKqDWWB(@b8DgD{-hD9PTE<#pUDU!|B7v z>FQz2#Um^%%*D;i#mmb9QgC?sxxg)aIb1yH{<8QN4>=o8D-U}&xV@_j&0n4tmablK zaVQiVr};N?xc$rja(D6k_w+$UaQz+O;^E}x`rqW>wEiQ@|DpD^aQlD6Hoo>R<@NtV zZ)NXh!Rg?}_4oGwqqXn?b@cB^{vXEwp#~}bCCXpHM3kK^Y;DwRTx{WX;!qx5p?`$@ z?}(ng_5U6K#TJqEu(5!iI*CL7>e1fC(bLMp&E~H*|9Sjh@``|5J=I;UZ9uYr zZi6rW=N@>;_18LF|27Y3XRiMk8ocS0$uB)DFA@HvX_;8?y03HL!&G& zE65`(D9FLf$pZk)30?_5*}5$#`^_kzm6+)0Z;IUK__d>>dF?00GFiH9ZVuAsHs&ux zm8-wOUi|(&9omkl@X(D?8tm=OX#ChFvFu#Wa3dC!`*YV%^5^FGNg(w{g*p`t*HbA@ zvym=HyOl)qid}FK0h^$Rdq1%W)uZrN6ZJLd>@QnAv+8&9Zl>o5l}#Y3(MRb84yeCa zeytcv3;5|Z8V&Xkc5QZXs&g_2y6znFwr6B>p2QCt(u+Z+@GKOYBUS|}tv_dfY^Aj2 zY$?|{uxk4to{^W8GQ+eKt&t7{Q>yU|qDVxLrOdve;CfwGpwU*6EZH5k#>!h!Sy-!< ziGylfP_1(Ip(lAuncQIN$Nj^8MedXH)QX0i{Ow+DiR*kn^r-oW;~*!pULrf+h>Adg zkaY|N3Hjw}hhf=|u3f!eu;|0ib&^xDG9C`y#3wyfWyGy{p&VEy4I|C^2L?8Iem7%W3~aUoQ`m3tz$K08rexp=00bZZo{#~iGaUe+0hHyWb$qk;g96~j ziW!?VI}+E64qg>!!Kz=@XFRN#f;&(W5jnKvgd~YL$h%@V$eyW+`op&g-R#-7wYHmX zsh{|y7(*F)tSksIX6X@0v_zsPgui?0sD?b8h8_(*8mv-mxV~$>(4D*=8d~(9 z$uJ3)Sa>5Z0Wvj)u+9OB#H0#V-YV$abhB^va3T4)vK;x)la6m^=&y8;Dbbe zi@Ojdo}(u|OcJysc7!BEiAHrL(Xt6cAF?8$vaL=X-){mQ z>u3JX^Ix0`!IRI+$H$04xo!h~?S)R;V;;kRj)q1UaB=WsZ@wWO9Vs+y`S8*8-94~* zi;p0EMX})^?0LH#rHj=gn}EdAmFLdlQv5 z%!W5(0+jK!roE1weR%z=bYh~tm!g&BUis^MT4g$J7YB=F;sNJJpzBOroop%=j@s#C9P=X5fF4rc zLvnpqBr$+mhj_hEKtN!rxmn~e_SsVD-b}6R>}UI=Xipa-HPf%IXAWFX{W8>gi8`gHN(FKF#iRBEg28PH~@_m-K7CkU?mT zUr(Lgrox^YM4>Snu#@ceOPupSq@I$K*D^;HC=|Zn+iWE_Ahg78yMm%rpdXo4>h4CI zpP%<_Y;1hv3ffj33%Xd;Q^qLkAw1`bRLj0|KZ@s{ABz@;q#s{jJqpS7nt*dEBTJpz zfAse8(JmP;!^OqTur?4Z(PGJ}-sR9o!Ng|hz+RzjVecP~B|ggw!x6YI)Edg$I4N z@czz5RHOs0{_usVsnmnrU2PqhfIO6d$f^=|Hp8=S;%l#Jp@>PFH>}pyZg^@@@@`A`?Wm>Ol!~26-pSQzs8IKHN74IZ< zvFkzC$l=W4x^L&>l43zBJO#8Y7goss@IZpSQz4lWAiRI~M7Xv}}E(RKB%&Y+eU8ahz7ciTnU_C7u)M$RngY;wnr zKl7~|G*8xhbQ4F#mr%ty+#7h5^`fnjm21NHO!lHDH}$CaZAqXk-|HkSj1qjaR8zFn;B)*rmz9yP zsW28Z77ba+N|##qubX9+r&H{Kky zly(35s0V}j0b)Q$P<>#H0)o8bH5kuYO>1oT=jzAK_vbl;=Z7h|hkIP(S_izpo+Yz) zNV8xSC$(864xc{yuKk|R1Sc-%UDP0U*YT%2(QVfoGs_s#CACiB28p8%hsd_9ke6-YNs5Qw-p2*@j9+|b{ra}ck6@p9nA`bD_(Yz+#ZYse+dZT;t`TPP7smi zrz*5%)S%ECyvh9ay@!P^HE#6ETCh>tyZvkQDQ>&AlPGq*KKp?pwO<&x56!lkx-uZn z1~_|3dIM3?AxqPA5n7F1dkA&=wt`~+0(2U&%T1*?@IYhM%B zB@RRx?{-%B)QHI~GSwL8!5w7s+c%Z6+S*#Q4m2RP_fK9tqNP&T(F;T>y_o`zN%CTF_KUp}?ORe{l47yOipr zEykBIY;eg5I@_7-S@(d=IDL5ns^MSoTMDFyQz44{>LoLE$l<7 zZ=MG03ugU@>R&CR30sKUYnu{gR_LILDk#+`8Lzb&BB^`%1z!cVj{U)!_ zHG9q|71f>P=z7I*?m_sJG8`ZKUA7b-?^EDVSE(;8Dk@sVY*{BH5S)k`M`boqp7hdgt;AJ=h3W#AEZlHhOBN&U zA_%!}xFML{Ug6~nqAsE~tFhV0PD^CWvckgdxzSN+Pg$*JbzY*#pD^D6@WHyhQgC&j zou1;iEK0l)ps5JX6>ZEyrX=hw&|)T_(Y(FS;}!}IoZUoY>W`<8^k2;*P(c~6Tt_1d z_Bz^ZO~>*QqCCf?5X5ho7kB0{4L6AO6NKmj9Gq!Gzubh@ymqHp>exy7g|l;o%JQg1 zIZ5-HlhcN8evTcs{UN*RE(z?w7((>_)Ue1&efpb~?0bK1XwW>I%!WWhm#OCIgf7RDp=n6R%70#e zT}}y}Y%qGn@LIJv9$LozU}IKuzo7@K@9&rYc=;M+hh!(? zJ+xu-J$G_SIZ?+3L_5^+Z}|E7OPeZRk}#8RF!iI+*D>Q}qPsJY#ug3o9Udg(nF)0q z82iLuy7gC0&}We*YtJb~-`PG4goONo1v{N$2sBEks%?l-w!r10ilMDtzcUx#+Xn@G z{eA3f{%O`Jk=~Eo%4oz*VSqLgQ}>T`#R9RaBKMl4$x-Cr3`$e;QHqVh7sDzN z>v&TW3%jW^6Og$aONyY&f>Jm>s!ys(wus`G;VbrENygmUYO*}LRxC;m%GNQbb>EbL z51;9qxV@@ZvQ;qhofaAsR1)PlNTM-6Dac&0DnUk^cr$dA6P5JzNI9(iM`B{gVvUK_ zJ`SnI4520FoU#*VCP2{H-pi$tsF5`iw{-{<6TmW?s5!#kwKO*~7bS0OApaPcYJq&G zf1j!40OnL>)zyrgX{v%aR&iVQbg{KZrTQc`BG}P3LRKGW!#e8Ud5QfdvKL2%WftNPYFa~rfkLcOmf~p|zQ;31jxwR8QpP^y;pxd2RhAc%t3V^sRGMnQ`sd`RpXsV? zH2@CGEcmfGU%*YzoI?9}@y(~@rlc$hGhdv_C5=r?gz?!9Gbd|(6RuH&AhjlIfmSfq z(|cq2hKWB_TIlhIq3U4nB!pC;%V$?+S1EDiy8cz^gBU*P^UopY(XG*xVfZpEMVx8a%$6)UDyU=w0wUuA zEzBPVHcu8U{7XG>@zv1Cu%;=zS{4VWxY7T_cwC{RW6-`&CXDWVwIIA8tYk}AaAaB= zZsouE&FS6HgAGrPYuW7b!Zj_Uvb42N3%VoaI=&I_dU z!Ku$03{6*h(n$QN27e-PisU7j`1+;O^omq;Sk4}+pC-&dNH2}F8nl<=s6LO2d2t%} z>;>#`W7qNeeZ`*mE9=mCEYdLOnX!hdSEk9@Zo|Xt=6pXsqpj2dt=f0ZgAcu*n?f7O%KVQRK3anqs6B%Ds8w>s5tXu6iOY_fsR##`kOgF1`ZaIdjK8|2Rt{R#e z4@BaX!EhUvXH7vGyf#foj&}IUi1K|~%r-=iaVI;BK?J%rxoYSo97x(iuOt(@E70h0b*}W4UPc&7|hp!{UWA@$&`xFlvNX9SQ?SS@J_(<8Lk<0yb%f5sn749{UytC*|1;P-E3=~@P*zek0aoUPS8I(QlX ziX`io-1q)m@lzrK4KWL&RF;B0;Urd1Guoh3vL|h&r+KmyhpB$Xh-lCgy?PgW0hvSy>f{Wi*g5{JXIt zRq%0q88;wle0iOSdsuig!h(#Bjt*qEQ1)Jh(bvgTO^%Dh857Ign}K6Oi1e-Ik;&ox zySyAR7LGK`X{!^Nl;~XSX+;GEbFzqp0HnU+_5s`PKZP|NGK)&tgsp}udItkl+&dRp)sDHeN;LC`aT3-H%+s&OgXpPk|3Nm}Ji{T+rq9=?5 zi%@|Qc@ao=QsGTnh9&`42A{r#f4IeB8n~&3<9#f4d3~D_fB$T5#lb+(&$ZO(XZD7$ zC=@`LHN%zjGBahM2})}VFXPtDxNj7d0Xi_Gf*_w;Osq1$BM^cAYF=+ao;f8oB{UF5 z_bz0n1_urJ+@zkfp^59 zCS2=H!;qbO4RfIRDEH^kP>48n{4Q9LLR%3-Oa!8E1Fs`2dR}#!Zw(~SK}n(?pW?`4 z^olz^@TFjIn3yE~k;q#teHo~Sw)FKV;=XG%hrfzxC=vIQsV!6F^M$YHC!c5D(|~oG zcuHX?m|V+%%-)@q^U4+yj~TrNUIn*H!oeb&1V6vd#7_?+SlWca*9eY7<}IvmCXYZ- zmn0rC&uh@{l{K~_8Pc3>)SvAhRdT*0Fqf5;9n883GXg?F(e*JH+69OVMf1GB9|OWyAqY^{znCKV6Gr7(e{ zLHhH9#foqlT0yYviMb+fEnY|36WFVa?5jBb`DkWlrl&3F=CVw?L}q}Ge!biIY^MIB)Bkz3Q`X^z2=1 zXJ_XK$f@z?CdJRI++g$*UyF9b01>p6fweX3k;4ln>X2LaT$Q3%%yrSO>igt2)I2OT=$g|HRIlZ~lX41$uZ}Bk-#XwgL^0r8;jDiv@xLR6vP0Y^PgTPiF>n@itlD|d7{+rTK!V&i%rwmu+R%QZi z{%5nwBk%44;xlV~{QTs+c6cDu(^#DGUY&Ni#|vZbq%EG4n`<)X_mrn?ZEY*sn&LK> zclR>`0|TY_zwH608b;f)-R59gIV&-0pNtOc&H(>1lr5kSw_86?qa@OTY`Cn9<^DK6 z#2AAX>-rrxnE#E*c&_yE6_hu8A5wp#-3r-}7E-ea{I4>8)et zmsETx7(3@6TVT?XtYvt_Uj)upt0^%P#s+Fo)|R|(WKfe{TpnqVXY`kWwhmReR`7jA zDAN`B1LAXfWNP;wVTf0^w>xP1O>NOG?wFZslNRVt$p^8gPoL&tpddj2(S-d#RhcFu z)nR0A(5NrLe#z+Qi;6{;Y29jLmQAH}WEJ``!=}Uu(Rp8H@lLujDQ_dCU>SSX&b*_9 z;~Dv-jf2b+dNqdrS45 zU0u2UzPuT}Jw|4=_Y4R&(g^3YcKyk{xj+=Fun1;o-QC?_MRx;kWRzvNr-MtItTVrB zpXMXZ;~Q~Ru!%`}tMcpHmML;1j|WenVdd!(bFoi>Iw-);rJG!#eMv)8zdwIc7~~hm zyqVe?ZVo??Osm+p#eM-D`u^?)S@N>;(dE{b-O=sUNg7VKFZQf2pAGIji3|d5r4rv# zp8tseTa=}Q@6r3Rsw$4jkr5hgmB++oTG5ttjt+tTl^;7gCtF?V!w#V3ui>WAXuRNEsRf;I13YZn+sRazGroKl#W@9dbQ)`Bz zP&>xLtrpGRcWJTkr~XQSBMM>?2r*VPV@3yim_;QZS@aOeG(a|cbKZ?sm~Q!!KI^Eme$yN*Iw^<_eX#g9JW%mFx!p`< z=f#IuVzRsd-6l#U9g>%`NEN@OjMg2#6s>cO8jcpFx~I#4SO-huxQA$P+B6^*{dMO` zI5sIKd4xMsN4xnH=Npe&ViaJOM&i-ht4keC^kcuvUvDOVWIfYMChAd?qRGWPsl7y% zAQ9K>TP5X5q1;S3B`(;e`SFoB!y*#eXqf>;DA!?>%>H2e?&4eN^iI(KF4U>T`I6Fk3|?>0^BeZUB5ooCK%An!hRD+W7!o{K#a5-h(2> zTB?}mhT2giQ|^j9Qqz7nVFbT%TvX%Ry(y9aZZdwy%;J7a9>0hCySn8=O(XVHu&IMv zlB_b695PEY`#j?K{{DXC(@zPChtc@po}bymNn~J`kBpq0eA4UA#QF#Jn^dvGqBe`A zAX}7^Q~$3iXJ=>iDJdyqJChZXZk=Lz!PoYyU`2`)4B=OSZSL*MPp{)CzwawsU3tOi zoltSv4S3TzA{z-BV^hhpKqCJB768xw;MkW{j5>aP8_p`2g-ace4z@($t9`MbD=MPFPB%Fs(KBCL zMadHvL5&q2qg|qL3?i{55Zb@){M$;ltW77t3hx3TXgcZGEv_-9ecRq+$yi5qDT(p~ zugw+$sUr5F;ixFAzb*5*e_G}qQ%x8}rZs8&0s{H@`4I4xE)5hU(WoSSBSwTTz<>Cf)Gn=ok(Sl3?1eIakzwAIH32p+4x?fKrGttl+?^KHEB!vA; z0xl4Qj1UBVB+|nSs&qjR&jZ3(u>B>UYQr!TN&iBHArTpPOIhcYQ{~jn4ObsORbwm! z!-X1ehT8i1W;~6fu4F6&MqiVDAU;NVL|CP^HU&b&`YX0K#I88mutYp|%@hMrJIu~H zH_oE7$i&GN#rGkYwUSm$5TKxcXR_ILP>YRtL;~rhp`%bLr8dyi=Cr1Y$#P@hm1j&V u7|0A`N~qccqV}w=`R-#RS6?F@u$iSMd$ju7+5Y|vOIcn+u3E Date: Wed, 10 Apr 2019 07:38:25 -0500 Subject: [PATCH 07/12] Bug for selectors with special characters #429 --- .../content/keepassxc-browser.js | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js index 7eb916d..60a4a47 100755 --- a/keepassxc-browser/content/keepassxc-browser.js +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -151,6 +151,25 @@ kpxcForm.onSubmit = function() { var kpxcFields = {}; kpxcFields.inputQueryPattern = 'input[type=\'text\'], input[type=\'email\'], input[type=\'password\'], input[type=\'tel\'], input[type=\'number\'], input:not([type])'; + +// copied from Sizzle.js +kpxcFields.rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g; +kpxcFields.fcssescape = function(ch, asCodePoint) { + if (asCodePoint) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === "\0") { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }; + // Unique number as new IDs for input fields kpxcFields.uniqueNumber = 342845638; // Objects with combination of username + password fields @@ -175,9 +194,7 @@ kpxcFields.setUniqueId = function(field) { }; kpxcFields.prepareId = function(id) { - return id.replace(/[:#.,\[\]\(\)' "]/g, function(m) { - return '\\' + m; - }); + return (id + "").replace(kpxcFields.rcssescape, kpxcFields.fcssescape); }; /** From ce2a6a29436a4d10fba43a3805f4c7cb6ff24514 Mon Sep 17 00:00:00 2001 From: dxdc Date: Wed, 10 Apr 2019 09:48:53 -0500 Subject: [PATCH 08/12] Code formatting/styling --- .../content/keepassxc-browser.js | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js index 60a4a47..7473c50 100755 --- a/keepassxc-browser/content/keepassxc-browser.js +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -155,20 +155,19 @@ kpxcFields.inputQueryPattern = 'input[type=\'text\'], input[type=\'email\'], inp // copied from Sizzle.js kpxcFields.rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g; kpxcFields.fcssescape = function(ch, asCodePoint) { - if (asCodePoint) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if (ch === "\0") { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + if (asCodePoint) { + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === '\0') { + return '\uFFFD'; } - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }; + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + '\\' + ch.charCodeAt(ch.length - 1).toString(16) + ' '; + } + + // Other potentially-special ASCII characters get backslash-escaped + return '\\' + ch; +}; // Unique number as new IDs for input fields kpxcFields.uniqueNumber = 342845638; @@ -194,7 +193,7 @@ kpxcFields.setUniqueId = function(field) { }; kpxcFields.prepareId = function(id) { - return (id + "").replace(kpxcFields.rcssescape, kpxcFields.fcssescape); + return (id + '').replace(kpxcFields.rcssescape, kpxcFields.fcssescape); }; /** From e21c45b71d16cf54b13565712cc2b19b273196f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Wed, 17 Apr 2019 21:12:30 +0300 Subject: [PATCH 09/12] Add HiDPI toolbar icon in Chrome (#471) --- keepassxc-browser/background/browserAction.js | 12 +++---- keepassxc-browser/background/event.js | 2 +- keepassxc-browser/background/keepass.js | 13 ++++---- keepassxc-browser/content/autocomplete.js | 26 +++++++-------- keepassxc-browser/content/define.js | 4 +-- .../content/keepassxc-browser.js | 30 ++++++++++-------- keepassxc-browser/content/pwgen.js | 7 ++-- keepassxc-browser/content/ui.js | 19 ++++++----- keepassxc-browser/global.js | 10 +++--- .../icons/19x19/icon_bang_19x19.png | Bin 2049 -> 0 bytes .../icons/19x19/icon_cross_19x19.png | Bin 2030 -> 0 bytes .../icons/19x19/icon_new_bang_19x19.png | Bin 1994 -> 0 bytes .../icons/19x19/icon_new_cross_19x19.png | Bin 1996 -> 0 bytes .../icons/19x19/icon_new_normal_19x19.png | Bin 2045 -> 0 bytes .../19x19/icon_new_questionmark_19x19.png | Bin 1986 -> 0 bytes .../icons/19x19/icon_normal_19x19.png | Bin 1967 -> 0 bytes .../icons/19x19/icon_questionmark_19x19.png | Bin 2041 -> 0 bytes .../icon_remember_red_background_19x19.png | Bin 1064 -> 0 bytes .../19x19/icon_remember_red_lock_19x19.png | Bin 1080 -> 0 bytes keepassxc-browser/icons/toolbar/icon_bang.png | Bin 0 -> 3773 bytes .../icons/toolbar/icon_cross.png | Bin 0 -> 3743 bytes .../icons/toolbar/icon_new_bang.png | Bin 0 -> 3833 bytes .../icons/toolbar/icon_new_cross.png | Bin 0 -> 3848 bytes .../icons/toolbar/icon_new_normal.png | Bin 0 -> 3929 bytes .../icons/toolbar/icon_new_questionmark.png | Bin 0 -> 3956 bytes .../icons/toolbar/icon_normal.png | Bin 0 -> 3853 bytes .../icons/toolbar/icon_questionmark.png | Bin 0 -> 3911 bytes .../toolbar/icon_remember_red_background.png | Bin 0 -> 1878 bytes .../icons/toolbar/icon_remember_red_lock.png | Bin 0 -> 1847 bytes keepassxc-browser/options/options.js | 12 +++---- keepassxc-browser/popups/popup.js | 2 +- keepassxc-browser/popups/popup_httpauth.js | 2 +- keepassxc-browser/popups/popup_remember.js | 8 ++--- keepassxc-browser/translate.js | 4 +-- 34 files changed, 75 insertions(+), 76 deletions(-) delete mode 100644 keepassxc-browser/icons/19x19/icon_bang_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_cross_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_new_bang_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_new_cross_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_new_normal_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_new_questionmark_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_normal_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_questionmark_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_remember_red_background_19x19.png delete mode 100644 keepassxc-browser/icons/19x19/icon_remember_red_lock_19x19.png create mode 100644 keepassxc-browser/icons/toolbar/icon_bang.png create mode 100644 keepassxc-browser/icons/toolbar/icon_cross.png create mode 100644 keepassxc-browser/icons/toolbar/icon_new_bang.png create mode 100644 keepassxc-browser/icons/toolbar/icon_new_cross.png create mode 100644 keepassxc-browser/icons/toolbar/icon_new_normal.png create mode 100644 keepassxc-browser/icons/toolbar/icon_new_questionmark.png create mode 100644 keepassxc-browser/icons/toolbar/icon_normal.png create mode 100644 keepassxc-browser/icons/toolbar/icon_questionmark.png create mode 100644 keepassxc-browser/icons/toolbar/icon_remember_red_background.png create mode 100644 keepassxc-browser/icons/toolbar/icon_remember_red_lock.png diff --git a/keepassxc-browser/background/browserAction.js b/keepassxc-browser/background/browserAction.js index 4f8e7ac..ca42b5d 100755 --- a/keepassxc-browser/background/browserAction.js +++ b/keepassxc-browser/background/browserAction.js @@ -21,7 +21,7 @@ browserAction.show = function(callback, tab) { browser.browserAction.setIcon({ tabId: tab.id, - path: '/icons/19x19/' + browserAction.generateIconName(data.iconType, data.icon) + path: '/icons/toolbar/' + browserAction.generateIconName(data.iconType, data.icon) }); if (data.popup) { @@ -65,7 +65,7 @@ browserAction.update = function(interval) { browser.browserAction.setIcon({ tabId: page.currentTabId, - path: '/icons/19x19/' + browserAction.generateIconName(null, data.intervalIcon.icons[data.intervalIcon.index]) + path: '/icons/toolbar/' + browserAction.generateIconName(null, data.intervalIcon.icons[data.intervalIcon.index]) }); } }; @@ -193,7 +193,7 @@ browserAction.removeRememberPopup = function(callback, tab, removeImmediately) { const currentMS = Date.now(); if (removeImmediately || (data.visibleForPageUpdates <= 0 && data.redirectOffset > 0)) { browserAction.stackPop(tab.id); - browserAction.show(null, { 'id': tab.id } ); + browserAction.show(null, { 'id': tab.id }); page.clearCredentials(tab.id); } else if (!isNaN(data.visibleForPageUpdates) && data.redirectOffset > 0 && currentMS >= data.redirectOffset) { data.visibleForPageUpdates -= 1; @@ -233,9 +233,9 @@ browserAction.setRememberPopup = function(tabId, username, password, url, userna index: 0, counter: 0, max: 2, - icons: ['icon_remember_red_background_19x19.png', 'icon_remember_red_lock_19x19.png'] + icons: [ 'icon_remember_red_background.png', 'icon_remember_red_lock.png' ] }, - icon: 'icon_remember_red_background_19x19.png', + icon: 'icon_remember_red_background.png', popup: 'popup_remember.html' }; @@ -301,7 +301,7 @@ browserAction.generateIconName = function(iconType, icon) { let name = 'icon_'; name += (keepass.keePassXCUpdateAvailable()) ? 'new_' : ''; name += (!iconType || iconType === 'normal') ? 'normal' : iconType; - name += '_19x19.png'; + name += '.png'; return name; }; diff --git a/keepassxc-browser/background/event.js b/keepassxc-browser/background/event.js index 17b91de..14b88e2 100755 --- a/keepassxc-browser/background/event.js +++ b/keepassxc-browser/background/event.js @@ -241,7 +241,7 @@ kpxcEvent.onLoginPopup = function(callback, tab, logins) { kpxcEvent.initHttpAuth = function(callback) { httpAuth.init(); callback(); -} +}; kpxcEvent.onHTTPAuthPopup = function(callback, tab, data) { const stackData = { diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index c49e6c8..1967a46 100755 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -57,7 +57,7 @@ const kpErrors = { NO_URL_PROVIDED: 14, NO_LOGINS_FOUND: 15, - errorMessages : { + errorMessages: { 0: { msg: tr('errorMessageUnknown') }, 1: { msg: tr('errorMessageDatabaseNotOpened') }, 2: { msg: tr('errorMessageDatabaseHash') }, @@ -197,8 +197,8 @@ keepass.updateCredentials = function(callback, tab, entryId, username, password, }; keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallback, triggerUnlock = false, httpAuth = false) { - keepass.testAssociation((response) => { - if (!response) { + keepass.testAssociation((taResponse) => { + if (!taResponse) { browserAction.showDefault(null, tab); if (forceCallback) { callback([]); @@ -569,7 +569,7 @@ keepass.getDatabaseHash = function(callback, tab, enableTimeout = false, trigger keepass.setcurrentKeePassXCVersion(parsed.version); keepass.databaseHash = parsed.hash || ''; - if (oldDatabaseHash && oldDatabaseHash != keepass.databaseHash) { + if (oldDatabaseHash && oldDatabaseHash !== keepass.databaseHash) { keepass.associated.value = false; keepass.associated.hash = null; } @@ -933,7 +933,7 @@ keepass.checkForNewKeePassXCVersion = function() { } if (version !== -1) { - browser.storage.local.set({'latestKeePassXC': keepass.latestKeePassXC}); + browser.storage.local.set({ 'latestKeePassXC': keepass.latestKeePassXC }); } }; @@ -944,8 +944,7 @@ keepass.checkForNewKeePassXCVersion = function() { try { xhr.open('GET', keepass.latestVersionUrl, true); xhr.send(); - } - catch (ex) { + } catch (ex) { console.log(ex); } keepass.latestKeePassXC.lastChecked = new Date().valueOf(); diff --git a/keepassxc-browser/content/autocomplete.js b/keepassxc-browser/content/autocomplete.js index a91b63c..f450c3d 100644 --- a/keepassxc-browser/content/autocomplete.js +++ b/keepassxc-browser/content/autocomplete.js @@ -22,14 +22,14 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { if (showListInstantly) { showList(input); - } + } - function showList(input) { + function showList(inputField) { closeList(); const div = kpxcUI.createElement('div', 'kpxcAutocomplete-items', { 'id': 'kpxcAutocomplete-list' }); // Element position - const rect = input.getBoundingClientRect(); + const rect = inputField.getBoundingClientRect(); div.style.top = String((rect.top + document.body.scrollTop) + input.offsetHeight) + 'px'; div.style.left = String((rect.left + document.body.scrollLeft)) + 'px'; div.style.minWidth = String(input.offsetWidth) + 'px'; @@ -48,10 +48,10 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { // Save index for combination.loginId const index = Array.prototype.indexOf.call(e.currentTarget.parentElement.childNodes, e.currentTarget); - input.value = this.getElementsByTagName('input')[0].value; - fillPassword(input.value, index); + inputField.value = this.getElementsByTagName('input')[0].value; + fillPassword(inputField.value, index); closeList(); - input.focus(); + inputField.focus(); }); // These events prevent the double hover effect if both keyboard and mouse are used @@ -71,7 +71,7 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { const items = getAllItems(); _index = 0; activateItem(items); - }; + } function activateItem(item) { if (!item || item.length === 0) { @@ -90,13 +90,13 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { if (item[_index] !== undefined) { item[_index].classList.add('kpxcAutocomplete-active'); } - }; + } function removeItem(items) { for (const item of items) { item.classList.remove('kpxcAutocomplete-active'); } - }; + } function closeList(elem) { const items = document.getElementsByClassName('kpxcAutocomplete-items'); @@ -105,7 +105,7 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { item.parentNode.removeChild(item); } } - }; + } function getAllItems() { const list = document.getElementById('kpxcAutocomplete-list'); @@ -113,7 +113,7 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { return []; } return list.getElementsByTagName('div'); - }; + } /** * Keyboard shortcuts for autocomplete menu: @@ -158,7 +158,7 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { _index = -1; showList(input); } - }; + } function fillPassword(value, index) { const fieldId = input.getAttribute('data-kpxc-id'); @@ -168,7 +168,7 @@ kpxcAutocomplete.create = function(input, showListInstantly = false) { kpxc.fillInCredentials(combination, false, false); input.setAttribute('fetched', true); - }; + } // Detect click outside autocomplete document.addEventListener('click', function(e) { diff --git a/keepassxc-browser/content/define.js b/keepassxc-browser/content/define.js index 69b0e3a..2184145 100644 --- a/keepassxc-browser/content/define.js +++ b/keepassxc-browser/content/define.js @@ -32,7 +32,7 @@ kpxcDefine.init = function() { kpxcDefine.prepareStep1(); kpxcDefine.markAllUsernameFields('#kpxcDefine-fields'); - kpxcDefine.dialog = $('#kpxcDefine-description');; + kpxcDefine.dialog = $('#kpxcDefine-description'); kpxcDefine.dialog.onmousedown = function(e) { kpxcDefine.mouseDown(e); }; @@ -205,7 +205,7 @@ kpxcDefine.markFields = function(chooser, pattern) { }; i.onfocus = function() { field.classList.add('kpxcDefine-fixed-hover-field'); - } + }; i.onblur = function() { field.classList.remove('kpxcDefine-fixed-hover-field'); }; diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js index 7473c50..713bd89 100755 --- a/keepassxc-browser/content/keepassxc-browser.js +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -5,7 +5,6 @@ var _called = {}; _called.retrieveCredentials = false; _called.clearLogins = false; _called.manualFillRequested = 'none'; -let _loginId = -1; let _singleInputEnabledForPage = false; const _maximumInputs = 100; @@ -77,14 +76,14 @@ browser.runtime.onMessage.addListener(function(req, sender) { kpxcDefine.init(); } else if (req.action === 'redetect_fields') { browser.runtime.sendMessage({ - action: 'load_settings', + action: 'load_settings' }).then((response) => { kpxc.settings = response; kpxc.initCredentialFields(true); }); } else if (req.action === 'show_password_generator') { kpxcPassword.trigger(); -} + } } }); @@ -344,7 +343,7 @@ kpxcFields.getCombination = function(givenType, fieldId) { return kpxcFields.combinations[0]; } - for (let c of kpxcFields.combinations) { + for (const c of kpxcFields.combinations) { if (c[givenType] === fieldId) { return c; } @@ -522,7 +521,7 @@ kpxcFields.prepareCombinations = function(combinations) { pwField.setAttribute('kpxcFields-onChange', true); pwField.onchange = function() { this.setAttribute('unchanged', false); - } + }; } // Initialize form-submit for remembering credentials @@ -699,7 +698,7 @@ kpxcObserverHelper.detectURLChange = function() { MutationObserver = window.MutationObserver || window.WebKitMutationObserver; // Detects DOM changes in the document -let observer = new MutationObserver(function(mutations, observer) { +const observer = new MutationObserver(function(mutations, obs) { if (document.visibilityState === 'hidden') { return; } @@ -737,7 +736,7 @@ observer.observe(document, { attributes: true, childList: true, characterData: true, - attributeFilter: ['style'] + attributeFilter: [ 'style' ] }); var kpxc = {}; @@ -750,7 +749,7 @@ kpxc.credentials = []; const initcb = function() { browser.runtime.sendMessage({ - action: 'load_settings', + action: 'load_settings' }).then((response) => { kpxc.settings = response; kpxc.initCredentialFields(); @@ -855,7 +854,7 @@ kpxc.initCredentialFields = function(forceCall) { // Get submitUrl for a single input if (!kpxc.submitUrl && kpxcFields.combinations.length === 1 && inputs.length === 1) { kpxc.submitUrl = kpxc.getFormActionUrlFromSingleInput(inputs[0]); - } + } if (kpxc.settings.autoRetrieveCredentials && _called.retrieveCredentials === false && (kpxc.url && kpxc.submitUrl)) { browser.runtime.sendMessage({ @@ -914,7 +913,7 @@ kpxc.retrieveCredentialsCallback = function(credentials, dontAutoFillIn) { }; kpxc.prepareFieldsForCredentials = function(autoFillInForSingle) { - // only one login for this site + // Only one login for this site if (autoFillInForSingle && kpxc.settings.autoFillSingleEntry && kpxc.credentials.length === 1) { let combination = null; if (!kpxc.p && !kpxc.u && kpxcFields.combinations.length > 0) { @@ -934,22 +933,25 @@ kpxc.prepareFieldsForCredentials = function(autoFillInForSingle) { if (combination) { let list = []; if (kpxc.fillInStringFields(combination.fields, kpxc.credentials[0].stringFields, list)) { - kpxcForm.destroy(false, {'password': list.list[0], 'username': list.list[1]}); + kpxcForm.destroy(false, { 'password': list.list[0], 'username': list.list[1] }); } } // Generate popup-list of usernames + descriptions browser.runtime.sendMessage({ action: 'popup_login', - args: [ [ kpxc.credentials[0].login + ' (' + kpxc.credentials[0].name + ')' ]] + args: [ [ kpxc.credentials[0].login + ' (' + kpxc.credentials[0].name + ')' ] ] }); + + // Auto-submit + kpxc.p.form.submit(); } else if (kpxc.credentials.length > 1 || (kpxc.credentials.length > 0 && (!kpxc.settings.autoFillSingleEntry || !autoFillInForSingle))) { kpxc.preparePageForMultipleCredentials(kpxc.credentials); } }; kpxc.preparePageForMultipleCredentials = function(credentials) { - // add usernames + descriptions to autocomplete-list and popup-list + // Add usernames + descriptions to autocomplete-list and popup-list const usernames = []; kpxcAutocomplete.elements = []; let visibleLogin; @@ -1102,7 +1104,7 @@ kpxc.fillInFromActiveElement = function(suppressWarnings, passOnly = false) { kpxc.fillInCredentials(combination, passOnly, suppressWarnings); }; -kpxc.fillInFromActiveElementTOTPOnly = function(suppressWarnings) { +kpxc.fillInFromActiveElementTOTPOnly = function() { const el = document.activeElement; kpxcFields.setUniqueId(el); const fieldId = kpxcFields.prepareId(el.getAttribute('data-kpxc-id')); diff --git a/keepassxc-browser/content/pwgen.js b/keepassxc-browser/content/pwgen.js index dff2a0a..bcf3c1e 100644 --- a/keepassxc-browser/content/pwgen.js +++ b/keepassxc-browser/content/pwgen.js @@ -35,7 +35,7 @@ kpxcPassword.observer = new IntersectionObserver((entries) => { // Wait for possible DOM animations setTimeout(() => { - kpxcPassword.setIconPosition(kpxcPassword.icon, entry.target) + kpxcPassword.setIconPosition(kpxcPassword.icon, entry.target); }, 500); } } @@ -127,7 +127,7 @@ kpxcPassword.createDialog = function() { } return; } - kpxcPassword.created = true; + kpxcPassword.created = true; const wrapper = kpxcUI.createElement('div', 'kpxc'); const dialog = kpxcUI.createElement('div', 'kpxc kpxc-pwgen-dialog'); @@ -307,8 +307,7 @@ kpxcPassword.copyPasswordToClipboard = function() { $('.kpxc-pwgen-input').select(); try { return document.execCommand('copy'); - } - catch (err) { + } catch (err) { console.log('Could not copy password to clipboard: ' + err); } return false; diff --git a/keepassxc-browser/content/ui.js b/keepassxc-browser/content/ui.js index 7b87973..3cb1306 100644 --- a/keepassxc-browser/content/ui.js +++ b/keepassxc-browser/content/ui.js @@ -1,8 +1,7 @@ 'use strict'; // jQuery style wrapper for querySelector() -var $ = function(elem) -{ +var $ = function(elem) { return document.querySelector(elem); }; @@ -35,22 +34,22 @@ kpxcUI.createElement = function(type, classes, attributes, textContent) { // Enables dragging document.onmousemove = function(e) { if (kpxcPassword.selected === kpxcPassword.titleBar) { - const x_pos = e.clientX - kpxcPassword.diffX; - const y_pos = e.clientY - kpxcPassword.diffY; + const xPos = e.clientX - kpxcPassword.diffX; + const yPos = e.clientY - kpxcPassword.diffY; if (kpxcPassword.selected !== null) { - kpxcPassword.dialog.style.left = x_pos + 'px'; - kpxcPassword.dialog.style.top = y_pos + 'px'; + kpxcPassword.dialog.style.left = xPos + 'px'; + kpxcPassword.dialog.style.top = yPos + 'px'; } } if (kpxcDefine.selected === kpxcDefine.dialog) { - const x_pos = e.clientX - kpxcDefine.diffX; - const y_pos = e.clientY - kpxcDefine.diffY; + const xPos = e.clientX - kpxcDefine.diffX; + const yPos = e.clientY - kpxcDefine.diffY; if (kpxcDefine.selected !== null) { - kpxcDefine.dialog.style.left = x_pos + 'px'; - kpxcDefine.dialog.style.top = y_pos + 'px'; + kpxcDefine.dialog.style.left = xPos + 'px'; + kpxcDefine.dialog.style.top = yPos + 'px'; } } }; diff --git a/keepassxc-browser/global.js b/keepassxc-browser/global.js index 887a290..58c29f5 100755 --- a/keepassxc-browser/global.js +++ b/keepassxc-browser/global.js @@ -40,14 +40,14 @@ var matchPatternToRegExp = function(pattern) { `^${schemeSegment}://${hostSegment}/${pathSegment}$` ); - let match = matchPatternRegExp.exec(pattern); + const match = matchPatternRegExp.exec(pattern); if (!match) { - throw new TypeError('"${pattern}" is not a valid MatchPattern'); + throw new TypeError(`"${pattern}" is not a valid MatchPattern`); } - let [, scheme, host, path] = match; + let [ , scheme, host, path ] = match; if (!host) { - throw new TypeError('"${pattern}" does not have a valid host'); + throw new TypeError(`"${pattern}" does not have a valid host`); } let regex = '^'; @@ -96,4 +96,4 @@ var slashNeededForUrl = function(pattern) { function tr(key, params) { return browser.i18n.getMessage(key, params); -}; +} diff --git a/keepassxc-browser/icons/19x19/icon_bang_19x19.png b/keepassxc-browser/icons/19x19/icon_bang_19x19.png deleted file mode 100644 index 2a7e920cacaa7e6ad882a2ea90cc5577cfa0b3dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2049 zcmZWqeLT~79RJNzaa=-@iZzjkY$KelCbh8*W0r?ihM8euTiax2P3NK4kyS`Ki4sDo zBa+-Aof{Dqs*5OhnTJx8;?lX_4_xJsKe;&TCUpmBA)W9|`o`!Ph(3{*I5r;FAOAsQrzWeVs}VQdVW zj}~HJi@a#?UFk-^po5)t?COc9Pg@M_j7B&782xNu-%MXf1 zV|h%vfW!0SaAGhpWffWMXg-6^Wh!gAc>1eaG|0&(al)A(Y|#yVcF_l#2xV^&OU(hh zj96|nXe4;%wmjI7o&A8)GR+h1X)l=Oo4z;y7$sr{gw+eTpm$kJ z4Tt7yiiJjDei5tS1KMpF)^jPP^Xu%hFSlLE#xruAHEW#R?h|Lqe>pSiyN);=v9R#b z|AbCsN8g*^^27F-^)BW8$zgYpE~|7d3e|4lZxRBhx2-@U?x88pya`4jN z2?Ov#YjO#D`2e7CPPrhXh^r$2peiTgcKJC=r8y)*P@sXlTlV($!>Nhqd4E`u(k;4d zVlSjQ$ChuaQoA)?{OBn;DvyR69k$(?sUA95z~UE&p1@VR{LLh@>l00HySZy4Gj%FHCK)kHisD>^>tf$r+}YzKjK(A4(90K;E?Zq37@Jv zmy-eU7+YUWjTyM{rdW|s<7eGoJ!a=LKY=toYr-g{5JiPsV*3v=}ronVgVE7O941&P+~D9()ov z=aV$wjMjJ-kLk`SR1oV&Gm-*Lx!|T6B6s~f*`4%PThNnNpo|R+uMT97L(@;Ojm}v= z%MqXI|BOAHH~&hSnRHT2{ZU#w^f@8oou1jWDOJy-VqH3}v-EXx z?fZ2l*)oXF)&aLP8eW|6>Zl3;ElnK^xz)PU=2M5=A(xcXHQ(49OY=`r^e1jfx{#Tb zoe>^KV6MKaEv;3qsO%UxgH5{jS8GEkdD!QVyHZrDzoq;L3@XdjJ4#oJqj7%8FY7C> z%%I&!@k@SLu6rfM)+1!LCR^=c;eH5=*I<<@0e z&bI04tE)bX-<0~|epx{8^jzTRRD~;Qqz?b-y!A;OZR|ti=Dd!o@aw+~r>*VWvjzf7 zdso!5@~Gs@PU1%yoCFstaSYnq&DCsJaXy$tt<>6Y%hP#eT znNSIvCJ5$w5b>}&{Z}fR%jF8Tgb1g7XN~>T{Ge*N{vnBm$d(tLrj)bSS6)zb%~@#! z(46*6ZEbBYnW#+NMKj4F`FpLEy6Q+nR|ECS9)S7vZ7K{%w|HXp_NNyf&Ck!rV6k`m z-`3Nrnz$otsEDoDEY8IS`JVHkFn7f;VaDh{LhZ4xGN(^J$YhDn>dm@)`})$hZ{OZD zIX*7(?1@gf-0%5lFxbFtq}aM{UtxdW!5(QpRW^s&U<@=%Cggoy*b5IFJ8G`FU-a!k zWDkel1%UF)be>WK18-mcDd@T-AeK&Rx awE&6HPz1at-s@NXxruJxxU0KElm7-@qiuBn diff --git a/keepassxc-browser/icons/19x19/icon_cross_19x19.png b/keepassxc-browser/icons/19x19/icon_cross_19x19.png deleted file mode 100644 index 93caa1ca8fcec60a4ae6b261b1bef310bfe829cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmZWqdpMM78-J&?4HvPkK9iI&sYP>OoTr&E#<3ZLZ)8}>m>CSs!OSqjrx8gJuCgkT zttHwbcI1@9EGm=?>a&!V5VBU}wDm3Zy(5?1z4njiect=Nf6wpz-G}FT)4aXhv^4ZJ z007YPa3}eK`&X(3{Q`Uny=|TVz$RY~jV`8B$T%jSi)OI+p=`92D*)pFfOn7z7|bZP z7#_+F=kN%K*@mAGa1M)r@VBOzQv}ZJ2#$Nakp1s?FB&sGifPY6I2_WzOK~6pmn~+% zrQG8@5l%`#tnuQ&ca7qY@|z9iT6!=Ob# zM2N)#90ntiNYD~XG+!8wv9Pzd$CzU=SS$)ephR&zF++;tiT0`}K68-RBBqcd5OerE zxQdez%8wBf5C||1UnduH!v19EiPqBx3xQEZFcxTY%wOSPS{qvahL$n}{{XY4oG=&q z2A;_gFwl_#jLQ8FEF%W2(Rz}9Bi=xRh|f|~!f+m3MmU?y=7ozR2nY-NHI07;{5h<@ z_(9P)XCa#*<_l?j{&50ARYeXjO2lLc*s5Bto&KyA2Xcxid=?vot+~O^uK7R{qv{Q2 zy*Xf)F&k|Ljg3KJ^T6p4f@9!F$gBkbND{}{*<0l6MudB~INMm*+t{G6XbS)^xe#+< z_`oS2Si3`5UT#U<`5@#7F+Vl%rO7u$kEjw&+rfrokq$#clEa;Mgrz3YWBpqaA+?XI zeMz2=3!+9-m*R&gl*-A)tCJ$dB%V5n--`UcD!cd2o(|SRpy26b5EO&sb`Sg*dh^?l zXA4WmlA1NGXU4K{mP2)2fz{osQC;%7a>t`ZbGe0)aU-T9SNa+w=W7HF+362bsHczS z1$n>!`M*UwWES=TBbaZiy?eAT9btse>$xS$v!7yH=Y{duspNT);ljRUX{^jEv{tHz zbK3uIgq5ehBHhWNg<*K9u=6{t=LzF00mAIkjxt{o^R%()d>skpzEt-hMv1gC~0CSTKH5$YAo*5=O!veb*`IuZAOtZ@Rj7H+M9=$@jYxZfGzqhz;l~ zJSb2=c56qH&gB%xM;}H&D!%U7o>~(X5qNv?xA1FY|AF3l(`k&t+I4Y^ETO&u)7aq z8)iNzFk4S0l^rQL|26!QLsg_V^AeE>L+UYK8UuaJ`$Xm$}WQiCx~E_Y%zo#XtSV5yZs=))Nn z@RaK`GYIqe6RWOa)8Y(l+vp<}mKSiTio46l69T+?{~o4w##!FjNCto#IX^Zvp_EFc zt91=`Z)YXT>|#1tWqSY8tk!+0EGA|j)abg&0i%{Ozh zns4NIm-ZPGp~Ff|re<%1ZtdVqMN{x>#*3QOTfVmv$Ty!kP$(3S!5TN}Z)i)?Vw&HM z)#YVWp+Xw~JdHO!n;kA{>AmoNWxR9P3Yt7LF)`85*Vp%ugm_m*GiyN|Btpq#GC+jh z$m!wQ_>etwKg~gsZfEHt2WlW0t7#Cxi%K1SExeal)N5kAUH!{6lIwPLqgZkguszt1RCh@1?txEg)#zwUaxg8!)$`x5j z1Sj`CLLpXOQ*#9G;2w0_A<>_;~;2is0`Jv$BF;GR61j)U$vb-!|B} v>H0&ZV1LH!PRL^V{#P-$>b8X*S2md_DcW+j^4u;D)oz$W_AuWMynOI@sW)s z`n2RMWw(PNK2$b_a>zQgMx-{%kPJfj>^t(ayTAS8d7k&a@9VkV>pr}{H_^x29SYHh z0000bc(@Y5bGve>sen7r$Nnh*Y$UQs6amHS2!_UqLQv_PFa|;t#RcO4;JjbNrP3l9 z0$3O$g2l$dCud2wABOqPe3$M6$-lW5{d8k!E@kApaiFd#t`LqLUz zqE52;7!ek}%8LP?m2M;)wh9qMV&N1oAD9b=$AH-(><}n84gz!L(ZexB*F$TUK?@6K z3ItpX5_$UcX~bz81cw)av_hlNNR&0w+S(FCSn{LU0;Xwni>sh5yOU=C7p>76Pe^AgvH6?h|f}#!Z3s=Y6Rm5gB>AYV&PWkRgHfJ0$B9F z_(9Pa7aoHu;P6Ns&Pgm>Sw$8*l24;@8OmC&-u|o>19I}cICKUGTXlo4UG;$`QrR2i zT64fIBiGvu8ta3?V1v`a1IOS1Hl+#xHk@O*xcKmi?syo%&BfjdZEtUBjj#d$)62rk zLl*JAdd>S~7qd(eTC4?OWn$UmlskL6yRMowuqA!5rOTq2Axq1u)`=udhuDx0y4><$ z3%A0;f%_(G%1@&&x_8HTcSPexW7?+$?feJ&ht19E!ZnERZtCRBU`BLx422!f-{xI5 zs(F-DaY=P!?2Z0rLmivJ>ZeD0I+i0-EPO*Yc-DQ$%0Ce}Y(`xKIxe_R{D)~auu#rb}sB83bzefAlfW(ul5K~*r=iu2=Vp&+4nBfDmfwK zd(tm*IQYeQ{oY4=T1?m}k6+GizN(WqtFNEgie3C|blwOrSNI3~T&udwtB+pT=|3AW zSTdNZ1%A-#T#rCL0H|D3t_^RI6(az!>3f3fL6T!iO8Rk+pa6sBhS34O=Ie$W*++AE zsbqJ-&XYcjMw6f&<1OE{)MOl-tNsoWBaJ^l^U$G6g3^ONQ@u^2$z^(`<8FG9)B@;s z`xibAK?MZ2csnM~&Y^8~Fs9uo>}Egelhc{wu}iVJLz6i}lN!z(2r!%@$6x$eBi~qW zt9^DcOB-^&xtN7OU-BzWS5+8z_}8`2dFGml3D8C+J=wQU$iU?yONeDNQmIsAl78Q^ zXkTxM1Z+K*9qlUc+Z!5Ny#dX`j03rWX zjSMSluSI{|c(KkuhLx9; z%r{N1r(%8}PT{Zh0Co%q>%sGKPW0rU<0O_c-xd-SbQgcU(+^8*VbVZqVr%*QB0Dpi8>CP|4p`$PI15GV|NZ-i&Ls zn|?Y3PqRt7p+=Tu{;(I@^I&7)Tng@8pJ~76`}*#F$P|ZtM~#NG`PJ6*(ranv1)ayX zVrF9Yp@ScT6Eyz!Tl9~DkmWRI^oT4qdimK;%o)q?K`Wu5;#E+Uy{;J#VX78vcnrC0J?*EsJU zB=hhMa_@n{)ZQR500<3AP|nWI^?v)X%hijJCEOQH()#|R-sdzSUqyRx+BNZ)Vn;Wj z0BQK$s_lutbVu&3`9PS9uzoq+*lg=#{?Ims*XFLHut_5(8h41LC!9#xxw*Mf9M0Lr z796sRbI z7!WNAt`>uWGD#T(1*B4xLF(cOA|fEq#~2Zd_->Fz+tnZE-n;ky_ILN$-#+Uc_ocdP zA@?8w0MPREAkpCWr>cceho1spyZZpJg~s*^6a`Ye@eCdZOK0*TSXc>%561z(!AZiW zGh$gHbObAk%_V@djV&OW%_M*UwiF8rpU8@4d&mT=Lo%u#Ll(=xF+nFsq=N(x6L44} zI$FZ{mMg?d2;e#|9{yIjArQR|5ycX~K#DJ#$P=*8wpd%N1?Y%GI|!JOcpAxVBN?^` zV6;fY$3u`oxuv2w*e+ z;)jdI69p`~h$ryl@xCR1sxGp*u|fu&&rAOwFCguQ}L%p z%~HS8?R1Ki7naxOhVCD8Ey@V~k7DrFwFycv9Fr>EJWz@X7ukZ=QarFz8|~2J`zSLlF?3)BF4Nh%0$( znWYuu$*r2Uuf~7CTaVQD1lRPwi|whZuXGN(G*?&}BOSwxog4fmW}%kfc>2VhG@tY^ zd8qH3M+293CRyTw#-O|!-v>GcU(=%&cDo;~I^Ad0wjhvMO{Xjf4Hr#bOA?Z(5p|N? zc$d%T$Cz@BRf!(cFB0Nr=;rRUT_8-X1_@4AbX}#980q^k3-u&(4`uzGw5d2f_KC>% z?_c}-XzKX?Je>Goj;YIQ3Lj4CE2keZ*yA>hcxgBWhV=C6w{|s775OWo4EN6P6M_ay z?fK1W`Z_VBtTSb@I4@A`+7}PDXVk_<2mieE->3`Y-yszD0>WDQPX3JnitYeg+2cZJw=2 zXjCB6U9aD`@#!vP`o$+)v(aV$nqXz$^il~5bS(DHxT>^x_qeMI5iM7r5a=y0FIR

      Z`wvjnSV8yXsR0zez?fYrJCrzWK_ z0O^=Qq2N{w(%M(Kbrss$+B=N4qP7Vd_9Bej4*fL1%eK6ohN>cg+iq||v}Ww>?c1qW zjL#Mnm;%RW$lAKPiHQjls}2BYjoW*Z6JnBguMh>gX|}(4WYZG`pWeRe{Thhypn~Vc zM8((b~sJ-lhNtZQYDgAqGH5nOGw;VfgU$~&q49)7tSDD$j69;DE zP0IYTEkgqXbBl$#Ya`R5Tp=|+%+R=U#x50|D=){8F%H_UvTL7gqbDTn!cFSDX3NV{ z&{MZ6hnYEU<9)TS9xW{`Eqd%Ly?iD$#kxb?qHM>Gtb^&9&zmFDP?>I*E(a@;xHfyv z-j6Fj39HxM-QBH|mzUQaSA5$<)9er#L+PJ8dw`d_;s^k99$U*tn%ZAa|Fr+;+oj$A zO1W6o(6Evql}e2aPM&-&z|{x1W76m6N;@rGGMx}W z>)pF|V}Gswq4c5Yo$)xm<0SQ6n6fn5iCT^q8G$weMs^1M zcg2&Dq@?);lO(b1?P_vqbKAA(t>M`kMx^@|*?M6^ouNaV46!)>=!~+(_SoSI-77kd WCQk#qb*f8Mm$2tSDyh;nJmvrMR#!9t diff --git a/keepassxc-browser/icons/19x19/icon_new_normal_19x19.png b/keepassxc-browser/icons/19x19/icon_new_normal_19x19.png deleted file mode 100644 index 74c1335e2903f0980d349f1e8e84c37803f1dd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcmZWqdpw(G8-A&CYfLpx)h{xvw347yG6|KWgr<#iw5W)LAcrME&@aqsAFa09>U^1F zRcqx_WzI{Pb+lTCszX~;O(~zl9NVdwy-`2ge*5EjpZC7+>$%?hzOVcFz3JqW&gyFV zY5)MJ6J78g;J#P3RFuFck8Jw{0OUQGUK9a^bOKG|u;A1XPB0xVWO2bb0N6VSxl~#N zT>uTHhcek1*so2^Feozw1M{^ZAxT^uJ&frR$D@13o%Eu`MbJCR zRLF{C^U*>KY>O8SzRTPQ7<3CFh`_)oBr+7o;nATsa2q%hhE;>w^FkPC5B%}%!=QzM zg$V>)Gy)M569bR2hI4qK2ulOZk_&^EgIzHlQ!K|pP z(L>4Zy6p}_|H(NB*JiFo)uey-b7qxEU$5A#nO!?5D%}vqk6KvNb1lI{a zM;|j?{3S@NdQPYt?8VT45AS)HVZN4JBGt3HQueU?iZdae9lNx?rNu^Q^dLWNrAdKcd%Yh~mTJg(@*>O5{)DL269 z`-h+8a-7za^#@u_9+|Q;e}28HAchpK>g!+cz^uP```ZDhnI&)E$|mIv-u>7$1Mk() zSGQkX(grWID%Zu24**JevL!c#sF(zRT|W`=$Gq$^Gp~^%4G7xpqfff*q76dZNws6R zH@IlU{g;yz!&#;Ela9uPPUQ56Pxe(kFq$tqS~zE#wJW^* zc+!zlBGKTB=wh^5;M0+)AG+Al(P_yuM~pv37H>{SjyC@{c6rjs4s8rTU70DC5ZZ;P z@9xC)RvjKfUTD8g-)G-#ebG;OO2x&tytugdd^#R>i}_O3No6v3cfjCGgFoB>i^X~# zhTKlkocyvU8L0~NMg>gUUCccrUN#kpU-RAg`Qvt=uc4-fe*4*UY#T)?blGcMuuIM{ zut3r=?)yPHQ$1KeZX4ug;5J;#!lF>In@IBSGYXdz>|vnysgG^}^UI}A&v zU(|L!n_jVR%h|Yl)kcn#ZBE#f_SbE^ugF{084!(4@LpUzUi^(5fGjy;g+@10YRY(< zD9sk%YG3JTiK)i?)LOojJ(lK$1e~zv;zQ+MQtYm|mSABi$X4C+CR*vw)9%AH?$76~ z7Pzyzwaz9iWXc23k`zS34~IpgQg!!Ul_4v)Fx=U19)(!7>7E~RF<#2J#r)hgVS=l6rc_v6@?VPV~a& z#1OBV_SIrap#l!4Vp{;Yi8!ZcY}B{emZ(Bj%wMkqXc*XS7GfvV zGF*wNd*3ndY59F+WhGn8I1ry7dLc8jb2g`D(bl)#N1cijWVHc5eC@K zKJ6$tUl;^q_?Twlv#CczPJV9$}8xtu3EjOM{1(|0zUOr(;6W>ZzF;aUw zeAmmosllI(`L?r5TP@W92>M-T*3VB9RG$FLf_rzHEZO_f~B~ zZ2$na;(c&L@Z6zVn>T?wo8Z_202_$(pfGNj-yt-GnFu4tFr%q3ej*Eu1AvPgpGBs` zQ@N06YAl_Bflk&nKq2%P3^dfi58=ncQsd}80yZ^J;2%U0#8Xf)P&Zd?7d{#!NThPf z5Po6;gM;Q{psT!S@LA=CLm{gWZafAW=0|{FnQSV=0p@61=`1dt z$$+Rh$3tYU|Q>1{)Og~S^oi3`E;6R z*gBp%w@8Jn9KwWR8>VfBc4Mcv#6?CuHOEr77cQ8{FpIR5Vq88p@hg~|Y@gAI;>J4Rds0BY%UESA6_dV4_do>)gD%F)r*4u%8(%RF9Q zpLIrnL9<(r=#nK&m%hNem0jK>t}^dvFSKf4RCfu>miZ_8Y;9|vjOTpjBqY7nXH^`r z_PloOj0A47xiy1T|FB9hZT7xBE%v2@NGYQW@zS@ zSw)3M2=kpCW>g^(6*&mczeQ-(?9?NBzt{H`{(P>L_&~`P1WF}J&hBaRcX0wnNOTQ< zFZ!Ux)Spp>S||Ai(LppF*vn5I=j>a^D1E=v?p(#=8|S{i#lKnSC#L!6EMxMIO4fY3KKTMPqCDw^c z&Q@1h-&fPJA;f<#+EQXH!j(G@=nP-^Oz-0DZ+f+tlN#A<5%J-bBZRC%pWsp-pMkUp z>>i(t!t>V_-gqVHjeA_{9uF&+ZK)pDkWb&RNP%d&UoU=2`{i{u4oWK=G<{?+oAOnGZ|PCk#ml=53=AS8 zB5KV`ZJaVDvaEn7JW_ClqGR}BnbUk@i5nXEm*S|yo7&0<5{cJ7GIMDgwAZ*DC?`Px z9%Z0#cY~6~q72l2#Tor6yGg4r$v8DGZg@&qvM5(Ca|`zN~O8alB;<(91U9bzxII`Bqf)SYnb1n~S`kx$S2hbo*hOr{(oM zDTq0<@`P@s>`X&D;BJ*wF$a_NT}(BTC}bhBHD#Tq3Ef$9bq@ z%5ih7E=FBTy3>=iQ3lrwf~YH=Jh-+b-nH{j!()?H*AE+IawN@9^-`()TWYwhlvplUEPb9=uq}|d zsSe@Q)^BZ|l)88tt&=sM&o;YLkGPt3%Gvg!Y|EV^j1L`c_Rh&O=c6Uj-nnV*g8Cq$ zXN1lU4s_XGCXBmc~{( z0gbeiuBq1f(%c5&nC;9XxRh0Mz?scnWeq$gOw;f+Agyox6jK;VPyZ>5K)4a5}_((e| zJ+Qn|_U$cc)Yu4V^21Echv(1gdRtz^^ry_9BJx_)92#@t_6v{~d`UhQ`AD$fxyYw; z%OznpjN;*Og})6fhnBxA%LOQhz>x==@mFmxt>;)%)r~h7hUCm@VA5%H!Kh$ruyyiF Rk%#Kni}&=$ReD6F{~wxvXWjq+ diff --git a/keepassxc-browser/icons/19x19/icon_normal_19x19.png b/keepassxc-browser/icons/19x19/icon_normal_19x19.png deleted file mode 100644 index 221b1b622b2210d8b89dd2c75b6c6ff70c13a8b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1967 zcmY*a4LFl~8-K=$I4PCnNLowB-m=Zd$i}9an3F=QnJD{sHZ%LM&Dlcb6*=DF5S50sxj#`c`HhU<>Qrv)ZsYNq?7kqZ&#i7xvu~7JokP7?%(ylf4}R0{jONo?5hVH^Mg?u!fC1ikTIbQ_T0l?Q! zE}}DepcKvkIa~n&F?CamfOA;{1l2RtHB=M;#&Ls_#o*rL-4tdrkBMU;{D_vmay&%9 z2c>kloSz_&;N=9w2VOk%Z%ktl@DC6vkAR2_4TA>=#UR`h?TL0p5G~=pVip@8LE8DT z8HxyqIH^>G$6#bK8CvFn7K%9-HyjR!adpSIyQ3fkN^)2rrOQzQ$tEMk|2RmXgem5V zq+Fo@Zsephgh^5Y0s+!V7))Ed@fMAtiR+TT6};Qq)UZjicpw9Kp5xb3V0GGT?87ZMPQ7& zU_J^1DUA6fF%*0<2^2uih#?CW_vp!xv+3M`fG|l!kUyLp7~tiG^YTKuqul@inV*zD zwDownU8~=dJJnqGwdiP<+{>W>C_xb!$-Q4R%uacgrTW8YNpGlXX6ig9zIYXKn^U)+>=RA zMu!<5cQL`EZaCU=Oku4kZrLyV=Bj6yygwP6E5MA=(Rz=G^oZ-<&#y}H_1U)d>H*D{ zrPiyz5V^H@GYu1*NVeZWv+=?;o-;@M<~^P{QS)h_RqmRC@;f6dYvJ7^t5%n_g5@-i zg++CBGDCDOdcZO5t@Ca9Z}#cmh({D zt@s5xOctVGngjsMN{tIPj;VSM0H*U~(hiDuZf4P;V22=w)?*$%DTABO`mAf{_3P5E z(-Uo8*1|gW&*-x(YtLgd8>5zvo?CG?v+-2CW9r2+^SNcH@F;=QSD+WC!gT>(g|D2gxY{5mkaU3q~! zaifu|Wb2Y*{`}Qrd;-u#@_D=kC;QyForskv8_Uv-8L>J$%&Cx5QhWmudP?uJopEEj zYiQG=&TWjVku_mRibLzlI=-TBo+f)*V&UcEH>s~fLAgx-TmNWbkVCiz%E>b1FbQ!r zj%IsisJ_*RXDWCe$6ek9X36;M@A}$d2}hY{X~iw8vj6qe01DCtrYR@c~ zSd2;aNp+OS-!*totiPzfA$2dn zFkE5Vee*ysf|XcS5Mp}NSLk*>K;92V9D^w*4}6jDMhUczO$DB(E6y#t;BO2?4{cF) zaFM4%R9~IAnitd4-Kx`Fkmb${nhz5%{@%8IY2}O5=_O4|k30KDq6UJp615%X8%`|5 z1`Q1;T1Px`+)Pb@XX5K^`T6-btGzVKH)K}Nq*a@xl1y@N*5u}zX8~I)795z%iHIFd zR8wj*b^fl^dRII?*}1T7mkHo7cd|jF(e(EA8Xn&qDCtmpX-uAshF-j~{@2-#n3Jx< zkG`>RvJS#@+Wwws@EDi>#>aYkzK)g44SS!|U2`U;#KgqZYqfqqbd0IQU{-YkM&6dC z?tgN3=-RW}2Y&naTspPt<#a0X*o!W2w+8s0<%xpHKGO@|QyHIF>D3~Y`-cptbM?({M0VkrOQ`@9By7}U5 zW?8emo2^na)7jKar&g9ZQCl}{y_%P4`dV`b>(jQ+{&>!Fe!t)M`JV6Z@_dex;pc5^ zXkiEdfH95g$%J=P?fO^`eu^0`-2kA&-@PBAZv!1VNbe;Bri z=mS!zhya2K2?^K)N32jB4cg=Jco63RIyl(D2s=rlK+2KX2_&1f6z@1ZAqiK^7fJa- z0ZPlsi4?|5iD)z&N4+PP@}vG_7f9Zx4;KQ|MnHQk4*V+|PV0k~zoBIu(LcbDj2}e_ z`GDv0MI3C52-Ld&f#t-*HF}@q--th;VZ=KrT44lQ948v`g#^*k14OhvensP-fnYxG zFMe1wfh>kNQlXe76doj^wN>N`VkKOT2-4Pa<@7tX1ejAo7xEw&w&I3AyW)dQP}>{u zeRJS0gCE)q8y^M*62Q|ThR0wRQB?;3h;%-g%#bj>NhlhH>|&31aj|p2+5>>iiTD$v z+cN^pJ3NN6@@%k3{$l(UWm%i*($@aF1(;^R)d5B6TUpYmon77SiNkAM73`_?qKfeC zl<&UNG*}BlYQ~29wKJ)M>roauk) zR6#gn;X(gqNMVov;yIXoh0&+~z>MSlX1%wf_GBNkbw(`T+gUgx`D}LU`~kTjD6&qr zjj-E#`f)^oL9)y|k`=WYt1-HD*mg0an z_+3@X8@N07tTh|%y2d11DIYGRdz_*BY8Jk}`D23Dfl-Cw6W^E6Tjeio=mA% z?NW)4e+#XN}Uiq`<&a%owImm@|FH z3%8?Tw(20uj?kzh>Z9em^-ayWO;uGB1yCq^TBdO_dZKHkE9s%shEzs5NQrLi}g`y%>R2iQ_fjwwtm+Lkh!do`}HljlIks4NZc zI@#s;lthIOJli{{uX&yFVzKDDqVZUVd#YW%qVaUn@7RO3JKER-&&pUa&rM9Ym9OXL z&%>t2@Y0ERW9j6=4G<<2++UYk@w?!bb&t;ENKU#%Cw$z#4?DO5s>AK{;C6htII6s-L&$q++ zG!~L=2U8v?+x7=Q9c%V0rqntBsw5Mf{Oxe_gH8R!FY(`8YNO;+xA^*$DdX9xcW_5c z8&Y$1ZFG?9zB-F;v27u7%;+`CoedF>rsEnId6bYt*YuHy?f$u$9CHqPAguO0pI%-b znHy)Nj(7;_#`@<%D4juS>v&V}4hl7JKCyg97&S1Ea__SBV>iD;_SR_C8XEGtFiV+^ zm?$wJO+8=y61n_TZ!NQ*2)@B(qHo(YI1=AtFlwLJw#ZufG=7#v&Z1hSFLQLsDzGH2 zQQ``%r)Cjt2ToqB%U-LO^^3USdSNFo2V1Bx=sA4@r951WO$VN^n~#&cEd0@z>+~=P zlb`QzLOQnlWMpJ;!=Bxq_pYtzGhu#Z!WtO7HJi5P>s@*m8Od3U33Okv(AXS6<#wrz zjEpp?&$?gsSuTZSl8sH!h7q5q*%$_?O$tDFr1`&E^sTOZf;i(s9?@ttzI*m`g}q7$ z$0tp9cU=q!J!CuT`Tep+|07d-mv2dH4f_9GbHs1(+i}!5!^zdPLoS!!g>A_rpAwyZr5SDTd8ieGJbsCB+! zQt&L?WzVr+|ChH3@v+r^nK8d!8!6}S%YNdfW|m#P`uo#Pm0nuivGT>$V@6Au3=Q~$ P_K!`Y_<2^7BGUf=Ih|$s diff --git a/keepassxc-browser/icons/19x19/icon_remember_red_background_19x19.png b/keepassxc-browser/icons/19x19/icon_remember_red_background_19x19.png deleted file mode 100644 index d38d5f7b3afb9231d36d0e14903c12319a51a888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmbVLO>5LZ7!FiKmlgyqRu4L)9^E99-Ry2cW8K{(cA;CBZJ>K>J|^AJCKHpXoAxB0 zEU4#t6z~23Jt(#m6a){Rdh-`Z4}vG_WOq|NlnM?cGw;mvyx;FmXX)Nl;d+5#n5ou+ z)}{O9?7J{Q|N8TTUv#@h^d4Ep9vN6MV(Koo5oiV08tNj;-Fom5%`wb`=bJs!YcDDe z4mc~raA^=xHp9%#r;+8XBLZx+=7%c#{p~vz_^!&XNNu4VHBsMR*pAWi_LAvruRF5K z&ffuZsX`S5h*%&EHo`U@oRIl9uO&lX2aYE4%DiBo494rfR zS-uTK0SY`6d7)Z_f+AHF0fO;jskPYkl&)rsZBa>O`-DUa&kqIzZcyTIyv9RWmU%(s zMX^W`#bhfaR$2^`*<6E$5-0W};^Pox8Z8@d5|yQ%jzS2ccKbwen2ZxeQ^u!O#6wQt zgCL7*h)zfs{c+<|bYgBri0`5VZ^jO-hc}y(Y3|N8lmV$X%Kg}}&=oBrQ#4 z=?mxju2Qc{nkd(`l2Fri5yDzkqGGjCX;cLRYDTW(G%gfHLlhfwO)o(Rb+J}1Rdh|# zgo;*&OWR2x15RlG diff --git a/keepassxc-browser/icons/19x19/icon_remember_red_lock_19x19.png b/keepassxc-browser/icons/19x19/icon_remember_red_lock_19x19.png deleted file mode 100644 index 37da76cd0d38a7c6be650ea31d228cf22369051f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmbVL%WKp?7!S0FE-eUJtR8eoJ&Bvlr29(f+U{<$cA>j2yMgYpdCYc0n@mimZrYQ0 zE2!rd{{lUD=utsMOGQEO;7Ly&JWD~Zu9JOK52b>EWaj(w{eItjyI#9FnYfhTIBv4C zs5aPnE`Cpsv9I><;1@eCQmsXsq)od^P zi@1Uj+X#{CGc?D|%}2grtzimGyy|#){`>QnJaFthznreZs$aq#XK^dQ&8?blZLL|d z&ClNebCJRbTucoRx$9o2M0vi?tFU{l7J1M&p=)`55LByL2PG0*l&%6b8TWP4}p)V%o`3|MNB8uH^SLn_PBv=)ZEXyL4 zL`h0Ai)6UzQ6oxv;mn9Z#i12AK6Qu(Vn)Lx8#K?eNCzpnezkf;?1jTZv66|A;fqLs zqU*+a^{qqNz<?k&5(I~e9hc(4mSBbUZVvknT zJkS0Jwqq-WLRyvNf;tOxnkFHX%chx_EoO>YSVn4j#Bm%J7IJDzR@Iy~ixASJq9he$ zP0Jt%GaAZCBW%SBso`08<}N6nrQ)nWyiBg zH;mge$X3OHa|heyfViMvU&T4b|G)DdVD0~@naF|>GSM~d6PJP_p*`Bfv&cA72em4E{bppKN W4j+si`d6$EjEk#iHT7w6<=$^0L{`!O diff --git a/keepassxc-browser/icons/toolbar/icon_bang.png b/keepassxc-browser/icons/toolbar/icon_bang.png new file mode 100644 index 0000000000000000000000000000000000000000..18030b13c52ae59e60f1405eb624c852c29027b9 GIT binary patch literal 3773 zcmZWs2{@G97k`KBDoU168YSzDeVGhmvhQYWA2P;Z7(0=5QbZ-GvGb{{ku407CCZYl zlO_9-wTA2={6}9;-~a#o-{-mSd+#~F`@83!bMJZ18)Iy!b)5MuGXMa`b+i$t)UVJ{ zW2C3P^Wlrd06=4kLt6S-8tB6?p6(E|qo)HF66o$l)dPUCYM>VyP$`Hc^uOWMZT+$3f6#$wum1yM1948* zEdSs!I4?BB)eCwg{y!|*pX#IEoBSW*KWHlAA5)GDgXy@Vow52@4`)9YI9NvUmyQ1_ zEO3thC8rt<)9}Hf{XBh;o}PF(_{fVm4>w;7+6#N+%U`qqu@*+<^fmBw#8P3u#MEVf z$*4op?voKGb6%R=}(S0H6q*hK8}Psg}Bc&NU5rDJ6M% z32BHF00_tX$Jgr7US+%6@b1`q3xtHY_=y;EljjjGg52z9BJOa%wRmD zqUfo>@DI@qXpea*=do+-?^;@{do^d%^=OzJoKiA8!)s-}bw$95rsSw*mPLK@lZLy* zoycoBTXYPaimN?m&5yf_vwb(~S6L~uS|tq@p!P=_2H0YGM2D8{XrT$wr_K;Ia?;!pqyfrVPY4xA1929 ze#s8fcd*$=e!y|F@GyMO^&JDly?)-%$q@O@ZIAr1s7wj+PndLPCMN%8M2Ego_$FJF zDq=#^ZJE}~y>SO+b^lw_dm%q%S2Wz_k?T9ks^XgrbuvxGnA*N+nR8C4;W>c{$aVkY z!FxS|^R^ug;%A*ZPR&NkQ!g}=m$sEJ0MKU~HP8aIcn$!VZ|fkgA}u2;lf&^Gt!G*r zJe{_?f&=D40^IPEcvgDe=v#NHvt^kW46N^nqM|EIPG3sUMQY?Abl0=kQbpZ$vPkz* zNv;LYk?OjsgjDsBr}V~bpomk^jf|hmLh08#=)3ACwsy9bZv^Cq^T`jXlxp-}hEo=n zDZ!aHW!9Z;Fa|(a3A6-eg4n$#pz)PBsFB{DMi^iVm`-1w-Gr+1yQ+1nFneZ%uJK9FbCe% zRdjnN1Pe*hLvcjX60lY`{al^vOdG@xSGA3$sw-3Anf?thKF?|O1N2DThCS7 zKo|hn$b|d;LF3BDyPR-km})d5xx$C%p(=)r##h>b@I<| zjrbpMP%$pG2LD;Qq+cIce0#0V|Rc6QVccs1aYd+m$tHvD(K>`%<2#tWGE54uz81}2QYO$WX9 zVAz+_MYo6?hWAS(Grxq2l{3D zMBGE^mw%DM)QvlzmF+IB6RE9wu1B|PB%}3Es3f z=|3>rkyM*aOwzRS2&(E^*;cLeo@trA9;q~GO)+KpCtjMV__ z-pwEHxgUn{#7uFsgAfE9*MiIT6!iF(&Nh1FRHTXO>J<0>+U+ECa+CnLK5RcI+{}z@ zTToDZ_T*eiadDVEHF60Eq)>LF>R%I8St+0{9yB86qRQ^H#&}w_?Ck!E&-C*j`Iz&U zA6I`KY&2FqwD`J5dPIZBuG{F-Ba4ZNod+g)>3m@s{;{#KEGu=}cISbOlXm4s>8hIe zbeS&3r0Mz9(^o)+$^!D_Ws-gO8 z*d^y~)Xv{ge`arGm2w*B+6tJmE{Id4Z7C!Qh2B_Z+@EWF~_2bZwnFE^$)wr>j%UQwR}F^hpf<-cLT1CW;@-^1P9++3e)CdoK1N23bfsFVvW zj5)~0=f&E*BcuQsE>r#dVY)(rD#}<>bG*Ee{a9a|Nn1~(i-P_L@!s>&9KEE(D;Zrk z0X|kj0nWOzdtOWs%$<9oBsbW7x-t6$WAn~~H{2^_65fJ0l{y~T`>bs%d0|TjyHc!l z5Z|fkCp8yEYs>@KnV3xZzP1qsq$xC}nlul}M1-fTYm7pAw(3(P9JOSeIbJT`I?QaG=tC+2PP1AY$d8%xBKPz(#0<3%#179mQ6L4 zr)hNgAWtn5FR?ar%Nvj(^fP@qu0A29kNK-T%svp=n^Pkv=GG@hnVMxi7C){?Cs$G8 zCQm37?CyTbywkjHVKs1{8Mu<5d#U{MOD45~QKkm1*7xr|>%5I-Cw%?P&jphXd_U~J zR$}QoFSOCi|AvLU#0dgKt8WK3(PtB#p4kg#c8d^s@mR~>vd;%@Q?CA(+ zSk>Ojc9v5p6pchIQ^FM&Quw*o=^je2s>V#Mq)cY=vNXK=PA&&)27dUkvOqpAY#v6< z;}Cw8kZLH^*&zGB>y5h#@g>0}9iM@GF)tt4_Yt%vQauZ7!&jgPwLp;66KT~96> z34zqMk?X+`*UvCRZOgQX<#`U)G@n!bhy2VRDEUrxU)(?|Hv$L{h?!$w( zE@l%+xiv%N?FO)z%|Y)}a{e9N06F!|35V2zSXe)jOCzS;hh$K*k0Iv>g zQAUEPd6W%M8X3%2dG$qv-OGZxOHmOcta4v8CpJ(%A`-Q&h+KYSCwghOZ$5`elkUwX z#TLu^wX2JlqMdzlD0#h>xTY)g#GCm7r@Vqfu&jYuVP1bJ4jbkz^7&eB8++EYsN*q4 z+{|##C7zf0NoTMidLYTnnKI@+f(4HlJs{9!h=6I%UNKczOVkBH>luZay}k>Sh96Si z0?~N+;NrYI=fv*$w6dd|--P1a=$buF<{IIry==m!)U-K_IF{|}U6Z~{;zET+vWkgK zc1qoAu!u86GZ3H_R)kueT%1 z8muPL{n#%bRG%%deWa8OX86k*f#Cj-H?)JO_1|4G@xByl$72tYQtC zf8Hl^`keFYA|;#W_Ve1>_x%DA@{5w8oZXgJ#asvNbriM8aJh7TI844x<0J@$YW!M4 z+q-Zqs{Mv*L-E%*IXO9aZ(pBjIW<44vd2PH^^&DMdHOi$7_F3RB&SWWClt@ba^#*0 z-|TmwC%LCx{FKB+*LeGu+9btT_*2bM1!5_ln6f1I>HB*3d^dd8#hSCj)#Q5M)ekNe z`Iimbqz-KdUyPbr0V*-AGyJU&`B~hDN~hjZ>k7JO#`#X|k1q*w1w8cT3W%g;OgA?- z-kRWf!#r)Ftj+hGuZ1C8PrtsuA?n|O*GEm0+*e*xOPkhSmx|?&DKh?sdF6KG3La`< zmWNAaI4aDt$%|jwQ1f~1Ula-nvL5tl5u@#$c73v)j?yX0w?%ADK!HU4@1<^BUQ5Wb ejLt;Xwd(}6O<%E~wZD)4I(4oYB8t`RBmM*AR@s06 literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_cross.png b/keepassxc-browser/icons/toolbar/icon_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3ad8791600f067e468e1db3a63aa915f857d1a GIT binary patch literal 3743 zcmZWr4Lp-;8-Eg6gjFMn+LjQr$+t1zV%da7V0(jb>8>)KEL0yXZLmgpZ{~+*Y&@y`%bjCvz8E(69WK10&ipK z2tJiIZ^$3(~LpFzeCsoIHU{F9&W)5rowg5I%o}~u^8Ma*vA*^XnFL<%isuy^kcJG zSPUjCEDRl{g=PlRFh>jw3@{p+7)?!e5TPEz31pMQ)dNEgZc_ZiVMz_41k+h;Ix`Ty z$w~HRhO%);BsdTMLC&W8{>vU1@?-g6ATXOVm?LNn%zwkdW&QN!f6(D%*8hR2;dEas zm!EhFokd3bvoM?H|HG0)!5IBmvL8q}6!BjGv8BAg_&)|@oQKSb3giy#V>Sipzzx|K5SdcS>$n>FtuewCMAU;8Gma<#Dx^mH~ za8X3GU4QnaoU;T21)Vw3V?15qI$POW?6lEe_ZphASM|-uIBO?jr`YlBYrVXjCd22S z{WayKjdw4O2b+x;+NQx)dPXfX>eOFbJPRs+3{guIOC^=(yy|{F7u-KVvQr;uiNI4( zT6$^~woi9ofL~d*|IIfxD1Mw~`2i8J_vUeDQrnWu9L*)u-N`q_2&<-Ob2)QR_3t|o z1aJ2*za_&sCEudg{2N6@f9=^9HGEFDeJQYLAU@Hb66df)vk;vdhy0|1l5C4_7eBfoUX-zCE#zt{h zA|^e(higVgY9*$mP-25FAE9&-j@R8C7;uVYHSg`CD3`y>C;2bjKEH6Ex$&{fB-V=w zixD#2Rg!G2kQtDR4P@8LirawN zY0*kXWahC#PZgN|Nv?a977mAVQqBB2#u=mnwspcR!z(I*d!0JPLwi&|Oy`er?{!Z^J042|(!ZW8@=?uPogW_` zU$#CF_0ax7Z*B@So;>4t9|lXZ@X+J)kr5celK%BlNUC|ka7s$b>^Wmh?Z%>;v5roYwADy% zZf@P{oO~FK6)~3Zl`DsE~gnQl0JZ$L4mG>=a)8YvYVgT>Slkv2a6ppB*yi1alIYgVdyUE)@ zHr`C7@XhZusp!SGG`zn2-FCaqTtmTK$HSJl9q!U|jP&(oPrwdkcM2$3)F_Giw~~Zo z_qyw%7kW-chmAHS4ver|W~00aMB<8|Gyh)B-PsGGQe1I&Vz=M%<7wj`Kh8%-#{ z5?oO-eXm9m6SsdWc~I-kU@*)yv+rD1>^h@cGEtpZ9Xgps>01odF5^tf+aF6a+W6AV zykQ&_!33Ki49L#OnKSve9^##&)fn}x=hl3;IF>EzO(Dgvs0GH zS!>`v@pN)U|Fa9CqMi{Gg)l@MC$Gh1PyDL0brM8LZ%BU3#czr#FM%oUPAGA0Q!Q)r498lrgTW2pnzj}Fat91n3=z%vJf?- zd?Q2%;GwjL-AGW?Sq(ifTPcMX&F@~FNj{>9#TIKeJNwdThdLhT)$g0+t}I678>Uh? zd3*YqgjOC(PQtkK%-9WRY;CQvjAX*f*#&8d($1w6c+(z!*8_l2yxIN5ZV$nwPogTjCALG zZC%j&_>nbZT5^VuCLT<}I7?SL! zC7BrM?SLL}zJ-4cgSlbE34Va$kFc@oqqF*1*Yp%nZmO?Un@LX844XKqb8~H3(cWZY z1NXY#Gm>;IL$uBy(s?7SaISBo9w7#BCkH`U=2f5ld`bkk)ul2yHT5C6BEfEH+v(q{ zxcs`Ws{v%$Z2>XXYim0{PeMS#`6hj+^!c(T-eeBsZLhAD2ZXTa9|>qj&9?Ai06 zcD}>V`lz+_l{jeGyRuGs8wQ!p}0>+S;yzO;}AFA>^7hF*8#RNoepkYyvkj-dj{A zl_NpOqW)zcsSvIxD6IAIT{|1rWPJYf7P`sq`FG!BeK6 zpGq-3r+;wJ&Y}SNfTVh71$GSb3sfkcd@0-r4QgK`#{ZEVOiYB_r;CWYN%8kzh?v;* ztf!>Df>Hu)N!?N{`SjaYrJ_(uKSZjplExgUex#LQ!GPyIGEP~+YkdY@DC)&*md1>g}Jn=er^8P?gnA&~PG2i40AI&z+ z?Bq*L-j|Nvws+F8hg}pkGmV3SN1d5)qmG*D>Q?X@T{<`-vP>1}Lm)ZFG?zcSMxwddnP^}r34Ao+xS@jJ(>_mfJTJj9@tx8ksz07NVOOZq;fb_ z;29`+=;=~kj={M%QBxPBR^8f-0rhLiUYAYXBx8sB!3fl;WFCuDR#I9lF3#!EE(3e$ zA#Gxk5ZK-Bawjv77S9i5zF>wmc{6}jH}fqeOPHtSVqrt)iISD%w5#$m^?QN(*4Cld i@Je3ut;hw{ui}0)vA#RXKQ@A=PylabXUR1`9s3`C!m=g+ literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_new_bang.png b/keepassxc-browser/icons/toolbar/icon_new_bang.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cad1509f25dd77ebe3d8a029283c1573fd6cdc GIT binary patch literal 3833 zcmZWsc|25K8^2@Uk|H}zLnVf>HQAFrd&V%zHpXCVGcg!6ne0kQ$Py)mqJ)$f*%Gpa zu~o=YvhQ2j-qEj5zxVyTf1G>o^E}`4z0Y>fIXBMI-0%R0Fb4nt2hJPmS<&w&_6Hja z{rW_6st5oWtZ>#SBFfBE4TJZQL%ZT#uyQ0H0^JS(8fQraG{y@{1iN6}alV?61!@fh zjC0k5*q%0%HzVj`J#a=Lepp0^xiu!l3!~}^IjhB?K~kd=_+W`>Fv-W;*I$jK3Hi;d zMt|N{!yw?_5TchR1Z8Fk*2Vi_!KdX;%gIBuIKUcyu5M~pdIoEH?ja#~=ty{^V4ZD}y`#?I1S%8z>+t8<;Ln@V ztFTU+Vtyw5Lk*3M7rP9;XPPjuySSxi;lrp(vmN1@$yT)JcbrqEHV4grCI5`l&s}F` zZC6?96t+3w1Lavn^lB}X*e$*8FF@`L*7Wh*6p|j8jxTc&}bR=cy=q zM2mNQ((l};x=8}x&)zY;#2VQ?-MY)g9Jj2CGkR$C%YK7X*5t85#Xdv%QUy}%h8kWdK1S>9GctUqkdc9YKJaPrzzTx|1DEfgcZCg#T{Q>4laCob!YSH(q8k7 z1fSZUNV^-e_3uv*H9XOp_P0G7=9W~dvUF$+WkcFKRweGaWOH$FnVeI=fzYi^i60KF zHBe#q*2CXp;q(uhonU0=4*)D#`vWuyE1CcRj+*m&=d4jtS!to(qP<6A!hQ^=4`mGn z%#t@#RBrLIs-G|!Qr^5jr9Zv^>w#7rjAJu@r|}je241B za5`rj^r*9tq%at?{VMw=hyX}|Ec2wU+g{*1w8K>~AMvzD`$Uou!1GhlxrNIo zAsiSy2xcC^@?gBl0RgA+-rn9EED@)#X=gW#FR5gj=NCwEumUvY=ho6#y+>U{L&K); zJ6jtM7N(}AxTADpxZVx0g1522jSuF~sLTQWbHA=sPtFffW9mm2QHtrxw5hUYS4BwD zhh~N&Q^bpsN#~VBxf5QMmmg$~s2jgpvj>YW>GNW8HArXFb{Ur}b~?v!duL|{0d|Q? z6XZH@ap&DmPS_hKu4tC$D2NRgytl6pUgp_bVA0ardX#k}i=AS@xF*H+oWx5x8`gVp zL{^)otPF?eJbuh{w|Mb#Q&Zy%^~{Z|rrl#-&h8nBP7cFF;buLyef|arPbY^mk3_Hc z*N?n}wtA}hPqc|T^s_!r*7w4TdUI0_0QVV+nImnk9IVA8L1jSO2US+{bqBV$+EuP@ zt5i~{b;j(WAsdS%=?=M>R6AE_z3A@{2_Ux&N9$K+&W3g>5M zpBbM>dTZ6vc)*oMRh%>BM8@i|e@>O8#!JE}L z$ZlxqethV~y)pZIg{$|CbKA`B!Ly2$jsEG)%7U*Ki0Uz>{zM7-UCB3$FxzzhaW^{ZnYPC93Z=k%_u zP4^CKgNsqfUgY>je2k`M=(_i7^45CE?(S7@lCN%&NoMBi>POHOVDQ(X?AX~R?(45# z!=Kr`WI-a4GzL&@MKfj7w%;(*C|oI{GqK_L?gnPTPKSdhaeaH`qiu3(>Q|OpC6HVB zmlykskW%*H@6x#EQ4fJj~mmoNDXvHp+9 zh-?)J`8%7lZO4QwG`vCDCMG6!y1MTmNaRdoU0Un+jH6sEUZUJFV!&Z&bOFVQKOD)V z(G9;bnMB)~3OZU1Hs=mQo3i$jOK6*OhBf>T?rUjVWi$v`J`os;=m|ZQ${+J?)WgRo zYbKC71IV+~y1o1~&3H{aE=Q`ZxU>}3!|9%TV3Mgb$pUl6vUipd!vsn)=ME~qNre-R zML{E5GVCfY_xo45zlmT^YY=>xHvLI*EhYqwiniv9l69yoYw#_HF*#!ZYcpDbhIm3m zY_>>c70=PKiD8>#C%e-VGRuc$;~05c*f8mjMFra?ewDvi_!vJ0g9mD_Wr zIAne~C_6GDK?%<|NO^^Lf&rL8&}@gt=8dt%;F7=k<-0rIR%?zR(r8)|8wbe9bR7jV z#AKzGn_zT`e`7A9*Y)Ac9N6vhQ*JG>qxbU`mPLj=B77%lT5U5ucDSaQ5x9VKOmxqK zwbjAm7Uc&>09As5W*Fyk0ao7wNkdn;^voT2;{`#@`sIrY=*{Kel_80+1}hnIuX?2? zKgMS0CO}d2l@KohPUR-HUu<^m<^b~n(M2=wx;&I+b0hOSt;e5!KiLr$VphCleORJX zvh-Pc;=PSMmWV{HK2zY(=&r+$B0=vEVbb)|!KG%lhl*zu`awl%&c`V!T-tr|@rbOf zEOwf5REv-DN9yg&z*Nx(U-FQ5Ir(H_W6erv3BJKPZ^VxGXNu+VvS>>teR#RGJ||+F zPZI)AllVLSEfeAXEFHLuVixF<5aQ>d!5_;ecNg9|F>|Gxx@G6*=WjJ9N?ZUIsfC-R z880}a1df(8rM$Ff;1oNls8F(2bMG5r40;k`dF)M9r2s!OBTof!s=LnCF&N84>4+UI zYCJtSzJ4RUHWnl`Ho%uBYR;`7{GzU&ax30m^%mdW!TTiJ*3$K$fByrd*CW<81Y)2pEMU<%z2V_fY^$?{ zg#`m8^9RnlANsRov7&|9T{KhS+q!B>cfE(Fpjk?*w{-cB7~{Byn?k2@0e4Y7E1CY9GA>@cIGB<56!~(Z)QmVC}1#k1d%-Q)pC zigDKb%*?&i}(wd>W&em{>|6bqL|)^a7WW zm#lVWyD#`_WD8P8h9<8kd{;Rx_I7i_K)O+W@OC}uves1tp@q1NcG=Xmj3=^}q;?EL z@+MXu#!#j`N9M|}6&1}eL?kQTF_JVF(+nw-6i?Xl^z!o2dSHQk(;`3;SZQ2#vqMw@ z-{(IOzL-GUC;04S%ycro1tG70E){7o>y^P_=QL5>NqHO__8r`!Y17|2)UUM|kG$%q zSWZeud$spC)_mP_rf*4;iH73o)Q~k#*da6GS%jb>X1bfljxBwQh;GPj@h+ATK4p4* zx7(zG&3lk^z}Cr;4=CTdQvJNnc@Y&Fx@D;%YVNq8*fXH?(bfFyqPG1+bZ=&n6AUYr zO#7&ng!sH1qB&!If)erQ(IbZ#ZZVD`2kQEIbab?Soikzn&T*4Qfq8Fc&Y(|SUHiu* z!<>re?Q%I?mSkVQjyM|o=1Qwk$v|1x8%Lp6P_L#aPJ#7korjgYC(V04&8>&fms0vZ zpqY_Z0n+YYbEPkze*HtRXjX!;Rsk{y5p(m;_E2P6Gl#td*$ tKwzrW#)1}dm@J?Yq8yZId?a8w%;%daM&j$ap8Y@8^ZMp`MLN#m{{ePu+F}3z literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_new_cross.png b/keepassxc-browser/icons/toolbar/icon_new_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..adaf0cc88296252bf587d2561d234f2ea1308b15 GIT binary patch literal 3848 zcmZWs2{=?;AHO46CS{6{q%nDA88c*w$vT$oX)=tWj4>Fy88V1uDTIpbNhxBy5i&j| zYnFWW*BV-E4a&YH)OYpv^nTy--RC*?-t#}d^Sl4;od3BomKJCCLq(wg0PHt5(#L^M zsoloI1>W;DXNmxT14pqU_z}#_FeGnJ6w%4sk&L2y`hepAprK9oA(Gt5esD*!3&l$l zvB0WDz$s3e2pbi11#=%gvMa?Xh)TW?WMM@Lawn-fA+)ui8gvXu;7Rr)!s(tKUNj6{ z6Y-N51HSKy(FpiYh@ZPAf?#e5*Yl>5;VLK`8PXn~}X-{9H8=N@_oK{Aa+1 z;`Co~P-%=Fl}z;WrdoM>duSqdy-4wLr;&(0oc*`97?6`@?(IYdVL!#-XMf7T zE_ydM=wHDBqm2F?X0Y=+QOI6kc2L1IkYhlN0RR$C(bKb};m%^=#s+$-it4JW@~2RW z03dzO{~pV9k1p(1Z6jxsjlMh*c_7C6d``IQ36X<`!y`rNZIbLRV-MY7aq=?5pFe^R zf0bQDcU!*@;xste*xY=v$8hR_DF?5kb9$Edb(YeX&T!59xZazu_sy7D^ILqozZqqa zyS|sZLv5*B)Ox=s61I4uUu&Vnc8NL2!0(LK4#47%$PUd$p2eGYLC^7S4VGp!ooSeJ zJ0*5lOJIGPsylYZ^p4X|nKS=}~d34U&s&zwX*@cj7hj)(Gz{p7&B__X@oqQT( z=4iK?7AF{3_~ZJPTO&7jZ2!@akJnT?HoWrR-OQHn-Nu~i$R_0nhPRoiUtfdW)YktX z>ps87$Fpt|Z+rVoLz9%Bh8t1S?yg(o+>+X>ENm~w%Xd0ExDuD#5DRhmOVkzr{lQz^ zC)oCFwMbEywnJ0Vs^Eg=^)a%g0RUIlZi7sti#`DWw9{B$*NPC8m3GBLu;o}wtx{Pq zc&+cKxR74x3KK`q+%S#H5$xnf-wU@YN65(YPfDOECbIa)xFjp1GnhRSOO1HECqE|#5swc695V7Ae-3)D-0>&bHt8nO%r-@3FZ@SH-BbMVWiH5~ z62KK!p(CAJJ2yS;psA@@J>wT-e=6OBHwt?>yX&NBVk1!JD>kUW$Fh{RQc7W6 zPq=gE&J?wh#`MhQQdkKAGG_!lq6pg~dTo!Zvf-fl*Ab)B}rWYq}98~!kmIYy6@C}aqP)n)E?xFrEZXP)*(-H=W;(MWBp zeCv_oQfB+GZE6%((8o8R7PLB@WzV`A(laoy4h>s$13dQTr|K$%)pA6m`V1kj_T@8T zA3hX+`SN8LEx}BRl&uk%$j{GzyDb&HQc|KgzeJ}ag-DS|V`AXSr;g$ExsglugLBos z6Nb+y85gk8d6hQYpE(!L0JV@saUQP43jp`gpk`oOSZ(7Djn3{``1n_@smRfzdT>}> zV$UqnWpv0O4VzGdQRSy_^5cx92Cbgr^!yzI`-&UXieA>XNgC$Cd0H6$X_Jh`rl z)qT)W2zx$VF9&=txI`NU&CUZ9 zpqBH+ah)@ZA7}R*D#ea>Ki2C6NeFNlUDCkN(C|TV&9~U{moNV{=96ZUs6VmvFUIGf z$!}|)^N1p;z+%vKDD6gh6|~)ifr?WJTVKDLVI--Mk*8vB)i!mi&`Nf)ui%1{qhkXk z%t!4@$WoK=nZ(vfh{?WTK4^GfSH&*B~ zxvAan-o5iPsm92dafQ>L)S67v1W@o88q1w0g5v5)1C(kUhpqY7_n+;FGIfl3& zCBc@T8KH2EnE(^`YMgW=^i}t|)Qb)7U_~{x=z;JQDE8 zN4SE!=d?CCnVvK(&j>5PTP@v8%E|UU{`iH8>Z+@A7cpvTgv!7bsmsB0<->Bmohw<}N1-WjiCKhz5j-ip-$?sl;^r>CV)M26w22qw9Qj*5$4je@}=^NVZ0 zf6HJpnOOk#wnJ==$Mnq1OvrNUNj>+$qNeXVTlPG_4@%nDli}RLLetSI|J$i;JR!z0zwlmjt1(948kL&JBk_i+U?SsZe{y5t z12;ggzPwOZR~JC?5L4dIJ|JLzR7U7^9Z*5a)HJov{*yb9!WYF3{ zrl&5CuC(AXgE4$SCl4Sfi12M*(>en9+6(7V5Q0#Ndq&Y1!j&u8JW<$=hI*y+I8ANs z+Ue2l?N@|{U*rz=Dvwp609bYxo0pSA0x(OIjA1Yst)=Zi7|lYgMdCj0DNg1tP2Y$S zX(fy2pU9EUg<-*j>k&C`-aFkKf0SKp&yp&>AF+S_P^UTsuuVy4Fft^KU(VFze^&+_ zEt%AM*!$vjR>~ZrPUHkDV8L31w33vRgd?S;x^E6O1)oWHZQlFm5OWT-n_NO`yvJ>< ztJEbptE;Qq*(*!^&A}Stx-y3WhY_ZGhI5mz7z*NZyUDR$f$wOTLtOpB#)<6f+d|di z!&S8SjLb|L>hh~-w{nxzXF5-|L$yUn0G#i2+Ms_mP*k7=y+T^RkmRwQa@a9&^X5QG$`mhk$lp`l3%*`8Yg4f!}l z-5i+deYPN`LHCJ3w$->Q%ZAs(on4NbkoZ-qjR`0vk0u%wc8-tNeSE@WrrO+2=R6HWso&w&p6huP(el zCKZ_v7A_Arw^$q5#PL9Bt1+b7@CpA5{rb-7XI^4VTEplZpAp%OZ- z&!NL{+FNToGQfVLeR_KObW6gqwtW(Iwkb24(m$&*H>P)5xodJ|v$l5QeeegcCZ+<>meP{mZ%d=xGnzAXc_kb~ zxExE;ZYeTdGmAcBc}jSk?W!-*7`Q;eqJs>at)E}(*$CLUSEZe`8oL@S8KHRm)WCrC z>{?LZV@r5E%M!~I2?J{(LWB=mJZK7eL_k)hn;DAS)a8*ND5+Yr4(vbpKy%-h5u1pi z3jS{Yj}iRhH!dEU2nrIpsTjEPZLQN%x~~K*7yv1bivz-R?hxImkKiU8uz7ABQ}o#j zDRd%XB6@6$SV2Idq;@iT&SQCXN2aCg=SBz|6)yZAmozx~`S^f#w{lE!tCM4FPUJXP zD;SK)wIJJofYTzRA{fU58jl2z1ZN7l=bF}n*|~Ex`@!7i>!-5>1bDb2uq=8>ifV=T z;Dg~Z_E=nT4fNV-&!K2%2N-tJH21G^aQmz>7+f>5u}M97DCSL^qR@d`wwEqt@^Er2 zZtYkKHm%V$M*Zy(k?@SXB?pB!XD}ELD~xGwiTSjl^lg*PPn(V4ceChEwiq0(3Sk|w zxDfTEXS#m(lmONS`m>AAMdP{u$fGRd3MOZ(=7nw>Tt*62g0>e}QO$cNQ^>sRMdFy4 z7LpULFZ+jnB{C9L{<%KF^!hVgd1&1U*0^&b@Dy?Hjdt(M>SA|ycUF3O`f`BgO@z>#95Z-ia7z@8e;4rp+7bI+_0V8$+wBs|9wb3Zj#fQ$&umFCKq}sD=eX o#JGT`xa)*Sg7KQc#uwXd{_u-*eVkrR>+TP%v4Mqt5!NC6Kc8O25dZ)H literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_new_normal.png b/keepassxc-browser/icons/toolbar/icon_new_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..56e03c42eaff1c9f84a3feeb5aa92c1b7a0b9d17 GIT binary patch literal 3929 zcmZWs2{=?;AHRcSD@J5QHI0&G7_zU)zK!flMjB%8peFz!?S+uvS54)|enqjEXDlye5Y_NtHq1jrB)EN#0&~qAE!P z_KR1QG2Ry=V9;L>e@_jVJ<=Si<3qqg6{HoUWnh{dP<4Wb-JJuA7clYaV66GNR0rN-2K$`4QQJ1xO@6@uelcP!> zLr1<#Y#{n=%a5|?fm_?#FTK;B&N5+QcX7+e_6e_*TcSj1q*+qqS~%xTZMn^M(zavu z^0p2f>{VXtKW2N#8_x5^YCvaTtkt$|9u+Pb`^T$im)WvUw2+O@23&kHp>0j-jDzIG^> z-Y+ui)ZG9-=HAUaeN&N9(Cog34nzQ8&E9XIIYikE0C1i((!F49ADd_I=_NeC|C3TL zSF2XLNOC3*RUm~Emtx>XP{pbBe^dParWkWs&-R zeL1iG=5Hz*%o zvE{@Q@f_#}se@b+HBgR@-Hw+o*>-$h+p&k+g1J~VEyt?%2`*4Am>_}p~tan|HI;fU!uVDJLPxft5=$#>`F&}AVb(Nwt_6h#qfHMJg? z(l?7`=cLN(N#B2w+Bwzpm(C6S$+hqChNr)(V@h^0T$QH>K*_^(!0_i}V2Vbg=|Rs? z1!c1!*I7GQ+i1g&A!b}^8S|zphMMWoAcrI}O&MY4SE_igv0k9VV zB0$aod8Ces38#dF1dZ+B^MHE1#_ovKWaHZXslWDw`3!|NV^D{*$b5Dlt>`E_9 zdwP00&L~qB z?BJg2u*@~f_q=Qz(85%ugkJA0EqjcxCO^w37-_1cK0RNz%XNHS&5Kz}jPI-0NL8WY(S-39 z2)#!;Fv+N-30%_jLTqr0osYTR4J_jXgmKe?fv^Mp7R^r8W3lwrhLe)EC1S;Qd(LD# z?Tr~R9Tptq+Cy~!vbk%W#BqI z;MKV~wl%{G^(_Vc!8gkLm(WI$&2Dil5K1Gf1G1K^I?ZJ4SJ>{QC z!?gj3mAZ8^-Q0J2AW&n?hve_{!ssl+D7nnp_<6sdL!S}K+8jJ7Tf>+;Hg+~P-Yh&> z2WPI=3hft-&v5yvS0USkv9--nVM71`S4M}gMLU0bt3-JtaknPMo);W3wGlJCJ7MOB zC(vN#Szw6KkHsE~%m>Gaz~h%M75c}<>Wpm$+EuRf%&wOvc6{DEai`-DK!rzpz+onl zHXTv#Unb6tQ?oY~?ZQPhh1GCUtVQlsqa#6IW+&^Z28PBDm6?sVwXZ+eX-~kfk<@b- zHOkuX@grM=EFgWqdw?&YO@dDkooE_vjxZ~9K zXTYZ*TtV{41SWGq-~<~>6yvlxpp|Z=)o$1%wDC9yX-)wplyRF#&4Dmppd`5dL4cI*Y03%B5K^mruR4I@caU0SIz-Eo z+V+`6*&q7>(5}$~hXqm+7UkgF@^2+YiUA-F{UAF#yQKz&=ZUxiB=^nU2nr4kPCBlZ z&Khy^eAn~Ry)^Uh?`7K^-bI!?WqwF;Z!P;)-B~gJB1G0HRt`1vMNn`}PX!QGyAG#* z{P+>$Fz7(bU4bcRYW}38OF4=HkVJ^)DB&#kj)==V4UvEPo_)_zvT*lpnM>#9inID& z`upm0SsG&&2TPB{>rS2o-g8Da`DIb83e2)Y*4hNDER7AU>X({?!bO=Ul3ic4ZCHw0 zZ$G)I6qHZyJ!9%(-J`7^k$hOcps#C3E0v4X%mq-eJJ}8X-uJ~rf505{wX`_9 zM=>AMg%(En&9W>D)3!IL7w^<<&pcG~cM4~Z5aZ;E=)bnR(b%ZvBm*g_UwOSK!CzLn z(5+*F_x#$&|TQndh!ia2bqk?Q?rVp$nZq-Air>~n)(oLqrQZ#NI*Guuv47F~1m z70Qa5PneuiPI^I{r4UD}eZmz|4ArA2=U5X!%s`8L?_XtQWyh*Vk9%Fc`d%JsC82>1 z`+TcUXS&ELSrm?LPEiDd^VbEhiw<}{dgZH|)t6&21K^|^N{YSGgzUmDhpdm>2pkr& z0p40mU{}U!*2hvWYHrW8wzjT5O%ut39u?97N6Z+WChUy|d<7o=Y~cmdskrRI5RQCr9)QG$lqTLVU-qG0>n>~Mk93Qv%B)!;GLp35QSeI5 zyHNVpabwZca31ZA+#ait!fgl;150^3gsB)-TB%)q6PJ{f!~^avcq9eSs6K>?XNrN7 zr4wISXK>>6L}Clq=_ca0cj?~>t}hMChJ2msoIMiXs)?HEDM{l4lww;xIjxa?eBb{z zy4&fxlA81vZ@lgbttncBAtoscPaL=+qS*vl_zWi}H)pMrkjP$SZ*On$$@2@!W@jTRnbYxdoPT(-WsRiP^ dN}cWx2c>FfY%(cEdF=lY8|j(pmT6y!`VZK86SV*U literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_new_questionmark.png b/keepassxc-browser/icons/toolbar/icon_new_questionmark.png new file mode 100644 index 0000000000000000000000000000000000000000..9981d5ba26343e17405d3ab204cedfbdb46633ba GIT binary patch literal 3956 zcmZWsc|6oz7ysFJjWv>tAuX0MWMVXtU6=~PSdtkAgIO{|)|yBW63UiAJ!LD)WD6BC zM3az^U0M){Cu@{<^z`X@-_QHU{r&De=X<~R+;h&o=X2vvqAbOPcL@UkAZBf4X3zPn zZ8t%F&bJ6TQw9Ls_5?=^4P$4E@FEknu-;@GUMrMH;phS2h*2m7>lJ{ffpK_W0tpHE z+Rz9A6TFcSXFWS@JBlgZk6;xZgm(x>IeLW$co}#@jE)K)2}N)Sh``@!AF9;eGv9$7QZKRMo5SsjYdI0 zq36z>(>kZCMGo?X!VC-ypxQc69UV;$LX#RsqG3ZdNmP|>ihnrF@KmoL0)<8(lfc`Y zSR6T+hJ-*kdhl;@8o}pZb`tgX_BoD#Zfl@0Ep6z3!#UgfW6S@bL$Q?q1LH#pKIWJ| zcrOA4tL0CDZj1j9iw)-Z==Uc7hxiYggZRgkZNm`OM655~7Ekh}`5_^?`oC=aSK&XJu4Dy8r-MLrM$Q$;(ms><;Y@K$XzTa4nHNUsQ zC(x&Jf0ls2)jox&iAZ?oDyeAna-L@ICPJq(&#Ndbnr&-vVHtGU$ZY&z zz&sCy*tCvzNtk=qszy8Fk43s)_h)@s)PKw{>E*5(HU44G^t~5_+5@iAIuk4wvC*wE zb(-C%vCEe&`7sX8InY8BD;FvN@H4g>*EF>3699-Htj&%&VqzJX2#P|h{8m)Nxl~lD z$}H9`WcPE==OJ;a`V$icbeV!)oqMKA@AR-QY;PHv9MGl-Yj&qwDtHe4OuH8Z9=v2B3p&SQN)5+L*`!Oe>(k~*wHK^v0?kqR2m58}7 zT9mNC1Tl~w9ayN1*5PmB%I7sM)?goXNsj`KQ^$83Ft%)_b?|Ji#P?x9C6F7_9%VE9 zWyLjv9elIX=e`44Z+bB_vZMsTW!zik2uaE8KSb1Fpz>_*+5a^|3zu$M+NrE|reN+o zh;GPr7dRq-OGLW5xE#=f!^_04wDjFRS;U%MM&zIhA?$~|KmozE*zrYND=z%RiLO>2 z0dZSVadB~5J3B?VsFxAFeWxDgX;9w&`VyKWYcvTOWz#F5{ zhv4u#cklAb)-I5`8rnp@&P_5#x1>)$AO9pEAWper_c2%|Sn@A(X89pKy*fB)oETPQV(JvX*>>IeV^wGWQlHDk@43 z6Z|UnWZzzUp^#Gz?FGJtE&-?2OFf=uOMIlVt8A5F@qFA|5jHjn4OLZD4{K`=XWFV= zxdiILeHh~f8-p-;)bS?now6Q0pfxlqFdyW|~A zObjL_BZV;x1uIO;*j%6CT7b}%xI<<0TP_)rp7N}Yo>Ouvb9bpat}4&;__1(;g-!8! z`MPP)!@q3MbA6Pn7EW$DEF`?p-4igdEf%)1)* zL2*yEo?G|W*tMRXQ*(or0z@LwX4gu0_j&dQc?fqLecRH$brHYIZSht^5Ag|5Y2ngS z()e%g41>y9G#dTj$&;uMZ*SgYvsgHO({xJ8#E2+xiFV#s&N%zYe z<`HBxTIOlxvYRX~eL!|;VRg=~gvp91+-gh#UK=kwTvzNXXa!rm}=k6Ta^3MNC3s!(GFKekS4T@#GF!jK?SuFK* z@GRZBfb2B7HK&^n(W8_NtSt|BEhL}VqpED1Dt9ujG9I=Ikr$lM@{UqfU0q6P7_A26 zcswfy1A{qd+AJOKgOP_F(c|@v6`SVM&ZNEvK!GbUFzzeXd3GxmisYkeXPeEHixaaX z496nfcje4scdNlH_Va6|-AyT0mP=RmcJY}VD2FnKzbpfRqVzi@{@t95B2F;-c06b8 zfYzjsxG{zSd;RlBw5sQxMD1Ist3A^d_`e@7(j25bxf5s^O{`X!&0+iKxQXR(#gYv{tlNgjW4i80^m)#H88 zvijo5R5`3@#U=CllxWbp`$7Zv-1qx%`PRu25JA^mwpI|3HcxRx2X{Ptd9^Iz6Amo* z_f^mK2FFNK95004GZ|ZcNoT>jlssJ~ z`MDS8iUq*Z9pZV0^qv_hXH|twar znFQu+6BGtVzRVT^Lq-PoNsUE`72S6mu_7X|rs|YQUVrkFKD41>gHV$iKiEsIEq-il zOuqL}9c0k&UU_a#NJi#Ht)@`Ap0s*Jx?N50s+-az$uKRR8cUN{yp4tb$)ZT-zmSuKUePc%+mD4#6(kyiX{#JQ3URZ^_`h~=os0S8^d}i z?#-uOkwwdC{N90r8Bkpz5Z->`E8q4k-7uY={S^VuPw%L9?(i(@nE5ugwu~#Wsar6G0nv&RnxXuIxQjo@ZUhl0E2!`>{*2Pn#Xh8RRqQ990|9M7$VY zRgL~6qH=AaP;8=#G;M7_UXC zb_@Y$=E?e`tSc0tUT$eRh%mDW+RdgS^4u+WY8b>l+4imY@!bLLO zmaiq@y~vT9k~olwt!kRJ;Z$TWr}(&`(R&{S^0|FlSnOqXwND^mFMO0$=prIhKB$Dx zuMwv{FX#gLQbyP(W8bc3q8R%ujC+l9;^=KZ`B$jaav1D3;T%&`D68f$85^pSad{L`mPrPu0M8O1Gfa5kVp`2$?zMmR4+dWI0#Sm zDPY|nZLDsa+_(3|%%P>{e)C7i+5M$W$kh*;%Qwq`n3#k(>EZZ*`m*Ger6tF=UqZ;I zPcuqNO6Jb4-BWNnuXyz?M*eoo1VRHVDS=f}^erri==Ad4@pnAyKvs~@?V%A|%k}u| z*WnWSI+F@jdP% z9X)>;J3GrtNo7zlpWm1Ra*1Y;uA17~9ZE*$Hyeg)$!C~&wycs$0e{X-`zDw8r>M5O?KxSxB4jhBcpwNdVAu{ zQu9{j{8v&eU+?=`udWQhl3$@<(DFtt*_$61!d?~I0$1+z_-(ywxzaLRLu@F%ef#!- z-Qwk#TGHr9Goy53LQ5*iVmUWAH|x_ial_=+g3oljGjDd~Ip0agKRLTHHyGvM;82}+ z{yU*`lvM73u73S~F%*ps=Ajo5I?Nyvw+ugTYRhi8@?CE-!4;nHEffTABpie|dx&Xi ziqggC+{UT+EG{}BdpDi03AirNlxFb5_o>zUEgocA$Q%8UlvCS}WovVkS(%Av^nU=3 C_W_;& literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_normal.png b/keepassxc-browser/icons/toolbar/icon_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..2956b934c328b24d44ec863842ffdb8b9cb5e2d8 GIT binary patch literal 3853 zcmZWsc|25Y8$MF@ie#5%lo-rdLdIHy?8#2Z7-NiOW{kl!gh(N@XtkvDB2z~8LdaIK zrHKhs$o4WMWS#Jh-hRE`_xt{M&N9E8;K0~s6f8IWLXf)ErDAx8=c#)iR2hM-@( zF!u9~7z&d61tA6*g4}HF<={91N=_T14N(Uf@yQtw{QO}Krslt2X3q>k0YoAm28BjO zMnWRBAUFaVs-dT+2UXXEYHF&n5o%%Qu|xz(4I8GgL-7xXDJl#}z~G4(99C|J6XA;s zCmMo4Y`xrXaw5k6Uv_NRZ}-`OfbM9Z8W45pf5X{s{jueL&?E%@|G+2`#^22C4<3oZ zBOrlz=#KdRu!wMWjD9=$Kg55~Y{WmN>=*{K3_+k#HYhBb7+?s}I{wSXe-*A6zyFf6 zjfTMqCNGvn={N7=Z9j$eu>$i{Uu{hp*y*O z{!R`%%g{e*W>5YU3JS}v4g$LjR49Cw0KgHCfy3>?98R5-vowS2Xz1zasA)np06^(R z_>Ed?&J%)H8d`R@x|*t~s_sj6Ig=M3pdcQ+jlk7 zcO74NFX^&3L{;#+W1rD{sry0|o#MR7Xy_MAlK_93xpd0ewukRDFNwRBMZ#1a&!(WF!ujWxn=1X^ap81j1v`An~JK3pyenYlIs%q(~ zlv>vbC&*>2+28Yz554?1+H_K$Eb;KPi&Oim=px$fwx_dyngLAZu*J>WU%=ykk!^fE zf80wwc>d{jEGw{un>(dX>cU90PS+~-$>+(1_1XPa6Ti3WiPL(l7hEprRU>vB%gc2#^f*>osH=U=dsk*k253*Q^Xdap3$ z)zP3TiS9Tsk)*?JXkNU9dl&$4KZ?(HK zM?wo1`TSz2x<)D7H{MDB!;flO+4JZ&*lM*|RQtA7#XglIvJq#M4`0AV2+duY#a0!I zCcky~py&dph1hc{@wQ?p*Lfu5rDjVtM#R2%q)xTg*ROUnqI#yek=#;4CKQ?Jb;7d2 z_EPPX!PK05^hO)720Q^?aHe+JFln#1KEv?UJ+dfS; z1%=wu;sGD`JMQ4yi+50IcRD6I3NYR(cRT37__nu?rL!|l#g)qV^6AqH`5e2#%*;%R zZ>gJ{xBw+34-eqI=vuZk<%4_?X!Mj{R1|C3Mv<1&AB!BDUwUE()dlEPA!i_W&0c!m;kWrzr6$mf4|~b@(VlVi3T^twc`y1oRO%e? z@Mp38f+=XBvpYw>r>e4Y?@(2U+9f4BkyiVNx3w^`v*)2#;LBxj?@-DM@n`EB%#!`a zTWe#oiW%*N94&X5q@tq3ZElaL%^h+WK}4-$H01Ip2nu?JR4|C zG71ehbS1Rir!u!DCnxd8B)$6j`kayC<|VfXU$Ko}YpAhPBd-%`Jv==6_avN<1!km} z;oGc_SG&bzH$HgA2nx9bIBRMRD!eIdOA>#MnNwUy>zR9Oq27cQ*?gTftWsk8%*-Hr zB(tC>OBa{E7F|y|b?THKnY@7n`UyTMR3UxFQ(#mpq!yVley8Ehy?oE}OU$^`W>Bnq~ii@4~VX%II zefw4{l({F}u*tSVIG1 zuYfeVfA~}k?35`WG(r*~H>`FVCTzZ3O`S@4m)+e$Opn>Sqy7d$~C2zFoiw#f0*Dux@ZF4QrTlDYR;X%n~ zE87a&*0v+-MtPM@Ob5ey468No+hDl`vpAPno8f6`X;Ly5e)Nh1skZ4PS+DiDPrEd_ zc{qh#zh{*fgV28SJa@As#TxX6z+6W+a5Ti>h2Goy1EL8ZIpf%+6#$1fCr~K;UGb&% zN)-@x=kB@~Ckt$}k<}ff6}#gS74zY;-q^z2SDOmGTI61LK1$SI9eUAU-+Y~&Shci@ zJX0){FF$jL$pP%%b+Ix1kbYqEDE<(@UR$D#&RuYHbiAFX)VTmIGalma&`8o~@>Lvh z=m|I)HM&;rX%RX^^ zmKMlfPvVk%^zPK1kz7pTj67z34w?d#_f*hVh*#db$Lc)?218RMPUaFQ&M1 z0DN2t^%jQ@a5mo0Q?j8|T&GZ^0fW(-b9T^7Vg59Y#tfN(bY5j+cmCw--Bnapc9^at zihlSsX*WQj5Nv5DQ}Ujh&6}0$;R|)j6M@u87T7Z%9bq(ov>PnzZB+cC$;;zXoEb#S zhsxyZC@VPhX2BmeruiiBrqC!>;NHM7oUr0$FRA)>3a_8IL5#-vt-25L0_kI5_nOCWKiRP&QL;CX`{NoJz=c=$%6SutlIxsEGuxJK1@ZngO zRgn`Iz)Jvc%AWO}eB@)T{HRDW-*+{%n>Vr|%h58`r24uuqwHtyO727GPPNrByN;e)f*GCcjIlbYaQUr$O(+y&e%{i_=O99~vJ<_f#E8>k|0bMEs!~v$2Bg zNy0z0QWcY3yyEATCj)kE5BCZkZAvU+uZjB~HUT`%>RjE~dRoCl5fVT@Q))ajKnf62nWQ7kgAKJ=A@v_=zVPodE-XohF~d zFgheOER>6zuk62uE+1$Blo)(mJxha7uNvY)m+o+rYWfmykFp0;V zt(5}1zDlVW<&k zTqzQadvz(H$hTRlQ;1qo4il5!alTk-mFCLmt`t`2xeAWZVsgatd3FY7Chne-!2|{A zpD#Ckf5pshLElS$XS;q}R5YEXrlwXIwfZehxRM@JMzI6QEh^K*nz8Zr4E6!3`^Au^ zlTMblUG{N}Y`a4J9W78b26<<{>hQuE-%Vp58qNg-1d!Bo?C3^|ZxzZD^@rn|yimTr zP2Xl`vjcHB*%>C2DI+DtYFw&|0IEgow_KhNh&nn~LZtW6*EhGwwlo(r(2aWq7zFTK zwL|H)RpNj{A-g4UGFpjI)8n+buBwKh(6y5M2k?U`NjFaH{KZ7ysEJrG_NSwT-PTGqTTQhC;R(Y8XpMgP}2)F~*Xea4nUzS+Z1ivSnW~ zktMn4rpQiZmnF#--k)xt?)!e;KYq(|p6~fS=bYy}=Q%MKO!T=p1vvo#;4(DO#erYx z{fFZK_|8Mk76Sk?j%02{x58qOjudwo!HMEPg!#Es!Fd4C)bgVe9LYqwm;=#;Y0{jWkvQG+zm&ld3VM}Jry}8S zUteFCuQH56bAg{mAP{gxCAgB30*FxXy5>PA_$hdJN$gYn!=X#`a-@-{bP~lwY@d_h zK=G!dpippL>=!wmdbm|3-s|e@xjo3~A_2a3Nxd9xn8&D5$c=PaFT8up~MC zmmD-2sY4?Y=oFech2n;S?nja2LH2SaP>K7o{HgtqwMdZD3rle#g0P=raM_y)nyK$e)ZB)>cbh1$p@+F%}n}gkP25=RO`D!QW(g*Y@%`p7?s!gH_>0kHiKy zWWT}RSd{Xy>T$QUwO#uA{A8*z^FasaA~&(XDO{`n!mUz z{c#+9?E4Ju?8F)4c;3zTA9WKL3Vk|Fo~6|saxt8@%u7?=^)`Q{4bPgJD2%lG8#>A> ztIL%cHypbzc6Z}Kl5@Cc)QpSnl(@gZBU20Wj&;7TE>`z#@y<6jk#dp-ckYkMe$Mj8 zIM{wmy1{#`a4%%rwS}EM_PtQhc%WL>x<}qfRE9$D52R98hGX8f@Jy?48x*8_a4 zY|K{C_YUJK&L-T!##CYAvL`uksTPjDcUDe%<4AMe=4o%|Fh4TaDjtk9T*^(a(i%ke z(&v)9UwJwh=95(uK3W+m#Y)OmEhOY67{;=mGWuxzkwpyPX@Qm2uYYG39XES2GMl`4 zAmGGw@Or&V4=P}t2hBJQzyMjG_#`I_FjU0`u!pie0<;4~Xj^{-g?m)j*JWjW4o>Vm z{$8c1d1;+p6}!qDO5m@>NGp5rw^7jU-z>7L{~l9USJzc$ zC6BYWw-@AK)x2C{iRX=E33VSbfhCsX^6w4w^{II-4%a^R(;Nj8)Tim$({g|(LvMTp zL%7jOx7+)BaiqQ^6&>WSm|%b*mRk?0U=w<#_0SoKablQW-T}8h6G?^wcue(`zG#pI?aj_U`Ot z%hW9q6tafgUmV{&v8)cTE~zaW#oys~^sX!3+uYsRX3)o9gsoLpR%YwAOrJqCH*H&v z!5g+aLL?sc@Bkab=*{BogNbhlb>y4Y*a`Q>qmtoVDw>*QC$9Nq_L* z!S?gZC5M2u8}y+)|E-K78POkaZG$1)eOI%U(8E&tGWyZ{Z%QAZT_BH|2A5=X$?Wv4 zFghq4?%Hood`!v7AF6U+t+y?{LM9i6xVp|A1KLI+PSq8Q`YqN@?=FuwUB_Q8>BpBI z`ihw@`NGgzL0J@RwxlbVDi{o_revTl*X#5Z7gqXeZRl+d-_n|z-2EzbEO=?oaGQZf zx2@quVp!#p3-aUzZ@MO9q~8qh7dpUS>vT}mDaS#YY5cZF1ak0m0W;|LD z2u+AN)7`EPgV^Y{2|R{hW1-k<%JU4A1;iR-ZpBu^Mfi3)Mx``wNTM4(!_Lb@2?JN% z+~f<3ibk>uT-Tl|THtWB5P7~hKTQ#J;M)!Qgo*!c4HiBfqd0V3@U7jI6Jy+VFNOPz zo*#mgRb4Av|#Hv$%+;ha>a%Sk3d|#_H{L1jGY# z-bhsym3ws~i-G{`fHqi*pb!qfXpSi2D{#R-HK?YF&E{x1id2BG4excA!6??d>x(^M zk7JnHD`?~~IZc>=SMzIiKY~L5z$NyHBDUAa96t$+b3DWZxDKRR9c}~kkxrKo2G+KR z9`mHRGZ+Jxxb#QC!~X{}fX9QmC>8spl(?=}j-bLH!o-2h$VN`f*~pQSnwaut{r;Yl zRi&2F;#ZQp*m#GkA_@Fv4~U4~>z=cC)mpz&qKx9F@>DsADAYqnv-FOI&^ofuSrRB_4NcPd^K($>$d;ACUpY{&=BFY=}8w>!73jGRJWY3*;`9# zxQwS-v@A&2!bG2Yh#tK^bLaGnFGpFh*j6o@OQBo-k8%$9t#*Cf$&tRYvxOkMnqIB` zxZ*dRZJdY$9&O8RNFK%3~ksa}*VzP-Eq zB*}@#Z)eRxzk6C*(HMbNQu^9NE_trT`Ql2;a=o|xBvS@#QThfy0Dbc$dZ78i%Yn1! zl@UpEKR7nNCgzq=#+t1)zg<`vR0$i~^$AndxaGAtSVO+=OL?VS7 zt_^zSkfe{rw0v(D32?hvJin-foz50vDBoT@+thJPf>}b1J<`+7x>~q$qDa=|H75Vw zjIno|=~mC}+eg&Aoui{m^Oc_~KJDsy5wOH0q=u}Y~ZO4M_FxI z+26UOluKnfcZyb6_3R7ce{bWf8j!;3yGh9 zk<+ch&E(xbb+9m>$s`qkCd~Tivo9}{zsNTBg2idc>%tQ2M~8+2?8P8f)$T)TjAlIF ziq;EqzlUe>&CBP`CPgF<>asfhCAsEOm&V>HD)F+rqx#Zbhk$|ow8|&500q5rhF9jo z5c|TI{f&2bO_^6Vn8iDTECq8&qpoDKoNxU|*j1GRQcBJSO1#nWrP+nrIo_;;#!1vH ztZqa{V9E$TrMhGo4UbY%=S{JOq;$%N&Q@K-TS%-KuY4Tb+3F8#7tLr4Ud4{fXjwxY z2H>8jCO1BRcIuhzOf*(b#^eQN!;|qO z$tTi6I5Sscj<`}JeG{_RR zK{-%}$bH5XcpD>KVpl^I_W|1+_`AM74^aEQO|?fFs>VwJStBQT*RZ^($o=a?rv3=@ zzF-`4SB9!!VP)1QjdlunT|X=wYpYusCOiM3hAM`dB6B=jtV<?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~itr6kaLzAE zRWQ{v)iY4C<5I9GN=dT{a&d!d2J&o`GD=Dctn~HE%ggo3jrH=2()A53EiLs8jP#9+ zbb%^#i!1X=5-W7`ij_e|K+JGSElw`VEGWs$&r<-InV6JcT4JlD1e8~R8eWo_hA=&^ z80vjsKPikIzNrtVGp(WT_ghY5|3X(W5oUELSQWHz^i$e1Ab8M9yLCH!XAS1sdzc?em zK*2fKRL@W$JTosPzq}Z16i|z=ua!%Fa%paAUWuoRtrAc~FC{a@%D~aW#l+IZ#lqFt z(9qD;$jQja(bCn`%+SEV%+=7s2uZtVUU5lcUUDi-dnQ7=GZEVTi!yATTy;4I7xz|-zo)55D;a#0z`i%mM|cwUmu)l^g+1a+V>w}IU4SwtE0o$85X#xDMML8P_(H<;$ZmXm^de){@pB`+nUxcP`LF& z>x=${unl4?u7XF79gDi?_H>Rn6K7J|%(?mXyN%zRYqFgZbh+&?_e-BJe!pK+ezv+U z{l?0E*5cy@sW9GL9f1$QSMAKj-i3n`Rxg zKJ+%rNJi97_}hyj$A{M5{USfFK6073U-z2x!NLvOIkY>u`a(9$x^nr@r=mMAL;Q5_ z9ZS!?6|FJSUJ3o0vWz%UN z%lfYZZT2qrwX)wa7vvuJ85-IB=Fm~K5}T|<+n5PiN8Wz4*fZDZGSim34u69-rZ27a zlT+BD7hlR-{riIQ^Vrk-b)?cy3q9>H1D4>N1s;*b3=G`DAk4@xYmNjkinKjl977^n z-%hpeYYGr)t8eqX!4zVqvWrdZf%3(m?@o(Ue>*xmF08%~yI|voz`zOlT-wG;hZYE@ z|0rHveeUo6ImPj8Ra@=i{BkDnembvg>mRt}Z`|*_i#+Cq-)amx{Qalief`v+w(GAM zQzRW7R=cit6_}99aQB_?gucUh>;`k=&Yn+WxUJh4Y;M%YIL+JVbJjhR$h8cQc7!c? z%{0gF#<$)Txy5$OJKibh_0PR=(q+=20M8=jSt?x4o>Kjw9*$UNSLP_cfjGeJLT}MS8%6?@bkbs|(eCh~>X= zZ7bYAMO~qO0bAr6FY902p><&~;cxeORUO`2Bc5_m`Zvqp{$pk**eU~;#{c4Gm(3Ho T_c!Yas5bP0l+XkKxaOt1 literal 0 HcmV?d00001 diff --git a/keepassxc-browser/icons/toolbar/icon_remember_red_lock.png b/keepassxc-browser/icons/toolbar/icon_remember_red_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..75d42ce1f8b201a12ae6c418104efdb3b863d068 GIT binary patch literal 1847 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFfz^z~Y=45>XQ2>tmIipR1RclAn~S zSCLx)lxJYDv9BmdOwLX%QAkQn&&;z`dcS+Wl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3 za#eP+Wr~u$9hXgo70`g()RIJnirk#MVyg;UC9t_xKsHENUr7P1q$Jx`DZ)2E!8yMu zRl!uxRL?-kj!VI&C?(A*$i)q+8OXC$$|xx*u+rBrFE7_CH`dE9O4m2Ew6xSWFw!?N z(gmu}Ew0QfNvzP#D^>;>0WrfRwK%ybv!En1KTiQQ?NYIsRz8p8Cv zVyO3l0ih3)(KpmH&_`Ad^cLJLD5@(G3$Q8n^~J9|Hy6eD;*y|L9L|ARP#jWOkg6Y) zTAW{6l$;7wu8i!y)QZeB*9f?s$(aR-dRYbfAYlyWC6)rC1sbj>eu1k7s(?5T6c$#V zxryniKB;->B^kC#hL&J!5fb5z$)&lec_p4Mwn{(|y_C!pD+5Oh7ZXbt7YkQo zLqkJXBPSyxM@v^%GeZLdGgm_kBP8vfdBr7(dC93T?U@Me&O~VUFUka_^28i$u5ffT zbuqGZbTKxtaCJ2@G_)``1#-=u%$&>(+zegZz^;IVzZEc)ihc7_Qh^=^3j+fZEC%F) z5~qR<)U&BYnPsUdZbkXI;3Nr-eybELK|qw{3K0F7Si*pyetmGJ(Ff%cq+A2aj9@Wf zZUkm)eR#eGa^NLHY96pSC<5mDx~ijf3=E7-na<7u#X;^)3ZAacW`>q#X1Ydth71fE z6H6!V_GWezXy1Q?2sOuE};v(B-zn+%J8?`2BuO`Pu5a z^cyStS&NSsq{4V}bp$>HU$uL`G4kWK>#IWl-r0XmpjT4s#;X?hP~Y=h{+z$BZ<=+~ z`q0}fBNI>O0>&oRrpNj6h4Dr*w zd%VgsS;yF1d!zRr;bw)&KLTc?H5InKNOyUrSS7i@KP=?rcd<|D5mRGA(|T>Jv{gJN zO}(e}WJ#4zQp}ebJtCE>|JVP{I>OH0byd3dL5DDI{XdVn7*{u zPflTrUVJHU_3sPH&tp&T*O5v;E%da*3|NA57I;J!Gca%qgD@k*tT__EDB|&SaSVxQ zeLKz8@34bNi@orY7{!$tN(Uv27!-u26ioLBcxK1A)Pu3SA)3YIpucNlTiOeu&Dpws z6Yi_84SQ{VPttaMjBJvh+S~Hq%{=4-Vf7Tz5XMIcNI3 z=b~%OI%8&6S6)1z&VO+6?t*CxY`1@VxZYXz=8Mn^{ujQp=I?uMa9sO);Jm7RYae_z z-)L$c=U3FTDrBL9rSx?PwMsL~KWhW@Zk%slAt3uABGF1@&4tL@H~Zd--(Kler>eGb nvut;QqX5f)*3>`iu7Bj+I=B4Dk)z^Cp!&|!)z4*}Q$iB}`oWgV literal 0 HcmV?d00001 diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index ccf6119..903b9ab 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -52,7 +52,7 @@ options.saveSettingsPromise = function() { }); }); }); -} +}; options.saveSetting = function(name) { const id = '#' + name; @@ -84,7 +84,7 @@ options.saveKeyRing = function() { options.initGeneralSettings = function() { $('#tab-general-settings input[type=checkbox]').each(function() { $(this).attr('checked', options.settings[$(this).attr('name')]); - if ($(this).attr('name') === 'defaultGroupAlwaysAsk' && $(this).attr('checked')) { + if ($(this).attr('name') === 'defaultGroupAlwaysAsk' && $(this).attr('checked')) { $('#defaultGroup').prop('disabled', true); $('#defaultGroupButton').prop('disabled', true); $('#defaultGroupButtonReset').prop('disabled', true); @@ -107,7 +107,7 @@ options.initGeneralSettings = function() { $('#defaultGroupButton').prop('disabled', false); $('#defaultGroupButtonReset').prop('disabled', false); } - } else if (name == 'automaticReconnect') { + } else if (name === 'automaticReconnect') { const message = updated.automaticReconnect ? 'enable_automatic_reconnect' : 'disable_automatic_reconnect'; browser.runtime.sendMessage({ action: message }); } @@ -253,12 +253,12 @@ options.initConnectedDatabases = function() { const trClone = $('#tab-connected-databases table tr.clone:first').clone(true); trClone.removeClass('clone'); - for (let hash in options.keyRing) { + for (const hash in options.keyRing) { const tr = trClone.clone(true); tr.data('hash', hash); tr.attr('id', 'tr-cd-' + hash); - $('a.dropdown-toggle:first img:first', tr).attr('src', '/icons/19x19/icon_normal_19x19.png'); + $('a.dropdown-toggle:first img:first', tr).attr('src', '/icons/toolbar/icon_normal.png'); tr.children('td:first').text(options.keyRing[hash].id); tr.children('td:eq(1)').text(options.getPartiallyHiddenKey(options.keyRing[hash].key)); @@ -448,7 +448,7 @@ options.initSitePreferences = function() { trClone.removeClass('clone'); let counter = 1; if (options.settings['sitePreferences']) { - for (let site of options.settings['sitePreferences']) { + for (const site of options.settings['sitePreferences']) { const tr = trClone.clone(true); tr.data('url', site.url); tr.attr('id', 'tr-scf' + counter); diff --git a/keepassxc-browser/popups/popup.js b/keepassxc-browser/popups/popup.js index 1447778..f6ce0a6 100644 --- a/keepassxc-browser/popups/popup.js +++ b/keepassxc-browser/popups/popup.js @@ -57,7 +57,7 @@ $(function() { $('#reopen-database-button').click(function() { browser.runtime.sendMessage({ action: 'get_status', - args: [ false, true ] // Set forcePopup to true + args: [ false, true ] // Set forcePopup to true }).then(statusResponse); }); diff --git a/keepassxc-browser/popups/popup_httpauth.js b/keepassxc-browser/popups/popup_httpauth.js index 5072079..04732cd 100644 --- a/keepassxc-browser/popups/popup_httpauth.js +++ b/keepassxc-browser/popups/popup_httpauth.js @@ -3,7 +3,7 @@ const getLoginData = function() { return new Promise((resolve, reject) => { browser.runtime.getBackgroundPage().then((global) => { - browser.tabs.query({'active': true, 'currentWindow': true}).then((tabs) => { + browser.tabs.query({ 'active': true, 'currentWindow': true }).then((tabs) => { resolve(global.page.tabs[tabs[0].id].loginList); }); }); diff --git a/keepassxc-browser/popups/popup_remember.js b/keepassxc-browser/popups/popup_remember.js index 37cddfa..c91ed57 100644 --- a/keepassxc-browser/popups/popup_remember.js +++ b/keepassxc-browser/popups/popup_remember.js @@ -161,8 +161,8 @@ function _initialize(tab) { .attr('class', 'list-group-item') .text(_tab.credentials.list[i].login + ' (' + _tab.credentials.list[i].name + ')') .data('entryId', i) - .click(function(e) { - e.preventDefault(); + .click(function(ev) { + ev.preventDefault(); const entryId = $(this).data('entryId'); // Use the current username if it's empty @@ -189,7 +189,7 @@ function _initialize(tab) { browser.runtime.sendMessage({ action: 'update_credentials', - args: [_tab.credentials.list[entryId].uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url] + args: [ _tab.credentials.list[entryId].uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url ] }).then(_verifyResult); }); }); @@ -277,7 +277,7 @@ const getDefaultGroup = function(groups, defaultGroup) { $(function() { browser.runtime.sendMessage({ action: 'stack_add', - args: [ 'icon_remember_red_background_19x19.png', 'popup_remember.html', 10, true, 0 ] + args: [ 'icon_remember_red_background.png', 'popup_remember.html', 10, true, 0 ] }); browser.runtime.sendMessage({ diff --git a/keepassxc-browser/translate.js b/keepassxc-browser/translate.js index 0d7062e..601b92b 100644 --- a/keepassxc-browser/translate.js +++ b/keepassxc-browser/translate.js @@ -5,7 +5,7 @@ for (const item of items) { let key = item.getAttribute('data-i18n'); if (key) { let attr = ''; - [ attr, key] = trAttribute(key); + [ attr, key ] = trAttribute(key); const placeholder = item.getAttribute('i18n-placeholder'); const translation = placeholder ? browser.i18n.getMessage(key, placeholder) : browser.i18n.getMessage(key); @@ -31,4 +31,4 @@ function trAttribute(key) { } return [ attr, key ]; -}; +} From 3111faf5d942bb893ac956663822fbe222c70fe3 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Sun, 21 Apr 2019 09:57:35 +0300 Subject: [PATCH 10/12] TIny fix for autocomplete.css --- keepassxc-browser/css/autocomplete.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/keepassxc-browser/css/autocomplete.css b/keepassxc-browser/css/autocomplete.css index fe5d99f..2fb788c 100644 --- a/keepassxc-browser/css/autocomplete.css +++ b/keepassxc-browser/css/autocomplete.css @@ -1,6 +1,5 @@ .kpxcAutocomplete-items { position: absolute !important; - border: 1px solid #d4d4d4; } .kpxcAutocomplete-items div { @@ -8,6 +7,8 @@ cursor: pointer; background-color: #fff; border-bottom: 1px solid #d4d4d4; + border-left: 1px solid #d4d4d4; + border-right: 1px solid #d4d4d4; width: auto; color: #000; font-size: .9em !important; @@ -16,4 +17,5 @@ .kpxcAutocomplete-active { background-color: #6cac4d !important; color: #ffffff !important; -} \ No newline at end of file + border: 0px !important; +} From a5cc7151fda85c557df9c9019bab23eb63457e8d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 21 Apr 2019 15:09:47 +0200 Subject: [PATCH 11/12] Update CHANGELOG --- CHANGELOG | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 183f711..d175b3f 100755 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +1.4.0 (21-04-2019) +========================= + - Add translations from Transifex + - Show HiDPI toolbar icon in Chrome [#471] + - Remove jQuery as a dependency [#128, #430] + - Fix ignored sites in Firefox [#458] + - Add "Show more" button for selecting arbitrary custom fields [#360] + 1.3.2 (11-01-2019) ========================= - Fix KeePassXC version check [#376] From 4cee8b1675172c9c9d0bfae450e37d8278aba34e Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 21 Apr 2019 15:14:10 +0200 Subject: [PATCH 12/12] Add languages from Transifex --- keepassxc-browser/_locales/cs/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/de/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/es/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/fi/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/fr/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/hu/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/it/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/ja/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/ko/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/la/messages.json | 850 ++++++++++++++++++ .../_locales/nl_NL/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/pl/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/pt/messages.json | 850 ++++++++++++++++++ .../_locales/pt_BR/messages.json | 850 ++++++++++++++++++ .../_locales/pt_PT/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/ru/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/sv/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/tr/messages.json | 850 ++++++++++++++++++ keepassxc-browser/_locales/uk/messages.json | 850 ++++++++++++++++++ .../_locales/zh_CN/messages.json | 850 ++++++++++++++++++ .../_locales/zh_TW/messages.json | 850 ++++++++++++++++++ 21 files changed, 17850 insertions(+) create mode 100644 keepassxc-browser/_locales/cs/messages.json create mode 100644 keepassxc-browser/_locales/de/messages.json create mode 100644 keepassxc-browser/_locales/es/messages.json create mode 100644 keepassxc-browser/_locales/fi/messages.json create mode 100644 keepassxc-browser/_locales/fr/messages.json create mode 100644 keepassxc-browser/_locales/hu/messages.json create mode 100644 keepassxc-browser/_locales/it/messages.json create mode 100644 keepassxc-browser/_locales/ja/messages.json create mode 100644 keepassxc-browser/_locales/ko/messages.json create mode 100644 keepassxc-browser/_locales/la/messages.json create mode 100644 keepassxc-browser/_locales/nl_NL/messages.json create mode 100644 keepassxc-browser/_locales/pl/messages.json create mode 100644 keepassxc-browser/_locales/pt/messages.json create mode 100644 keepassxc-browser/_locales/pt_BR/messages.json create mode 100644 keepassxc-browser/_locales/pt_PT/messages.json create mode 100644 keepassxc-browser/_locales/ru/messages.json create mode 100644 keepassxc-browser/_locales/sv/messages.json create mode 100644 keepassxc-browser/_locales/tr/messages.json create mode 100644 keepassxc-browser/_locales/uk/messages.json create mode 100644 keepassxc-browser/_locales/zh_CN/messages.json create mode 100644 keepassxc-browser/_locales/zh_TW/messages.json diff --git a/keepassxc-browser/_locales/cs/messages.json b/keepassxc-browser/_locales/cs/messages.json new file mode 100644 index 0000000..58c2190 --- /dev/null +++ b/keepassxc-browser/_locales/cs/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Napojení KeePassXC na moderní webové prohlížeče", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Vyplnit uživatelské jméno a heslo", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Vyplnit pouze heslo", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Vyplnit TOTP heslo", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Zobrazovat ikony pro vytváření hesla", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Uložit přihlašovací údaje", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Show password generator", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Přihlašovací údaje vytvoříte nebo upravíte kliknutím na ikonu rozšíření.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Zjištěno HTTP ověření s vícero přihlašovacími údaji. Klikněte na ikonu rozšíření a zvolte to správné.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Neznámá chyba.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Databáze není otevřená.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Neobdržen otisk databáze.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Nebyla obdržena veřejná část klíče klienta.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Zprávu se nedaří rozšifrovat.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Akce zrušena nebo odepřena.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Přiřazení KeePassXC se nezdařilo, zkuste to znovu.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Výměna klíče se nezdařila.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Šifrovací klíč není rozpoznán.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nenalezeny žádné uložené databáze.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Nesprávná akce.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Obdržena prázdná zpráva.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nebyla zadána URL adresa.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nenalezena žádná uživatelská jména.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Vytvořené heslo", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Vyplnit také následující kolonku hesla", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bitů", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Vytváření hesel", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Vytvořit", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Zkopírovat", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Vyplnit a zkopírovat", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Chyba:\nVytvořené heslo je delší než délka, která je možná!\nBylo zkráceno, aby se vešlo.\n\nZapamatujte se nové heslo!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Vytvořit heslo", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Nedaří se obdržet vytvořené heslo.
      Je KeePassXC spuštěné?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Zahodit", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Přeskočit", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Znovu", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Potvrdit", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Přihlašovací kolonky na této stránce už byly vybrány a budou přepsány.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Zahodit výběr", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Číslo kolonky řetězce", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Zvolte kolonku pro uživatelské jméno", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Zvolte kolonku pro heslo", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Potvrďte výběr", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Potvrďte svůj výběr nebo zvolte více kolonek jako Kolonky řetězců.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Uživatelské jméno", + "description": "General text for username." + }, + "password": { + "message": "Heslo", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- žádné uživatelské jméno -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Chyba:\nNenalezena žádná uživatelská jména.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Chyba:\nV KeePassXC nalezeno více než jedno uživateské jméno!\nKliknutím na ikonu KeePassXC-Browser zobrazíte další možnosti.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Chyba:\nPro dané uživatelské jméno nebyly nalezeny žádné přihlašovací údaje.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Chyba:\nNedaří se nalézt kolonky k vyplnění.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Chyba:\nNedaří se nalézt kolonku pro heslo.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Chyba:\nNedaří se zjistit změněné přihlašovací údaje.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC – vyskakovací okno", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Nastavení", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Zvolte uživatelsky určené přihlašovací kolonky pro tuto stránku", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Připojit", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Připojit znovu", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Znovu zjistit přihlašovací kolonky", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Načíst znovu", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Znovu otevřít databázi", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser se setkalo s chybou:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Používáte starou verzi KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Stáhněte si nejnovější verzi z keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Zjišťování stavu…", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser nebyl nastaven.\nKlikněte na připojit a spárujte s KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser byl odpojen od KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Kliknutím na tlačítko připojit znovu navážete nové připojení.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser ještě nebyl připojen ke KeePassXC, ale byl nastaven s použitím identifikátoru: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser je připojený ke KeePassXC a byl nastaven s použitím následujícího identifikátoru: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Uživatelské jméno nebo heslo se změnilo! Uložit?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Přihlašovací údaje budou uloženy v připojené databázi pod identifikátorem $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Následující uživatelské jméno v tuto chvíli není uloženo: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Přihlašovací údaje s použitým uživatelským jménem jsou vyznačeny tučně: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Vyberte přihlašovací údaje, které chcete aktualizovat.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Vyberte uživatelské jméno které chcete vyplnit do stránky.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtrovat:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Vyberte uživatelské jméno, kterým se chcete přihlásit.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Na této stránce byla nalezena více než jedna kolonka pro heslo. Klikněte do jedné z těchto kolonek pravým tlačítkem a zvolte jedno z:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL adrea:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Uživatelské jméno:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nové", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Aktualizovat", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Zahodit", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Na této stránce se už nikdy neptat", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Zavřít", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Zahodit a zobrazit výchozí dialog ověřování", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Nastavení | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Obecná nastavení", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Připojené databáze", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Uživatelsky určené přihlašovací kolonky", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Předvolby pro stránky", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "O aplikaci", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Obecné", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Připojené databáze", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Uživatelsky určené přihlašovací kolonky", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Předvolby pro stránky", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "O aplikaci", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Nastavit klávesové zkratky", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Uložit", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Připojit", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Odebrat", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Přidat", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Zjistit případné aktualizace", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Ano, odebrat", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Storno", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Vrátit na výchozí", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Doba blikání:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Posun přesměrování:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Nejvíce umožněno (počet) přesměrování:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Zapnout vytváření hesel.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Získávat přihlašovací údaje automaticky.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Položky s jediným přihlašovacím údajem vyplňovat automaticky.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Zapnout automatické dokončování v kolonkách pro uživatelské jméno.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Zobrazit oznámení.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Uložit pouze doménu.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Zobrazit oznámení pokud mohou být do databáze uložené nové přihlašovací údaje.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Automaticky vyplňovat HTTP Basic Auth dialogy a odesílat je.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Zjišťovat případné aktualizace KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "každé 3 dny", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "každý týden", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "každý měsíc", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nikdy", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Klávesové zkratky", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Jak nejdéle (ms) má ikona blikat po zjištění nových přihlašovacích údajů", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Nejkratší doba (ms) po kterou má ikona blikat před deaktivací z důvodu přesměrování stránky.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 pro použití pouze doby blikání a ignorování Přesměrování nejvýše (původní chování)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Kolik stránek by měl panel cyklovat po posunu přesměrování před vypnutím ikony", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Přidá do kolonky hesla tlačítko pro vytvoření nového hesla.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Hesla jsou vytvářena KeePassXC s použitím vašeho profilu vytváření hesel.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "Při aktivaci panelu KeePassXC-Browser obdrží přihlašovací údaje bezprostředně.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Pokud obdrží pouze jedinou položku, nechat KeePassXC-Browser automaticky vyplnit přihlašovací údaje.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Varování! Použití automatického vyplnění není bezpečné. Použijte pouze na vlastní nebezpečí.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Zobrazit rozbalovací seznam obsahující přihlašovací údaje, které jsou k dispozici, ve všech kolonkách pro uživatelské jméno, která se na stránce nacházejí.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Zobrazovat oznámení chyb a když je třeba interakce s uživatelem.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Při ukládání nových přihlašovacích údajů, uložit pouze doménu namísto úplné URL adresy.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Pokud jsou nalezeny přihlašovací údaje pro stránku a typ přihlášení je HTTP Basic Auth, KeePassXC-Browser se pokusí přihlásit pomocí prvního ze zadaných přihlašovacích údajů.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Dialog HTTP Basic Auth vypadá takto:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "Pro získávání přihlašovacích údajů KeePassXC-Browser potřebuje KeePassXC.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Nejnovější hotovou verzi si můžete stáhnout z $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Provozujete KeePassXC verze: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Nejnovější dostupná verze KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Výchozí: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Nekonečné: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Doporučeno: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Klávesová zkratka $1 byla úspěšně změněna.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Klávesová zkratka pro $1 byla resetována.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Chyba: Klávesová zkratka pro $1 nebyla změněna!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Ke KeePassXC-Browser jsou připojeny následující KeePassXC databáze.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nebyly nalezeny žádné připojené databáze.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Odebrat identifikátor ze seznamu databází?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Opravdu chcete následující identifikátor odebrat ze seznamu databází?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Databázi je možné kdykoli znovu připojit.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identifikátor", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Klíč", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Naposledy použito", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Vytvořeno", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Smazat", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL adresa stránky", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorovat", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Zjišťování pouze uživatelského jména", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Smazat", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Zapnout všechny funkce", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Vypnout nové/upravené přihlašovací údaje", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Vypnout všechny funkce", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nebyly nalezeny žádné uživatelsky určené kolonky přihlášení.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Pokud KeePassXC-Browser zjistí chybné přihlašovací kolonky, můžete ty správné určit sami.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Přejděte na stránku a klikněte na ikonu KeePassXC-Browser, pak vyberte", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Odebrat uložené uživatelsky určené přihlašovací kolonky?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Opravdu chcete odebrat uloženou uživatelsky určenou přihlašovací kolonku na stránce: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "Až tuto stránku navštívíte příště, KeePassXC-Browser automaticky zjistí přihlašovací kolonky.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nenalezeny žádné ignorované stránky.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Odebrat stránky?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Stránky na této stránce mají přiřazenou speciální obslužnou metodu.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Pro ignorování nových/upravených přihlašovacích údajů na konkrétních stránkách, přidejte je níže nebo klikněte na blikající ikonu KeePassXC-Browser a vyberte", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Pokud jsou stránky zcela ingorovány (Je vybráno Vypnout všechny funkce), pak zásuvný modul při navštívení takových stránek nebude dělat vůbec nic.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Zjišťování pouze uživatelského jména umožňuje KeePassXC-Browser vyplnit podrobnosti přihlášení na webech, které mají oddělené stránky pro uživatelské jméno a heslo.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Opravdu chcete dané stránky odebrat ze seznamu: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser zapne pro tyto stránky všechny funkce a odebere zjišťování pouze uživatelského jména.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Navštívit KeePassXC-Browser v katalogu doplňků pro prohlížeč Chrome.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Navštívit KeePassXC-Browser v katalogu doplňků pro prohlížeč Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Navštívit KeePassXC-Browser na portálu GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Verze KeePassXC-Browser: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Verze KeePassXC: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/de/messages.json b/keepassxc-browser/_locales/de/messages.json new file mode 100644 index 0000000..4a39a98 --- /dev/null +++ b/keepassxc-browser/_locales/de/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC-Integration für moderne Webbrowser", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Benutzername und Passwort ausfüllen", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Nur Passwort ausfüllen", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP ausfüllen", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Zeige Symbole für Passwortgenerator", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Anmeldedaten speichern", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Passwortgenerator anzeigen", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Erstellen oder ändern Sie die Anmeldedaten, indem Sie auf das Erweiterungssymbol klicken.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "HTTP-Authentifizierung mit mehreren Anmeldedaten erkannt. Klicken Sie auf das Erweiterungssymbol, um die richtigen auszuwählen.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Unbekannter Fehler.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Datenbank nicht geöffnet.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Datenbank-Hash nicht empfangen.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Öffentlicher Client-Schlüssel nicht erhalten.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Nachricht kann nicht entschlüsselt werden.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Die Verbindung zu KeePassXC ist nicht möglich. Überprüfen Sie, ob die Browser-Integration in den KeePassXC-Einstellungen aktiviert ist.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Aktion abgebrochen oder abgelehnt.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Die Nachrichtenverschlüsselung ist fehlgeschlagen. Läuft KeePassXC?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC-Verbindung ist fehlgeschlagen, versuchen Sie es erneut.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Schlüsselaustausch war nicht erfolgreich.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Verschlüsselungsschlüssel wird nicht erkannt.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Keine gespeicherten Datenbanken gefunden.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Falsche Aktion.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Leere Nachricht empfangen.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Keine URL angegeben.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Keine Anmeldungen gefunden.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Passwortgenerator-Symbol", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Generiertes Passwort", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Auch das nächste Passwortfeld ausfüllen", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Passwortgenerator", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Generieren", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Kopieren", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Ausfüllen und kopieren", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Fehler:\nDas generierte Passwort ist länger als die zulässige Länge!\nEs wurde auf die Länge abgeschnitten.\n\nBitte merken Sie sich das neue Passwort!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Passwort generieren", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Generiertes Passwort kann nicht empfangen werden.
      Wird KeePassXC ausgeführt?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Verwerfen", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Überspringen", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Mehr anzeigen", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Noch einmal", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Bestätigen", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Anmeldefelder für diese Seite sind bereits ausgewählt und werden überschrieben.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Auswahl aufheben", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Zeichenkettenfeld #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Wählen Sie ein Feld für den Benutzernamen aus", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Wählen Sie nun ein Passwortfeld aus", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Auswahl bestätigen", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Bitte bestätigen Sie Ihre Auswahl oder wählen Sie weitere Felder als Zeichenkettenfelder aus.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Sie können die Zahlen auch verwenden, um die Eingabefelder über die Tastatur auszuwählen.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Benutzername", + "description": "General text for username." + }, + "password": { + "message": "Passwort", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- kein Benutzername -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Fehler:\nKeine Anmeldungen gefunden.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Fehler:\nIn KeePassXC wurde mehr als eine Anmeldung gefunden!\nDrücken Sie auf das KeePassXC-Browser-Symbol für weitere Optionen.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Fehler:\nKeine Anmeldedaten für den angegebenen Benutzernamen gefunden.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Fehler:\nAuszufüllende Felder können nicht gefunden werden.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Fehler:\nPasswortfeld konnte nicht gefunden werden.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Fehler:\nGeänderte Anmeldedaten konnten nicht erkannt werden.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Einstellungen", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Benutzerdefinierte Anmeldefelder für diese Seite wählen", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Verbinden", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": " Wiederverbinden", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Anmeldefelder erneut erkennen", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Neu laden", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": " Datenbank erneut öffnen", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser hat einen Fehler festgestellt:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Sie verwenden eine alte Version von KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Bitte laden Sie die neueste Version von keepassxc.org herunter", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": " Status wird überprüft...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser wurde nicht konfiguriert. Drücken Sie auf die Schaltfläche Verbinden, um eine Verbindung mit KeePassXC herzustellen.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser wurde von KeePassXC getrennt.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Drücken Sie auf die Schaltfläche Wiederverbinden, um eine neue Verbindung herzustellen.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser wurde noch nicht mit KeePassXC verbunden, sondern über den Bezeichner konfiguriert: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser ist mit KeePassXC verbunden und wurde mit dem folgenden Bezeichner konfiguriert: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Benutzername oder Passwort geändert! Speichern?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Anmeldedaten werden in der verbundenen Datenbank mit dem Bezeichner $1 gespeichert.", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Der folgende Benutzername ist aktuell nicht gespeichert: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Die Anmeldedaten mit dem verwendeten Benutzernamen sind fett gedruckt: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Bitte wählen Sie die Anmeldedaten aus, die Sie aktualisieren möchten.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Bitte wählen Sie die Gruppe aus, zu der Sie die neuen Anmeldedaten hinzufügen möchten.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Fehler: Angegebene Standardgruppe nicht gefunden. Alle notwendigen Gruppen werden erstellt.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Neue Gruppe(n) können nicht erstellt werden.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Fehler: Anmeldedaten nicht aktualisiert. Das Passwort wurde nicht geändert.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Fehler: Anmeldedaten können nicht gespeichert oder aktualisiert werden.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Wählen Sie die Anmeldeinformationen aus, die Sie auf der Seite eingeben möchten.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filter:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Wählen Sie die Anmeldeinformationen aus, mit denen Sie sich anmelden möchten.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Auf dieser Seite wurde mehr als ein Passwortfeld gefunden. Klicken Sie mit der rechten Maustaste auf eines der Passwortfelder und wählen Sie eines der folgenden aus:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Benutzername: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": " Neu", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": " Aktualisieren", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Verwerfen", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Für diese Seite nie fragen", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Schließen", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": " Verwerfen und Standard-Authentifizierungsdialog anzeigen", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Einstellungen | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Allgemeine Einstellungen", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Verbundene Datenbanken", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Benutzerdefinierte Anmeldefelder", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Seiteneinstellungen", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Über", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Allgemein", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Verbundene Datenbanken", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Benutzerdefinierte Anmeldefelder", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Seiteneinstellungen", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Über", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Tastaturkürzel konfigurieren", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": " Speichern", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Verbinden", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": " Entfernen", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": " Hinzufügen", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": " Nach Aktualisierungen suchen", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Ja, jetzt entfernen", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": " Abbrechen", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Zurücksetzen", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Blinkzeit:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Umleitungswartezeit:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximale (Anzahl der) Umleitungen:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Standardgruppe zum Speichern neuer Passwörter:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Trennen Sie die Gruppe durch Schrägstriche, zum Beispiel: Gruppe/KinderGruppe.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Immer nachfragen, wo neue Anmeldedaten gespeichert werden sollen", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Wenn aktiviert, zeigt das Popup eine Gruppenauflistung an.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Passwortgenerator aktivieren.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Anmeldedaten automatisch abrufen.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Einträge mit einzelnen Anmeldedaten automatisch ausfüllen.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Autovervollständigung für Benutzernamensfelder aktivieren.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Benachrichtigungen anzeigen.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Nur Domain speichern.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Benachrichtigung anzeigen, wenn neue Anmeldedaten in der Datenbank gespeichert werden können.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "HTTP-Basisauthentifizierungsdialoge automatisch ausfüllen und absenden.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Nach Aktualisierungen von KeePassXC suchen:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": " alle 3 Tage", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "wöchentlich", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "monatlich", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": " nie", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Tastaturkürzel", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maximale Zeit (ms), in der das Symbol nach dem Erkennen neuer Anmeldedaten blinken sollte", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimale Zeit (ms), in der das Symbol blinken sollte, bevor es aufgrund von Seitenumleitungen deaktiviert wird.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1, um nur die Blinkzeit zu verwenden und die maximalen Umleitungen zu ignorieren (altes Verhalten).", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Wie viele Weiterleitungsseiten der Tab durchlaufen darf, bevor das Icon deaktiviert wird", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Fügt den Passwortfeldern eine Schaltfläche zum Generieren eines neuen Passworts hinzu.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Passwörter werden von KeePassXC mit Hilfe Ihres Passwortgenerierungsprofils generiert.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser ruft Anmeldedaten sofort ab, wenn ein Tab aktiviert wird.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Anmeldedaten von KeePassXC-Browser automatisch ausfüllen lassen, wenn er nur einen einzigen Eintrag erhält.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Warnung! Verwendung von Autoausfüllen ist nicht sicher. Benutzung auf eigene Gefahr.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Eine Dropdown-Liste mit verfügbaren Anmeldedaten für alle Benutzernamensfelder auf einer Seite anzeigen.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Benachrichtigungen bei Fehlern, und wenn Benutzerinteraktion erforderlich ist, anzeigen.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Beim Speichern neuer Anmeldedaten nur die Domain anstatt der vollständigen URL speichern.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "KeePassXC-Browser versucht sich mit den ersten angegebenen Anmeldedaten anzumelden, wenn Anmeldedaten für eine Seite gefunden werden und der Anmeldetyp eine HTTP-Basisauthentifizierungsanfrage ist.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Ein HTTP-Basisauthentifizierungsdialog sieht wie folgt aus:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser benötigt KeePassXC, um Anmeldedaten abzurufen.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Sie können die neueste stabile Version von $1 herunterladen.", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Sie verwenden die KeePassXC-Version: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Neueste verfügbare Version von KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Standard: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Unendlich: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Empfohlen: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Das Tastaturkürzel für $1 wurde geändert.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Das Tastaturkürzel für $1 wurde auf Standard zurückgesetzt.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Fehler: Tastaturkürzel für $1 wurde nicht geändert!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Die folgenden KeePassXC-Datenbanken sind mit dem KeePassXC-Browser verbunden.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Keine verbundenen Datenbanken gefunden.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Bezeichner aus Datenbankliste entfernen?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Möchten Sie wirklich den folgenden Bezeichner aus der Datenbankliste entfernen?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Sie können Ihre Datenbank jederzeit wieder verbinden.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Bezeichner", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Schlüssel", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Zuletzt verwendet", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Erstellt", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Löschen", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Seiten-URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorieren", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Reine Benutzernamenerkennung", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Löschen", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Alle Funktionen aktivieren", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Neue/geänderte Anmeldedaten deaktivieren", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Alle Funktionen deaktivieren", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Keine gespeicherten benutzerdefinierten Anmeldefelder gefunden.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Sie können gespeicherte benutzerdefinierte Anmeldefelder anhand der folgenden Tabelle verwalten.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Wenn KeePassXC-Browser die falschen Anmeldefelder erkennt, können Sie die richtigen Felder selbst angeben.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Gehen Sie auf die Seite und klicken Sie auf das Symbol KeePassXC-Browser, und wählen Sie anschließend", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Gespeicherte benutzerdefinierte Anmeldefelder entfernen?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Möchten Sie die gespeicherten benutzerdefinierten Anmeldefelder wirklich entfernen auf der Seite: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser wird die Anmeldefelder beim nächsten Besuch dieser Seite automatisch erkennen.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Keine ignorierten Seiten gefunden.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Seite entfernen?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Webseiten auf dieser Seite haben spezielle Handhabungsmethoden, die mit ihnen verknüpft sind.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Um neue/geänderte Anmeldedaten auf einer bestimmten Webseite zu ignorieren, fügen Sie sie unten hinzu oder klicken Sie auf das blinkende KeePassXC-Browser-Symbol und wählen Sie", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Wenn eine Webseite vollständig ignoriert wird (Alle Funktionen deaktivieren ist ausgewählt), dann wird das Plugin beim Besuch dieser Webseite nichts tun.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Die reine Benutzernamenerkennung ermöglicht es dem KeePassXC-Browser, Zugangsdaten auf Webseiten mit separaten Seiten für Benutzername und Passwort einzugeben.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "URL manuell hinzufügen", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Möchten Sie die angegebene Webseite wirklich aus der Liste entfernen: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser aktiviert alle Funktionen dieser Webseite und entfernt die reine Benutzernamenerkennung.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Sie können gespeicherte Seiteneinstellungen anhand der folgenden Tabelle verwalten.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option zum Ignorieren von Erweiterungsfunktionen für die Seite.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "KeePassXC-Browser im Chrome Web Store besuchen.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "KeePassXC-Browser im Mozilla Add-ons-Verzeichnis besuchen.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "KeePassXC-Browser auf GitHub besuchen.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser-Version: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC-Version: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Beitragende", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Lizenzen", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Fehler melden", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Neues Thema auf GitHub erstellen", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Die folgenden Debug-Informationen können verwendet werden", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Ungültiger Wert. Bitte die Eingabe überprüfen.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Ungültige URL. Bitte die Eingabe überprüfen.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Der Wert ist bereits in der Liste vorhanden.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Öffnet einen neuen Tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP-Basisauthentifizierungs-Dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/es/messages.json b/keepassxc-browser/_locales/es/messages.json new file mode 100644 index 0000000..d52d070 --- /dev/null +++ b/keepassxc-browser/_locales/es/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Integración de KeePassXC para navegadores web modernos.", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Llene nombre de Usuario y Contraseña", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Sólo llenar contraseña", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Llenar TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Mostrar Iconos del Generador de Contraseñas", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Guardar credenciales", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Mostrar generador de contraseña", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Crear o modificar las credenciales haciendo clic en el icono de la extensión.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Autenticación HTTP con múltiples credenciales detectadas. Haga clic en el icono de la extensión de elegir la correcta.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Error desconocido.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Base de datos no abierta.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "No se ha recibido el hash de la base de datos.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Clave pública del cliente no recibida.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "No se puede descifrar el mensaje.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "No se puede conectar a KeePassXC. Compruebe que la integración del navegador esté habilitada en la configuración de KeePassXC.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Acción cancelada o denegada.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "El cifrado del mensaje falló. ¿Se está ejecutando KeePassXC?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Asociación de KeePassXC fallida, inténtelo de nuevo.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Intercambio de claves no tuvo éxito.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "La clave de cifrado no es reconocida.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "No se encontraron bases de datos guardadas.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Acción incorrecta.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Mensaje en blanco recibido.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "No se ha proporcionado ninguna URL.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "No se encontraron inicios de sesión.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Iconos del generador de contraseña", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Contraseña generada", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "También rellenar el siguiente campo de contraseña", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Generador de Contraseñas", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Generar", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copiar", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Llenar y copiar", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Error:\nLa contraseña generada es más larga que la longitud permitida!\nSe ha cortado para adaptarse a la longitud.\n\nPor favor, recuerde la nueva contraseña!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Generar contraseña", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "No se puede recibir la contraseña generada.
      ¿Se está ejecutando KeePassXC?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Descartar", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Saltear", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Mostrar más", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Otra vez", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirmar", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Los campos de inicio de sesión para esta página ya están seleccionados y se sobrescribirán.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Descartar selección", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campo de cadena #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Elija un campo de nombre de usuario", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Ahopra elija un campo de contraseña", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirme su elección", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Por favor confirme su selección o elija más campos como Campos de cadena.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "También puede utilizar los números para elegir los campos de entrada desde el teclado.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nombre de usuario", + "description": "General text for username." + }, + "password": { + "message": "Contraseña", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- Sin nombre de usuario -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Error:\nNo se encontraron inicios de sesión.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Error:\n¡Se encontró más de un inicio de sesión en KeePassXC!\nPresiona el ícono del KeePassXC-Browser para más opciones.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Error:\nNo se encontraron credenciales para el nombre de usuario dado.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Error:\nNo se pueden encontrar campos para rellenar.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Error:\nNo se puede encontrar un campo de contraseña.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Error:\nNo se pudieron detectar las credenciales cambiadas.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Emergente", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Configuración", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Elija campos de inicio de sesión personalizados para esta página", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Conectar", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconectar", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Redetectar campos de inicio de sesión", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Recargar", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Reabrir la base de datos", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser ha encontrado un error:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Utiliza una versión antigua de KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Por favor descargue la última versión de keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Comprobando estado...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser no ha sido configurado. Presione el botón de conexión para emparejar con KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser se ha desconectado de KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Presione el botón de reconexión para establecer una nueva conexión.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser aún no se ha conectado a KeePassXC pero se ha configurado utilizando el identificador:$1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser está conectado a KeePassXC y se ha configurado utilizando el siguiente identificador: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Nombre de usuario o contraseña cambiado! Lo guarda?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Las credenciales se guardarán en la base de datos conectada con el identificador $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "El siguiente nombre de usuario no está guardado actualmente: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Las credenciales con el nombre de usuario utilizado están marcadas en negrita: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Por favor, elija las credenciales que desea actualizar.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Elija el grupo al que desea agregar las nuevas credenciales.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: No se ha encontrado el grupo predeterminado especificado. Creando todos los grupos necesarios.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "No se puede(n) crear nuevo(s) grupo(s).", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credenciales no actualizadas. La contraseña no ha sido cambiada.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: las credenciales no se pueden guardar o actualizar.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Seleccione la información de inicio de sesión que desea que se ingrese en la página.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtro:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Seleccione la información de inicio de sesión con la que desea iniciar sesión.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Más de un campo de contraseña encontrado en esta página. Haga clic con el botón derecho en uno de los campos de contraseña y elija uno de los siguientes:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nombre de usuario:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nuevo", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Actualizar", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Descartar", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Nunca preguntar para esta página", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Cerrar", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Descartar y mostrar el diálogo de autenticación predeterminado", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Configuración | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Configuración general", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bases de datos conectadas", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Campos de inicio de sesión personalizados", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Preferencias de sitio", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Acerca de", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "General", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bases de datos conectadas", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campos de inicio de sesión personalizados", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Preferencias de sitio", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Acerca de", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": " Configurar atajos de teclado", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Guardar", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Conectar", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Quitar", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Añadir", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Buscar actualizaciones", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Sí, eliminar ahora", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Cancelar", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Resetear", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tiempo de parpadeo:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Desplazamiento de redirección:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Máximo (número de) Redirecciones:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Grupo predeterminado para guardar nuevas contraseñas:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separe el grupo con barras diagonales, por ejemplo: Grupo/GrupoHijo.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Siempre preguntar dónde guardar nuevas credenciales.", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Cuando está habilitado, la ventana emergente muestra una lista de grupo.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Activar generador de contraseñas.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Recuperar automáticamente las credenciales.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Rellenar automáticamente las entradas de una sola credencial.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Activar autocompletar para los campos de nombre de usuario.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Mostrar notificaciones.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Salvar el dominio únicamente.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Mostrar una notificación cuando las nuevas credenciales se pueden guardar en la base de datos.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Rellene automáticamente los cuadros de diálogo de autenticación básica de HTTP y envíelos.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Compruebe si hay actualizaciones de KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "cada 3 días", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "cada semana", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "cada mes", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nunca", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Atajos de teclado", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Tiempo máximo (ms) que el icono debe parpadear después de detectar nuevas credenciales", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Tiempo mínimo (ms) para que el icono parpadee antes de desactivarse debido a los redireccionamientos de página.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 para usar solo el tiempo de parpadeo ignorando redireccionamientos máximos (comportamiento anterior)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "¿Cuántas páginas debe recorrer la pestaña después del desvío de redireccionamiento antes de desactivar el icono?", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Añade un botón a los campos de contraseña para generar una nueva contraseña.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "KeePassXC genera las contraseñas utilizando su perfil de generación de contraseñas.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser recuperará inmediatamente las credenciales cuando se active una pestaña.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Permitir que KeePassXC-Browser complete las credenciales automáticamente si recibe solo una entrada.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "¡Advertencia! El uso de autocompletar no es seguro. Úselo bajo su propio riesgo.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Muestre una lista desplegable que contenga las credenciales disponibles para todos los campos de nombre de usuario en una página.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Mostrar notificaciones de errores y cuándo es necesaria la interacción del usuario.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Al guardar nuevas credenciales, guarde solo el dominio en lugar de la URL completa.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Si se encuentran credenciales para una página y el tipo de inicio de sesión es una solicitud de Autenticación Básica HTTP, KeePassXC-Browser intenta iniciar sesión con las primeras credenciales dadas.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Un diálogo de Autenticación Básica de HTTP se ve así:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser necesita KeePassXC para recuperar credenciales.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "You can download the latest stable version from $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Está ejecutando la versión KeePassXC: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Última versión disponible de KeePassXC:$1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Por defecto: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinito: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Recomendado: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "El acceso directo para $1 ha sido cambiado con éxito.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Acceso directo para $1 se ha restablecido.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Error: Acceso directo para $1 no ha cambiado!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Las siguientes bases de datos KeePassXC están conectadas a KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "No se encontraron bases de datos conectadas.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "¿Desea eliminar el identificador de la lista de base de datos?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "¿Realmente desea eliminar el siguiente identificador de la lista de la base de datos?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Puede volver a conectar su base de datos en cualquier momento.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificador", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Clave", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Usado por última vez", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Creado", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Eliminar", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL de la página", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorar", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Detección por nombre de usuario únicamente", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Eliminar", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Habilitar todas las características", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Desactivar credenciales nuevas/modificadas", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Desactivar todas las características", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "No se encontraron campos de inicio de sesión personalizado.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Puede administrar los campos de inicio de sesión personalizados guardados utilizando la tabla a continuación.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Si KeePassXC-Browser detecta los campos de inicio de sesión incorrectos, usted mismo puede especificar los campos correctos.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Vaya a la página y haga clic en el icono de KeePassXC-Browser, luego seleccione", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "¿Quitar campos de inicio de sesión personalizados?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "¿Realmente desea eliminar los campos de inicio de sesión personalizados guardados en la página: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser detectará automáticamente los campos de inicio de sesión la próxima vez que visite esta página.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "No se encontraron sitios ignorados.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "¿Eliminar el sitio?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Los sitios en esta página tienen métodos de manejo especiales asociados con ellos.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Para ignorar las credenciales nuevas/modificadas en un sitio específico, agréguelas a continuación o haga clic en el icono parpadeante de KeePassXC-Browser y seleccione", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Si un sitio se ignora por completo (Desactivar todas las funciones es seleccionado), entonces el complemento no hará nada cuando visite ese sitio.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "La detección solo-nombre de usuario permite que KeePassXC-Browser complete los detalles de inicio de sesión en los sitios web con páginas separadas para el nombre de usuario y la contraseña.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Añadir URL manualmente", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "¿Realmente desea eliminar el sitio especificado de la lista: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser habilitará todas las funciones de este sitio y eliminará la detección solo-nombre de usuario.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Puede administrar las preferencias del sitio guardado usando la tabla a continuación.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Opción para ignorar las características de extensión de la página.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Visite KeePassXC-Browser en Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Visite KeePassXC-Browser en el directorio Add-Ons de Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Visite KeePassXC-Browser en GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Versión de KeePassXC-Browser: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC Versión: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Colaboradores", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licencias", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Informar errores", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Crear un nuevo asunto en GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "La siguiente información de depuración puede ser utilizada", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Valor no válido. Por favor, verifique la entrada.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "URL no válida. Por favor, verifique la entrada.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "El valor ya existe en la lista.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Se abre una nueva pestaña", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "Cuadro de diálogo de autenticación básica HTTP", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/fi/messages.json b/keepassxc-browser/_locales/fi/messages.json new file mode 100644 index 0000000..f7552e1 --- /dev/null +++ b/keepassxc-browser/_locales/fi/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC-integraatio moderneille nettiselaimille", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Täytä käyttäjänimi ja salasana", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Täytä salasana", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Täytä TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Näytä salasanageneraattorin ikonit", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Tallenna tilitiedot", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Näytä salasanageneraattori", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Luo tai muokkaa tilitietoja klikkaamalla selainlaajennuksen ikonia.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Havaittiin useita tilitietoja HTTP-autentikaation yhteydessä. Klikkaa selainlaajennuksen ikonia valitaksesi oikeat tunnukset.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Tuntematon virhe.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Tietokanta ei ole avattu.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Tietokannan tiivistettä (hash) ei saatu.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Asiakkaan julkista avainta ei saatu.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Viestin salauksen purkaminen ei onnistu.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "KeePassXC:hen ei voitu yhdistää. Tarkista onko selainintegraatio päällä KeePassXC:n asetuksissa.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Toiminto peruttiin tai estettiin.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Viestin salaus epäonnistui. Onko KeePassXC käynnissä?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Liittäminen KeePassXC:hen epäonnistui, yritä uudelleen.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Avainten vaihto ei onnistunut.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Salausavainta ei tunnistettu.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Tallennettuja tietokantoja ei löytynyt.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Virheellinen toiminto.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Vastaanotettiin tyhjä viesti.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Sivuston osoitetta ei ole annettu.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Tunnuksia ei löydy.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Salasalageneraattorin ikoni", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Luotu salasana", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Täytä myös seuraava salasanakenttä", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bittiä", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Salasanageneraattori", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Luo", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Kopioi", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Täytä ja kopioi", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Virhe:\nLuotu salasana on sallittua pidempi!\nSalasana on leikattu sopivan pituiseksi.\n\nMuista uusi salasana!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Luo salasana", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Salasanaa ei voitu luoda.
      Onko KeePassXC käynnissä?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Poistu", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Ohita", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Näytä lisää", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Uudestaan", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Vahvista", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Tunnuksien kentät tälle sivustolle ovat jo valittu, ja ne ylikirjoitetaan.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Hylkää valinta", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Lisämerkkijonokenttä #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Valitse käyttäjänimen kenttä", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Valitse salasanan kenttä", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Vahvista valinta", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Vahvista valintasi tai merkitse lisää kenttiä lisämerkkijonokentiksi.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Voit myös valita kenttiä käyttämällä näppäimistön numeroita.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Käyttäjänimi", + "description": "General text for username." + }, + "password": { + "message": "Salasana", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- ei käyttäjänimeä -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Virhe:\nTunnuksia ei löydy.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Virhe:\nKeePassXC löysi useampia tilitietoja!\nPaina selainlaajennuksen ikonia nähdäksesi lisävalinnat.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Virhe:\nTunnuksia annetulle käyttäjänimelle ei löydy.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Virhe:\nTäytön tarvitsemia kenttiä ei löydy.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Virhe:\nSalasanakenttää ei löytynyt.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Virhe:\nTilitietojen muutoksia ei havaittu.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Ponnahdusikkuna", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Asetukset", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Valitse sivustolle mukautetut tunnuskentät", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Yhdistä", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Yhdistä uudelleen", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Tunnista tunnuskentät uudelleen", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Lataa uudelleen", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Avaa tietokanta uudelleen", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser havaitsi virheen:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Käytät KeePassXC:n vanhaa versiota.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Lataa uusin versio osoitteesta keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Haetaan tilaa...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser ei ole yhdistetty. Paina Yhdistä liittääksesi selainlaajennuksen KeePassXC:hen.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser on katkaissut yhteyden KeePassXC:hen.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Paina Yhdistä uudelleen avataksesi uuden yhteyden.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser ei ole vielä yhdistetty KeePassXC:hen, mutta on asetettu käyttämään tunnistetta: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser on yhdistetty KeePassXC:hen käyttäen tunnistetta: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Käyttäjänimi tai salasana on muuttunut! Tallenna?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Tilitiedot tallennetaan yhdistettyyn tietokantaan tunnisteella $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Käyttäjänimi ei ole tällä hetkellä tallennettu: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Tilitiedot tämän hetkisellä käyttäjänimellä on lihavoitu: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Valitse tilitiedot jotka haluat päivittää.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Valitse ryhmä johon haluat tallentaa uuden tietueen.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Virhe: Asetettua oletusryhmää ei löytynyt. Luodaan tarvittavat ryhmät.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Uusia ryhmiä ei voitu luoda.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Virhe: Tietueita ei päivitetty. Salasana ei ole muuttunut.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Virhe: Tietueita ei voitu tallentaa tai päivittää.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Valitse tunnukset jotka haluat täyttää sivulle.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Suodata:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Valitse tunnukset joilla haluat kirjautua.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Sivustolta löytyy useampi salasanakenttä. Klikkaa oikealla hiiren napilla salasanakenttää ja valitse yksi seuraavista:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Käyttäjänimi:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Uusi", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Päivitä", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Poistu", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Älä kysy koskaan tälle sivustolle", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Sulje", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Poistu ja näytä autentikaation oletusdialogi", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Asetukset | KeePassXC-Browser ", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Yleiset asetukset", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Yhdistetyt tietokannat", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Mukautetut tunnuskentät", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Sivustojen asetukset", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Tietoja", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Yleiset", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Yhdistetyt tietokannat", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Mukautetut tunnuskentät", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Sivustojen asetukset", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Tietoja", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Muokkaa näppäinoikoteitä", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Tallenna", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Yhdistä", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Poista", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Lisää", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Tarkista päivitykset", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Kyllä, poista", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Peruuta", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Palauta oletus", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Vilkkumisaika:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Uudelleenohjauksien määrä:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Uudelleenohjauksien maksimimäärä:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Oletusryhmä johon uudet salasanat tallennetaan:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Erota ryhmät vinoviivalla, esimerkiksi: Ryhmä/AlaRyhmä.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Kysy aina minne uudet tietueet tallennetaan.", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Kun tämä on asetettu, ponnahdusikkuna näyttää ryhmälistauksen.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Aktivoi salasanageneraattori.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Hae tilitiedot automaattisesti.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Täytä yhden tilitiedon sisältävät tietueet automaattisesti.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Aktivoi käyttäjänimikenttien valikko.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Näytä ilmoitukset.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Tallenna vain verkkotunnus.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Näytä ilmoitus, kun uusia tilitietoja voidaan tallettaa tietokantaan.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Täytä HTTP-autentikaation dialogit automaattisesti.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Tarkista KeePassXC:n päivitykset:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "joka kolmas päivä", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "joka viikko", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "joka kuukausi", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "ei koskaan", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Pikanäppäimet", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maksimiaika (millisekunteina) jonka ikoni vilkkuu, kun uusia tilitietoja havaitaan", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimiaika (millisekunteja) jonka ikoni vilkkuu sivun uudelleenohjauksen jälkeen.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 käyttää vain vilkkumisaikaa hyläten uudelleenohjauksien maksimimäärän", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Kuinka monta sivun latausta sallitaan ennen kuin ikonin vilkkuminen lakkaa", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Lisää ikonin salasanakenttien loppuun uuden salasanan luomista varten.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Salasanat luodaan käyttäen KeePassXC:n salasanageneraattorin asetuksia.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser hakee tilitiedot heti kun välilehti on aktivoitu.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Sallii KeePassXC-Browser:in täyttää tilitiedot automaattisesti, jos tietueessa on niitä vain yksi.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Varoitus! Automaattisen täytön käyttö ei ole turvallista. Käytä omalla vastuulla.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Näyttää pudotusvalikon käyttäjänimikentässä kaikista saatavilla olevista tilitiedoista kyseiselle sivulle.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Näyttää ilmoituksen virheistä, ja tilanteista jolloin käyttäjältä vaaditaan toimia.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Uusia tilitietoja tallentaessa tallenna vain verkkotunnus koko osoitteen sijasta.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Jos HTTP-autentikaatiota vaativalle sivustolle löydetään tilitiedot, KeePassXC-Browser yrittää automaattisesti kirjautua niitä käyttäen.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "HTTP-autentikaatiodialogi näyttää tältä:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser tarvitsee KeePassXC:tä hakeakseen tilitietoja.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Voit ladata viimeisimmän vakaan version osoitteesta $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Käytät KeePassXC:n versiota: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Viimeisin saatavilla oleva KeePassXC:n versio: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Oletus: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Ääretön: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Suositeltu: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Näppäinoikotie toiminnolle $1 on muutettu.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Näppäinoikotie toiminnolle $1 on palautettu oletusasetukseen.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Virhe: Näppäinoikotietä toiminnolle $1 ei pystytty muuttamaan!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Seuraavat KeePassXC:n tietokannat ovat yhdistettynä selainlaajennukseen.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Yhdistettyjä tietokantoja ei löytynyt.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Poista tunniste tietokantalistasta?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Haluatko poistaa kyseisen tunnisteen tietokantalistasta?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Voit yhdistää tietokannan myöhemmin uudelleen.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Tunniste", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Avain", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Viimeksi käytetty", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Luotu", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Poista", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Sivun URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Älä huomioi", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Pelkän käyttäjänimikentän tunnistus", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Poista", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Käytä kaikkia ominaisuuksia", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Poista uusien/muokattujen tilitietojen tunnistus käytöstä", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Poista kaikki ominaisuudet käytöstä", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Mukautettuja tunnuskenttiä ei ole tallennettu.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Voit hallita tallennettuja mukautettuja tunnuskenttiä käyttämällä alla olevaa taulukkoa.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Jos KeePassXC-Browser tunnistaa sivustolla väärät tunnuskentät, voit valita oikeat kentät itse.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Mene sivustolle ja klikkaa KeePassXC-Browser:in ikonia, valitse sitten", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Poista tallennetut mukautetut tunnuskentät?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Haluatko poistaa mukautetut tunnuskentät sivulta: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser tunnistaa tunnuskentät automaattisesti seuraavan kerran, kun vierailet sivulla.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Hyljättyjä sivustoja ei löydetty.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Poista sivusto?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Tällä sivulla mainitut sivustot vaativat mukautettuja asetuksia.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Poistaaksesi uusien/muokattujen tilitietojen tunnistuksen käytöstä tietyllä sivulla, lisää sivusto alle tai käytä KeePassXC-Browserin ponnahdusikkunaa ja valitse", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Jos sivusto on täysin estetty (Poista kaikki ominaisuudet käytöstä on valittu), selainlaajennusta ei käytetä lainkaan sille sivustolle.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Pelkän käyttäjänimikentän tunnistus mahdollistaa KeePassXC-Browser:in käytön sivustoilla joissa käyttäjänimi- ja salasanakenttä on jaoteltu eri sivuille.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Lisää URL manuaalisesti", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Haluatko poistaa listalta sivuston: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser käyttää tällä sivustolla kaikkia ominaisuuksia ja poistaa pelkän käyttäjänimikentän tunnistuksen käytöstä.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Voit hallita tallennettuja sivustojen asetuksia käyttämällä alla olevaa taulukkoa.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Asetus jonka kautta selainlaajennuksen ominaisuuksia voidaan rajoittaa sivustolle.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "KeePassXC-Browser Chrome Web Storessa.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "KeePassXC-Browser Mozillan Add-ons -sivustolla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "KeePassXC-Browser GitHubissa.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser:in versio: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC:n versio: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Osallistujat", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Lisenssit", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Raportoi virheestä", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Luo uusi virheraportti GitHubissa", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Voit käyttää seuraavia vianjäljitystietoja", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Väärä arvo. Tarkista kenttä.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Väärä URL. Tarkista kenttä.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Arvo on jo listassa.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Avaa uuden välilehden", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic -autentikaatiodialogi", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/fr/messages.json b/keepassxc-browser/_locales/fr/messages.json new file mode 100644 index 0000000..6c8c103 --- /dev/null +++ b/keepassxc-browser/_locales/fr/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Intégration de KeePassXC pour les navigateurs Web modernes", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Saisir nom d’utilisateur et mot de passe", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Saisir le mot de passe seulement", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Remplir TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Afficher les icônes du générateur de mots de passe", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Enregistrer les identifiants.", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Show password generator", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Créez ou modifiez les identifiants en cliquant sur l'icône de l'extension.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Authentification HTTP avec plusieurs identifiants détectée. Cliquer sur l'icône de l’extension afin de choisir le bon.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Erreur inconnue.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "La base de données n’est pas ouverte.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Empreinte numérique de la base de données non reçue.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Clé publique du client non reçue.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Impossible de déchiffrer le message.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Action annulée ou non-autorisée.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "L’association avec KeePassXC a échoué, veuillez ressayer.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "L'échange de clé a échoué.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Clé de chiffrement non reconnue.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Aucune base de données enregistrée n'a été trouvée.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Action incorrecte.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Message vide reçu.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Aucune URL fournie.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Aucun identifiant trouvé.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Mot de passe généré", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Remplir également le prochain champ de mot de passe", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Générateur de mots de passe", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Générer", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copier", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Saisir et copier", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Erreur:\nLe mot de passe généré est plus long que la longueur autorisée !\nIl a été tronqué à la longueur maximale.\n\nVeuillez vous souvenir du nouveau mot de passe !", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Générer un mot de passe", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Impossible de recevoir le mot de passe généré.
      Est-ce que KeePassXC est en cours d'exécution ?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Fermer", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Ignorer", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "A nouveau", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirmer", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Les champs d'identification de la page ont déjà été sélectionnés et seront écrasés.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Abandonner la sélection", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Champ de type chaîne de caractères #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Choisir un champ pour le nom d'utilisateur", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Choisir maintenant un champ pour le mot de passe", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirmer la sélection", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Veuillez confirmer votre sélection ou choisir d'autres champs de type chaîne de caractères.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nom d’utilisateur", + "description": "General text for username." + }, + "password": { + "message": "Mot de passe", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- aucun nom d’utilisateur -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Erreur :\nAucun identifiant trouvé.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Erreur:\nPlus d'un identifiant a été trouvé dans KeePassXC !\nAppuyez sur l'icône de KeePassXC-Browser pour plus d'options.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Erreur :\nAucun identifiant trouvé pour le nom d'utilisateur donné.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Erreur:\nImpossible de trouver des champs à remplir.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Erreur:\nImpossible de trouver un champ de mot de passe.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Erreur:\nN'a pas pu détecter les identifiants modifiés.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": " Paramètres", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Choisir des champs d'identification personnalisés pour cette page", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Connecter", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconnecter", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Redétecter les champs d'identification", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Recharger", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Réouvrir la base de données", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser a rencontré une erreur :", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Vous utilisez une ancienne version de KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Veuillez télécharger la dernière version depuis keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Vérification du statut ...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser n'est pas configuré. Appuyer sur le bouton Connecter pour se connecter à KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser a été déconnecté de KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Appuyer sur le bouton Reconnecter pour établir une nouvelle connexion.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser ne s’est pas encore connecté à KeePassXC, mais a été configuré avec l’identifiant : $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser est connecté à KeePassXC et a été configuré avec l’identifiant suivant : $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Nom d'utilisateur ou mot de passe modifié ! Enregistrer les nouveaux identifiants ?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Les identifiants seront enregistrés dans la base de données avec l'identifiant $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Le nom d'utilisateur suivant n'est actuellement pas enregistré: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Les identifiants avec le nom d'utilisateur utilisé sont indiquées en gras : $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Veuillez choisir les identifiants à mettre à jour.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Sélectionner les informations d'authentification à insérer dans la page.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtre :", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Sélectionner les informations d'authentification à utiliser.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Plus d'un champ de mot de passe trouvé sur cette page. Utiliser le clic-droit sur un des champs de mot de passe et choisir un des suivants:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL :", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nom d'utilisateur :", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nouveau", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Mettre à jour", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Fermer", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Ne plus demander pour cette page", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Fermer", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Annuler et afficher la fenêtre de connexion par défaut", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Paramètres | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Paramètres généraux", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bases de données connectées", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Champs d'authentification personnalisés", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Préférences du site", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "À propos", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Général", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bases de données connectées", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Champs d'identification personnalisés", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Préférences du site", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "À propos", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Configurer les raccourcis clavier", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Enregistrer", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Connecter", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Supprimer", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Ajouter", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Vérifier les mises à jour", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Oui, supprimer maintenant", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": " Annuler", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Réinitialiser", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Durée du clignement :", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Rediriger l'offset :", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Nombre maximum de redirections :", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Activer le générateur de mots de passe.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Récupérer automatiquement les identifiants.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Remplir automatiquement les entrées ne contenant qu'un identifiant.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Activer l’auto-complétion pour les champs de nom d'utilisateur.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Afficher les notifications.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Enregistrer le domaine uniquement.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Afficher une notification lorsque de nouveaux identifiants peuvent être enregistrés en base de données.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Remplir et soumettre automatiquement les dialogues d’authentification HTTP Basic.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Vérifier les mises à jour de KeePassXC :", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": " tous les 3 jours", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "toutes les semaines", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": " tous les mois", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": " jamais", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Raccourcis-clavier", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Durée maximale (en ms) durant laquelle l'icône cligne après avoir détecté de nouveaux identifiants", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Durée minimale (en ms) durant laquelle l'icône cligne avant de se désactiver suite à une redirection de page.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 pour n'utiliser que la durée de clignement en ignorant le nombre maximum de redirections (Ancien comportement)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Combien de pages l'onglet doit-il parcourir après le décalage de redirection avant de désactiver l'icône ?", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Ajoute un bouton sur les champs de mot de passe permettant de générer un nouveau mot de passe.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Les mots de passe sont générés par KeePassXC en utilisant votre profil de génération de mot de passe.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser récupérera automatiquement les identifiants lorsqu'un onglet est sélectionné.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Laisse KeePassXC-Browser remplir les identifiants automatiquement si une seule entrée est retournée.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Attention ! Utiliser le remplissage automatique n'est pas sûr. Utiliser à vos propres risques.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Affiche une liste déroulante contenant tous les identifiants pour tous les champs de nom d'utilisateur sur la page.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Affiche une notification pour les erreurs ou lorsqu'une interaction avec l'utilisateur est nécessaire.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Lorsqu'un nouvel identifiant est ajouté, n'enregistrer que le domaine au lieu de l'URL complète.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Si des identifiants sont trouvés pour une page et que le type d'authentification est HTTP Basic, KeePassXC-Browser essaiera de s'authentifier avec le premier identifiant transmis.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Un dialogue d'authentification HTTP Basic ressemble à ceci :", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser nécessite KeePassXC pour récupérer des identifiants.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Vous pouvez télécharger la dernière version stable depuis $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Vous utilisez KeePassXC version : $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Dernière version disponible de KeePassXC : $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Par défaut : $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infini : $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Recommandé : $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Le raccourci pour $1 à été modifié avec succès.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Le raccourci pour $1 à été réinitialisé.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Erreur : Le raccourci pour $1 n'a pas été modifié!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Les bases de données KeePassXC suivantes sont connectées à KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Aucune base de données trouvée.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Supprimer l'identifiant de la liste de base de données ?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Voulez-vous vraiment supprimer l'identifiant suivant de la liste des bases de données ?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Vous pouvez reconnecter votre base de données en tout temps.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identifiant", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Clé", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Dernière utilisation", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Création", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Supprimer", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL de la page", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorer", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Détection des noms d'utilisateurs uniquement", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Supprimer", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Activer toutes les fonctionnalités", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Désactiver l'ajout et modification d'identifiants", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Désactiver toutes les fonctionnalités", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Aucun champ d'authentification personnalisé trouvé.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Si KeePassXC-Browser détecte les mauvais champs d'authentification, vous pouvez préciser les champs corrects vous-mêmes.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Allez sur la page et cliquez sur l'icône KeePassXC-Browser puis sélectionnez", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Supprimer les champs d'authentification personnalisés ?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Voulez-vous vraiment supprimer les champs d'authentification personnalisés sur la page suivante : $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser détectera automatiquement les champs d'authentification lors de la prochaine visite de la page.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Aucun site ignoré n’a été trouvé.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Supprimer le site ?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Les sites sur cette page possèdent des méthodes de gestion spécifique associées.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Pour ignorer l'ajout et la modification des identifiants sur un site spécifique, ajoutez-les ci-dessous ou cliquez sur l'icône KeePassXC-Browser lorsqu'elle cligne et sélectionnez", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Si un site est ignoré complètement (Désactiver toutes les fonctionnalités est sélectionné), l'extension ne fera rien lorsque le site est visité.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Détection des noms d'utilisateurs uniquement permet à KeePassXC-Browser de remplir les détails d'authentification sur les sites avec des pages séparées pour le nom d'utilisateur et le mot de passe.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Voulez-vous vraiment supprimer le site spécifié de la liste : $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser activera toutes les fonctionnalités pour ce site et supprimera la détection des noms d'utilisateurs uniquement.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Visiter KeePassXC-Browser sur le Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Visiter KeePassXC-Browser sur le site Mozilla Add-ons.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Visiter KeePassXC-Browser sur GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser version : $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Version de KeePassXC : $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/hu/messages.json b/keepassxc-browser/_locales/hu/messages.json new file mode 100644 index 0000000..1945071 --- /dev/null +++ b/keepassxc-browser/_locales/hu/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC integráció a modern webböngészőkhöz", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Felhasználónév és jelszó kitöltése", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Csak jelszó kitöltése", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP kitöltése", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Jelszó-előállító ikonok megjelenítése", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Hitelesítési adatok mentése", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Jelszó-előállító megjelenítése", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "A hitelesítési adatok létrehozása vagy módosítása a kiegészítő ikonjára kattintva.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Több hitelesítési adattal rendelkező HTTP hitelesítés észlelhető. Kattintson a kiegészítő ikonjára a megfelelő kiválasztásához.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Ismeretlen hiba.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Az adatbázis nincs megnyitva.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Az adatbázis kivonata nem érkezett meg.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "A kliens nyilvános kulcsa nem érkezett meg.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Nem lehet visszafejteni az üzenetet.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Nem lehet kapcsolódni a KeePassXC-hez. Ellenőrizze, hogy a böngészőintegráció engedélyezve van-e a KeePassXC beállításaiban.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "A művelet megszakítva vagy megtagadva.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Az üzenet titkosítása sikertelen. Fut a KeePassXC?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "A KeePassXC hozzárendelés sikertelen, próbálja újra.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "A kulcscsere nem volt sikeres.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "A titkosítókulcs nem ismerhető fel.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nem találhatók elmentett adatbázisok.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Helytelen művelet.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Üres üzenet érkezett.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nincs URL megadva.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nem találhatók bejelentkezések.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Jelszó-előállító ikon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Előállított jelszó", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Töltse ki a következő jelszómezőt is", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bit", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Jelszó-előállító", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Előállítás", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Másolás", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Kitöltés és másolás", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Hiba:\nAz előállított jelszó hosszabb mint a megengedett hossz!\nLe lesz vágva a megengedett legnagyobb hossznál.\n\nJegyezze meg az új jelszót!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Jelszó előállítása", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Nem sikerült fogadni az előállított jelszót.
      Fut a KeePassXC?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Eltüntetés", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Kihagyás", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Több megjelenítése", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Újra", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Megerősítés", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Az oldal bejelentkező mezői már ki lettek jelölve és felül lesznek írva.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Kijelölés elvetése", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Karakterlánc mező #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Válasszon egy felhasználónév mezőt", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Most válasszon egy jelszó mezőt", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Erősítse meg a választást", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Erősítse meg a választását vagy válasszon több mezőt karakterlánc mezőkként.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Használhatja a billentyűzeten lévő számokat is a beviteli mezők kiválasztásához.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Felhasználónév", + "description": "General text for username." + }, + "password": { + "message": "Jelszó", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "– nincs felhasználónév –", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Hiba:\nNem találhatók bejelentkezések.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Hiba:\nTöbb mint egy bejelentkezés található a KeePassXC programban!\nNyomja meg a KeePassXC-böngésző ikont a több lehetőségért.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Hiba:\nNem találhatók hitelesítési adatok a megadott felhasználónévhez.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Hiba:\nNem találhatók kitöltendő mezők.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Hiba:\nNem található jelszó mező.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Hiba:\nNem sikerült felismerni a megváltozott hitelesítési adatokat.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC – felugró ablak", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Beállítások", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Egyéni bejelentkezési mezők kiválasztása ehhez az oldalhoz", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Kapcsolódás", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Újrakapcsolódás", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Bejelentkezési mezők újra felderítése", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Újratöltés", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Adatbázis újbóli megnyitása", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "A KeePassXC-böngésző hibát észlelt:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "A KeePassXC egy régebbi verzióját használja.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Töltse le a legújabb verziót a keepassxc.org oldalról.", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Állapot ellenőrzése…", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "A KeePassXC-böngésző nem lett beállítva. Nyomja meg a kapcsolódás gombot a KeePassXC programmal történő párosításához.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "A KeePassXC-böngésző le lett választva a KeePassXC programról.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Nyomja meg az újrakapcsolódás gombot egy új kapcsolat kiépítéséhez.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "A KeePassXC-böngésző még nem lett hozzákapcsolva a KeePassXC programhoz, de már be lett állítva a következő azonosító használatával: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "A KeePassXC-böngésző kapcsolódott a KeePassXC programhoz és be lett állítva a következő azonosító használatával: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "A felhasználónév vagy a jelszó megváltozott! Menti?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "A hitelesítési adatok a kapcsolódó adatbázisba lesznek elmentve a következő azonosítóval: $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "A következő felhasználónév jelenleg nincs elmentve: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "A hitelesítési adatok a használt felhasználónévvel félkövéren vannak megjelölve: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Válassza ki azokat a hitelesítési adatokat, amiket frissíteni szeretne.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Válassza ki a csoportot, amelyhez hozzá szeretné adni az új hitelesítési adatokat.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Hiba: a megadott alapértelmezett csoport nem található. Az összes szükséges csoport létrehozása.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Az új csoportok nem hozhatók létre.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Hiba: A hitelesítési adatok nem lettek frissítve. A jelszó nem változott.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Hiba: A hitelesítési adatokat nem lehet menteni vagy frissíteni.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Válassza ki azokat a bejelentkezési információkat, amelyeket be szeretne íratni az oldalba.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Szűrő:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Válassza ki azokat a bejelentkezési információkat, amelyekkel be szeretne jelentkezni.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Egynél több jelszó mező található ezen az oldalon. Kattintson a jobb egérgombbal a jelszó mezők egyikére, és válassza ki a következők egyikét:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Felhasználónév: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Új", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Frissítés", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Eltüntetés", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Sose kérdezze ennél az oldalnál", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Bezárás", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Eltüntetés és az alapértelmezett hitelesítési párbeszédablak megjelenítése", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Beállítások | KeePassXC-böngésző", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Általános beállítások", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Kapcsolódott adatbázisok", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Egyéni bejelentkezési mezők", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Oldal beállításai", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Névjegy", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Általános", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Kapcsolódott adatbázisok", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Egyéni bejelentkezési mezők", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Oldal beállításai", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Névjegy", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Gyorsbillentyűk beállítása", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Mentés", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Kapcsolódás", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Eltávolítás", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Hozzáadás", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Frissítések keresése", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Igen, azonnali eltávolítás", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Mégse", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Alapállapot", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Villogási idő:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Átirányítási eltolás:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Átirányítások legnagyobb száma:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Alapértelmezett csoport az új jelszavak mentéséhez:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Válassza el a csoportok perjellel, például: Csoport/Alcsoport.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Mindig kérdezze meg, hogy hova mentse a hitelesítési adatokat", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Ha engedélyezve van, akkor a felugró ablak megjelenít egy csoportlistát.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Jelszó-előállító bekapcsolása.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Hitelesítési adatok automatikus lekérése.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Önálló hitelesítésiadat-bejegyzések automatikus kitöltése.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Automatikus kiegészítés bekapcsolása a felhasználónév mezőknél.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Értesítések megjelenítése.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Csak tartomány mentése.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Értesítés megjelenítése, amikor új hitelesítési adatokat lehet elmenteni az adatbázisba.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Alap HTTP hitelesítési párbeszédablakok automatikus kitöltése és beküldése.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "A KeePassXC frissítéseinek keresése:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "3 naponta", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "hetente", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "havonta", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "soha", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Gyorsbillentyűk", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "A legnagyobb idő (ms), amíg az ikonnak villognia kell új hitelesítési adatok felismerésekor.", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "A legkisebb idő (ms), amíg az ikonnak villognia kell az oldal átirányítása miatti kikapcsolás előtt.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "A -1 megadásakor csak akkor használjon villogást, ha figyelmen kívül hagyja a legnagyobb átirányításokat (régi viselkedés).", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Hány oldalon kell a lapnak végiglépkednie az átirányítási eltolás után, mielőtt kikapcsolná az ikont.", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Egy gombot ad a jelszó mezőkhöz új jelszó előállításához.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "A jelszavakat a KeePassXC állítja elő a jelszó-előállító profil használatával.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "A KeePassXC-böngésző azonnal le fogja kérni a hitelesítési adatokat, amikor egy lapot aktiválnak.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "A KeePassXC-böngésző automatikusan kitölthesse a hitelesítési adatokat, ha csak egy önálló bejegyzést kap.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Figyelmeztetés! Az automatikus kitöltés használata nem biztonságos! Saját felelősségére használja.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Az elérhető hitelesítési adatokat tartalmazó legördülő lista megjelenítése az összes felhasználónév mezőnél egy adott oldalon.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Értesítések megjelenítése a hibáknál és amikor felhasználói beavatkozás szükséges.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Új hitelesítési adatok mentésekor csak a tartományt mentse el a teljes URL helyett.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Ha hitelesítési adatok találhatók egy oldalhoz, és a bejelentkezés típusa egy alap HTTP hitelesítési kérés, akkor a KeePassXC-böngésző megpróbál bejelentkezni az első megadott hitelesítési adattal.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Egy alap HTTP hitelesítési párbeszédablak így néz ki:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "A KeePassXC-böngészőnek a KeePassXC programra van szüksége a hitelesítési adatok lekéréséhez.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "A legújabb stabil verziót innen töltheti le: $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "A KeePassXC alábbi verziója fut: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "A KeePassXC legújabb elérhető verziója: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Alapértelmezett: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Végtelen: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Ajánlott: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "A funkcióhoz tartozó gyorsbillentyű sikeresen megváltozott: $1.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "A funkcióhoz tartozó gyorsbillentyű alapállapotba lett hozva:$1.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Hiba: A funkcióhoz tartozó gyorsbillentyű nem változott: $1.", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "A következő KeePassXC adatbázisok vannak kapcsolódva a KeePassXC-böngészőhöz.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nem találhatók kapcsolódó adatbázisok.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Eltávolítja az azonosítót az adatbázislistából?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Valóban el szeretné távolítani a következő azonosítót az adatbázislistából?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Bármikor újrakapcsolódhat az adatbázisához.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Azonosító", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Kulcs", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Utolsó használat", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Létrehozva", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Törlés", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Oldal URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Mellőzés", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Csak felhasználónév felismerés", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Törlés", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Az összes funkció engedélyezése", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Új vagy módosított hitelesítési adatok letiltása", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Az összes funkció letiltása", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nem találhatók elmentett egyéni bejelentkezési mezők.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "A mentett egyéni bejelentkezési mezőket a lenti táblázat használatával kezelheti.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Ha a KeePassXC-böngésző a rossz bejelentkezési mezőket ismeri fel, akkor lehetősége van meghatározni a helyes mezőket.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Menjen az oldalra, és kattintson a KeePassXC-böngésző ikonra, majd válassza ki a következőt:", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Eltávolítja az elmentett egyéni bejelentkezési mezőket?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Valóban el szeretné távolítani az elmentett egyéni bejelentkezési mezőket ezen az oldalon: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "A KeePassXC-böngésző automatikusan fel fogja ismerni a bejelentkezési mezőket a következő alkalommal, amikor meglátogatja ezt az oldalt.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nem találhatók mellőzött oldalak.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Eltávolítja az oldalt?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Az ezen az oldalon lévő oldalakhoz különleges kezelési módszerek vannak hozzárendelve.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Egy bizonyos oldalon lévő új vagy módosított hitelesítési adatok mellőzéséhez adja hozzá azokat lent, vagy kattintson a villogó KeePassXC-böngésző ikonra és válassza a következőt:", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Ha egy oldal teljesen mellőzött (Az összes funkció letiltása van kiválasztva), akkor a bővítmény nem fog tenni semmit, amikor meglátogatja azt az oldalt.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "A csak felhasználónév felismerése lehetővé teszi a KeePassXC-böngésző számára, hogy kitöltse a bejelentkezési részleteket a különálló felhasználónév és jelszó oldalakkal rendelkező weboldalakon.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "URL kézi hozzáadása", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Valóban el szeretné távolítani a megadott oldalt a listából: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "A KeePassXC-böngésző engedélyezni fogja az összes funkciót ennél az oldalnál, és eltávolítja a csak felhasználónév felismerést.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "A mentett oldalbeállításokat a lenti táblázat használatával kezelheti.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Lehetőség a kiterjesztés funkcióinak figyelmen kívül hagyására az oldalon.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Nézze meg a KeePassXC-böngészőt a Chrome webáruházában.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Nézze meg a KeePassXC-böngészőt a Mozilla kiegészítők könyvtárában.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Nézze meg a KeePassXC-böngészőt a GitHubon.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "A KeePassXC-böngésző verziója: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "A KeePassXC verziója: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Közreműködők", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licencek", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Hibajelentés", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Új hibajegy létrehozása a GitHubon", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Az alábbi hibakeresési információk használhatók", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Érvénytelen érték. Ellenőrizze a bemenetet.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Érvénytelen URL. Ellenőrizze a bemenetet.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Az érték már szerepel a listában.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Új fület nyit meg", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP egyszerű hitelesítés párbeszédablak", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/it/messages.json b/keepassxc-browser/_locales/it/messages.json new file mode 100644 index 0000000..0e0d82c --- /dev/null +++ b/keepassxc-browser/_locales/it/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Integrazione di KeePassXC per browser web moderni", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Compilare nome utente e password", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Compilare solo la password", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Compilare TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Mostra le icone del generatore di password", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Salva le credenziali", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Show password generator", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Crea o modifica le credenziali facendo clic sull'icona dell'estensione.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Rilevata autenticazione HTTP con più credenziali di accesso. Fare clic sull'icona dell'estensione per scegliere quella corretta.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Errore sconosciuto.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Database non aperto.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Hash del database non ricevuto.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Chiave pubblica del client non ricevuta.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Non è possibile decrittare il messaggio.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Azione annullata o negata.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Associazione con KeePassXC non riuscita, riprovare.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Lo scambio delle chiavi non è riuscito.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "La chiave di crittografia non è riconosciuta.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nessun database salvato trovato.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Azione non corretta.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Ricevuto un messaggio vuoto.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nessun URL fornito.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nessun login trovato.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Password generata", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Compilare anche il successivo campo password", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Bit", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Generatore di password", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Genera", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copia", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Compila e copia", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Errore: la password generata è più lunga della lunghezza consentita.\nÈ stata tagliata per adattarla alla lunghezza.\n\nRicorda la nuova password.", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Genera password", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Non è possibile ricevere la password generata.
      KeePassXC è in esecuzione?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Abbandona", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Ometti", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Di nuovo", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Conferma", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "I campi di login per questa pagina sono già selezionati e verranno sovrascritti.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Annulla la selezione", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campo stringa n.", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Scegliere un campo nome utente", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Ora scegliere un campo password", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confermare la selezione", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Confermare la selezione o scegliere altri campi come campi stringa.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nome utente", + "description": "General text for username." + }, + "password": { + "message": "Password", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- nessun nome utente -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Errore:\nNessun login trovato.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Errore:\nè stato trovato più di un login in KeePassXC!\nPremere l'icona di KeePassXC-Browser per ulteriori opzioni.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Errore:\nNessuna credenziale trovata per il nome utente dato.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Errore:\nImpossibile trovare campi da riempire.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Errore:\nImpossibile trovare un campo password.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Errore:\nImpossibile rilevare le credenziali modificate.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Impostazioni", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Scegliere i campi di accesso personalizzati per questa pagina", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Connessione", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Riconnessione", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Rilevare nuovamente i campi di login", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Ricaricare", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Riaprire il database", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser ha riscontrato un errore:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Si sta utilizzando una vecchia versione di KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Scaricare l'ultima versione da keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Controllo dello stato...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser non è stato configurato. Premere il pulsante di connessione per associarlo a KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser è stato scollegato da KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Premere il pulsante di riconnessione per attivare una nuova connessione.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser non è stato ancora collegato a KeePassXC ma è stato configurato usando l'identificatore: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser è collegato a KeePassXC ed è stato configurato usando il seguente identificatore: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Username o password modificati. Salvarli?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Le credenziali saranno salvate nel database connesso con l'identificatore $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Il seguente nome utente non è attualmente salvato: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Le credenziali del nome utente usato sono marcate in grassetto: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Scegliere le credenziali da aggiornare.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Selezionare le informazioni di login da inserire nella pagina.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtro:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Selezionare le informazioni di login da usare per l'accesso.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "È stato trovato più di un campo di password in questa pagina. Fare clic su uno di essi con il pulsante destro, e scegliere uno tra:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nome utente: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nuovo", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Modificare", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Chiudere", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Non chiedere mai per questa pagina", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Chiudi", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Chiudere e visualizzare la finestra di dialogo di autenticazione predefinita", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Impostazioni | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Impostazioni generali", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Database connessi", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Campi di login personalizzati", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Preferenze del sito", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Informazioni su", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Generale", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Database connessi", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campi di login personalizzati", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Preferenze del sito", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Informazioni su", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": " Configurare le scorciatoie", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Salva", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Connetti", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Rimuovere", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Aggiungere", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Controllare gli aggiornamenti", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Sì, rimuovere ora", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Annulla", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Reset", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tempo di lampeggio:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Reindirizzare l'offset:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Massimo (numero di) ridirezioni:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Attiva il generatore di password.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Recupera automaticamente le credenziali.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Compila automaticamente le voci a credenziale singola.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Attiva il completamento automatico per i campi nome utente.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Visualizza le notifiche.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Salva solo il dominio.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Mostra una notifica quando possono essere salvate nuove credenziali nel database.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Compila automaticamente le finestre di dialogo di autenticazione HTTP Basic e inviale.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Controlla gli aggiornamenti di KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "ogni 3 giorni", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "ogni settimana", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "ogni mese", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "mai", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Scorciatoie da tastiera", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Tempo massimo (ms) del lampeggiamento dell'icona al rilevamento di nuove credenziali", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Tempo minimo (ms) del lampeggiamento dell'icona prima di disattivarsi per ridirezioni delle pagine.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 per usare solo il tempo di lampeggiamento ignorando il massimo valore di ridirezioni (vecchio comportamento)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Quante pagine dovrebbe scorrere la scheda dopo l'offset di reindirizzamento prima di disattivare l'icona", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Aggiunge un pulsante ai campi di password per generare una nuova password.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Le password sono generate da KeePassXC usando il profilo di generazione di password scelto.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser recupererà immediatamente le credenziali quando una scheda è attivata.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Lasciare che KeePassXC-Browser compili automaticamente le credenziali se riceve solo una singola voce.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Attenzione! Utilizzare la compilazione automatica non è sicuro. Utilizzare a proprio rischio.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Visualizzare un elenco a discesa contenente le credenziali disponibili per tutti i campi del nome utente in una pagina.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Mostrare notifiche per errori e quando è necessaria l'interazione dell'utente.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Salva solo il dominio al posto dell'URL completo al salvataggio di nuove credenziali.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Se le credenziali sono state trovate per una pagina e il tipo di accesso è una richiesta di autenticazione di base HTTP, KeePassXC-Browser cerca di effettuare il login con le prime credenziali date.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Una finestra di autenticazione HTTP Basic ha il seguente aspetto:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser richiede KeePassXC per recuperare le credenziali.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "È possibile scaricare l'ultima versione stabile da $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "La versione di KeePassXC usata è: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Ultima versione disponibile di KeePassCX: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Predefinito: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinito: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Consigliato: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "La scorciatoia per $1 è stata modificata con successo.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "La scorciatoia per $1 è stata reimpostata.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Errore: la scorciatoia per $1 non è stata modificata!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "I seguenti database KeePassXC sono collegati a KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nessun database connesso trovato.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Rimuovere l'identificatore dall'elenco dei database?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Si desidera davvero rimuovere il seguente identificatore dall'elenco del database?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Si può ricollegare il database in ogni momento.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificatore", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Chiave", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Usato l'ultima volta", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Creato", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Elimina", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL della pagina", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignora", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Rilevamento solo del nome utente", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Elimina", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Attiva tutte le funzioni", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Disabilita le credenziali nuove/modificate", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Disattiva tutte le funzionalità", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nessun campo di login personalizzato salvato è stato trovato.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": " Se KeePassXC-Browser rileva i campo di login sbagliati è possibile specificare quelli corretti.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Andare alla pagina e cliccare sull'icona di KeePassXC-Browser, quindi selezionare", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Rimuovere i campi di login personalizzati salvati?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Si desidera davvero rimuovere i campi di login personalizzati salvati nella pagina: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser cercherà di rilevare automaticamente i campi di login alla prossima visita della pagina.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nessun sito ignorato trovato.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Rimuovere il sito?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Ai siti in questa pagina sono associati dei metodi speciali per la loro gestione.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Per ignorare credenziali aggiunte/modificate per un sito specifico aggiungerle qui di seguito o fare clic sull'icona lampeggiante di KeePassXC-Browser e selezionare", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Se un sito viene completamente ignorato (disabilitare tutte le funzionalità è selezionato), il plugin non farà nulla quando si visita questo sito.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Il rilevamento del solo nome utente permette a KeePassXC-Browser di riempire i dettagli di login su siti Web con pagine separate per username e password.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Si desidera davvero rimuovere il sito specificato dall'elenco: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser abiliterà tutte le funzioni per questo sito e rimuoverà il rilevamento dei soli nomi utente.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Visita KeePassXC-Browser in Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Visita KeePassXC-Browser nella directory di Mozilla Add-ons.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Visita KeePassXC-Browser su GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser versione: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC versione: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/ja/messages.json b/keepassxc-browser/_locales/ja/messages.json new file mode 100644 index 0000000..133d3f3 --- /dev/null +++ b/keepassxc-browser/_locales/ja/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "モダンなウェブブラウザーのための KeePassXC 統合", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "ユーザー名とパスワードを入力", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "パスワードのみ入力", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP を入力", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "パスワード生成アイコンを表示", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "資格情報を保存", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "パスワード生成アイコンを表示", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "拡張機能のアイコンをクリックして、資格情報を作成または変更してください。", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "HTTP 認証で複数の資格情報が検出されました。拡張機能のアイコンをクリックして正しいものを選択してください。", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "不明なエラーです。", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "データベースが開かれていません。", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "データベースハッシュを受信しませんでした。", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "クライアントの公開鍵を受信しませんでした。", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "メッセージを復号できません。", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "KeePassXC に接続できません。KeePassXC の設定でブラウザー統合が有効になっているか確認してください。", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "アクションがキャンセルまたは拒否されました。", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "メッセージの暗号化に失敗しました。KeePassXC を実行していますか?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC のアソシエーションに失敗しました。再試行してください。", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "鍵交換が成功しませんでした。", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "暗号化キーが認識されません。", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "保存されたデータベースが見つかりません。", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "不正確なアクションです。", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "空のメッセージを受信しました。", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "URL がありません。", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "ログイン情報が見つかりません。", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "パスワード生成アイコン", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "生成されたパスワード", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "次のパスワードフィールドにも入力する", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? ビット", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "パスワード生成", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "生成", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "コピー", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "入力とコピー", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "エラー:\n許可された長さよりも長いパスワードが生成されました。\n長さに合わせてカットされます。\n\n新しいパスワードを忘れないでください。", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "パスワード生成", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "生成されたパスワードを受信できません。
      KeePassXC を実行していますか?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "棄却", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "スキップ", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "さらに表示", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "戻る", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "確認", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "このページのログインフィールドは既に選択されているため上書きされます。", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "選択を破棄", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "文字列フィールド #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. ユーザー名フィールドを選択してください", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. パスワードフィールドを選択してください", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. 選択の確認", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "選択を確認するか、文字列フィールドとして更にフィールドを選択してください。", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "キーボードの数字キーで入力フィールドを選択できます。", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "ユーザー名", + "description": "General text for username." + }, + "password": { + "message": "パスワード", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- ユーザー名なし -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "エラー:\nログイン情報が見つかりません。", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "エラー:\nKeePassXC に複数のログイン情報が見つかりました。\nKeePassXC-Browser のアイコンを押してオプションを表示してください。", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "エラー:\nユーザー名の資格情報が見つかりません。", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "エラー:\n入力するフィールドを見つけられません。", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "エラー:\nパスワードフィールドを見つけられません。", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "エラー:\n変更された資格情報を検出できませんでした。", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - ポップアップ", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "設定", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "このページのカスタムログインフィールドを選択", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "接続", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "再接続", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "ログインフィールドを再検出", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "再読み込み", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "データベースを再度開く", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser がエラーに遭遇しました:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "KeePassXC の古いバージョンを使用しています。", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "keepassxc.org から最新バージョンをダウンロードしてください", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "ステータスをチェック中...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser はまだ設定されていません。接続ボタンを押して KeePassXC とペアリングしてください。", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser が KeePassXC から切断されました。", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "再接続ボタンを押すと新しい接続を確立します。", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser はまだ KeePassXC に接続されていませんが、識別子を使用するように設定されています: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser は KeePassXC に接続されており、次の識別子を使用するように設定されています: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "ユーザー名またはパスワードが変更されました。保存しますか?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "資格情報が識別子 $1 の接続されたデータベースに保存されました", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "次のユーザー名は現在保存されていません: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "使用されたユーザー名の資格情報は太字でマークされます: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "更新する資格情報を選択してください。", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "新しい資格情報を追加するグループを選択してください。", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "エラー: 指定されたデフォルトのグループが見つかりませんでした。必要な全てのグループを作成します。", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "新しいグループを作成できません。", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "エラー: 資格情報は更新されません。パスワードは変更されていません。", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "エラー: 資格情報を保存または更新できません。", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "ページに入力するログイン情報を選択してください。", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "フィルター:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "いずれかのログイン情報を選択してください。", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "このページで複数のパスワードフィールドが見つかりました。それらのパスワードフィールドで右クリックし、次の中から選択してください:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "ユーザー名: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "新規", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "更新", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "棄却", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "このページでは確認しない", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "閉じる", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "棄却してデフォルトの認証ダイアログを表示します", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "設定 | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "一般設定", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "接続されたデータベース", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "カスタムログインフィールド", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "サイト設定", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "情報", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "一般", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "接続されたデータベース", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "カスタムログインフィールド", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "サイト設定", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "情報", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": " ショートカットを設定", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "保存", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "接続", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "削除", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "追加", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "更新を確認", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "はい、今すぐ削除します", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "キャンセル", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "元に戻す", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "点滅時間:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "リダイレクトオフセット:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "最大リダイレクト数:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "新しいパスワードを保存するデフォルトのグループ:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "グループはスラッシュで区切ってください (例: グループ/子グループ)。", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "新しい資格情報をどこに保存するか常に確認する", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "有効にすると、グループの一覧をポップアップ表示します。", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "パスワード生成を有効にする。", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "資格情報を自動的に読み込む。", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "資格情報が単一のエントリーに自動入力する。", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "ユーザー名フィールドの自動補完を有効にする。", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "通知を表示する。", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "ドメインのみを保存する。", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "新しい資格情報をデータベースに保存可能な際に通知を表示する。", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "HTTP Basic 認証ダイアログに自動入力して送信する。", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "KeePassXC の更新確認:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "3日毎", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "毎週", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "毎月", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "しない", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "キーボードショートカット", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "新しい資格情報の検出後にアイコンが点滅する最長時間 (ミリ秒)", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "ページのリダイレクトによって無効になる前にアイコンが点滅する最短時間 (ミリ秒)。", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1を指定すると最大リダイレクト数を無視して点滅時間のみを使用 (古い挙動)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "アイコンが無効になる前のリダイレクトオフセット後にタブが遷移するページ数", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "新しいパスワードを生成するボタンをパスワードフィールドに追加します。", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "パスワードは KeePassXC のパスワード生成プロファイルを使用して生成されます。", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "タブがアクティブになった直後に KeePassXC-Browser が資格情報を読み込みます。", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "エントリーに対する資格情報が単一の場合は、KeePassXC-Browser に自動入力させます。", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "警告!自動入力は安全ではありません。自己責任で使用してください。", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "ページにある全てのユーザー名フィールドに、利用可能な資格情報を含んだドロップダウンリストを表示します。", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "エラーが発生した場合や、ユーザーによる操作が必要な場合は通知を表示します。", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "新しい資格情報を保存する際に、完全な URL の代わりにドメインのみを保存します。", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "ページの資格情報が存在し、ログイン方式が HTTP Basic 認証リクエストの場合、KeePassXC-Browser は最初に受け取った資格情報でログインを試みます。", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "HTTP Basic 認証ダイアログはこのような外観です:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser は資格情報の読み込みに KeePassXC を必要とします。", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "次のアドレスから最新の安定バージョンをダウンロードできます: $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "実行中の KeePassXC のバージョン: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "利用可能な KeePassXC の最新バージョン: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "デフォルト: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "無制限: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "推奨: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "ショートカット ($1) が正常に変更されました。", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "ショートカット ($1) がリセットされました。", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "エラー: ショートカット ($1) は変更されていません。", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "以下の KeePassXC データベースが KeePassXC-Browser に接続されています。", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "接続されたデータベースが見つかりません。", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "データベースリストから識別子を削除しますか?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "本当に次の識別子をデータベースから削除しますか?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "いつでもデータベースに再接続できます。", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "識別子", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "キー", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "最終使用日時", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "作成日", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "削除", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "ページの URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "無視", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "ユーザー名のみ検出", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "削除", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "全ての機能を有効にする", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "資格情報の作成/変更を無効にする", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "全ての機能を無効にする", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "保存されたカスタムログインフィールドが見つかりません。", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "保存されたカスタムログインフィールドは以下で管理できます。", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "KeePassXC-Browser がログインフィールドを間違えて検出した場合は、自分で正しいフィールドを指定できます。", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "対象のページに移動して KeePassXC-Browser のアイコンをクリックし、次のボタンを選択してください:", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "保存されたカスタムログインフィールドを削除しますか?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "本当に保存されたカスタムログインフィールドを削除しますか: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser は次にこのページに訪問した際に、ログインフィールドを自動検出します。", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "無視されるサイトが見つかりません。", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "サイトを削除しますか?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "このページにあるサイトには、特別な処理方法が割り当てられます。", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "特定のサイトの新規または変更された資格情報を無視するには、この下にある一覧に追加するか、点滅する KeePassXC-Browser のアイコンをクリックし、次のボタンを選択してください:", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "サイトを完全に無視する (全ての機能を無効にするが選択されている) 場合は、そのサイトを訪問してもプラグインは何もしません。", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "ユーザー名のみを検出することで、KeePassXC-Browser はユーザー名とパスワードが別々のページにあるウェブサイトでのログイン情報の入力を可能にします。", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "URL を手動で追加", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "本当に指定したサイトをリストから削除しますか: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser はユーザー名のみの検出を削除し、このサイトの全ての機能を有効にします。", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "保存されたサイト設定は以下で管理できます。", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "ページで拡張機能の機能を無視するためのオプションです。", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Chrome ウェブストアの KeePassXC-Browser 配布ページを開く。", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Mozilla Add-ons ディレクトリの KeePassXC-Browser 配布ページを開く。", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "GitHub の KeePassXC-Browser プロジェクトページを開く。", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser のバージョン: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC のバージョン: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "貢献者", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "ライセンス", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "バグ報告", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "GitHub で問題を報告する", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "次の情報を含めてください", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "不正な値です。入力を確認してください。", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "不正な URL です。入力を確認してください。", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "その値は既にリストに存在します。", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "新しいタブを開く", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic 認証ダイアログ", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/ko/messages.json b/keepassxc-browser/_locales/ko/messages.json new file mode 100644 index 0000000..ec76826 --- /dev/null +++ b/keepassxc-browser/_locales/ko/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "현대적인 웹 브라우저용 KeePassXC 통합", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "사용자 이름과 암호 입력", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "암호만 입력", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP 입력", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "암호 생성기 아이콘 표시", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "인증 정보 저장", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "암호 생성기 표시", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "확장 기능 아이콘을 눌러서 인증 정보를 생성하거나 수정할 수 있습니다.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "여러 개의 인증 정보를 사용할 수 있습니다. 확장 기능 아이콘을 눌러서 사용할 인증 정보를 선택하십시오.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "알 수 없는 오류입니다.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "데이터베이스를 열지 않았습니다.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "데이터베이스 해시를 수신하지 못했습니다.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "클라이언트 공개 키를 수신하지 못했습니다.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "메시지를 복호화할 수 없습니다.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "KeePassXC에 연결할 수 없습니다. KeePassXC 설정에서 브라우저 통합이 켜져 있는지 확인하십시오.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "동작이 취소되었거나 거부되었습니다.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "메시지를 암호화할 수 없습니다. KeePassXC가 실행 중입니까?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC 연결이 실패했습니다. 다시 시도하십시오.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "키 교환에 실패했습니다.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "암호화 키를 인식할 수 없습니다.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "저장된 데이터베이스를 찾을 수 없습니다.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "동작이 잘못되었습니다.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "빈 메시지를 받았습니다.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "URL을 지정하지 않았습니다.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "로그인을 찾을 수 없습니다.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "암호 생성기 아이콘", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "생성된 암호", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "다음 암호 입력 필드도 채우기", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? 비트", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "암호 생성기", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "생성", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "복사", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "채우고 복사", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "오류:\n생성된 암호가 입력이 허용된 암호보다 더 깁니다!\n허용된 길이에 맞춰서 암호를 잘랐습니다.\n\n새 암호를 기억하십시오!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "암호 생성", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "생성된 암호를 수신할 수 없습니다.
      KeePassXC가 실행 중입니까?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "숨기기", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "건너뛰기", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "더 보기", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "다시 시도", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "확인", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "이 페이지의 로그인 필드가 선택되어 있으며 내용을 덮어 씁니다.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "선택 무시", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "문자열 필드 #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. 사용자 이름 필드 선택", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. 암호 필드 선택", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. 선택 확인", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "선택 사항을 확인하거나 더 많은 문자열 필드를 선택하십시오.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "키보드에서 숫자를 눌러서 입력 필드를 선택할 수 있습니다.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "사용자 이름", + "description": "General text for username." + }, + "password": { + "message": "암호", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- 사용자 이름 없음 -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "오류:\n로그인을 찾을 수 없습니다.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "오류:\nKeePassXC에 하나 이상의 로그인 정보가 있습니다!\nKeePassXC-브라우저 아이콘을 눌러서 더 많은 옵션을 보십시오.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "오류:\n지정한 사용자 이름과 일치하는 인증 정보를 찾을 수 없습니다.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "오류:\n입력할 필드를 찾을 수 없습니다.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "오류:\n암호 필드를 찾을 수 없습니다.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "오류:\n변경된 인증 정보를 감지할 수 없습니다.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - 팝업", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "설정", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "이 페이지의 사용자 정의 로그인 필드 선택", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "연결", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "다시 연결", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "로그인 필드 다시 확인", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "새로 고침", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "데이터베이스 다시 열기", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-브라우저에서 오류가 발생했습니다:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "KeePassXC의 오래된 버전을 사용하고 있습니다.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "keepassxc.org 사이트에서 최신 버전을 다운로드하십시오", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "상태 확인 중...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-브라우저가 설정되지 않았습니다. KeePassXC와 연결하려면 연결 단추를 누르십시오.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-브라우저와 KeePassXC 사이의 연결이 끊어졌습니다.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "다시 연결 단추를 눌러서 새로 연결하십시오.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-브라우저가 아직 KeePassXC에 연결되지 않았지만 다음 식별자로 설정되어 있습니다: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-브라우저가 KeePassXC에 연결되어 있고 다음 식별자로 설정되어 있습니다: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "사용자 이름이나 암호가 변경되었습니다! 저장하시겠습니까?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "인증 정보를 연결된 데이터베이스에 식별자 $1(으)로 저장합니다", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "다음 사용자 이름이 저장되지 않았습니다: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "지정한 사용자 이름을 사용하는 인증 정보는 굵게 표시됩니다: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "업데이트할 인증 정보를 선택하십시오.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "새 인증 정보를 추가할 그룹을 선택하십시오.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "오류: 지정한 기본 그룹을 찾을 수 없습니다. 필요한 모든 그룹을 만듭니다.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "새 그룹을 만들 수 없습니다.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "오류: 인증 정보를 업데이트하지 않았습니다. 암호가 변경되지 않았습니다.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "오류: 인증 정보를 저장하거나 업데이트할 수 없습니다.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "페이지에 입력할 로그인 정보를 선택하십시오.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "필터:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "로그인에 사용할 인증 정보를 선택하십시오.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "이 페이지에서 두 개 이상의 암호 필드를 찾았습니다. 암호 필드 중 하나를 오른쪽 단추로 누른 다음 선택하십시오:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "사용자 이름:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "새로 만들기", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "업데이트", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "숨기기", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "이 페이지에서 묻지 않기", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "닫기", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "숨기고 기본 인증 대화 상자 표시", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "설정 | KeePassXC-브라우저", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "일반 설정", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "연결된 데이터베이스", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "사용자 정의 로그인 필드", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "사이트 환경 설정", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "정보", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "일반", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "연결된 데이터베이스", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "사용자 정의 로그인 필드", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "사이트 환경 설정", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "정보", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "단축키 설정", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "저장", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "연결", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "삭제", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "추가", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "업데이트 확인", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "예, 삭제합니다", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "취소", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "초기화", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "깜빡임 시간:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "전환 위치:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "최대 전환 수:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "새 암호를 저장할 기본 그룹:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "슬래시로 그룹을 구분하십시오. 예: 그룹/자식그룹.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "항상 새 인증 정보를 추가할 그룹 묻기", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "이 옵션을 사용하면 팝업 창에 그룹 목록을 표시합니다.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "암호 생성기를 활성화합니다.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "자동으로 인증 정보를 가져옵니다.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "자동으로 단일 인증 정보 항목을 입력합니다.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "사용자 이름 필드 자동 완성을 사용합니다.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "알림을 표시합니다.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "도메인만 저장합니다.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "데이터베이스에 새 인증 정보를 저장할 수 있을 때 알림을 표시합니다.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "자동으로 HTTP 기본 인증 정보 항목을 입력하고 제출합니다.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "KeePassXC 업데이트 확인:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "3일마다", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "매주", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "매달", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "하지 않음", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "키보드 단축키", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "새 인증 정보를 발견한 후 아이콘을 깜빡일 최대 시간(ms)", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "페이지 전환으로 인하여 비활성화될 때까지 아이콘을 깜빡일 최소 시간(ms)", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1을 입력하면 최대 전환 회수와 상관 없이 깜빡임 시간만 사용(이전 방식)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "전환 위치 이후 아이콘을 비활성화하기 전까지 탭을 순환할 회수", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "암호 필드에 새 암호 생성기 단추를 추가합니다.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "암호 생성 프로필을 사용하여 KeePassXC에서 암호를 생성합니다.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "탭을 활성화할 때 KeePassXC-브라우저에서 인증 정보를 즉시 가져옵니다.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "인증 정보가 하나만 있을 때 KeePassXC-브라우저에서 자동으로 입력합니다.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "경고! 자동 입력은 안전하지 않을 수 있습니다. 주의하여 사용하십시오.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "페이지에 있는 모든 사용자 이름 필드에 입력할 수 있는 인증 정보 드롭다운 목록을 표시합니다.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "사용자 동작이 필요하거나 오류가 발생했을 때 알림을 표시합니다.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "새 인증 정보를 저장할 때 전체 URL 대신 도메인만 저장합니다.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "페이지 인증 정보를 찾았고 로그인 형식이 HTTP 기본 인증일 때 KeePassXC-브라우저에서 최초로 지정한 인증 정보로 로그인을 시도합니다.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "HTTP 기본 인증 대화 상자 예시:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-브라우저에서 인증 정보를 가져오려면 KeePassXC가 필요합니다.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "최신 안정 버전 다운로드: $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "실행 중인 KeePassXC 버전: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "사용 가능한 KeePassXC 최신 버전: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "기본값: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "무한대: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "추천: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "$1의 단축키가 변경되었습니다.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "$1의 단축키를 초기화했습니다.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "오류: $1의 단축키가 변경되지 않았습니다!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "다음 KeePassXC 데이터베이스가 KeePassXC-브라우저에 연결되어 있습니다.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "연결된 데이터베이스를 찾을 수 없습니다.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "데이터베이스 목록에서 식별자를 삭제하시겠습니까?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "다음 식별자를 데이터베이스 목록에서 삭제하시겠습니까?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "언제든지 데이터베이스에 다시 연결할 수 있습니다.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "식별자", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "키", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "마지막 사용", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "생성", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "삭제", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "페이지 URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "무시", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "사용자 이름만 감지", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "삭제", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "모든 기능 활성화", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "새로운/수정된 인증 정보 비활성화", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "모든 기능 비활성화", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "저장된 사용자 정의 로그인 필드가 없습니다.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "아래 표에서 저장된 사용자 정의 로그인 필드를 관리할 수 있습니다.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "KeePassXC-브라우저에서 잘못된 로그인 필드를 감지했다면 올바른 필드를 직접 지정할 수 있습니다.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "해당 페이지로 이동하여 KeePassXC-브라우저 아이콘을 누른 다음 선택하십시오", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "저장된 사용자 정의 로그인 필드를 삭제하시겠습니까?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "다음 페이지의 저장된 사용자 정의 로그인 필드를 삭제하시겠습니까: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "다음 번에 이 페이지를 방문할 때 KeePassXC-브라우저에서 자동으로 로그인 필드를 감지합니다.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "무시할 사이트를 찾을 수 없습니다.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "사이트를 삭제하시겠습니까?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "이 페이지에 있는 사이트에서는 개별적 처리 방법을 사용합니다.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "지정한 사이트에서 새로운/수정된 인증 정보를 무시하려면 아래에 추가하거나 깜빡이는 KeePassXC-브라우저 아이콘을 누른 다음 선택하십시오", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "만약 모든 기능 비활성화를 선택하여 사이트를 완전히 무시한다면 해당 사이트를 방문할 때 플러그인을 비활성화합니다.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "사용자 이름만 감지 기능을 사용하면 KeePassXC-브라우저에서 사용자 이름과 암호를 별도의 웹 페이지로 입력하는 사이트의 로그인 정보를 입력합니다.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "직접 URL 추가", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "다음 사이트를 목록에서 삭제하시겠습니까: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-브라우저는 이 사이트에서 모든 기능을 활성화하고 사용자 이름만 감지 기능을 사용하지 않습니다.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "아래 표에서 저장된 사이트별 설정을 관리할 수 있습니다.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "페이지에서 확장 기능의 기능을 무시하는 옵션입니다.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Chrome 웹 스토어의 KeePassXC-브라우저 페이지를 방문합니다.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Mozilla 확장 기능 디렉터리의 KeePassXC-브라우저 페이지를 방문합니다.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "GitHub의 KeePassXC-브라우저 페이지를 방문합니다.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-브라우저 버전: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC 버전: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "기여자", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "라이선스", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "버그 보고", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "GitHub에 새 문제점 보고하기", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "다음 디버그 정보를 사용할 수 있습니다", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "값이 잘못되었습니다. 입력값을 확인하십시오.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "URL이 잘못되었습니다. 입력값을 확인하십시오.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "값이 목록에 이미 존재합니다.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "새 탭 열기", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP 기본 인증 대화상자", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/la/messages.json b/keepassxc-browser/_locales/la/messages.json new file mode 100644 index 0000000..fc86f3d --- /dev/null +++ b/keepassxc-browser/_locales/la/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC integratio pro interretialibus navigatoribus modernis", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Imple Nomine Usorio et Tessera", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Imple Tessera Tantum", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Imple TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Ostende Tesserarum Generatoris Icones", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Serva litteras credentiales", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Ostende generatorem tesserarium", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Litteras credentialies vel creare vel mutare potes incone extensionis deprimendo.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "HTTP authenticatio cum litteris credentialibus multis invent comprehensa sunt. Deprime iconem extensionis ut recta eligas.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Error incognitus.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Datorum basis non aperta est.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Datorum basis comminutum non receptum est.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Clientis publica clavis recepta non est.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Nuntius discifrari non potest.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Non potest connexi ad KeePassXC. Comproba in KeePassXC optionibus navigatoris integrationem habilitatam esse", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Actio aut cancellata aut vetita est.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Nuntii cifrandi defecerunt. Curritne KeePassXC?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC associatio fefellit. Conare iterum.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Permutatio clavorum non successavit.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Clavis cryptographica non cognita est.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nullae servatae datorum bases inventae sunt.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Prava actio.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Nuntius vacuus receptus.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nullum URL praebitum est.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nulla credentialia sunt inventa.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Icon generatoris tesserarii", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Tessera generata", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Imple quoque campum tesserarium sequentem ", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Biti", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Tesserarum Generator", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Genera", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Exscribe", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Imple et exscribe", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Error:\nHaec tessera generata longior est quam longitudo permitta!\nSecuta est ut longitudini conveniat.\n\nMemento, si vis, novam tesseram!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Genera tesseram", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Tessera generata recepi non potest.
      Curritne KeePassXC?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Dimitte", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Transi", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Ostende plus", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Iterum", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirme", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Campi credentiales pro hac pagina iam electi sunt et superscribentur.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Excute electum", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campus serialis #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Campus pro nomine usorio legendo", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Campus pro tessera nunc legenda", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirma electionem", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Confirma, si vis, electionem tuam vel elige plures campos pro Serialibus Campis.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Potes quoque numeris uti ut ex claviario campos inductos eligas.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nomen usorium", + "description": "General text for username." + }, + "password": { + "message": "Tessera", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- nullum nomen usorium -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Error:\nNulla credentialia inventa sunt.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Error:\nPlus uno credentiali in KeePassXC inventum est!\nDeprime KeePassXC-Navigatoris inconem ut plus optionum videas.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Error:\nNullae litterae credentialies pro praebito nomini usorio inventae sunt.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Error:\nCampi inveniri ad implendum non possunt.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Error:\nCampus tesserarius inveniri non potest.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Error:\nMutatae litterae credentiales non inventae sunt.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Emergens", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Configuratio", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Elige personalizatos initii campos pro hac pagina.", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Connecte", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconnecte", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Initii campos rursus inveni", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Reonera", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Reclude datorum basim", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeepassXC-Navigator errori occurrit.", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Uteris KeePassXC veteri versione.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Extrahe, si vis, novissimam versionem ex keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Comprobans statum...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Navigator non configuratus est. Deprime malleolum connexionis ut Navigatorem cum KeePassXC copules.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Naviagator disconnexus est de KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Deprime malleolum cui titulus \"Reconnecte est\" ut connexum novum constituas.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Navigator non iam connexit cum KeePassXC sed configuratus est signo: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Navigator connexus cum KeePassXC et configuratus est cum sequenti signo: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Mutatum est aut nomen usorium aut tesseram. Visne id servare?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Litterae credentiales in connexa datorum basi servabuntur cum signo $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Nomen usorium sequens non servatum est: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Credentialia cum nomine usorio uso sunt graviter marcata: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Elige, si vis, litteras credentiales actualizandas.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Elige, si vis, classem cui novas litteras credentiales addere vis.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Praebita classis defalta non invenitur. Omnes classes necessarias creabuntur.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Novae classes creari non possunt.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Litterae credentiales non actualizatae sunt. Tessera non actualizata est.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Litterae credentiales aut servari aut actualizari non possunt.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Elige login-informationem quae velis inducere in pagina.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Percolator:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Elige informationem credentialem vis tibi initurum esse.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Plus uno campo tesseralio in hac pagina inventus est. Dextrorsum deprime unum campum tesseralium, et elige unum ex:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nomen usorium:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Novum", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Actualizatio", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Dimitte", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Noli poscere umquam hanc paginam", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Claude", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Dimitte ostendeque dialogum authenticationis defaltum", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Configuratio | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Configuratio Generalis", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Datorum Bases Connectae", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Personalizati campi credentiales", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Potissima situs interretialis ", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Informatio de", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Generale", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Connectae Datorum Bases", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campos initiailizandi sessionis personalizatos", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Potissima situs interretialis ", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Informatio de", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Configura excurtiatus", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Serva", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Connecte", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Excute", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Adde", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Comproba utrum actualizationes sunt", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Ita, excute nunc", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Cancella", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Reimpone", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tempus in Connivendo:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Redirectionis numeratus:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximus numerus redirectionum:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Defalta classis ad novarum tesserarum servandum:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separa classem lineolis intercendentibus, e.g.: Classis/FiliaClassis.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Semper roga ubi oportet novas litteras credentialas servari.", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Popup habiltatu elenchum circulatum osdenit.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Activa generatorem tesserae.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Automatice litteras credentiales repete", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Automatice imple nomina singulorum credentialorum.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Activa autocomplete pro campis nominum usoriorum.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Ostende notificationes.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Serva dominium solum.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Ostende notificationem si litterae credentialiae novae in datorum basi servari possunt.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Automatice imple HTTP Basic Auth dialogos et submitte eos.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Comproba si actualizationes sint pro KeePassKC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "ternis (3) diebus", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "singulis hebdomadis", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "singulis mensibus", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "numquam", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Excurtiatus claviaturiales", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maximum tempus (ms) oportet iconem connivere postquam novae litterae credentiales inveniuntur", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimum tempus (ms) oportet iconem connivere dum cesset propter redirectiones paginales.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 ut tantum tempus connivendi conferatur, praeterens Maximum Redirectionum Numerum (vetus usus)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Quot paginas periterare oportet tabellam post redirectionem ante inconem disactivandum?", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Addit malleolum campis tesserariis ad novam tesseram generandam.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "KeePassXC tesseras generat profilo tesserarum generandarum.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Navigator, cum tabella activatur, litteras credentiales statim referret. ", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Permitte ipsum KeePassXC-Navigatorem implere litteras credentiales si solum unum nomen recipiat.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Cave! Auto-implere non est tutum a periculo. Utere tuo periculo.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Ostende elenchum pendentem omnes litteras credentiales habentem omnium camporum usoriorum qui sunt in singula pagina.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Ostende notificationes cum errores sint aut congressus cum usore opus est. ", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Quotiescumque novas litteras credentiales servas, serva solum dominium pro plena URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Si litterae credentiales pro pagina inveniatur et login-typus est HTTP Basic Auth request, KeePassXC-Navigator intrare conabitur primis datis litteris credentialibus.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Dialogus HTTP Basic Auth similis eo videtur:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Navigator requirit KeePassXC litteras credentiales arcessere.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Novissimam versionem stabilem extrahere potes ex $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Agis KeePassXC versionem: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Novissima versio KeePassXC in promptu: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Defaltum: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinitum: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Suasum: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Excurtiatus pro $1 sine errore mutatus est.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Excurtiatus for $1 reimpositus est.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Error: Excurtiatus pro $1 mutatus non est!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Sequentes KeePassXC datorum bases ad KeePassXC-Navigatorem connectae sunt.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nullae datorum bases connectae inventae sunt.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Excutiaturne indentifactor ex datorum basis tabula?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Num vis sequentem identificatorem ex datorum basis tabula excutere?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Reconnectere datorum basim semper potes.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificator", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Clavis", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Novissime usum", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Creatum", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Dele", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Paginae URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Praetere", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Detectio nominis usorii tantum", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Dele", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Habilita omnia propria", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Debilita litteras credentiales novas aut mutatas", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Debilita omnia propria", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nulli personalizati campi credentiales inventi sunt.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Tabulae inferioris opere, potes servatos campos credentiales administrare.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Si KeePassXC-Navigator inveniat falsos initializandi campos, potes ipse rectos campos indicare.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Adi ad paginam et deprime KeePassXC-Navigatoris iconem, deinde elige", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Visne excutere campos sessionis initializandi personalizatos servatos?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Num vis huius paginae campos servatos initializandi sessionis personalizatos: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Navigator initializandi campos automatice inveniet in tuo visitatione huius paginae sequenti. ", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nulli interretiales situs praeteriti inventi sunt.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Visne excutere situm interretialem?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Situs interretiales in hac pagina habunt iis modos tractandi proprios.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Ut praetereas litteras cuiusdam situs interretialis credentiales, vel ea adde infra vel deprime iconem KeePassXC-Navigator eligeque.", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Si situs interretialis est omnino praeteritus ( Debilita omnia propria), hoc plugin nihil operabit quoties illum situm visitas.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Detectio pro nomini usorio tantum inveniendo efficit ut KeePassXC-Navigator singulas res de sessionis initio in interretilibus sitis separatas paginas pro nomine usorio et pro tessera habentis implere possit.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Adde URL manualiter", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Num vis situm interretialem praebitum ex indice excutere: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Navigator omnia pro hoc sito interretiali propria habilitabit et detectionem tantum pro nomini usorio excutiet.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Tabulae inferioris opere, potes servata potissima administrare.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Optio ad proprium extensionis ignorandum in quaqua pagina.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Visita KeePassXC-Navigator in Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Visita KeePassXC-Navigator in Mozilla Add-ons indice.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Vistita KeePassXC-Navigator in GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Navigatoris Versio: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC Versio: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributores", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licentiae", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Nuntia errores", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Crea novam adsumptionem in GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Debug informatio sequens potest adhiberi", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalidus valor. Comproba, si vis, inductum.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "URL invalida. Comproba, si vis, inductum.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Valor iam est in indice.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Tabellam novam aperit", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authenticationis dialogus", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/nl_NL/messages.json b/keepassxc-browser/_locales/nl_NL/messages.json new file mode 100644 index 0000000..c6127ff --- /dev/null +++ b/keepassxc-browser/_locales/nl_NL/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC-integratie voor moderne webbrowsers", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Gebruikersnaam en wachtwoord invullen", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Alleen wachtwoord invullen", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP invullen", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Wachtwoordgenerator-pictogrammen tonen", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Inloggegevens opslaan", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Wachtwoordgenerator weergeven", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Creëer of bewerk de inloggegevens door de klikken op het extensiepictogram.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "HTTP-authenticatie met meerdere inloggegevens gedetecteerd. Klik op het extensiepictogram om de juiste te kiezen.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Onbekende fout.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Databank niet geopend.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Geen databank-hash ontvangen.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Geen openbare client-sleutel ontvangen.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Kan bericht niet ontcijferen.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Kan niet met KeePassXC verbinden. Controleer of browser integratie aan staat in de KeePassXC instellingen.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Actie geannuleerd of geweigerd.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Berichtencryptie is niet gelukt. Is KeePassXC wel gestart?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC-associatie mislukt; probeer het opnieuw.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Sleuteluitwisseling is mislukt.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Beveiligingssleutel wordt niet herkend.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Geen opgeslagen databanken aangetroffen.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Onjuiste actie.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Leeg bericht ontvangen", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Geen URL opgegeven.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Geen inloggegevens aangetroffen.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Wachtwoordgenerator pictogram", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Gegeneerd wachtwoord", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Volgend wachtwoordveld ook invullen", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Wachtwoordgenerator", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Genereren", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Kopiëren", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Invullen en kopiëren", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Fout:\nHet gegenereerde wachtwoord is langer dan de toegestane lengte!\nHet wachtwoord is daarom ingekort.\n\nOnthoudt het nieuwe wachtwoord!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Wachtwoord genereren", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Kan gegenereerd wachtwoord niet ontvangen.
      Is KeePassXC actief?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Verwerpen", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Overslaan", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Meer", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Opnieuw", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Bevestigen", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "De inlogvelden op deze pagina zijn al geselecteerd en worden overschreven.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Selectie verwerpen", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "String-veld #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Kies een gebruikersnaamveld", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Kies een wachtwoordveld", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Bevestig de selectie", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Bevestig je selectie of kies meerdere velden als stringvelden.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Gebruikersnaam", + "description": "General text for username." + }, + "password": { + "message": "Wachtwoord", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- geen gebruikersnaam -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Fout:\nGeen inloggegevens aangetroffen.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Fout:\nEr zijn meerdere inloggegevens aangetroffen in KeePassXC!\nDruk op het KeePassXC-browserpictogram voor meer opties.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Fout:\nGeen inloggegevens aangetroffen voor de opgegeven gebruikersnaam.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Fout:\nGeen in te vullen velden aangetroffen.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Fout:\nGeen wachtwoordveld aangetroffen.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Fout:\nKan gewijzigde inloggegevens niet detecteren.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Pop-up", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Instellingen", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Kies aangepaste inlogvelden voor deze pagina", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Koppelen", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Opnieuw koppelen", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Inlogvelden opnieuw detecteren", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Herladen", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Databank heropenen", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "Er is een fout opgetreden in KeePassXC-Browser:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Je gebruikt een oude versie van KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Download de nieuwste versie op keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Bezig met controleren van status...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser is niet ingesteld. Druk op de knop 'Koppelen' om te koppelen met KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser is niet langer gekoppeld aan KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Druk op de knop 'Opnieuw koppelen' om een nieuwe verbinding op te zetten.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser is nog niet gekoppeld aan KeePassXC, maar is wél ingesteld met de identificatie: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser is gekoppeld aan KeePassXC en is ingesteld met de volgende identificatie: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Gebruikersnaam of wachtwoord gewijzigd. Opslaan?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "De inloggegevens worden opgeslagen in de gekoppelde databank met de identificatie $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "De volgende gebruikersnaam is nog niet opgeslagen: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "De inloggegevens met de gebruikte gebruikersnaam zijn vetgedrukt: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Kies de bij te werken inloggegevens.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Kies de inloggegevens die je wilt invullen op de pagina.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filter:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Kies de inloggegevens waarmee je wilt inloggen.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Er is meer dan één wachtwoordveld aangetroffen op deze pagina. Druk met de rechtermuisknop op één van de velden en kies één van de:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Gebruikersnaam", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nieuw", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Bijwerken", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Sluiten", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Nooit vragen op deze pagina", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Sluiten", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Sluiten en standaard authenticatievenster tonen", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Instellingen | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Algemene instellingen", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Gekoppelde databanken", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Aangepaste inlogvelden", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Websitevoorkeuren", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Over", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Algemeen", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Gekoppelde databanken", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Aangepaste inlogvelden", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Websitevoorkeuren", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Over", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Sneltoetsen instellen", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Bewaren", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Koppelen", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Verwijderen", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Toevoegen", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Controleren op updates", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Ja, nu verwijderen", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Annuleren", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Terugzetten", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Knippertijd:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Doorverwijstijd:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximaal aantal doorverwijzingen:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Wachtwoordgenerator activeren.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Inloggegevens automatisch ophalen.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Pagina's met één inlogveld automatisch invullen.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Auto-aanvullen inschakelen voor gebruikersnaamvelden.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Meldingen tonen.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Alleen domeinnaam opslaan.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Melding tonen als er nieuwe inloggegevens kunnen worden opgeslagen in de databank.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "HTTP Basic Auth-velden automatisch invullen en versturen.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Controleren op updates:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "elke 3 dagen", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "elke week", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "elke maand", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nooit", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Sneltoetsen", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maximale tijd (ms) dat het pictogram moet knipperen na het detecteren van nieuwe inloggegevens", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimale tijd (ms) dat het pictogram moet knipperen voordat pagina-doorverwijzingen worden uitgeschakeld.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 om knippertijd te gebruiken waarbij het maximale aantal doorverwijzingen wordt genegeerd (oorspronkelijke instelling)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Hoeveel pagina's moeten worden doorgebladerd na het doorverwijzen voordat het een pictogram wordt gedeactiveerd", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Voegt een knop toe aan wachtwoordvelden om een nieuw wachtwoord te genereren.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Wachtwoorden worden gegenereerd door KeePassXC op basis van je wachtwoordgeneratie-profiel.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser haalt inloggegevens automatisch op als een tabblad wordt geactiveerd.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Inloggegevens automatisch invullen als er slechts één veld wordt gedetecteerd.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Waarschuwing: auto-aanvullen is niet veilig. Gebruik op eigen risico.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Toont een uitklaplijst met beschikbare inloggegevens voor alle gebruikersnaamvelden op de pagina.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Toont een melding bij fouten en als gebruikershandelingen vereist zijn.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Alleen de domeinnaam opslaan i.p.v. de volledige URL bij het opslaan van nieuwe inloggegevens.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Als inloggegevens worden aangetroffen voor een pagina en de inlogsoort is HTTP Basic Auth, dan probeert KeePassXC-Browser in te loggen met de eerste de beste inloggegevens.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Een HTTP Basic Auth-venster ziet er zo uit:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-browser heeft KeePassXC nodig om inloggegevens op te halen.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Je kunt de nieuwste stabiele versie downloaden op $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Je gebruikt KeePassXC, versie: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Nieuwste beschikbare versie van KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Standaard: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Oneindig: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Aanbevolen: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Sneltoets voor $1 is veranderd.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Sneltoets voor $1 is hersteld.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Fout: Sneltoets voor $1 is niet veranderd!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "De volgende KeePassXC-databanken zijn gekoppeld aan KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Geen gekoppelde databanken aangetroffen.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Identificatie verwijderen uit databanklijst?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Weet je zeker dat je de volgende identificatie wilt verwijderen uit de databanklijst?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Je kunt je databank op elk moment opnieuw koppelen.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificatie", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Sleutel", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Laatst gebruikt op", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Gecreëerd op", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Verwijderen", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Pagina-URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Negeren", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Alleen gebruikersnamen detecteren", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Verwijderen", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Alle functies inschakelen", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Nieuwe/gewijzigde inloggegevens uitschakelen", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Alle functies uitschakelen", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Geen aangepaste inlogvelden aangetroffen.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Als KeePassXC-Browser de verkeerde inlogvelden detecteert, dan kun je de juiste velden zelf opgeven.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Ga naar de pagina, klik op het KeePassXC-browserpictogram en kies", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Opgeslagen aangepaste inlogvelden verwijderen?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Weet je zeker dat je de opgeslagen aangepaste inlogvelden wilt verwijderen op de pagina: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser detecteert automatisch de inlogvelden bij je volgende paginabezoek.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Geen genegeerde websites aangetroffen.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Website verwijderen?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Websites op deze pagina hebben speciale behandelingsmethoden toegewezen gekregen.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Om nieuwe/aangepaste inloggegevens op een specifieke site te nergeren, voeg ze hier onder toe of klik op het knipperende KeePassXC-Browser icoon en selecteer", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Als een site volledig is genegeerd (Alle functies uitschakelen is geselecteerd), dan zal de plugin niks doen wanneer die site bezoekt.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Alleen gebruikersnaamen detecteren laat KeePassXC-Browser inloggegevens invullen op websites met aparte pagina's voor gebruikersnaam en wachtwoord.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Weet je zeker dat je de gespecificeerde site wil verwijderen uit de lijst: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser zal alle functionaliteiten aanzetten voor deze site en alleen-gebruikersnaam detectie uitschakelen", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Bekijk KeePassXC-Browser in de Chrome Web Store", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Bekijk KeePassXC-Browser in de Mozilla Add-ons lijst", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Bekijk KeePassXC-Browser op GitHub", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser versie: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC versie: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/pl/messages.json b/keepassxc-browser/_locales/pl/messages.json new file mode 100644 index 0000000..d62e310 --- /dev/null +++ b/keepassxc-browser/_locales/pl/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC - integracja z nowoczesnymi przeglądarkami internetowymi", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Wypełnij nazwę użytkownika i hasło", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Wypełnij tylko hasło", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Wypełnij TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Pokaż ikony generatora haseł", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Zapisz dane uwierzytelniające", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Pokaż generator haseł", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Utwórz lub zmień dane uwierzytelniające poprzez kliknięcie ikony rozszerzenia.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Uwierzytelnianie HTTP z wykrytymi wieloma danymi uwierzytelniającymi. Kliknij ikonę rozszerzenia, aby wybrać właściwe.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Nieznany błąd.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Baza danych nie została otwarta.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Nie otrzymano hashu bazy danych.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Klucz publiczny klienta nie został odebrany.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Nie można odszyfrować wiadomości.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Nie można połączyć się z KeePassXC. Sprawdź, czy integracja przeglądarki jest włączona w ustawieniach KeePassXC.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Działanie anulowane lub odrzucone.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Szyfrowanie wiadomości nie powiodło się. Czy KeePassXC jest uruchomiony?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Powiązanie KeePassXC nie powiodło się, spróbuj ponownie.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Wymiana klucza nie powiodła się.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Klucz szyfrowania nie jest rozpoznawany.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nie znaleziono zapisanych baz danych.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Nieprawidłowe działanie.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Otrzymano pustą wiadomość.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nie podano adresu URL.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nie znaleziono loginów.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Ikona generatora haseł", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Wygenerowane hasło", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Wypełnij także kolejne pole hasła", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bity", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Generator hasła", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Wygeneruj", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Skopiuj", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Wypełnij i skopiuj", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Błąd:\nWygenerowane hasło jest dłuższe niż dozwolona długość!\nZostało przycięte, aby pasowało do długości.\n\nZapamiętaj nowe hasło!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Wygeneruj hasło", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Nie można odebrać wygenerowanego hasła.
      Czy KeePassXC jest włączony?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Odwołaj", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Pomiń", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Pokaż więcej", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Jeszcze raz", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Potwierdź", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Pola logowania dla tej strony są już wybrane i zostaną nadpisane.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Odrzuć wybór", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Pole ciągów #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Wybierz pole nazwy użytkownika", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Teraz wybierz pole hasła", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Potwierdź wybór", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Potwierdź swój wybór lub wybierz więcej pól jako Pola ciągów.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Możesz także użyć liczb, aby wybrać pola wprowadzania z klawiatury.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nazwa użytkownika", + "description": "General text for username." + }, + "password": { + "message": "Hasło", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- brak nazwy użytkownika -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Błąd:\nNie znaleziono loginów.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Błąd:\nZnaleziono więcej niż jeden login w KeePassXC!\nWciśnij ikonę KeePassXC-Browser, aby uzyskać więcej opcji.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Błąd:\nNie znaleziono danych uwierzytelniających dla podanej nazwy użytkownika.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Błąd:\nNie można znaleźć pól do wypełnienia.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Błąd:\nNie można znaleźć pola hasła.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Błąd:\nNie można wykryć zmienionych danych uwierzytelniających", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Ustawienia", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Wybierz niestandardowe pola logowania dla tej strony", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Połącz", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Połącz ponownie", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Ponownie wykryj pola logowania", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Przeładuj", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": " Ponownie otwórz bazę danych", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser napotkał błąd:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Używasz starej wersji KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Pobierz najnowszą wersję z keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Sprawdzanie stanu...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser nie został skonfigurowany. Wciśnij przycisk połączenia, aby sparować z KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser został odłączony od KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Wciśnij przycisk ponownego połączenia, aby ustanowić nowe połączenie.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser jeszcze nie połączył się z KeePassXC, ale został skonfigurowany przy użyciu identyfikatora: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser jest połączony z KeePassXC i został skonfigurowany przy użyciu następującego identyfikatora: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Nazwa użytkownika lub hasło zostały zmienione! Zapisać to?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Dane uwierzytelniające zostaną zapisane w podłączonej bazie danych z identyfikatorem $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Następująca nazwa użytkownika nie jest obecnie zapisana: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Dane uwierzytelniające z używaną nazwą użytkownika są oznaczone pogrubieniem: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Wybierz dane uwierzytelniające, które chcesz zaktualizować.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Wybierz grupę, do której chcesz dodać nowe dane uwierzytelniające.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Błąd: Nie znaleziono określonej domyślnej grupy. Tworzenie wszystkich niezbędnych grup.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Nie można utworzyć nowych grup lub grupy.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Błąd: Dane uwierzytelniające nie zostały zaktualizowane. Hasło nie zostało zmienione.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Błąd: Nie można zapisać ani zaktualizować danych uwierzytelniających.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Wybierz dane logowania, które chcesz wprowadzić na stronie.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtr:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Wybierz dane logowania, z którymi chcesz się zalogować.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Znaleziono więcej niż jedno pole hasła na tej stronie. Kliknij prawym przyciskiem myszy jedno z pól hasła i wybierz jedno z:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "Adres URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nazwa użytkownika: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nowe", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Zaktualizuj", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Odwołaj", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Nigdy nie pytaj o tę stronę", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Zamknij", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Odwołaj i pokaż domyślne okno uwierzytelniania", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Ustawienia | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Ustawienia główne", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Podłączone bazy danych", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Niestandardowe pola logowania", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Ustawienia witryny", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Informacje", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Ogólne", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Podłączone bazy danych", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Niestandardowe pola logowania", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Ustawienia witryny", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Informacje", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": " Skonfiguruj skróty", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Zapisz", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Połącz", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Usuń", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Dodaj", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Sprawdź aktualizacje", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Tak, usuń teraz", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Anuluj", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Resetuj", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Czas migania:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Przesunięcie przekierowania:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maksymalna liczba przekierowań:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Domyślna grupa do zapisywania nowych haseł:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Oddziel grupę ukośnikami, na przykład: Grupa/Podgrupa.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Zawsze pytaj, gdzie zapisać nowe dane uwierzytelniające", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Po włączeniu popup pokazuje listę grup.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Aktywuj generator haseł.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Automatycznie pobieraj dane uwierzytelniające.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Automatycznie wypełnij pojedyncze wpisy.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Aktywuj autouzupełnianie dla pól nazwy użytkownika.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Pokaż powiadomienia.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Zapisz tylko domenę.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Pokaż powiadomienie, gdy nowe dane uwierzytelniające mogą zostać zapisane w bazie danych.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Automatycznie wypełniaj okna dialogowe podstawowego uwierzytelniania HTTP i przesyłaj je.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Sprawdź dostępność aktualizacji KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "co 3 dni", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "co tydzień", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "co miesiąc", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nigdy", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Skróty klawiszowe", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maksymalny czas (ms), w którym ikona powinna migać po wykryciu nowych danych uwierzytelniających", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimalny czas (ms), w któym ikona powinna migać przed dezaktywacją z powodu przekierowań strony.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1, aby używać tylko czasu migania z ignorowaniem maksymalnych przekierowań (stare zachowanie)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Ile stron powinna przejść karta po przesunięciu przekierowania przed dezaktywacją ikony", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Dodaje przycisk do pól hasła w celu wygenerowania nowego hasła.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Hasła są generowane przez KeePassXC przy użyciu profilu generowania haseł.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser natychmiast odbierze dane uwierzytelniające po aktywowaniu karty.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Pozwól KeePassXC-Browser automatycznie wypełnić dane uwierzytelniające, jeśli otrzyma tylko jeden wpis.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Ostrzeżenie! Korzystanie z automatycznego wypełniania nie jest bezpieczne. Używaj na własne ryzyko.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Pokaż listę rozwijaną zawierającą dostępne dane uwierzytelniające dla wszystkich pól nazwy użytkownika na stronie.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Pokaż powiadomienia o błędach, i gdy wymagana jest interakcja użytkownika.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Zapisując nowe dane uwierzytelniające, zapisz tylko domenę zamiast pełnego adresu URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Jeśli znaleziono dane uwierzytelniające dla strony, a typem logowania jest żądanie podstawowego uwierzytelniania HTTP, KeePassXC-Browser spróbuje zalogować się przy użyciu pierwszych danych uwierzytelniających.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Okno dialogowe podstawowego uwierzytelniania HTTP wygląda następująco:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser potrzebuje KeePassXC do pobierania danych uwierzytelniających.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Możesz pobrać najnowszą stabilną wersję z $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Używasz KeePassXC w wersji: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Najnowsza dostępna wersja KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Domyślne: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Nieskończone: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Polecane: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Skrót do $1 został pomyślnie zmieniony.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Skrót dla $1 został zresetowany.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Błąd: Skrót dla $1 nie został zmieniony!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Następujące bazy danych KeePassXC są podłączone do KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nie znaleziono podłączonych baz danych.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Usunąć identyfikator z listy baz danych?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Czy na pewno chcesz usunąć następujący identyfikator z listy baz danych?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Możesz ponownie połączyć się z bazą danych w dowolnym momencie.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identyfikator", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Klucz", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Ostatnio używana", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Utworzona", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Usuwanie", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Adres URL strony", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorowanie", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Wykrywanie tylko nazwy użytkownika", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Usuwanie", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Włącz wszystkie funkcje", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Wyłącz nowe/zmodyfikowane dane uwierzytelniające", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Wyłącz wszystkie funkcje", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nie znaleziono zapisanych niestandardowych pól logowania.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Możesz zarządzać zapisanymi niestandardowymi polami logowania, korzystając z poniższej tabeli.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Jeśli KeePassXC-Browser wykryje niewłaściwe pola logowania, możesz samodzielnie określić poprawne pola.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Przejdź do strony i kliknij ikonę KeePassXC-Browser, a następnie wybierz ", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Usunąć zapisane niestandardowe pola logowania?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Czy na pewno chcesz usunąć zapisane niestandardowe pola logowania na stronie: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser automatycznie wykryje pola logowania przy następnej wizycie na tej stronie.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nie znaleziono ignorowanych witryn.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Usunąć witrynę?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Witryny na tej stronie zawierają specjalne metody obsługi.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Aby zignorować nowe/zmodyfikowane dane uwierzytelniające na określonej witrynie, dodaj je poniżej lub kliknij migającą ikonę KeePassXC-Browser i wybierz", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Jeżeli witryna jest w pełni ignorowana (Wyłącz wszystkie funkcje jest wybrane), wtyczka nie zrobi nic podczas odwiedzania tej witryny.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Wykrywanie tylko nazwy użytkownika pozwala KeePassXC-Browser na wpełnienie danych logowania na witrynach internetowych z osobnymi stronami dla nazwy użytkownika i hasła.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Dodaj ręcznie adres URL", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Czy na pewno chcesz usunąć określoną witrynę z listy: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser włączy wszystkie funkcje dla tej witryny i usunie wykrywanie tylko nazwy użytkownika.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Możesz zarządzać zapisanymi preferencjami witryny, korzystając z poniższej tabeli.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Opcja ignorowania funkcji rozszerzenia strony.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Odwiedź KeePassXC-Browser w Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Odwiedź KeePassXC-Browser w katalogu Dodatki do Firefoksa.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Odwiedź KeePassXC-Browser na GitHubie.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Wersja KeePassXC-Browser: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Wersja KeePassXC: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Współtwórcy", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licencje", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Zgłoś błędy", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Utwórz nowy problem techniczny na GitHubie", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Można użyć następujących informacji debugowania", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Niewłaściwa wartość. Sprawdź dane wejściowe.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Niewłaściwy adres URL. Sprawdź dane wejściowe.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Wartość już istnieje na liście.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Otwiera nową kartę", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "Okno dialogowe podstawowego uwierzytelniania HTTP", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/pt/messages.json b/keepassxc-browser/_locales/pt/messages.json new file mode 100644 index 0000000..93f910c --- /dev/null +++ b/keepassxc-browser/_locales/pt/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Integração KeepassXC para os navegadores modernos", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Preencher nome de utilizador e palavra-passe", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Preencher palavra-passe", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Preencher TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Mostrar ícones do gerador de palavra-passe", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Guardar credenciais", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Show password generator", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Criar ou modificar credenciais clicando no ícone da extensão.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Detetada autenticação HTTP com múltiplas credenciais. Clique no ícone da extensão para escolher as corretas.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Erro desconhecido.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Base de dados não aberta.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "'Hash' da base de dados não recebida.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Chave pública do cliente não recebida.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Não foi possível decifrar a mensagem.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Ação cancelada ou recusada.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Falha ao associar o KeePassXC. Tente novamente.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Troca de chaves não efetuada com sucesso.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Chave de cifra não reconhecida.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Não existem bases de dados guardadas.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Ação incorreta.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Recebida uma mensagem vazia.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nenhum URL indicado.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Credenciais não encontradas.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Palavra-passe gerada", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Preencher também o campo seguinte da palavra-passe", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Gerador de palavra-passe", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Gerar", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copiar", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Preencher e copiar", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Erro:\nA palavra-passe gerada tem um tamanho superior ao permitido.\nO tamanho foi ajustado.\n\nPor favor memorize a nova palavra-passe!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Gerar palavra-passe", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "A palavra-passe gerada não foi recebida.
      O KeepassXC está em execução?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Rejeitar", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Ignorar", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Novamente", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirmação", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Os campo para esta página já foram selecionados e serão substituídos.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Rejeitar seleção", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campo de cadeia #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Escolha o campo para o nome de utilizador", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Agora escolha o campo para a palavra-passe", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirme a seleção", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Confirme a sua seleção ou escolha mais campos como campos de cadeia.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nome de utilizador", + "description": "General text for username." + }, + "password": { + "message": "Palavra-passe", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- sem nome de utilizador -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Erro:\nCredenciais não encontradas.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Erro:\nExiste mais do que uma credencial no KeePassXC!\nPrima no ícone KeePassXC-Browser para ver mais opções.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Erro:\nNão existem credenciais para o nome de utilizador encontrado.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Erro:\nNão foram encontrados campos que possam ser preenchidos.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Erro:\nNão foi possível detetar o campo de palavra-passe.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Erro:\nNão foi possível detetar as credenciais alteradas.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Alerta", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Definições", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Escolha os campos de autenticação personalizados para esta página", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Conetar", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconetar", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Redetetar campos de autenticação", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Recarregar", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Reabrir base de dados", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser encontrou um erro:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Está a usar uma versão antiga do KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Descarregue a versão mais recente em keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "A verificar o estado...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "O KeePassXC-Browser não foi configurado. Pressione o botão de conexão para emparelhar com o KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "O KeePassXC-Browser foi desconectado do KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Prima o botão Reconectar para estabelecer uma nova ligação.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "O KeePassXC-Browser ainda não se conectou ao KeePassXC, mas foi configurado utilizando o identificador: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "O KeePassXC-Browser está conectado ao KeePassXC e foi configurado utilizando o seguinte identificador: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Nome de utilizador ou palavra-passe alterada. Guardar alterações?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "As credenciais serão guardadas na base de dados conectada com o identificador $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "O seguinte nome de utilizador não está guardado: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "As credenciais para o nome de utilizador utilizado estão marcadas a negrito: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Por favor escolha as credenciais que deseja atualizar.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Selecione a informação que deseja guardar para esta página.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtrar:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Selecione as informações de autenticação com as quais gostaria de se autenticar.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Foi encontrado mais do que um campo de palavra-passe nesta página. Clique com o botão direito do rato num dos campos de palavra-passe e escolha um dos seguintes:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nome de utilizador:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nova", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Atualizar", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Rejeitar", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Não voltar a perguntar para esta página", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Fechar", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Rejeitar e mostrar o diálogo de autenticação padrão.", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Definições | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Definições gerais", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bases de dados conectadas", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Campos personalizados de autenticação", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Preferências do site", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Acerca", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Geral", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bases de dados conectadas", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campos personalizados de autenticação", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Preferências do site", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Acerca", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Configurar atalhos", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Guardar", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Conetar", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Remover", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Adicionar", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Procurar atualizações", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Sim, remover agora", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": " Cancelar", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Repôr", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tempo de intermitência:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Atraso de redirecionamento:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Número (máximo) de redirecionamentos:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Ativar gerador de palavras-passe.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Obter credenciais automaticamente.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Preencher automaticamente as entradas de credenciais únicas.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Ativar conclusão automática para o campo nome de utilizador.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Mostrar notificações.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Guardar apenas domínio.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Mostrar uma notificação se as novas credenciais puderem ser guardadas.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Preencher e enviar automaticamente as caixas de diálogo de autenticação básica HTTP.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Procurar por atualizações do KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "a cada 3 dias", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "a cada semana", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "a cada mês", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nunca", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Teclas de atalho", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Tempo máximo (ms) que o ícone deve piscar após detetar novas credenciais", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Tempo mínimo (ms) que o ícone deve piscar antes de desativar devido a redirecionamentos de página.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 para usar apenas o tempo de piscar ignorando o máximo de redirecionamentos (comportamento antigo)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Quantas páginas deve o separador percorrer após o atraso de redirecionamento antes de desativar o ícone", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Adiciona um botão aos campos de palavras-passe para gerar uma nova palavra-passe.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "As palavras-passe serão geradas no KeePassXC utilizando o seu perfil de criação de palavras-passe.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser irá obter automaticamente as credenciais quando um separador for ativado.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Deixar o KeePassXC-Browser preencher automaticamente as credenciais se receber apenas uma única entrada.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Atenção! O preenchimento automático não é seguro. Use-o por sua conta e risco.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Mostrar uma lista suspensa contendo as credenciais disponíveis para todos os campos nome de utilizador de uma página.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Mostrar notificações para erros e quando for necessária qualquer interação.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Ao guardar as novas credenciais, guardar apenas o domínio e não o URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Se forem encontradas credenciais para uma página e o tipo de autenticação for uma solicitação de autenticação básica HTTP, o KeePassXC-Browser tentará fazer a autenticação com as primeiras credenciais encontradas.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Um diálogo de autenticação básica HTTP é parecido com este:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser necessita do KeePassXC para obter as credenciais.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Pode descarregar a versão mais recente em $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Está a utilizar o KeePassXC, versão: $1 ", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "A versão mais recente do KeePassXC é a:$1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Padrão: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinito: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Recomendado: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "O atalho para $1foi mudado com successo", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "O atalho para $1foi reposto", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Erro: O atalho para $1não foi mudado!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "As seguintes bases de dados do KeePassXC estão conectadas ao KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Não foi encontrada uma base de dados conectada.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Remover identificador da lista de bases de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Tem a certeza de que deseja remover o seguinte identificador da lista da base de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Pode reconectar a sua base de dados a qualquer momento.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificador", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Chave", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Última utilização", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Criada", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Apagar", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL da página", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorar", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Deteção apenas de nome de utilizador", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Apagar", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Ativar todas as funcionalidades", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Desativar credenciais novas/modificadas.", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Desativar todas as funcionalidades", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Não foi encontrado um campo de autenticação personalizado guardado.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Se o KeePassXC-Browser detetar os campos de autenticação errados, você poderá especificar os campos corretos.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Aceda à página, clique no ícone KeePassXC-Browser e selecione", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Remover campos de autenticação personalizados guardados?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Tem a certeza de que deseja remover os campos personalizados de autenticação guardados para a página: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "O KeePassXC-Browser detetará automaticamente os campos de autenticação na próxima vez que visitar esta página.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Não existem sites ignorados.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Remover site?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Os sites nesta página têm métodos especiais de manipulação associados.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Para ignorar credenciais novas/alteradas num site específico, adicione-as abaixo ou clique no ícone do KeePassXC-Browser intermitente e selecione", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Se um site for totalmente ignorado (se a opção Desativar todas as funcionalidades for selecionada), o suplemento não fará nada ao visitar este site.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "A deteção de apenas nome de utilizador permite que o KeePassXC-Browser preencha os detalhes de autenticação em sites com páginas distintas para nome de utilizador e palavra-passe.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Tem a certeza de que deseja remover o site especificado da lista$1?", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "O KeePassXC-Browser irá ativar todos as funcionalidades para este site e removerá a deteção única do nome de utilizador.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Aceder a KeePassXC-Browser na Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Aceder a KeePassXC-Browser no diretório de extras Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Aceda a KeePassXC-Browser no GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser versão: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC versão: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/pt_BR/messages.json b/keepassxc-browser/_locales/pt_BR/messages.json new file mode 100644 index 0000000..778ffb5 --- /dev/null +++ b/keepassxc-browser/_locales/pt_BR/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Integração ao KeePassXC para navegadores modernos", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Preencher usuário e senha", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Preencher apenas senha", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Preencher TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Mostrar ícones do gerador de senhas", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Salvar credenciais", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Exibir gerador de senhas", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Crie ou modifique as credenciais clicando no ícone da extensão.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Autenticação HTTP com várias credenciais detectadas. Clique no ícone da extensão para escolher o correto.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Erro desconhecido.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "O banco de dados não está aberto.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Hash do banco de dados não recebido.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Chave pública do cliente não recebida.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Não é possível descriptografar a mensagem.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Não foi possível conectar ao KeePassXC. Verifique se a integração do navegador está ativada nas configurações do KeePassXC.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Ação cancelada ou negada.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "A criptografia de mensagens falhou. O KeePassXC está em execução?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "A associação ao KeePassXC falhou, tente novamente.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "A troca de chaves não foi bem sucedida.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "A chave de criptografia não foi reconhecida.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Nenhum banco de dados salvo foi encontrado.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Ação incorreta.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Mensagem vazia recebida.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nenhuma URL fornecida.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Nenhum login encontrado.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Ícone do gerador de senhas", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Senha gerada.", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Preencher também o próximo campo de senha", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? Bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Gerador de senhas", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Gerar", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copiar", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Preencher e copiar", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Erro:\nA senha gerada é maior que o tamanho permitido!\nEla foi cortada para caber no tamanho.\n\nPor favor, lembre-se da nova senha!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Gerar senha", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Não é possível receber a senha gerada.
      O KeePassXC está aberto?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Cancelar", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Pular", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Mostrar mais", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Novamente", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirmar", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Os campos de login para esta página já estão selecionados e serão sobrescritos.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Descartar seleção", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campo de string #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Escolha um campo de usuário", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Agora escolha um campo de senha", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirme a seleção", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Por favor, confirme sua seleção ou escolha mais campos como Campos de String.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Você também pode usar os números para escolher os campos de entrada do teclado.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Usuário", + "description": "General text for username." + }, + "password": { + "message": "Senha", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- sem usuário -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Erro:\nNenhum login encontrado.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Erro:\nMais de um login foi encontrado no KeePassXC!\nPressione o ícone do KeePassXC-Browser para mais opções.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Erro:\nNenhuma credencial encontrada para o nome de usuário.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Erro:\nNão foi possível encontrar campos para preencher.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Erro:\nNão é possível encontrar um campo de senha.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Erro:\nNão foi possível detectar as credenciais alteradas.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Configurações", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Escolha campos de login personalizados para esta página", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Conectar", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconectar", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Redetectar os campos de login", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Recarregar", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Reabrir banco de dados", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "O KeePassXC-Browser encontrou um erro:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Você está usando uma versão antiga do KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Por favor, faça download da versão atualizada em keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Checando status...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "O KeePassXC-Browser não foi configurado. Pressione o botão de conexão para conectar com o KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "O KeePassXC-Browser foi desconectado do KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Pressione o botão de reconexão para estabelecer uma nova conexão.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "O KeePassXC-Browser ainda não se conectou ao KeePassXC, mas foi configurado usando o identificador: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "O KeePassXC-Browser está conectado ao KeePassXC e foi configurado usando o seguinte identificador: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Usuário ou senha modificados! Salvar?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Credenciais serão salvas no banco de dados conectado com o identificador $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "O seguinte nome de usuário não está salvo atualmente: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "As credenciais com o nome de usuário usado estão marcadas em negrito: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Por favor, escolha as credenciais que você deseja atualizar.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Por favor, escolha o grupo que você deseja adicionar as novas credenciais.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Erro: Grupo padrão especificado não encontrado. Criando todos os grupos necessários.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Novo(s) grupo(s) não pode(m) ser criado(s).", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Erro: Credenciais não atualizadas. A senha não foi alterada.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Erro: Credenciais não podem ser salvas ou atualizadas.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Selecione as informações de login que você gostaria de inserir na página.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtro:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Selecione as informações de login com as quais você gostaria de fazer login.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Mais de um campo de senha encontrado nesta página. Clique com o botão direito do mouse em um dos campos de senha e escolha um dos seguintes:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Usuário:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nova", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Atualizar", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Dispensar", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Nunca pergunte nesta página", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Fechar", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Dispensar e mostrar a caixa de diálogo de autenticação padrão", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Configurações | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Configurações Gerais", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bancos de dados conectados", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Campos de login personalizados", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Preferencias de sites", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Sobre", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Geral", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bancos de dados conectados", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campos de login personalizados", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Preferências de site", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Sobre", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Configurar atalhos", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Salvar", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Conectar", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Remover", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Adicionar", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Checar por atualizações", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Sim, remover agora", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Cancelar", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Restaurar", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tempo Piscando:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Atraso de redirecionamento:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Máximo (número de) redirecionamentos:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Grupo padrão para salvar novas senhas:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separe o grupo com barras, por exemplo: Grupo/SubGrupo.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Sempre perguntar onde salvar novas credenciais", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Quando ativado, um balão mostra uma lista de grupos.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Ativar o gerador de senhas.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Recuperar credenciais automaticamente.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Preencha automaticamente as entradas de credenciais únicas.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Ative o preenchimento automático para campos de nome de usuário.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Mostrar notificações.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Salvar apenas o domínio.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Mostrar uma notificação quando novas credenciais podem ser salvas no banco de dados.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Preencha automaticamente as caixas de diálogo de Autenticação Básica HTTP e envie-as.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Verificar atualizações do KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "a cada 3 dias", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "toda semana", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "todo mês", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nunca", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Atalhos do teclado", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Tempo máximo (ms) que o ícone deve piscar após detectar novas credenciais", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Tempo mínimo (ms) o ícone deve piscar antes de desativar devido a redirecionamentos de página.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 para usar apenas o tempo de piscar ignorando o máximo de redirecionamentos (comportamento antigo)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Quantas páginas a aba deve percorrer após o atraso de redirecionamento antes de desativar o ícone", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Adiciona um botão aos campos de senha para gerar uma nova senha.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "As senhas são geradas pelo KeePassXC usando o seu perfil de geração de senha.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "O KeePassXC-Browser recuperará as credenciais imediatamente quando uma aba for ativada.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Deixe o KeePassXC-Browser preencher automaticamente as credenciais se receber apenas uma única entrada.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Atenção! Usar o preenchimento automático não é seguro. Use por sua conta e risco.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Mostrar uma lista suspensa contendo as credenciais disponíveis para todos os campos de nome de usuário em uma página.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Mostrar notificações de erros e quando a interação do usuário é necessária.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Ao salvar novas credenciais, salve apenas o domínio em vez da URL completa.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Se forem encontradas credenciais para uma página e o tipo de login for uma solicitação de Autenticação Básica de HTTP, o KeePassXC-Browser tentará efetuar login com as primeiras credenciais encontradas.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Uma caixa de diálogo de Autenticação Básica de HTTP é assim:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "O KeePassXC-Browser precisa do KeePassXC para buscar as credenciais.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Você pode baixar a última versão estável em $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Você está executando a versão do KeePassXC: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Última versão disponível do KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Padrão: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinito: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Recomendado: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Atalho para $1 foi alterado com sucesso.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Atalho para $1 foi restaurado.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Erro: Atalho para $1 não foi alterado!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Os seguintes bancos de dados do KeePassXC estão conectados ao KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Nenhum banco de dados conectado encontrado.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Remover identificador da lista de banco de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Você realmente quer remover o seguinte identificador da lista de banco de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Você pode reconectar seu banco de dados a qualquer momento.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificador", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Chave", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Último uso", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Criado", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Excluir", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL da página", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorar", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Detecção apenas de nome de usuário", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Excluir", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Habilitar todas as funcionalidades", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Desativar credenciais novas/modificadas", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Desativar todos os recursos", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Nenhum campo de login personalizado salvo encontrado.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Você pode gerenciar os campos de login personalizados salvos usando a tabela abaixo.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Se o KeePassXC-Browser detectar os campos de login errados, você mesmo poderá especificar os campos corretos.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Vá até a página, clique no ícone do KeePassXC-Browser e selecione", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Remover campos de login personalizados salvos?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Você realmente deseja remover os campos de login personalizados salvos na página: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "O KeePassXC-Browser detectará automaticamente os campos de login na próxima vez que você visitar esta página.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Nenhum site ignorado encontrado.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Remover site?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Sites nesta página têm métodos especiais de manipulação associados a eles.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Para ignorar credenciais novas/modificadas em um site específico, adicione-as abaixo ou clique no ícone do KeePassXC-Browser piscando e selecione", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Se um site for totalmente ignorado (Desativar todos os recursos for selecionado), o plug-in não fará nada ao visitar esse site.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "A detecção somente de nome de usuário permite que o KeePassXC-Browser preencha os detalhes de login em sites com páginas separadas para nome de usuário e senha.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Adicionar URL manualmente", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Você realmente quer remover o site especificado da lista: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "O KeePassXC-Browser habilitará todos os recursos para este site e removerá a detecção somente de nome de usuário.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Você pode gerenciar as preferências do site salvo usando a tabela abaixo.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Opção para ignorar recursos de extensão para a página.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Visite o KeePassXC-Browser na Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Visite o KeePassXC-Browser no diretório de extensões do Firefox.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Visite o KeePassXC-Browser no GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Versão do KeePassXC-Browser: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Versão do KeePassXC: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contribuidores", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenças", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Relatar defeitos", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Criar um relatório no GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "As seguintes informações de depuração podem ser usadas", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Valor inválido. Por favor, verifique a entrada.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "URL inválida. Por favor, verifique a entrada.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "O valor já existe na lista.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Abre uma nova aba", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "Diálogo Básico de Autenticação HTTP", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/pt_PT/messages.json b/keepassxc-browser/_locales/pt_PT/messages.json new file mode 100644 index 0000000..d545774 --- /dev/null +++ b/keepassxc-browser/_locales/pt_PT/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Integração KeepassXC para os navegadores modernos", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Preencher nome de utilizador e palavra-passe", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Preencher palavra-passe", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Preencher TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Mostrar ícones do gerador de palavra-passe", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Guardar credenciais", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Ver gerador de palavra-passe", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Criar ou modificar credenciais clicando no ícone da extensão.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Detetada autenticação HTTP com múltiplas credenciais. Clique no ícone da extensão para escolher as corretas.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Erro desconhecido.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Base de dados não aberta.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "'Hash' da base de dados não recebida.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Chave pública do cliente não recebida.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Não foi possível decifrar a mensagem.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Não é possível ligar a KeePassXC. Verifique se a integração do browser está ativada nas definições do KeePassXC", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Ação cancelada ou recusada.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Falhou a encriptação da mensagem. O KeePassXC está em execução?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Falha ao associar o KeePassXC. Tente novamente.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Troca de chaves não efetuada com sucesso.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Chave de cifra não reconhecida.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Não existem bases de dados guardadas.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Ação incorreta.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Recebida uma mensagem vazia.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Nenhum URL indicado.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Credenciais não encontradas.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Ícone do gerador de palavra-passe", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Palavra-passe gerada", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Preencher também o campo seguinte da palavra-passe", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bits", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Gerador de palavra-passe", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Gerar", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Copiar", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Preencher e copiar", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Erro:\nA palavra-passe gerada tem um tamanho superior ao permitido.\nO tamanho foi ajustado.\n\nPor favor memorize a nova palavra-passe!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Gerar palavra-passe", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "A palavra-passe gerada não foi recebida.
      O KeepassXC está em execução?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Rejeitar", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Ignorar", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Ver mais", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Novamente", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Confirmação", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Os campo para esta página já foram selecionados e serão substituídos.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Rejeitar seleção", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Campo de cadeia #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Escolha o campo para o nome de utilizador", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Agora escolha o campo para a palavra-passe", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Confirme a seleção", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Confirme a sua seleção ou escolha mais campos como campos de cadeia.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Nome de utilizador", + "description": "General text for username." + }, + "password": { + "message": "Palavra-passe", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- sem nome de utilizador -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Erro:\nCredenciais não encontradas.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Erro:\nExiste mais do que uma credencial no KeePassXC!\nPrima no ícone KeePassXC-Browser para ver mais opções.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Erro:\nNão existem credenciais para o nome de utilizador encontrado.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Erro:\nNão foram encontrados campos que possam ser preenchidos.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Erro:\nNão foi possível detetar o campo de palavra-passe.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Erro:\nNão foi possível detetar as credenciais alteradas.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Alerta", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Definições", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Escolha os campos de autenticação personalizados para esta página", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Conetar", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Reconetar", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Redetetar campos de autenticação", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Recarregar", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Reabrir base de dados", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser encontrou um erro:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Está a usar uma versão antiga do KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Descarregue a versão mais recente em keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "A verificar o estado...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "O KeePassXC-Browser não foi configurado. Pressione o botão de conexão para emparelhar com o KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "O KeePassXC-Browser foi desconectado do KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Prima o botão Reconectar para estabelecer uma nova ligação.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "O KeePassXC-Browser ainda não se conectou ao KeePassXC, mas foi configurado utilizando o identificador: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "O KeePassXC-Browser está conectado ao KeePassXC e foi configurado utilizando o seguinte identificador: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Nome de utilizador ou palavra-passe alterada. Guardar alterações?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "As credenciais serão guardadas na base de dados conectada com o identificador $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "O seguinte nome de utilizador não está guardado: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "As credenciais para o nome de utilizador utilizado estão marcadas a negrito: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Por favor escolha as credenciais que deseja atualizar.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Novo(s) grupo(s) não pode(m) ser criado(s)", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Erro: Credenciais não foram guardadas. A palavra-passe não foi alterada.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Erro: As credenciais podem podem ser guardadas ou atualizadas", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Selecione a informação que deseja guardar para esta página.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filtrar:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Selecione as informações de autenticação com as quais gostaria de se autenticar.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Foi encontrado mais do que um campo de palavra-passe nesta página. Clique com o botão direito do rato num dos campos de palavra-passe e escolha um dos seguintes:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Nome de utilizador:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Nova", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Atualizar", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Rejeitar", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Não voltar a perguntar para esta página", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Fechar", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Rejeitar e mostrar o diálogo de autenticação padrão.", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Definições | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Definições gerais", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bases de dados conectadas", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Campos personalizados de autenticação", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Preferências do site", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Acerca", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Geral", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bases de dados conectadas", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Campos personalizados de autenticação", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Preferências do site", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Acerca", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Configurar atalhos", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Guardar", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Conetar", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Remover", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Adicionar", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Procurar atualizações", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Sim, remover agora", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": " Cancelar", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Repor", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Tempo de intermitência:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Atraso de redirecionamento:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Número (máximo) de redirecionamentos:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Ativar gerador de palavras-passe.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Obter credenciais automaticamente.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Preencher automaticamente as entradas de credenciais únicas.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Ativar conclusão automática para o campo nome de utilizador.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Mostrar notificações.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Guardar apenas domínio.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Mostrar uma notificação se as novas credenciais puderem ser guardadas.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Preencher e enviar automaticamente as caixas de diálogo de autenticação básica HTTP.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Procurar por atualizações do KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "a cada 3 dias", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "a cada semana", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "a cada mês", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "nunca", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Teclas de atalho", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Tempo máximo (ms) que o ícone deve piscar após detetar novas credenciais", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Tempo mínimo (ms) que o ícone deve piscar antes de desativar devido a redirecionamentos de página.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 para usar apenas o tempo de piscar ignorando o máximo de redirecionamentos (comportamento antigo)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Quantas páginas deve o separador percorrer após o atraso de redirecionamento antes de desativar o ícone", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Adiciona um botão aos campos de palavras-passe para gerar uma nova palavra-passe.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "As palavras-passe serão geradas no KeePassXC utilizando o seu perfil de criação de palavras-passe.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser irá obter automaticamente as credenciais quando um separador for ativado.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Deixar o KeePassXC-Browser preencher automaticamente as credenciais se receber apenas uma única entrada.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Atenção! O preenchimento automático não é seguro. Use-o por sua conta e risco.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Mostrar uma lista suspensa contendo as credenciais disponíveis para todos os campos nome de utilizador de uma página.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Mostrar notificações para erros e quando for necessária qualquer interação.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Ao guardar as novas credenciais, guardar apenas o domínio e não o URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Se forem encontradas credenciais para uma página e o tipo de autenticação for uma solicitação de autenticação básica HTTP, o KeePassXC-Browser tentará fazer a autenticação com as primeiras credenciais encontradas.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Um diálogo de autenticação básica HTTP é parecido com este:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser necessita do KeePassXC para obter as credenciais.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Pode descarregar a versão mais recente em $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Está a utilizar o KeePassXC, versão: $1 ", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "A versão mais recente do KeePassXC é a:$1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Padrão: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinito: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Recomendado: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "O atalho para $1foi mudado com successo", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "O atalho para $1foi reposto", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Erro: O atalho para $1não foi mudado!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "As seguintes bases de dados do KeePassXC estão conectadas ao KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Não foi encontrada uma base de dados conectada.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Remover identificador da lista de bases de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Tem a certeza de que deseja remover o seguinte identificador da lista da base de dados?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Pode reconectar a sua base de dados a qualquer momento.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identificador", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Chave", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Última utilização", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Criada", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Apagar", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL da página", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorar", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Deteção apenas de nome de utilizador", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Apagar", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Ativar todas as funcionalidades", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Desativar credenciais novas/modificadas.", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Desativar todas as funcionalidades", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Não foi encontrado um campo de autenticação personalizado guardado.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Se o KeePassXC-Browser detetar os campos de autenticação errados, você poderá especificar os campos corretos.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Aceda à página, clique no ícone KeePassXC-Browser e selecione", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Remover campos de autenticação personalizados guardados?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Tem a certeza de que deseja remover os campos personalizados de autenticação guardados para a página: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "O KeePassXC-Browser detetará automaticamente os campos de autenticação na próxima vez que visitar esta página.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Não existem sites ignorados.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Remover site?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Os sites nesta página têm métodos especiais de manipulação associados.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Para ignorar credenciais novas/alteradas num site específico, adicione-as abaixo ou clique no ícone do KeePassXC-Browser intermitente e selecione", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Se um site for totalmente ignorado (se a opção Desativar todas as funcionalidades for selecionada), o suplemento não fará nada ao visitar este site.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "A deteção de apenas nome de utilizador permite que o KeePassXC-Browser preencha os detalhes de autenticação em sites com páginas distintas para nome de utilizador e palavra-passe.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Tem a certeza de que deseja remover o site especificado da lista$1?", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "O KeePassXC-Browser irá ativar todos as funcionalidades para este site e removerá a deteção única do nome de utilizador.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Aceder a KeePassXC-Browser na Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Aceder a KeePassXC-Browser no diretório de extras Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Aceda a KeePassXC-Browser no GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser versão: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC versão: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenças", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Reportar bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Valor inválido. Por favor verifique a entrada.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "URL inválido. Por favor verifique a entrada.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "O valor já existe na lista.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Abre um novo separador", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/ru/messages.json b/keepassxc-browser/_locales/ru/messages.json new file mode 100644 index 0000000..506430a --- /dev/null +++ b/keepassxc-browser/_locales/ru/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Интеграция KeePassXC в современные веб-браузеры", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Заполнить логин и пароль", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Заполнить только пароль", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Заполнить одноразовый пароль", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Показывать значки генератора паролей", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Сохранить учетные данные", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Показать генератор паролей", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Создайте или измените учетные данные, щелкнув по значку расширения.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Обнаружена HTTP-аутентификация с несколькими учетными данными. Щелкните по значку расширения и выберите нужные.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Неизвестная ошибка.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "База данных не открыта.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Не получен хеш базы данных.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Не получен открытый (публичный) ключ клиента.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Невозможно расшифровать сообщение.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Не удается соединиться с KeePassXC. Убедитесь, что интеграция с браузером включена в настройках KeePassXC.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Действие отменено или отклонено.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Шифрование сообщения не удалось. KeePassXC выполняется?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Ошибка ассоциирования KeePassXC, попробуйте еще раз.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Не выполнен обмен ключами.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Не распознан ключ шифрования.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Нет сохраненных баз данных.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Некорректное действие.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Получено пустое сообщение.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Не указан URL.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Нет логинов.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Значок генератора паролей", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Сгенерированный пароль", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Также заполнять следующее поле пароля", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? бит", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Генератор паролей", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Создать", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Скопировать", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Заполнить и скопировать", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "ОШИБКА:\nСгенерированный пароль длиннее допустимого!\nОн усечен до предельной длины.\n\nЗапомните новый пароль!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Создать пароль", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Невозможно получить сгенерированный пароль.
      Запущена ли программа KeePassXC?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Отклонить", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Пропустить", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Показать больше", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Снова", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Подтвердить", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Поля логина для этой страницы уже выбраны и будут перезаписаны.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Отменить выбор", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Строковое поле #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Выберите поле логина", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Выберите поле пароля", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Подтвердите выбор", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Подтвердите свой выбор или выберите дополнительные поля Строковые поля.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Вы также можете использовать числа для выбора полей ввода с клавиатуры.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Логин", + "description": "General text for username." + }, + "password": { + "message": "Пароль", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- нет логина -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "ОШИБКА:\nНе найдены логины.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "ОШИБКА:\nВ KeePassXC обнаружено более одного логина!\nНажмите значок KeePassXC-Browser для дополнительных опций.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "ОШИБКА:\nДля указанного логина нет учетных данных.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "ОШИБКА:\nНет полей для заполнения.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "ОШИБКА:\nНе найдено поле пароля.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "ОШИБКА:\nНе обнаружены измененные учетные данные.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "Всплывающее окно KeePassXC", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Настройки", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Выбор пользовательских полей входа для этой страницы", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Соединиться", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Соединиться заново", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Переопределить поля логина", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Перезагрузить", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Переоткрыть базу данных", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser обнаружил ошибку:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Вы используете устаревшую версию KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Пожалуйста, загрузите последнюю версию с сайта keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Проверка статуса...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser не настроен. Нажмите кнопку подключения, чтобы связать его с KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser отключен от KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Нажмите кнопку переподключения, чтобы установить новую связь.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser еще не подключен к KeePassXC, но настроен с помощью идентификатора: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser подключен к KeePassXC и настроен с помощью этого идентификатора: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Изменились логин или пароль! Сохранить?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Учетные данные будут сохранены в подключенной базе данных с идентификатором $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Следующий логин сейчас не сохранен: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Учетные данные с используемым логином выделены жирным: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Выберите учетные данные, которые хотите обновить.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Пожалуйста, выберите группу, в которую Вы хотите добавить новые учетные данные.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Ошибка: указанная группа по умолчанию не найдена. Создание всех необходимых групп.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Не удается создать новую(ые) группу(ы).", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Ошибка: учетные данные не обновлены. Пароль не был изменен.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Ошибка: учетные данные не могут быть сохранены или обновлены.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Выберите информацию для входа на эту страницу.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Фильтр:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Выберите информацию для входа, которую вы использовали.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "На этой странице более одного поля для ввода пароля. Щелкните правой кнопкой мыши по одному из полей и выберите один из:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Логин:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Новые", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Обновить", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Отклонить", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Не спрашивать для этой страницы", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Закрыть", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Отклонить и показать диалог аутентификации по умолчанию", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Настройки | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Общие настройки", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Подключенные базы", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Свои поля логина", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Настройки сайта", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Сведения", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Общие", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Подключенные базы", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Свои поля логина", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Настройки сайта", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Сведения", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Настроить ярлыки", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Сохранить", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Подключение", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Удалить", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Добавить", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Проверить обновления", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Да, удалить сейчас", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Отмена", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Сброс", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Время мерцания:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Смещение перенаправления:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Максимум перенаправлений:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Группа по умолчанию для сохранения новых паролей:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Разделите группу слэшами, например: Группа/ДочерняяГруппа.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Всегда спрашивать, куда сохранять новые учетные данные", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Когда включено, всплывающее окошко показывает список групп.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Вызов генератора паролей.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Автоматически извлекать учетные данные.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Автозаполнение элементов с единственными учетными данными.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Автозаполнение для полей логина.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Показывать уведомления.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Сохранять только домен.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Показывать уведомление, когда есть новые учетные данные для сохранения в базе данных.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Автозаполнение окон с простой HTTP-аутентификацией и отправка данных.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Проверять обновления KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "каждые 3 дня", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "каждую неделю", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "каждый месяц", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "никогда", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Клавиатурные сокращения", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Максимальное время (мс) мерцания значка при обнаружении новых учетных данных", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Минимальное время (мс) мерцания значка перед деактивацией из-за перенаправлений страниц.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 = использовать только время мерцания, игнорируя максимум перенаправлений (старое поведение)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Число страниц для цикличного перебора после смещения перенаправления перед деактивацией значка", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Добавляет кнопку к полям пароля для генерирования нового пароля.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Пароли, созданные KeePassXC с помощью вашего профиля генерирования паролей.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser будет извлекать учетные данные сразу при активации вкладки.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Разрешить KeePassXC-Browser автоматически заполнять учетные данные, если он получает только одиночный элемент.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Внимание! Автозаполнение небезопасно! Используйте его на свой риск.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Показывать выпадающий список с доступными учетными данными для всех полей логина на странице.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Уведомлять об ошибках, когда требуется вмешательство пользователя.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "При сохранении новых учетных данных сохранять только домен, а не полный URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Если на странице есть учетные данные, и тип входа - запрос простой HTTP-аутентификации, KeePassXC-Browser войти с первыми указанными учетными данными.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Окно простой HTTP-аутентификации выглядит так:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "Для извлечения учетных данных KeePassXC-Browser требуется KeePassXC.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Новейшую стабильную версию можно загрузить с $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "У вас сейчас KeePassXC версии $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Новейшая версия KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "По умолчанию: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Неопределенный: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Рекомендуется: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Ярлык для $1 был успешно изменен.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Ярлык для $1 был сброшен.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Ошибка: Ярлык для $1 изменен не был!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Эти базы данных KeePassXC подключены к KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Нет подключенных баз данных.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Удалить идентификатор из списка баз данных?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Вы действительно хотите удалить следующий идентификатор из списка баз данных?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Базу данных можно в любое время подключить повторно.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Идентификатор", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Ключ", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Последний", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Создан", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Удалить", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL страницы", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Пропустить", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Определение только по логину", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Удалить", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Включить все функции", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Отключить новые/измененные учетные данные", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Отключить все функции", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Нет сохраненных пользовательских полей логина.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Вы можете управлять сохраненными пользовательскими полями логина, используя таблицу ниже.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Если KeePassXC-Browser обнаруживает неверные поля логина, вы можете сами указать правильные поля.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Перейдите на страницу и нажмите значок KeePassXC-Browser, затем выберите ", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Удалить сохраненные пользовательские поля логина?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Вы действительно хотите удалить сохраненные пользовательские поля логина на странице: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser будет автоматически обнаруживать поля логина при следующем посещении этой страницы.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Нет игнорируемых сайтов.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Удалить сайт?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "У сайтов на этой странице особые связанные с ними методы обработки.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Для игнорирования новых/измененных учетных данных на каком-либо сайте добавьте их ниже или щелкните по мерцающему значку KeePassXC-Browser и выберите ", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Если сайт полностью игнорируется (выбрано Отключить все функции), то при посещении такого сайта плагин ничего не будет делать.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Определение только по логину позволяет KeePassXC-Browser заполнять детали входа на сайтах, где логин и пароль находятся на разных страницах.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Добавить URL вручную", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Вы действительно хотите удалить указанный сайт из списка: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser включит все функции для этого сайта и удалит определение только по логину.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Вы можете управлять сохраненными настройками сайтов, используя таблицу ниже.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Опция для игнорирования деталей расширения для страницы.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "KeePassXC-Browser в Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "KeePassXC-Browser в каталоге дополнений Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "KeePassXC-Browser на GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Версия KeePassXC-Browser: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Версия KeePassXC: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Авторы", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Лицензии", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Сообщать об ошибках", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Создать новую проблему на GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Может быть использована следующая отладочная информация", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Неверное значение. Пожалуйста, проверьте ввод.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Неверный URL. Пожалуйста, проверьте ввод.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Значение уже существует в списке.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Открывает новую закладку", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "Диалог базовой аутентификации HTTP", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/sv/messages.json b/keepassxc-browser/_locales/sv/messages.json new file mode 100644 index 0000000..f444af5 --- /dev/null +++ b/keepassxc-browser/_locales/sv/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC integration för moderna webbläsare", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Ange Användarnamn och Lösenord", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Ange endast lösenord", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Ange TOTP", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Visa ikoner för lösenordsgeneratorn", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Spara autentiseringsuppgifter", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Show password generator", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Skapa eller ändra autentiseringsuppgifterna genom att klicka på tilläggsikonen.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "HTTP-autentisering med multipla användaruppgifter upptäckt. Klicka på utöknings-ikonen för att välja den korrekta användaruppgiften.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Okänt fel", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Databas ej öppnad.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Databas hash ej mottagen.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Klientens publika nyckel ej mottagen.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Kan inte avkryptera meddelande.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Åtgärden avbröts eller nekades.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC associering misslyckades, försök igen.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Nyckelutbytet misslyckades.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Krypteringsnyckeln är okänd.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Inga sparade databaser hittade.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Felaktig åtgärd.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Tomt meddelande mottaget.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "Ingen URL tillhandahållen.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Inga inloggningar hittade.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Genererat lösenord", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Fyll även i nästa lösenords-fält", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? bitar", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Lösenords-generator", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Generera", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Kopiera", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Fyll och kopiera", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Fel:\nDet genererade lösenordet är längre än den tillåtna längden!\nDet har kortats ned för att passa längden.\n\nVänligen kom ihåg det nya lösenordet!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Generera lösenord", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Kan inte ta emot det genererade lösenordet.
      Är KeePassXC igångstartat?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Avfärda", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Hoppa över", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Igen", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Bekräfta", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Inloggningsfält för denna sidan är redan valda och kommer att skrivas över.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Kasta markering", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Sträng-fält #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Välj ett användarnamn fältet", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Välj nu ett lösenord fältet", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Bekräfta val", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Vänligen bekräfta ditt val eller välj fler fält som Strängfält.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Användarnamn", + "description": "General text for username." + }, + "password": { + "message": "Lösenord", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- inget användarnamn -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Fel:\nInga inloggningar hittades.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Fel:\nMer än en inloggning hittades i KeePassXC!\nTryck på ikonen för KeePassXC-Browser för fler alternativ.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Fel:\nInga autentiseringsuppgifter funna för angivet användarnamn.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Fel:\nKan inte hitta fält att fylla i.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Fel:\nKan inte hitta ett lösenordsfält.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Fel:\nKan inte hitta ändrade autentiseringsuppgifter.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - Popup", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Inställningar", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Välj anpassade inloggningsfält för denna sidan", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Anslut", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": " Återanslut", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": " Återidentifiera inloggningsfälten", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Ladda om", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": " Återöppna databas", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser har påträffat ett fel:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Du använder en gammal version av KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Vänligen ladda ner den senaste versionen från keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": " Kontrollerar status...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser har inte konfigurerats. Tryck på anslutningsknappen för att parkoppla med KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser har kopplats ned från KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Tryck på återanslut-knappen för att upprätta en ny anslutning.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser har ännu inte anslutit till KeePassXC men har konfigurerats med identifieraren: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser är ansluten till KeePassXC och har konfigurerats med följande identifierare: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Användarnamn eller lösenord ändrat! Spara det?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Inloggningsuppgifter sparas i den anslutna databasen med identifierare $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Följande användarnamn sparas för närvarande inte: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Inloggningsuppgifterna med det angivna användarnamnet är markerat med fetstil: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Vänligen välj de uppgifter du vill uppdatera.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Välj inloggningsuppgifterna som du vill ska anges på sidan.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Filter:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Välj inloggningsuppgifter som du vill bli inloggad med.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Fler än ett lösenordsfält hittades på denna sidan. Högerklicka på ett av lösenordsfälten och välj en av:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Användarnamn: ", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": " Nytt", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": " Uppdatera", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": " Avfärda", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Fråga aldrig för den här sidan", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Stäng", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Avfärda och visa den förinställda autentiseringsdialogen", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Inställningar | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Allmänna inställningar", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Anslutna databaser", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Egenvalda inloggningsfält", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Förval för sidan", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Om", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Allmänt", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Anslutna databaser", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Egenvalda inloggningsfält", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Förval för sidan", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Om", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Konfigurera genvägar", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Spara", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Anslut", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Ta bort", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Lägg till", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Leta efter uppdateringar", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Ja, ta bort nu", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Avbryt", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Återställ", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Blinktid:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Styr om Offset:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximalt antal omdirigeringar:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Aktivera lösenordsgenerator", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Hämta inloggningsuppgifter automatiskt.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Fyll automatiskt i single-credential uppgifter.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Aktivera autokomplettering av fält för användarnamn.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Visa notifieringar.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Spara endast domän.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Visa en notifikation när nya inloggningsuppgifter har hittats i databasen.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Fyll automatiskt i HTTP Basic Auth-dialoger och skicka dem.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Leta efter uppdateringar av KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "var 3:e dag", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "varje vecka", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "varje månad", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "aldrig", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Tangentbords-genvägar", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maximal tid (i ms) som ikonen ska blinka efter att ha hittat nya inloggningsuppgifter.", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minsta tid (i ms) som ikonen ska blinka innan deaktivering på grund av omdirigeringar på sidan.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 för att endast använda blinktid och ignorera Maximalt antal omdirigeringar (gammalt beteende)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Hur många sidor som fliken ska bläddra efter en redirect offset innan ikonen deaktiveras", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Lägger till en knapp i lösenordsfält för generering av ett nytt lösenord.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Lösenord genereras av KeePassXC och använder din lösenordsgenereringsprofil.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser kommer omedelbart att hämta inloggningsuppgifter när en flik aktiveras.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Låt KeePassXC-Browser fylla i inloggningsuppgifter automatiskt om den bara tar emot ett inlägg.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Varning! Användning av autofyll är inte säkert. Använd på egen risk.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Visa en rull-lista innehållande tillgängliga inloggningsuppgifter för alla användarnamnsfält på en sida.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Visa notifieringar för fel och när användaren behöver interagera.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Spara enbart domänen istället för hela URL:en när nya inloggningsuppgifter sparas.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Om inloggningsuppgifter hittas för en sida och inloggningstypen är en HTTP Basic Auth begäran så kommer KeePassXC-Browser att försöka logga in med den först angivna inloggningsuppgiften.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "En HTTP Basic Auth dialog ser ut så här:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser behöver KeePassXC för att hämta inloggningsuppgifter.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Du kan ladda ner den senaste stabila versionen från $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Du använder KeePassXC version: $1 ", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Senaste tillgänliga version av KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Förinställt: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Oändlig: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Rekommenderad: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Genväg för $1 har ändrats framgångsrikt.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Genväg för $1 har återställts.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Fel: Genväg för $1 har inte ändrats!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Följande KeePassXC-databaser är anslutna till KeePassXC-Browser.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Inga anslutna databaser funna.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Ta bort identifierare från databaslistan?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Vill du verkligen ta bort följande identifierare från databaslistan?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Du kan återansluta till din databas när som helst.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Identifierare", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Nyckel", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Senast använd", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Skapad", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Ta bort", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Sid-URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Ignorera", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Identifiera endast användarnamn", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Ta bort", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Aktivera alla funktioner", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Inaktivera nya/ändrade autentiseringsuppgifter", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Inaktivera alla funktioner", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Inga sparade anpassade inloggningsfält hittade.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Om KeePassXC-Browser upptäcker fel inloggningsfält så kan du själv ange korrekta fält.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Gå till sidan och klicka på ikonen för KeePassXC-Browser, välj sedan", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Ta bort anpassade inloggningsfält?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Vill du verkligen ta bort det sparade anpassade inloggningsfältet för sidan: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser kommer automatiskt att identifiera inloggningsfälten nästa gång du besöker denna sidan.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Inga ignorerade sidor funna.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Ta bort sida?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Siter på denna sidan har speciella hanteringsmetoder associerade.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "För att ignorera nya/ändrade uppgifter för en specifik sida, lägg till dem nedan eller klicka på den blinkande ikonen för KeePassXC-Browser och välj", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Om en site ignoreras totalt (Avaktivera alla funktioner är vald) så kommer pluginen inte att göra någonting då sidan besöks.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Identifiering med enbart användarnamn låter KeePassXC-Browser fylla i inloggningsuppgifter på siter med separata sidor för användarnamn och lösenord.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Vill du verkligen ta bort den angivna siten från listan: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser kommer att aktivera alla funktioner för denna siten och ta bort identifiering som bygger på enbart användarnamn.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Gå till KeePassXC-Browser in Chrome Web Store.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Gå till KeePassXC-Browser i Mozilla Add-ons directory.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Gå till KeePassXC-Browser på GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser Version: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC Version: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Contributors", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/tr/messages.json b/keepassxc-browser/_locales/tr/messages.json new file mode 100644 index 0000000..002b92a --- /dev/null +++ b/keepassxc-browser/_locales/tr/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Modern web tarayıcıları için KeePassXC bütünleşmesi", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Kullanıcı Adı ve Parolayı Doldur", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Sadece Parolayı Doldur", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "TOTP Doldur", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Parola Oluşturucu Simgelerini Göster", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Kimlik bilgilerini kaydet", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Parola oluşturucuyu göster", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Uzantı simgesine tıklayarak kimlik bilgilerini oluşturun veya değiştirin.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Birden çok kimlik bilgisi ile HTTP kimlik doğrulaması algılandı. Doğru olanı seçmek için uzantı simgesine tıklayın.", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Bilinmeyen hata.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Veritabanı açılmadı.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Veritabanı karma alınmadı.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "İstemci ortak anahtar alınmadı.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Mesaj şifresi çözülemiyor.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "KeePassXC'ye bağlanılamıyor. Tarayıcı bütünleşmesinin KeePassXC ayarlarında etkin olduğunu kontrol edin.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Eylem iptal edildi veya reddedildi.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "İleti şifreleme başarısız. KeePassXC çalışıyor mu?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC ilişkilendirmesi başarısız, tekrar deneyin.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Anahtar değişimi başarısız oldu.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Şifreleme anahtarı tanınmıyor.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Kayıtlı veritabanları bulunamadı.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Yanlış eylem.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Boş mesaj alındı.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "URL sağlanmadı.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Hiçbir giriş bulunamadı.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Parola üreticisi simgesi", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Oluşturulan parola", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Ayrıca bir sonraki parola alanını doldurun", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "Bit ???", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Parola Oluşturucu", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Oluştur", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Kopyala", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Doldur ve kopyala", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Hata\nOluşturulan parola izin verilen uzunluktan daha uzun!\nUzunluğa uyacak şekilde kısaltıldı.\n\nLütfen yeni parolayı unutma!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Parola oluştur", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Oluşturulan parola alınamıyor.
      KeePassXC çalışıyor mu?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Yoksay", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Atla", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Daha fazla göster", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Tekrarla", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Onayla", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Bu sayfa için giriş alanları seçildi ve üzerine yazılacak.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Seçimi bırak", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Dize alanı #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Bir kullanıcı adı alanı seçin", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Şimdi bir parola alanı seçin", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Seçimi onaylayın", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Lütfen seçiminizi onaylayın veya Dizi alanları olarak daha fazla alan seçin.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "Girdi alanlarını klavyeden seçmek için de sayıları kullanabilirsiniz.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Kullanıcı adı", + "description": "General text for username." + }, + "password": { + "message": "Parola", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- kullanıcı adı yok -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Hata\nHiçbir giriş bulunamadı.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Hata:\nKeePassXC'de birden fazla giriş bulundu!\nDaha fazla seçenek için KeePassXC-Tarayıcı simgesine basın.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Hata:\nVerilen kullanıcı adı için kimlik bilgisi bulunamadı.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Hata:\nDoldurulacak alanlar bulunamıyor.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Hata:\nParola alanı bulunamadı", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Hata:\nDeğiştirilen kimlik bilgileri tespit edilemedi.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeepassXc - Açılır Pencere", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Ayarlar", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Bu sayfa için özel giriş alanları seç", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Bağlan", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Yeniden bağlan", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Giriş alanlarını yeniden belirle", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Tekrarla", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Veritabanını yeniden aç", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Tarayıcı bir hatayla karşılaştı:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "KeePassXC'nin eski sürümünü kullanıyorsunuz.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Lütfen keepassxc.org adresinden en son sürümü indirin.", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Durum kontrol ediliyor...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Tarayıcı yapılandırılmamış. KeePassXC ile eşleştirmek için bağlantıya basın.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Tarayıcı KeePassXC ile bağlantısı kesildi.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Yeni bir bağlantı kurmak için yeniden bağlan düğmesine basın.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Tarayıcı henüz KeePassXC'ye bağlanmadı, ancak tanımlayıcı kullanılarak yapılandırıldı: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Tarayıcı KeePassXC'ye bağlı ve aşağıdaki tanımlayıcı kullanılarak yapılandırıldı: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Kullanıcı adı veya parola değiştirildi! Kaydet?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Kimlik bilgileri, tanımlayıcı ile bağlı veritabanına kaydedilecek $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Şu kullanıcı adı şu anda kaydedilmedi: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Kullanılan kullanıcı adına sahip kimlik bilgileri koyu olarak işaretlenmiştir: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Lütfen güncellemek istediğiniz kimlik bilgilerini seçin.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Lütfen yeni kimlik bilgilerini eklemek istediğiniz kümeyi seçin.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Hata: Belirtilen öntanımlı küme bulunamadı. Gerekli tüm kümelerin oluşturulması.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "Yeni küme oluşturulamıyor.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Hata: Kimlik bilgileri güncellenmedi. Parola değiştirilmedi.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Hata: Kimlik bilgileri kaydedilemez veya güncellenemez.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Sayfaya girmek istediğiniz giriş bilgilerini seçin.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Süzgeç:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Giriş yapmak istediğiniz giriş bilgisini seçin.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "Bu sayfada birden fazla parola alanı bulundu. Parola alanlarından birine sağ tıklayın ve şunlardan birini seçin:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "kullanıcı adı:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Yeni", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Güncelle", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Yoksay", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Bu sayfayı asla sorma", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Kapat", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Öntanımlı kimlik doğrulama iletişim kutusunu kapatın ve gösterin", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Ayarlar | KeePassXC-Tarayıcı", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Genel Ayarlar", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Bağlı Veritabanları", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Özel giriş alanları", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Site tercihleri", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Hakkında", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Genel", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Bağlı Veritabanları", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Özel giriş alanları", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Site tercihleri", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Hakkında", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Kısayolları yapılandır", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Kaydet", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Bağlan", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Kaldır", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Ekle", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Güncellemeleri kontrol et", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Evet, şimdi kaldır", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "İptal", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Sıfırla", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Göz Yumma Zamanı:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Redirect Offset:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximum (Number of) Redirects:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Yeni parolaları kaydetmek için öntanımlı küme:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Her zaman yeni kimlik bilgilerinin nereye kaydedileceğini sor", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "Etkinleştirildiğinde, açılır pencerede bir küme listesi gösterilir.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Parola oluşturucuyu etkinleştir.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Kimlik bilgilerini otomatik olarak al.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Automatically fill in single-credential entries.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Kullanıcı adı alanları için otomatik tamamlamayı etkinleştir.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Bildirimleri göster.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Yalnızca etki alanını kaydet.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Yeni kimlik bilgileri veritabanına kaydedildiğinde bir bildirim göster.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "HTTP Temel Kimlik Doğrulama iletişim kutularını otomatik olarak doldur ve gönder.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "KeePassXC güncellemelerini kontrol et:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "her 3 günde", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "her hafta", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "her ay", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "asla", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Klavye kısayolları", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Yeni kimlik bilgileri tespit edildikten sonra simgenin yanıp sönmesi gereken azami süre (ms)", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Yeni kimlik bilgileri tespit edildikten sonra simgenin yanıp sönmesi gereken asgari süre (ms)", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 to only use blink time ignoring Maximum Redirects (old behavior)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "How many pages should the tab cycle through after the redirect offset before deactivating the icon", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Yeni bir parola oluşturmak için parola alanlarına bir düğme ekler.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Parolalar, parola oluşturma profilinizi kullanarak KeePassXC tarafından üretilir.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Tarayıcı, bir sekme etkinleştirildiğinde hemen kimlik bilgilerini alır.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Yalnızca tek bir giriş alırsa KeePassXC-Tarayıcı'nın otomatik olarak kimlik bilgilerini doldurmasına izin ver.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Uyarı! Otomatik doldurmayı kullanmak güvenli değildir. Kullanım kendi sorumluluğunuzdadır.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Bir sayfadaki tüm kullanıcı adı alanları için mevcut bilgileri içeren bir açılır liste göster.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Hata bildirimlerini ve kullanıcı etkileşimi gerektiğinde göster.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Yeni kimlik bilgilerini kaydederken, tam URL yerine yalnızca etki alanını kaydet.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Bir sayfa için kimlik bilgileri bulunursa ve giriş türü bir HTTP Temel Kimlik Doğrulama isteği ise, KeePassXC-Tarayıcı ilk verilen kimlik bilgileriyle giriş yapmaya çalışır.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Bir HTTP Temel Kimlik Doğrulama iletişim kutusu şöyle görünür:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Tarayıcı, kimlik bilgilerini almak için KeePassXC'e ihtiyaç duyuyor.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "En son kararlı sürümü indirebilirsiniz $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "KeePassXC $1 sürümünü çalıştırıyorsunuz", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "KeePassXC'nin mevcut en son sürümü: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Öntanımlı: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Infinite: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Tavsiye edilen: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "$1 kısayolu başarıyla değiştirildi.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "$1 kısayolu sıfırlandı.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Hata: $1 için kısayol değişmedi!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "Aşağıdaki KeePassXC veritabanları KeePassXC-Tarayıcıya bağlanmıştır.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Bağlı veritabanı bulunamadı.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Tanımlayıcı veritabanı listesinden kaldırılsın mı?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Aşağıdaki tanımlayıcıyı gerçekten veritabanı listesinden çıkarmak istiyor musunuz?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Veritabanınızı istediğiniz zaman yeniden bağlayabilirsiniz.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Tanıtıcı", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Anahtar", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Son kullanılan", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Oluşturulan", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Sil", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "Sayfa URL'si", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Yoksay", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Sadece kullanıcı adı Tespiti", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Dil", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Tüm özellikleri etkinleştir", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Yeni/değiştirilmiş kimlik bilgilerini devre dışı bırak", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Tüm özellikleri devre dışı bırak", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Kaydedilmiş özel giriş alanı bulunamadı.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "Kayıtlı özel giriş alanlarını aşağıdaki tabloyu kullanarak yönetebilirsiniz.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "KeePassXC-Tarayıcı yanlış giriş alanlarını tespit ederse, doğru alanları kendiniz belirleyebilirsiniz.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Sayfaya gidin ve KeePassXC-Tarayıcı simgesine tıkla, sonra seç", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Kayıtlı özel giriş alanları kaldırılsın mı?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Sayfadaki kayıtlı özel giriş alanlarını gerçekten kaldırmak istiyor musunuz: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Tarayıcı bu sayfayı bir sonraki ziyaretinizde giriş alanlarını otomatik olarak algılar.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Yok sayılan site bulunamadı.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Site kaldırılsın mı?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Bu sayfadaki siteler, kendisiyle ilişkilendirilen özel işleme yöntemlerine sahiptir.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Belirli bir sitedeki yeni / değiştirilmiş kimlik bilgilerini yok saymak için aşağıya ekleyin veya yanıp sönen KeePassXC-Tarayıcı simgesini tıkla ve seç", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Bir site tamamen yok sayılırsa (Tüm özellikleri devre dışı bırak seçiliyse) eklenti bu siteyi ziyaret ederken hiçbir şey yapmaz.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Sadece kullanıcı adı tespiti, KeePassXC-Tarayıcı, kullanıcı adı ve parola için ayrı sayfalara sahip web sitelerinde oturum açma detaylarını doldurmasına izin verir.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "URL'yi elle ekle", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Belirtilen siteyi listeden gerçekten kaldırmak istiyor musunuz: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Tarayıcı bu site için tüm özellikleri sağlayacak ve sadece kullanıcı adı tespitini kaldıracak.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "Kayıtlı site tercihlerini aşağıdaki tabloyu kullanarak yönetebilirsiniz.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Sayfanın eklenti özelliklerini yok sayma seçeneği.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Chrome Web Mağazası'nda KeePassXC-Tarayıcı'yı ziyaret edin.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Mozilla Eklentileri dizininde KeePassXC-Tarayıcı'yı ziyaret edin.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "GitHub'da KeePassXC-Tarayıcı'yı ziyaret edin.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Tarayıcı Sürümü: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC Sürümü: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Katkıda bulunanlar", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Lisanslar", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Hataları raporla", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "GitHub'da yeni konu oluştur", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "Aşağıdaki hata ayıklama bilgisi kullanılabilir", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Geçersiz değer. Lütfen girişi kontrol edin.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Geçersiz URL. Lütfen girişi kontrol edin.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "Değer listede zaten var.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Yeni bir sekme açar", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Temel Kimlik Doğrulama iletişim kutusu", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/uk/messages.json b/keepassxc-browser/_locales/uk/messages.json new file mode 100644 index 0000000..39021f2 --- /dev/null +++ b/keepassxc-browser/_locales/uk/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "Сполучення KeePassXC з сучасними переглядачами тенет", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "Заповнити ім'я користувача і пароль", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "Заповнити тільки пароль", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "Заповнити ТОП", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "Показувати значок генератора паролів", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "Зберегти реєстраційні дані", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "Показувати генератор паролів", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "Клацніть значок додатка, щоб створити або змінити реєстраційні дані.", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "Знайдено декілька реєстраційних записів для перевіряння HTTP. Клацніть на значку розширення, щоб вибрати потрібні,", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "Невідома помилка.", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "Сховище не відкрите.", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "Контрольну суму сховища не одержано.", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "Відкритий ключ користувача не одержано.", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "Неможливо розшифрувати повідомлення.", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings.", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "Дію скасовано або заборонено.", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "Message encryption failed. Is KeePassXC running?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "Прив'язка KeePassXC зазнала невдачі, спробуйте ще раз.", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "Обмін ключами зазнав невдачі.", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "Шифрувальний ключ не розпізнано.", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "Збережених сховищ не знайдено.", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "Хибна дія.", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "Одержано порожнє повідомлення.", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "URL не надано.", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "Імен користувача не знайдено.", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "Password generator icon", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "Створений пароль", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "Також заповнити наступне поле, яке має тип пароля", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? бітів", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "Генератор паролів", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "Створити", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "Скопіювати", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "Заповнити та скопіювати", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "Помилка:\nСтворений пароль довший за дозволену довжину!\nВін був вкорочений до максимальної дозволеної довжини.\n\nБудь ласка, запам'ятайте новий пароль!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "Створити пароль", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "Неможливо одержати створений пароль.
      Можливо, KeePassXC не запущено?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "Відкинути", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "Пропустити", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "Show more", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "Знову", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "Схвалити", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "Реєстраційні поля вже було вибрано для цієї сторінки. Їх буде перезаписано.", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "Відкинути вибране", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "Текстове поле №", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. Виберіть поле імені користувача", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. Тепер виберіть поле пароля", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. Схваліть вибір", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "Будь ласка, схваліть свій вибір або вкажіть додаткові текстові поля.", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "Ім'я користувача", + "description": "General text for username." + }, + "password": { + "message": "Пароль", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- без імені користувача -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "Помилка:\nРеєстраційних даних не знайдено.", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "Помилка:\nЗнайдено більш одного реєстраційного запису у KeePassXC!\nНатисніть значок KeePassXC-Переглядача для додаткових дій.", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "Помилка:\nРеєстраційних даних для вказаного імені користувача не знайдено.", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "Помилка:\nНеможливо знайти поля для заповнення.", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "Помилка:\nНеможливо знайти поле пароля.", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "Помилка:\nЗміни реєстраційних даних не виявлено.", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "Вигульк KeePassXC", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "Налаштування", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "Choose custom login fields for this page", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "Сполучити", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "Сполучити заново", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "Заново виявити поля реєстраційних даних", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "Оновити", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "Заново відкрити сховище", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Переглядач натрапив на помилку:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "Ви використовуєте застарілу версію KeePassXC.", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "Будь ласка, завантажте останню версію з keepassxc.org", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "Перевіряння стану...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Переглядач не налаштовано. Натисніть кнопку «Сполучити», щоб під'єднати переглядач до KeePassXC.", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Переглядач було від'єднано від KeePassXC.", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "Натисніть кнопку «Сполучити заново», щоб знову встановити зв'язок.", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Переглядач ще не під'єднувався до KeePassXC але був налаштований з таким ідентифікатором: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Переглядач зараз сполучений з KeePassXC і був налаштований з таким ідентифікатором: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "Ім'я користувача чи пароль було змінено! Зберегти зміни?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "Реєстраційні дані будуть збережені у сполученому сховищі з ідентифікатором $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "Таке ім'я користувача не було збережене: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "Реєстраційні дані з використаним іменем користувача позначені жирним шрифтом: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "Будь ласка, виберіть реєстраційні дані, які Ви хочете оновити.", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "Виберіть реєстраційні дані, які Ви хочете ввести на цій сторінці.", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "Фільтр:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "Виберіть реєстраційні дані, з якими Ви хочете ввійти.", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "На цій сторінці знайдено декілька парольних полів. Клацніть правою кнопкою на одному з них та виберіть одну з дій:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL: ", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "Ім'я користувача", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "Новий", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "Оновити", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "Відкинути", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "Ніколи не питати для цієї сторінки", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "Закрити", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "Відкинути і показати типовий діалог перевіряння пароля", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "Налаштування | KeePassXC-Переглядач", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "Загальні налаштування", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "Сполучені сховища", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "Власні реєстраційні поля", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "Налаштування сторінки", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "Про розширення", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "Загальні", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "Сполучені сховища", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "Власні реєстраційні поля", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "Налаштування сторінки", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "Про розширення", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "Налаштувати сполучення клавіш", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "Зберегти", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "Сполучити", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "Видалити", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "Додати", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "Перевірити наявність оновлень", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "Так, видалити негайно", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "Скасувати", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "Reset", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "Тривалість блимання:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Зміщення кількості перенаправлень: ", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Максимальна кількість перенаправлень: ", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "Увімкнути генератор паролів.", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "Автоматично видобувати реєстраційні дані.", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "Автоматично заповнювати, якщо сховище містить лише один збіг.", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "Увімкнути автозаповнення для полів з іменем користувача.", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "Показувати повідомлення.", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "Зберігати тільки домени.", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "Показувати повідомлення, коли є нагода додати нові реєстраційні дані до сховища.", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "Автоматично заповнювати й надсилати діалоги HTTP Basic Auth.", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "Перевярити наявність оновлень KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "раз на 3 дні", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "щотижня", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "щомісяця", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "ніколи", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "Сполучення клавіш", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Максимальна тривалість (мс) блимання значка після виявлення нових реєстраційних даних", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Мінімальна тривалість (мс) блимання значка до вимкнення, обумовленого перенаправленнями сторінки.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 для означення тривалості блимання, що ігнорує максимальну кількість перенаправлень (стара поведінка)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "Кількість сторінок понад зміщення кількості перенаправлень, яку має пройти цикл табуляції перед тим, як вимкнути значок", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Додає до парольних полів кнопку для створення нового паролю.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "KeePassXC створює паролі з використанням Ваших налаштувань генератора паролів.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Переглядач видобуде реєстраційні дані безпосередньо після активування вкладки.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Дозволити переглядачу KeePassXC автоматично заповнювати поля з реєстраційними даними, якщо він одержує лише один запис.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Обережно! Використання автозаповнення може бути небезпечним. Користуйтеся на власний ризик.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Показувати спадний список з доступними реєстраційними даними для кожного поля імені користувача на сторінці.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Показувати повідомлення про помилки та коли необхідні додаткові дії користувача.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "Під час збереження реєстраційних даних, зберігати тільки домен, а не всю адресу URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "Якщо реєстраційні дані знайдено для сторінки і типом перевірки є HTTP Basic Auth, KeePassXC-Переглядач спробує увійти використовуючи перший доступний запис.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "Діалог HTTP Basic Auth виглядає так:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Переглядач потребує KeePassXC для видобування реєстраційних даних.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "Ви можете завантажити найновішу стабільну версію з $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "Встановлена версія KeePassXC: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "Найновіша доступна версія KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "Типово: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "Нескінченність: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "Рекомендовано: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "Shortcut for $1 has been successfully changed.", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "Shortcut for $1 has been reset.", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Error: Shortcut for $1 has not been changed!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "До KeePassXC-Переглядача підключені такі сховища KeePassXC.", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "Підключених сховищ не знайдено.", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Видалити ідентифікатор з переліку сховищ?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Ви дійсно хочете видалити такий ідентифікатор з переліку сховищ?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "Ви можете заново під'єднати Ваше сховище у будь-який час.", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "Ідентифікатор", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "Ключ", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "Останнє використання", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "Створено", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "Видалено", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "URL сторінки", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "Нехтувати", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Визначення виключно за іменем користувача", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "Видалити", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "Увімкнути всі можливості", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Вимкнути додавання і змінення реєстраційних даних", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "Вимкнути всі можливості", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "Не знайдено жодного власного реєстраційного поля.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "Якщо KeePassXC-Переглядач помилково визначить реєстраційні поля, Ви можете вказати їх самостійно.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Перейдіть до сторінки і натисніть значок KeePassXC-Переглядач, потім виберіть ", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Видалити збережені власні реєстраційні поля?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Ви дійсно хочете видалити власні реєстраційні поля збережені для такої сторінки: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Переглядач автоматично визначить реєстраційні поля під час наступних відвідувань сторінки.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "Нехтуваних сайтів не знайдено.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "Видалити сторінку?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Для сайтів на цій сторінці призначені особливі методи поводження.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "Для нехтування новими або оновленими реєстраційними даними на окремому сайті, додайте його нижче або клацніть на блимкому значку KeePassXC-Переглядача і виберіть", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "Якщо сайт повністю знехтувано (вибрано Вимкнути усі можливості), то розширення не робитиме нічого під час відвідання цього сайту.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Визначення виключно за іменем користувача дозволяє KeePassXC–Переглядачу заповнювати реєстраційні поля на сайтах, що запитують ім'я користувача і пароль на окремих сторінках.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Додати URL вручну", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Ви дійсно хочете видалити позначену сторінку зі списку: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Переглядач увімкне всі можливості для цього сайту і скасує визначення виключно за іменем користувача.", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "Відвідати сторінку KeePassXC-Переглядача у Веб-магазині Chrome.", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "Відвідати сторінку KeePassXC-Переглядач у покажчику розширень Mozilla.", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "Відвідати KeePassXC-Переглядач на GitHub.", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "Версія KeePassXC-Переглядач: $1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "Версія KeePassXC: $1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "Спільнота:", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "Licenses", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "Report bugs", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "Create new issue on GitHub", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "Opens a new tab", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/zh_CN/messages.json b/keepassxc-browser/_locales/zh_CN/messages.json new file mode 100644 index 0000000..1f781f8 --- /dev/null +++ b/keepassxc-browser/_locales/zh_CN/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC 与现代 Web 浏览器的集成", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "填写用户名和密码", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "仅填写密码", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "填写一次性密码。", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "显示密码生成器图标", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "保存凭据", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "显示密码生成器", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "单击扩展图标创建或修改凭据。", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "检测到多个凭据的 HTTP 身份验证。 单击扩展图标以选择正确的扩展图标。", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "未知错误。", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "数据库未打开。", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "未收到数据库哈希。", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "未收到客户端公钥。", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "无法解密消息。", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "无法连接到KeePassXC。 检查KeePassXC设置中是否启用了浏览器集成。", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "行动被取消或被拒绝。", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "消息加密失败。KeepassXC正在运行吗?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC 整合失败,请再尝试一下。", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "密钥交换没有成功。", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "无法识别加密密钥。", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "找不到保存的数据库。", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "行动不正确。", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "收到空消息。", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "没有提供URL。", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "找不到登录信息。", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "密码生成器图标", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "生成密码", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "同时填写下一个密码字段", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? 位", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "密码生成器", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "生成", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "复制", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "填写并复制", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "错误:\n生成的密码长于允许的长度!\n它被剪裁以适应长度。\n\n请记住新密码!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "生成密码", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "无法接收生成的密码。
      KeePassXC 正在运行吗?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "关闭", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "跳过", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "显示更多", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "重试", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "确认", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "此页面的登录字段已被选中,将被覆盖。", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "放弃选择", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "字符串字段#", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1.选择用户名字段", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2.现在选择一个密码字段", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3.确认选择", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "请确认您的选择或选择更多字段作为字符串字段。", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "您还可以使用数字从键盘中选择输入字段。", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "用户名", + "description": "General text for username." + }, + "password": { + "message": "密码", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- 没有用户名 -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "错误:\n找不到登录信息。", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "错误:\n在 KeePassXC 中找到了多个登录名!\n点击 KeePassXC-Browser 图标查看更多选项。", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "错误:\n找不到给定用户名的凭据。", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "错误:\n找不到要填写的字段。", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "错误:\n无法找到密码字段。", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "错误:\n无法检测更改的凭据。", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - 弹出窗口", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "设置", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "选择此页面的自定义登录字段", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "连接", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "重新连接", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "重新检测登录字段", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "重新加载", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "重新打开数据库", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser 遇到错误:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "您使用旧版本的 KeePassXC。", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "请从 keepassxc.org 下载最新版本", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "正在检查状态...", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser 尚未被设置。按“连接”按钮可与 KeePassXC 配对。", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC 已断开与 KeePassXC-Browser 的连接。", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "按重新连接按钮建立新的连接。", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser 尚未连接到 KeePassXC,但已使用标识符进行了配置: $1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser 已连接到 KeePassXC,并且已使用以下标识符进行了配置: $1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "用户名或密码已更改!是否保存?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "凭据将用标识符 $1 保存在连接的数据库中", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "以下用户名尚未保存: $1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "被使用用户名的凭据已被标记为粗体: $1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "请选择要更新的凭据。", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "请选择要添加新凭据的组。", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "错误:未找到指定的默认群组。创建所有必要的群组。", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "无法创建新群组。", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "错误:凭据未更新。密码尚未更改。", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "错误:无法保存或更新凭据。", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "选择您希望在页面中输入的登录信息。", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "筛选:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "选择您要登录的登录信息。", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "在此页面中找到多个密码字段。右键单击其中一个密码字段,然后选择其中一个:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "链接:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "用户名:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "新增", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "更新", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "关闭", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "永远不要问这个页面", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "关闭", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "关闭并显示默认身份验证对话框", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "设置 | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "常规设置", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "连接的数据库", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "自定义登录字段", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "网站首选项", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "关于", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "常规", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "连接数据库", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "自定义登录字段", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "网站首选项", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "关于", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "配置快捷方式", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "保存", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "连接", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "删除", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "添加", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "检查更新", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "是的,立即删除", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "取消", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "重置", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "闪烁时间:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "重定向偏移:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "重定向的最大值(数量):", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "保存新密码的默认群组:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "使用斜杠分隔群组,例如:Group / ChildGroup。", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "始终询问保存新凭据的位置", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "启用后,弹出窗口将显示群组列表。", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "激活密码生成器。", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "自动检索凭据。", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "自动填写单凭证条目。", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "激活用户名字段的自动完成功能。", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "显示通知。", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "仅保存域。", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "在可以将新凭据保存到数据库时显示通知。", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "自动填写 HTTP 基本身份验证对话框并提交。", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "检查更新 KeePassXC:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "每3天", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "每周", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "每月", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "从不", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "键盘快捷键", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "检测到新的条目后图标闪烁的最长时间(毫秒)", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "图标在页面重定向导致的停用前闪烁的最小时间(毫秒)。", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 只使用闪烁时间忽略最大重定向(旧行为)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "在停用图标之前,在重定向偏移之后,tab 应循环遍历多少页", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "向密码字段添加一个用于生成新密码的按钮。", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "密码是由 KeePassXC 使用您的密码生成配置文件生成的。", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser 将在选项卡是激活状态时立即获取凭据。", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "当获取到的条目只有一条时,让 KeePassXC-Browser 自动填写凭据。", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "警告! 使用自动填充并不安全。 使用风险由您自己承担。", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "显示一个包含了页面上所有用户名字段的可用凭据的列表。", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "显示错误通知以及需要用户交互的时间。", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "保存新凭据时,仅保存域而不是完整的 URL。", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "如果在页面上找到凭据,并且登录类型是 HTTP 基本身份验证请求时,KeePassXC-Browser 将尝试使用第一个凭据登录。", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "HTTP 基本验证对话框如下所示:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser 需要 KeePassXC 来检索凭据。", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "您可以从 $1 下载最新的稳定版本", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "您正在运行 KeePassXC 版本: $1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "最新版本的 KeePassXC: $1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "默认值: $1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "无限: $1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "推荐: $1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "$1 的快捷方式已成功更改。", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "$1 的快捷方式已重置。", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "错误: $1 的快捷方式未更改!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "以下 KeePassXC 数据库连接到 KeePassXC-Browser。", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "未找到连接的数据库。", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "是否从数据库列表中删除标识符?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "是否确实要从数据库列表中删除以下标识符?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "您可以随时重新连接数据库。", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "标识符", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "密钥", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "上次使用", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "创建", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "删除", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "页面网址", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "忽略", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "仅用户名检测", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "删除", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "启用所有功能", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "禁用新的/修改的凭据", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "禁用所有功能", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "找不到保存的自定义登录字段。", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "您可以使用下表管理保存的自定义登录字段。", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "如果 KeePassXC-Browser 检测到错误的登录字段,您可以自己指定正确的字段。", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "转到页面并单击 KeePassXC-Browser 图标,然后选择", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "是否删除已保存的自定义登录字段?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "是否确实要删除页上保存的自定义登录字段: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser 将在您下次访问此页面时自动检测登录字段。", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "未找到被忽略的站点。", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "删除站点?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "此页面上的网站具有与之相关的特殊处理方法。", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "要在特定站点上忽略新的或已修改的凭据,请在下面添加它们或单击闪烁的 KeePassXC-Browser 图标,然后选择", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "如果站点被完全忽略( 禁用所有功能 被选中),则在访问该站点时插件将不执行任何操作。", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "仅用户名检测允许 KeePassXC-Browser 在访问用户名与密码是在不同页面的网站时填写登录信息。", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "手动添加 URL", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "您真的要从列表中删除指定的站点: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser 将在此站点启用所有功能并删除仅用户名检测。", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "您可以使用下表管理保存的网站首选项。", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "用于忽略页面的扩展功能的选项。", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "访问 Chrome 应用商店中的 KeePassXC-Browser。", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "访问 Mozilla 附加组件目录中的 KeePassXC-Browser。", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "访问 GitHub 上的 KeePassXC-Browser。", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser 版本:$1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC 版本:$1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "贡献", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "许可证", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "报告错误", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "在 GitHub 上创建新问题", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "可以使用以下调试信息", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "无效的值。请检查输入。", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "无效的 URL。请检查输入。", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "该值已存在于列表中。", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "打开新选项卡", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "\"http 基本身份验证\" 对话框", + "description": "Options page HTTP Basic Auth dialog text" + } +} diff --git a/keepassxc-browser/_locales/zh_TW/messages.json b/keepassxc-browser/_locales/zh_TW/messages.json new file mode 100644 index 0000000..4605e04 --- /dev/null +++ b/keepassxc-browser/_locales/zh_TW/messages.json @@ -0,0 +1,850 @@ +{ + "extensionDescription": { + "message": "KeePassXC 與現代瀏覽器的整合", + "description": "Name of the extension." + }, + "contextMenuFillUsernameAndPassword": { + "message": "填入使用者名稱和密碼", + "description": "Context menu item for filling both username and password." + }, + "contextMenuFillPassword": { + "message": "僅填入密碼", + "description": "Context menu item for filling password." + }, + "contextMenuFillTOTP": { + "message": "填入限時單次密碼", + "description": "Context menu item for filling Time-based One Time Password." + }, + "contextMenuShowPasswordGeneratorIcons": { + "message": "顯示密碼產生器圖示", + "description": "Show password generator icon on every password input field." + }, + "contextMenuSaveCredentials": { + "message": "儲存憑證", + "description": "Save credentials using the extension popup icon." + }, + "contextMenuShowPasswordGenerator": { + "message": "顯示密碼產生器", + "description": "Show password generator text." + }, + "rememberCredentialsPopup": { + "message": "點選擴展圖示來建立或更改憑證。", + "description": "Notification text when saving credentials from the context menu." + }, + "multipleCredentialsDetected": { + "message": "偵測到多個 HTTP 身份驗證的憑證。點選擴展圖示來選擇正確的憑證。", + "description": "Notification when HTTP Authentication has multiple credentials detected." + }, + "errorMessageUnknown": { + "message": "未知錯誤。", + "description": "Unknown error." + }, + "errorMessageDatabaseNotOpened": { + "message": "資料庫未開啟。", + "description": "Database not opened." + }, + "errorMessageDatabaseHash": { + "message": "未收到資料庫雜湊值。", + "description": "Database hash not received." + }, + "errorMessageClientPublicKey": { + "message": "未收到客戶端公鑰。", + "description": "Client public key not received." + }, + "errorMessageDecrypt": { + "message": "無法解密訊息。", + "description": "Cannot decrypt message." + }, + "errorMessageTimeout": { + "message": "無法連線到 KeePassXC。請確認 KeePassXC 的瀏覽器整合功能已啟用。", + "description": "Cannot connect to KeePassXC. Check that browser integration is enabled in KeePassXC settings." + }, + "errorMessageCanceled": { + "message": "動作被取消或是被拒絕。", + "description": "Action canceled or denied." + }, + "errorMessageEncrypt": { + "message": "訊息加密失敗。KeePassXC 是否正在執行?", + "description": "Message encryption failed. Is KeePassXC running?" + }, + "errorMessageAssociate": { + "message": "KeePassXC 配對失敗,請再試一次。", + "description": "KeePassXC association failed, try again." + }, + "errorMessageKeyExchange": { + "message": "金鑰交換失敗。", + "description": "Key exchange was not successful." + }, + "errorMessageEncryptionKey": { + "message": "無法辨認加密金鑰。", + "description": "Encryption key is not recognized." + }, + "errorMessageSavedDatabases": { + "message": "找不到儲存的資料庫。", + "description": "No saved databases found." + }, + "errorMessageIncorrectAction": { + "message": "行動不正確。", + "description": "Incorrect action." + }, + "errorMessageEmptyMessage": { + "message": "收到空訊息。", + "description": "Empty message received." + }, + "errorMessageNoURL": { + "message": "沒有提供 URL。", + "description": "No URL provided." + }, + "errorMessageNoLogins": { + "message": "找不到登錄資訊。", + "description": "No logins found." + }, + "passwordGeneratorIcon": { + "message": "密碼產生器圖示", + "description": "Alt attribute text of the password generator icon." + }, + "passwordGeneratorPlaceholder": { + "message": "產生密碼", + "description": "Input field placeholder for generated password." + }, + "passwordGeneratorLabel": { + "message": "同時填入下一個密碼欄位", + "description": "Checkbox text below the password generator input field." + }, + "passwordGeneratorBits": { + "message": "??? 位", + "description": "Bits of the generated password." + }, + "passwordGeneratorTitle": { + "message": "密碼產生器", + "description": "Password generator dialog title." + }, + "passwordGeneratorGenerate": { + "message": "產生", + "description": "Generate button text in password generator." + }, + "passwordGeneratorCopy": { + "message": "複製", + "description": "Copy button text in password generator." + }, + "passwordGeneratorFillAndCopy": { + "message": "填入並複製", + "description": "Fill and copy button text in password generator." + }, + "passwordGeneratorErrorTooLong": { + "message": "錯誤:\n產生的密碼超出允許的長度!\n已將其截斷已符合長度。\n\n請記住新的密碼!", + "description": "A warning text shown in the password generator." + }, + "passwordGeneratorGenerateText": { + "message": "產生密碼", + "description": "Password icon title text." + }, + "passwordGeneratorError": { + "message": "無法接收產生的密碼。
      KeePassXC 正在執行嗎?", + "description": "Password generator error text when KeePassXC is closed." + }, + "defineDismiss": { + "message": "撤銷", + "description": "Dismiss button text when choosing custom login fields." + }, + "defineSkip": { + "message": "略過", + "description": "Skip button text when choosing custom login fields." + }, + "defineMore": { + "message": "顯示更多", + "description": "More button text when choosing custom login fields." + }, + "defineAgain": { + "message": "重試", + "description": "Again button text when choosing custom login fields." + }, + "defineConfirm": { + "message": "確認", + "description": "Confirm button text when choosing custom login fields." + }, + "defineAlreadySelected": { + "message": "此網頁的登錄欄位已被選擇,所以將會被覆蓋。", + "description": "A text shown when custom credentials fields are already set for the page." + }, + "defineDiscard": { + "message": "放棄選擇", + "description": "Discard selection button text when choosing custom login fields." + }, + "defineStringField": { + "message": "字串欄位 #", + "description": "Text for string field." + }, + "defineChooseUsername": { + "message": "1. 選擇使用者名稱欄位", + "description": "Choosing a username field text when choosing custom login fields." + }, + "defineChoosePassword": { + "message": "2. 現在選擇一個密碼欄位", + "description": "Choosing a password field text when choosing custom login fields." + }, + "defineConfirmSelection": { + "message": "3. 確認選擇", + "description": "Confirm a selection text when choosing custom login fields." + }, + "defineHelpText": { + "message": "請確認您的選擇,或是選擇更多欄位作為字串欄位。", + "description": "Confirm a selection text when choosing custom login fields which contains string fields." + }, + "defineKeyboardText": { + "message": "You can also use the numbers to choose the input fields from keyboard.", + "description": "Help text when choosing custom login fields." + }, + "username": { + "message": "使用者名稱", + "description": "General text for username." + }, + "password": { + "message": "密碼", + "description": "General text for password." + }, + "credentialsNoUsername": { + "message": "- 無使用者名稱 -", + "description": "Shown when no username is set in the credentials." + }, + "credentialsNoLoginsFound": { + "message": "錯誤:\n找不到登錄資訊。", + "description": "Shown when no credentials are found for the current page." + }, + "credentialsMultipleFound": { + "message": "錯誤:\n在 KeePassXC 中找到多個登錄資訊!\n點選 KeePassXC-Browser 圖示來檢視更多選項。", + "description": "Alert message when trying to fill username and/or password when multiple credentials are found." + }, + "credentialsNoUsernameFound": { + "message": "錯誤:\n找不到該使用者名稱的憑證。", + "description": "Alert message when no credentials are found for the given username." + }, + "fieldsFill": { + "message": "錯誤:\n找不到該填入的欄位。", + "description": "Alert message when no fields are found to fill in." + }, + "fieldsNoPasswordField": { + "message": "錯誤:\n無法找到密碼欄位。", + "description": "Message shown when no password fields are found." + }, + "rememberNothingChanged": { + "message": "錯誤:\n無法找到修改後的憑證。", + "description": "Message shown when trying to save credentials that haven't changed." + }, + "popupTitle": { + "message": "KeePassXC - 彈出視窗", + "description": "Popup window title." + }, + "popupSettingsText": { + "message": "設定", + "description": "Popup Settings button text." + }, + "popupChooseCredentialsText": { + "message": "為此網頁定義登錄欄位", + "description": "Popup credential choosing button text." + }, + "popupConnectButton": { + "message": "連線", + "description": "Popup Connect button text." + }, + "popupReconnectButton": { + "message": "重新連線", + "description": "Popup Reconnect button text." + }, + "popupRedetectButton": { + "message": "重新偵測登錄欄位", + "description": "Popup Redetect login fields button text." + }, + "popupReloadButton": { + "message": "重新載入", + "description": "Popup Reload button text." + }, + "popupReopenButton": { + "message": "重新開啟資料庫", + "description": "Popup reopen database button text." + }, + "popupErrorEncountered": { + "message": "KeePassXC-Browser 遇到錯誤:", + "description": "A text shown above error message in the popup." + }, + "popupUpdateAvailable": { + "message": "您使用了舊版的 KeePassXC。", + "description": "Popup warning message about old version of KeePassXC." + }, + "popupDownloadNewVersion": { + "message": "請從 keepassxc.org 下載最新版本", + "description": "Popup warning message link when KeePassXC version is not up-to-date." + }, + "popupCheckingStatus": { + "message": "檢查狀態中…", + "description": "Checking status message in popup." + }, + "popupNotConfigured": { + "message": "KeePassXC-Browser 尚未設定。請按下連線按鈕來與 KeePassXC 配對。", + "description": "A popup message shown when the extension has not been connected to KeePassXC." + }, + "popupNeedReconfigure": { + "message": "KeePassXC-Browser 已與 KeePassXC 斷線。", + "description": "A popup message shown when the extension has been disconnected from KeePassXC." + }, + "popupNeedReconfigureMessage": { + "message": "按下重新連線按鈕來建立新連線。", + "description": "A popup message shown when reconnect is needed." + }, + "popupConfiguredNotAssociated": { + "message": "KeePassXC-Browser 尚未與 KeePassXC 連線,但是已經被設定為使用此識別碼:$1", + "description": "A popup message shown when KeePassXC is not connected but configured." + }, + "popupConfiguredAndAssociated": { + "message": "KeePassXC-Browser 已與 KeePassXC 連線,且設定為使用此識別碼:$1", + "description": "A popuo message when a connection to KeePassXC is succesful." + }, + "popupRememberInfoText": { + "message": "使用者名稱或是密碼已更改!是否要儲存?", + "description": "Popup message when username or password has changed." + }, + "popupRememberSaving": { + "message": "憑證將會儲存於已連線的資料庫,識別碼為 $1", + "description": "A popup message when saving or updating credentials." + }, + "popupRememberNewUsername": { + "message": "以下使用者名稱尚未儲存:$1", + "description": "A popup message shown when a new username is detected when saving credentials." + }, + "popupRememberUsernameExists": { + "message": "該使用者名稱對應的憑證將以粗體標記:$1", + "description": "A popup message shown when a existing username is detected when saving credentials." + }, + "popupRememberChooseCredentials": { + "message": "請選擇您要更新的憑證。", + "description": "A popup message shown choosing what credentials user wants to update." + }, + "popupRememberChooseGroup": { + "message": "Please choose the group you want to add the new credentials.", + "description": "A popup message shown choosing what group user wants to use for new credentials." + }, + "popupRememberErrorDefaultGroupNotFound": { + "message": "Error: Specified default group not found. Creating all necessary groups.", + "description": "Error message shown when default group set cannot be found." + }, + "popupRememberErrorCreatingNewGroup": { + "message": "New group(s) cannot be created.", + "description": "Error message shown when new groups cannot be created." + }, + "popupRememberErrorPasswordNotChanged": { + "message": "Error: Credentials not updated. The password has not been changed.", + "description": "Error message shown when credential password is not changed." + }, + "popupRememberErrorCannotSaveCredentials": { + "message": "Error: Credentials cannot be saved or updated.", + "description": "Error message shown when credentials cannot be saved or updated." + }, + "popupLoginText": { + "message": "選擇您希望在頁面中輸入的登入資訊。", + "description": "A popup message shown when one or multiple credentials are present." + }, + "popupFilterText": { + "message": "篩選器:", + "description": "Text for login credentials quick filter." + }, + "popupAuthText": { + "message": "選擇您要使用的登入資訊。", + "description": "A popup message shown when doing HTTP Authentication with multiple credentials present." + }, + "popupMultiplePasswordFields": { + "message": "此頁面包含一個以上的密碼欄位。右鍵點選其中一個密碼欄位,並選擇以下其一:", + "description": "A popup message shown when web page has multiple password fields." + }, + "popupURL": { + "message": "URL:", + "description": "URL. Might not need any translation." + }, + "popupUsername": { + "message": "使用者名稱:", + "description": "A username field name shown on credential update." + }, + "popupButtonNew": { + "message": "新增", + "description": "New button text in popup when updating credentials." + }, + "popupButtonUpdate": { + "message": "更新", + "description": "Update button text in popup when updating credentials." + }, + "popupButtonDismiss": { + "message": "撤銷", + "description": "Dismiss button text in popup when updating credentials." + }, + "popupButtonIgnore": { + "message": "永不於此網頁詢問", + "description": "Ignore button text in popup or in notification when updating credentials." + }, + "popupButtonClose": { + "message": "關閉", + "description": "Close button text in popup or in notification." + }, + "popupButtonDismissHttpAuth": { + "message": "撤銷並顯示預設身份驗證彈出視窗", + "description": "Dismiss button text when in HTTP Authentication popup." + }, + "optionsTitle": { + "message": "設定 | KeePassXC-Browser", + "description": "Options page title." + }, + "optionsGeneralSettingsTab": { + "message": "一般設定", + "description": "General Settings tab text." + }, + "optionsConnectedDatabasesTab": { + "message": "已連結的資料庫", + "description": "Connected Databases tab text." + }, + "optionsCustomFieldsTab": { + "message": "自定登入欄位", + "description": "Saved custom login fields tab text." + }, + "optionsSitePreferencesTab": { + "message": "網站設定", + "description": "Site preferences fields tab text." + }, + "optionsAboutTab": { + "message": "關於", + "description": "About tab text." + }, + "optionsMenuGeneral": { + "message": "一般", + "description": "General settings page header." + }, + "optionsMenuConnectedDatabases": { + "message": "已連結的資料庫", + "description": "Connected Databases page header." + }, + "optionsMenuCustomFields": { + "message": "自定登入欄位", + "description": "Custom login fields page header." + }, + "optionsMenuSitePreferences": { + "message": "網站設定", + "description": "Site preferences page header." + }, + "optionsMenuAbout": { + "message": "關於", + "description": "About page header." + }, + "optionsConfigureShortcuts": { + "message": "設定快速鍵", + "description": "Keyboard shortcut button and title text." + }, + "optionsButtonSave": { + "message": "儲存", + "description": "Save button text." + }, + "optionsButtonConnect": { + "message": "連線", + "description": "Connect button text." + }, + "optionsButtonRemove": { + "message": "移除", + "description": "Remove button text." + }, + "optionsButtonAdd": { + "message": "新增", + "description": "Add button text." + }, + "optionsButtonUpdate": { + "message": "檢查更新", + "description": "Check for updates button text." + }, + "optionsButtonRemoveNow": { + "message": "是,立即刪除", + "description": "Confirm button text when removing database key or custom login fields." + }, + "optionsButtonCancel": { + "message": "取消", + "description": "Cancel button text when removing database key or custom login fields." + }, + "optionsButtonReset": { + "message": "重設", + "description": "Reset button text for keyboard shortcuts." + }, + "optionsLabelBlinkTime": { + "message": "閃爍時間:", + "description": "Blink Time option text." + }, + "optionsLabelRedirectOffset": { + "message": "Redirect Offset:", + "description": "Redirect Offset option text." + }, + "optionsLabelRedirectAllowance": { + "message": "Maximum (Number of) Redirects:", + "description": "RMaximum (Number of) Redirects options text." + }, + "optionsLabelDefaultGroup": { + "message": "Default group for saving new passwords:", + "description": "Default group options text." + }, + "optionsDefaultGroupHelpText": { + "message": "Separate the group with slashes, for example: Group/ChildGroup.", + "description": "Default group help text." + }, + "optionsLabelDefaultGroupCheckboxText": { + "message": "Always ask where to save new credentials", + "description": "Default group checkbox help text." + }, + "optionsLabelDefaultGroupCheckboxHelpText": { + "message": "When enabled, the popup shows a group listing.", + "description": "Default checkbox explanation help text." + }, + "optionsCheckboxUsePasswordGenerator": { + "message": "啟用密碼產生器。", + "description": "Activate password generator checkbox text." + }, + "optionsCheckboxAutoRetrieveCredentials": { + "message": "自動獲取憑證。", + "description": "Automatically retrieve credentials checkbox text." + }, + "optionsCheckboxAutoFillSingleEntry": { + "message": "自動填入單一憑證條目。", + "description": "Automatically fill-in single credential entry checkbox text." + }, + "optionsCheckboxAutoCompleteUsernames": { + "message": "啟用使用者名稱欄位的自動完成。", + "description": "Activate autocomplete for username fields checkbox text." + }, + "optionsCheckboxShowNotifications": { + "message": "顯示通知。", + "description": "Show notifications checkbox text." + }, + "optionsSaveDomainOnly": { + "message": "只儲存網域。", + "description": "Save domain only checkbox text." + }, + "optionsCheckboxShowLoginNotifications": { + "message": "當可以儲存新憑證至資料庫時顯示通知。", + "description": "Show login notifications checkbox text." + }, + "optionsCheckboxAutoFillAndSend": { + "message": "自定填入 HTTP 基礎身份驗證對話視窗並提交。", + "description": "Auto fill HTTP Basic Auth dialogs and send them checkbox text." + }, + "optionsRadioText": { + "message": "檢查 KeePassXC 的更新:", + "description": "Text above radio buttons in the settings page." + }, + "optionsRadioThreeDays": { + "message": "每三天", + "description": "Radio button text." + }, + "optionsRadioWeek": { + "message": "每週", + "description": "Radio button text." + }, + "optionsRadioMonth": { + "message": "每月", + "description": "Radio button text." + }, + "optionsRadioNever": { + "message": "永不", + "description": "Radio button text." + }, + "optionsKeyboardShortcutsHeader": { + "message": "快速鍵", + "description": "Keyboard shortcut header text." + }, + "optionsBlinkTimeHelpText": { + "message": "Maximum time (ms) the icon should blink after detecting new credentials", + "description": "Blink Time option help text." + }, + "optionsRedirectOffsetHelpText": { + "message": "Minimum time (ms) the icon should blink before deactivating due to page redirects.", + "description": "Redirect Offset option help text." + }, + "optionsRedirectOffsetHelpTextSecond": { + "message": "-1 to only use blink time ignoring Maximum Redirects (old behavior)", + "description": "Redirect Offset option help text, second part." + }, + "optionsRedirectAllowanceHelpText": { + "message": "How many pages should the tab cycle through after the redirect offset before deactivating the icon", + "description": "Redirect Allowance option help text." + }, + "optionsUsePasswordGeneratorHelpText": { + "message": "Adds a button to password fields for generating a new password.", + "description": "Password Generator option help text." + }, + "optionsUsePasswordGeneratorHelpTextSecond": { + "message": "Passwords are generated by KeePassXC using your password generation profile.", + "description": "Password Generator option help text, second part." + }, + "optionsAutoRetrieveCredentialsHelpText": { + "message": "KeePassXC-Browser will immediately retrieve credentials when a tab is activated.", + "description": "Auto-Retrive Credentials option help text." + }, + "optionsAutoFillSingleEntryHelpText": { + "message": "Let KeePassXC-Browser automatically fill in credentials if it receives only a single entry.", + "description": "Auto-Fill Single Entry option help text." + }, + "optionsAutoFillSingleEntryWarning": { + "message": "Warning! Using auto-fill is not safe. Use at your own risk.", + "description": "Auto-Fill Single Entry warning text." + }, + "optionsAutocompleteUsernamesHelpText": { + "message": "Show a dropdown list containing available credentials for all username fields on a page.", + "description": "Autocomplete Usernames option help text." + }, + "optionsShowNotificationsHelpText": { + "message": "Show notifications for errors and when user interaction is required.", + "description": "Show notifications option help text." + }, + "optionsSaveDomainOnlyHelpText": { + "message": "When saving new credentials, save only the domain instead of full URL.", + "description": "Save domain only option help text." + }, + "optionsAutoFillAndSendHelpText": { + "message": "If credentials are found for a page and the login-type is an HTTP Basic Auth request, KeePassXC-Browser tries to login with the first given credentials.", + "description": "Auto-Fill And Send option help text." + }, + "optionsAutoFillAndSendHelpTextSecond": { + "message": "An HTTP Basic Auth dialog looks like this:", + "description": "HTTP Basic Auth image help text." + }, + "optionsVersionInfoText": { + "message": "KeePassXC-Browser needs KeePassXC to retrieve credentials.", + "description": "Settings page version info text." + }, + "optionsVersionDownload": { + "message": "You can download the latest stable version from $1", + "description": "Settings page download link." + }, + "optionsVersionRunning": { + "message": "您正在執行的 KeePassXC 版本:$1", + "description": "Settings page info text of user's KeePassXC version." + }, + "optionsLatestVersion": { + "message": "最新可用的 KeePassXC 版本:$1", + "description": "Settings page info text about the latest KeePassXC version." + }, + "optionsDefault": { + "message": "預設值:$1", + "description": "Default setting text." + }, + "optionsInfinite": { + "message": "無限:$1", + "description": "Infinite setting text." + }, + "optionsRecommended": { + "message": "建議值:$1", + "description": "Recommended setting text." + }, + "optionsShortcutsSuccess": { + "message": "$1 的快速鍵已成功更改。", + "description": "Message for successful keyboard shortcut change." + }, + "optionsShortcutsInfo": { + "message": "$1 的快速鍵已重設。", + "description": "Info message for changing keyboard shortcuts." + }, + "optionsShortcutsDanger": { + "message": "Error: Shortcut for $1 has not been changed!", + "description": "Error message for changing keyboard shortcuts." + }, + "optionsConnectedDatabasesText": { + "message": "以下的 KeePassXC 資料庫已連結到 KeePassXC-Browser。", + "description": "Info text about connected databases." + }, + "optionsConnectedDatabasesNotFound": { + "message": "找不到已連線的資料庫。", + "description": "Shown in the connected databases table when there is no connected databases." + }, + "optionsDatabasesRemoveIdentifier": { + "message": "Remove identifier from database list?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmFirst": { + "message": "Do you really want to remove the following identifier from the database list?", + "description": "Confirmation text when removing database from the list." + }, + "optionsDatabasesRemoveIdentifierConfirmSecond": { + "message": "您可以在任何時候重新與您的資料庫連線。", + "description": "Confirmation text when removing database from the list, second part." + }, + "optionsDatabaseIdentifier": { + "message": "識別碼", + "description": "Database list column title." + }, + "optionsDatabaseKey": { + "message": "金鑰", + "description": "Database list column title." + }, + "optionsDatabaseLastUsed": { + "message": "上次使用", + "description": "Database list column title." + }, + "optionsDatabaseCreated": { + "message": "建立", + "description": "Database list column title." + }, + "optionsDatabaseDelete": { + "message": "刪除", + "description": "Database list column title." + }, + "optionsColumnPageURL": { + "message": "網頁 URL", + "description": "Site preferences list column title." + }, + "optionsColumnIgnore": { + "message": "忽略", + "description": "Site preferences list column title." + }, + "optionsColumnUsernameOnly": { + "message": "Username-only Detection", + "description": "Site preferences list column title." + }, + "optionsColumnDelete": { + "message": "刪除", + "description": "Site preferences list column title." + }, + "optionsSelectionNothing": { + "message": "啟用所有功能", + "description": "Site preferences option selection." + }, + "optionsSelectionNormal": { + "message": "Disable new/modified credentials", + "description": "Site preferences option selection." + }, + "optionsSelectionFull": { + "message": "停用所有功能", + "description": "Site preferences option selection." + }, + "optionsCustomFieldsNotFound": { + "message": "No saved custom login fields found.", + "description": "Shown when no saved custom credentials are saved." + }, + "optionsCustomFieldsTableCaption": { + "message": "You can manage saved custom login fields using the table below.", + "description": "Table caption of Custom login fields page." + }, + "optionsCustomFieldsTabHelpTextFirst": { + "message": "If KeePassXC-Browser detects the wrong login fields, you are able to specify the correct fields yourself.", + "description": "Saved custom login fields info text, first part." + }, + "optionsCustomFieldsTabHelpTextSecond": { + "message": "Go to the page and click on the KeePassXC-Browser icon, then select ", + "description": "Saved custom login fields info text, second part." + }, + "optionsCustomFieldsRemove": { + "message": "Remove saved custom login fields?", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmation": { + "message": "Do you really want to remove the saved custom login fields on the page: $1", + "description": "Confirmation text when removing saved custom login fields." + }, + "optionsCustomFieldsConfirmationHelpText": { + "message": "KeePassXC-Browser will automatically detect the login fields next time you visit this page.", + "description": "Part of confirmation text when removing saved custom login fields." + }, + "optionsSitePreferencesNotFound": { + "message": "No ignored sites found.", + "description": "Shown when no ignored sites are saved." + }, + "optionsSitePreferencesRemove": { + "message": "移除網站?", + "description": "Confirmation text when removing ignored sites from the list." + }, + "optionsSitePreferencesTabHelpTextFirst": { + "message": "Sites on this page have special handling methods associated with them.", + "description": "Site preferences info text, first part." + }, + "optionsSitePreferencesTabHelpTextSecond": { + "message": "To ignore new/modified credentials on a specific site, add them below or click the blinking KeePassXC-Browser icon and select", + "description": "Site preferences info text, second part." + }, + "optionsSitePreferencesTabHelpTextThird": { + "message": "If a site is fully ignored (Disable all features is selected), then the plugin will do nothing when visiting that site.", + "description": "Site preferences info text, third part." + }, + "optionsSitePreferencesTabHelpTextFourth": { + "message": "Username-only detection allows KeePassXC-Browser to fill in login details on websites with separate pages for username and password.", + "description": "Site preferences info text, fourth part." + }, + "optionsSitePreferencesManualAddText": { + "message": "Add URL manually", + "description": "Label for adding site manually on Site preferences tab." + }, + "optionsSitePreferencesConfirmation": { + "message": "Do you really want to remove the specified site from the list: $1", + "description": "Confirmation text when removing site from site preferences." + }, + "optionsSitePreferencesConfirmationHelpText": { + "message": "KeePassXC-Browser 將對此網站啟用所有功能,並移除只針對使用者名稱的偵測。", + "description": "Part of confirmation text when removing site preferences." + }, + "optionsSitePreferencesTableCaption": { + "message": "You can manage saved site preferences using the table below.", + "description": "Table caption of Site Preferences page." + }, + "optionsSitePreferencesSelect": { + "message": "Option to ignore extension features for the page.", + "description": "Title text of select element in Site Preferences." + }, + "optionsAboutChrome": { + "message": "瀏覽 Chrome 線上應用程式商店上的 KeePassXC-Browser。", + "description": "About page link to Chrome Web Store." + }, + "optionsAboutMozilla": { + "message": "瀏覽 Mozilla 附加元件站上的 KeePassXC-Browser。", + "description": "About page link to AMO." + }, + "optionsAboutGitHub": { + "message": "瀏覽 GitHub 上的 KeePassXC-Browser。", + "description": "About page link to GitHub." + }, + "optionsAboutExtensionVersion": { + "message": "KeePassXC-Browser 版本:$1", + "description": "About page text of extension version." + }, + "optionsAboutKeePassXCVersion": { + "message": "KeePassXC 版本:$1", + "description": "About page text of KeePassXC version." + }, + "optionsAboutContributors": { + "message": "貢獻者", + "description": "About page text of contributors." + }, + "optionsAboutLicenses": { + "message": "授權", + "description": "About page text of licenses." + }, + "optionsAboutReportBugs": { + "message": "回報錯誤", + "description": "About page text of reporting bugs." + }, + "optionsAboutCreateNewIssue": { + "message": "在 GitHub 上建立新 issue", + "description": "Link text for creating a new issue." + }, + "optionsAboutDebugInfo": { + "message": "The following debug info can be used", + "description": "Debug info text." + }, + "optionsErrorInvalidValue": { + "message": "Invalid value. Please check the input.", + "description": "Error shown when input field has an incorrect value." + }, + "optionsErrorInvalidURL": { + "message": "Invalid URL. Please check the input.", + "description": "Error shown when input field has an incorrect URL." + }, + "optionsErrorValueExists": { + "message": "The value already exists in the list.", + "description": "Error shown when trying to add a duplicate value to the list." + }, + "openNewTab": { + "message": "開新分頁", + "description": "Title attribute text." + }, + "httpAuthDialog": { + "message": "HTTP Basic Authentication dialog", + "description": "Options page HTTP Basic Auth dialog text" + } +}