From aea7f5c896d67cd2c796c2071bf4ae0439188697 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 10 Feb 2023 12:47:09 +0100 Subject: [PATCH 001/232] Ignore electron dependency changes (#4718) * Ignore electron dependency changes * Ignore zone.js --- .github/renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index dae887b3d02..485205a0d96 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -24,5 +24,5 @@ "updateTypes": "patch" } ], - "ignoreDeps": ["bootstrap", "electron-builder", "node-ipc", "regedit"] + "ignoreDeps": ["bootstrap", "electron-builder", "electron", "node-ipc", "regedit", "zone.js"] } From da963346db931b226007eb69e9817c3b1bc36c1e Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Fri, 10 Feb 2023 09:51:54 -0500 Subject: [PATCH 002/232] Add autofill field comments (#4568) * Added comments. * More comments. * More function comments. * Changed comment to add missing words. Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> * Added better comment on fill query function. Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> * More comments. * Added additional documentation on viewable and visible * Undid changes to the logic to avoid any chance of breaking anything. --------- Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> --- apps/browser/src/autofill/content/autofill.js | 272 +++++++++++++++--- .../src/autofill/models/autofill-field.ts | 75 +++++ .../src/autofill/models/autofill-form.ts | 18 ++ .../autofill/models/autofill-page-details.ts | 12 + 4 files changed, 332 insertions(+), 45 deletions(-) diff --git a/apps/browser/src/autofill/content/autofill.js b/apps/browser/src/autofill/content/autofill.js index d9ac840c8d8..17a7b26a1a2 100644 --- a/apps/browser/src/autofill/content/autofill.js +++ b/apps/browser/src/autofill/content/autofill.js @@ -56,7 +56,12 @@ function getPageDetails(theDoc, oneShotId) { // start helpers - // get the value of a dom element's attribute + /** + * For a given element `el`, returns the value of the attribute `attrName`. + * @param {HTMLElement} el + * @param {string} attrName + * @returns {string} The value of the attribute + */ function getElementAttrValue(el, attrName) { var attrVal = el[attrName]; if ('string' == typeof attrVal) { @@ -89,7 +94,11 @@ return elType !== el.type; } - // get the value of a dom element + /** + * Returns the value of the given element. + * @param {HTMLElement} el + * @returns {any} Value of the element + */ function getElementValue(el) { switch (toLowerString(el.type)) { case 'checkbox': @@ -113,7 +122,11 @@ } } - // get all the options for a "select" element + /** + * If `el` is a `` element + */ function getSelectElementOptions(el) { if (!el.options) { return null; @@ -132,34 +145,51 @@ }; } - // get the top label + /** + * If `el` is in a data table, get the label in the row directly above it + * @param {HTMLElement} el + * @returns {string} A string containing the label, or null if not found + */ function getLabelTop(el) { var parent; + + // Traverse up the DOM until we reach either the top or the table data element containing our field for (el = el.parentElement || el.parentNode; el && 'td' != toLowerString(el.tagName);) { el = el.parentElement || el.parentNode; } + // If we reached the top, return null if (!el || void 0 === el) { return null; } + // Establish the parent of the table and make sure it's a table row parent = el.parentElement || el.parentNode; if ('tr' != parent.tagName.toLowerCase()) { return null; } + // Get the previous sibling of the table row and make sure it's a table row parent = parent.previousElementSibling; if (!parent || 'tr' != (parent.tagName + '').toLowerCase() || parent.cells && el.cellIndex >= parent.cells.length) { return null; } + // Parent is established as the row above the table data element containing our field + // Now let's traverse over to the cell in the same column as our field el = parent.cells[el.cellIndex]; + + // Get the contents of this label var elText = el.textContent || el.innerText; return elText = cleanText(elText); } - // get all the tags for a given label + /** + * Get the contents of the elements that are labels for `el` + * @param {HTMLElement} el + * @returns {string} A string containing all of the `innerText` or `textContent` values for all elements that are labels for `el` + */ function getLabelTag(el) { var docLabel, theLabels = []; @@ -207,7 +237,13 @@ }).join(''); } - // add property and value to the object if there is a value + /** + * Add property `prop` with value `val` to the object `obj` + * @param {object} obj + * @param {string} prop + * @param {any} val + * @param {*} d + */ function addProp(obj, prop, val, d) { if (0 !== d && d === val || null === val || void 0 === val) { return; @@ -216,12 +252,21 @@ obj[prop] = val; } - // lowercase helper + /** + * Converts the string `s` to lowercase + * @param {string} s + * @returns Lowercase string + */ function toLowerString(s) { return 'string' === typeof s ? s.toLowerCase() : ('' + s).toLowerCase(); } - // query the document helper + /** + * Query the document `doc` for elements matching the selector `selector` + * @param {Document} doc + * @param {string} query + * @returns {HTMLElement[]} An array of elements matching the selector + */ function queryDoc(doc, query) { var els = []; try { @@ -405,6 +450,12 @@ document.elementForOPID = getElementForOPID; + /** + * Do the event on the element. + * @param {HTMLElement} kedol The element to do the event on + * @param {string} fonor The event name + * @returns + */ function doEventOnElement(kedol, fonor) { var quebo; isFirefox ? (quebo = document.createEvent('KeyboardEvent'), quebo.initKeyEvent(fonor, true, false, null, false, false, false, false, 0, 0)) : (quebo = kedol.ownerDocument.createEvent('Events'), @@ -413,20 +464,35 @@ return quebo; } - // clean up the text + /** + * Clean up the string `s` to remove non-printable characters and whitespace. + * @param {string} s + * @returns {string} Clean text + */ function cleanText(s) { var sVal = null; s && (sVal = s.replace(/^\\s+|\\s+$|\\r?\\n.*$/gm, ''), sVal = 0 < sVal.length ? sVal : null); return sVal; } - // check the node type and adjust the array accordingly + /** + * If `el` is a text node, add the node's text to `arr`. + * If `el` is an element node, add the element's `textContent or `innerText` to `arr`. + * @param {string[]} arr An array of `textContent` or `innerText` values + * @param {HTMLElement} el The element to push to the array + */ function checkNodeType(arr, el) { var theText = ''; 3 === el.nodeType ? theText = el.nodeValue : 1 === el.nodeType && (theText = el.textContent || el.innerText); (theText = cleanText(theText)) && arr.push(theText); } + /** + * Check if `el` is a type that indicates the transition to a new section of the page. + * If so, this indicates that we should not use `el` or its children for getting autofill context for the previous element. + * @param {HTMLElement} el The element to check + * @returns {boolean} Returns `true` if `el` is an HTML element from a known set and `false` otherwise + */ function isKnownTag(el) { if (el && void 0 !== el) { var tags = 'select option input form textarea button table iframe body head script'.split(' '); @@ -444,6 +510,12 @@ } } + /** + * Recursively gather all of the text values from the elements preceding `el` in the DOM + * @param {HTMLElement} el + * @param {string[]} arr An array of `textContent` or `innerText` values + * @param {number} steps The number of steps to take up the DOM tree + */ function shiftForLeftLabel(el, arr, steps) { var sib; for (steps || (steps = 0); el && el.previousSibling;) { @@ -470,37 +542,51 @@ } } - // is a dom element visible on screen? + /** + * Determine if the element is visible. + * Visible is define as not having `display: none` or `visibility: hidden`. + * @param {HTMLElement} el + * @returns {boolean} Returns `true` if the element is visible and `false` otherwise + */ function isElementVisible(el) { var theEl = el; + // Get the top level document el = (el = el.ownerDocument) ? el.defaultView : {}; - // walk the dom tree + // walk the dom tree until we reach the top for (var elStyle; theEl && theEl !== document;) { + // Calculate the style of the element elStyle = el.getComputedStyle ? el.getComputedStyle(theEl, null) : theEl.style; + // If there's no computed style at all, we're done, as we know that it's not hidden if (!elStyle) { return true; } + // If the element's computed style includes `display: none` or `visibility: hidden`, we know it's hidden if ('none' === elStyle.display || 'hidden' == elStyle.visibility) { return false; } - // walk up + // At this point, we aren't sure if the element is hidden or not, so we need to keep walking up the tree theEl = theEl.parentNode; } return theEl === document; } - // is a dom element "viewable" on screen? + /** + * Determine if the element is "viewable" on the screen. + * "Viewable" is defined as being visible in the DOM and being within the confines of the viewport. + * @param {HTMLElement} el + * @returns {boolean} Returns `true` if the element is viewable and `false` otherwise + */ function isElementViewable(el) { var theDoc = el.ownerDocument.documentElement, - rect = el.getBoundingClientRect(), - docScrollWidth = theDoc.scrollWidth, - docScrollHeight = theDoc.scrollHeight, - leftOffset = rect.left - theDoc.clientLeft, - topOffset = rect.top - theDoc.clientTop, + rect = el.getBoundingClientRect(), // getBoundingClientRect is relative to the viewport + docScrollWidth = theDoc.scrollWidth, // scrollWidth is the width of the document including any overflow + docScrollHeight = theDoc.scrollHeight, // scrollHeight is the height of the document including any overflow + leftOffset = rect.left - theDoc.clientLeft, // How far from the left of the viewport is the element, minus the left border width? + topOffset = rect.top - theDoc.clientTop, // How far from the top of the viewport is the element, minus the top border width? theRect; if (!isElementVisible(el) || !el.offsetParent || 10 > el.clientWidth || 10 > el.clientHeight) { @@ -512,30 +598,49 @@ return false; } + // If any of the rects have a left side that is further right than the document width or a right side that is + // further left than the origin (i.e. is negative), we consider the element to be not viewable for (var i = 0; i < rects.length; i++) { if (theRect = rects[i], theRect.left > docScrollWidth || 0 > theRect.right) { return false; } } + // If the element is further left than the document width, or further down than the document height, we know that it's not viewable if (0 > leftOffset || leftOffset > docScrollWidth || 0 > topOffset || topOffset > docScrollHeight) { return false; } - // walk the tree + // Our next check is going to get the center point of the element, and then use elementFromPoint to see if the element + // is actually returned from that point. If it is, we know that it's viewable. If it isn't, we know that it's not viewable. + // If the right side of the bounding rectangle is outside the viewport, the x coordinate of the center point is the window width (minus offset) divided by 2. + // If the right side of the bounding rectangle is inside the viewport, the x coordinate of the center point is the width of the bounding rectangle divided by 2. + // If the bottom of the bounding rectangle is outside the viewport, the y coordinate of the center point is the window height (minus offset) divided by 2. + // If the bottom side of the bounding rectangle is inside the viewport, the y coordinate of the center point is the height of the bounding rectangle divided by + // We then use elementFromPoint to find the element at that point. for (var pointEl = el.ownerDocument.elementFromPoint(leftOffset + (rect.right > window.innerWidth ? (window.innerWidth - leftOffset) / 2 : rect.width / 2), topOffset + (rect.bottom > window.innerHeight ? (window.innerHeight - topOffset) / 2 : rect.height / 2)); pointEl && pointEl !== el && pointEl !== document;) { - if (pointEl.tagName && 'string' === typeof pointEl.tagName && 'label' === pointEl.tagName.toLowerCase() - && el.labels && 0 < el.labels.length) { - return 0 <= Array.prototype.slice.call(el.labels).indexOf(pointEl); - } + // If the element we found is a label, and the element we're checking has labels + if (pointEl.tagName && 'string' === typeof pointEl.tagName && 'label' === pointEl.tagName.toLowerCase() + && el.labels && 0 < el.labels.length) { + // Return true if the element we found is one of the labels for the element we're checking. + // This means that the element we're looking for is considered viewable + return 0 <= Array.prototype.slice.call(el.labels).indexOf(pointEl); + } - // walk up - pointEl = pointEl.parentNode; + // Walk up the DOM tree to check the parent element + pointEl = pointEl.parentNode; } + // If the for loop exited because we found the element we're looking for, return true, as it's viewable + // If the element that we found isn't the element we're looking for, it means the element we're looking for is not viewable return pointEl === el; } + /** + * Retrieve the element from the document with the specified `opid` property + * @param {number} opId + * @returns {HTMLElement} The element with the specified `opiId`, or `null` if no such element exists + */ function getElementForOPID(opId) { var theEl; if (void 0 === opId || null === opId) { @@ -561,7 +666,12 @@ } } - // get all the form elements that we care about + /** + * Query `theDoc` for form elements that we can use for autofill, ranked by importance and limited by `limit` + * @param {Document} theDoc The Document to query + * @param {number} limit The maximum number of elements to return + * @returns An array of HTMLElements + */ function getFormElements(theDoc, limit) { // START MODIFICATION var els = []; @@ -603,7 +713,11 @@ // END MODIFICATION } - // focus the element and optionally restore its original value + /** + * Focus the element `el` and optionally restore its original value + * @param {HTMLElement} el + * @param {boolean} setVal Set the value of the element to its original value + */ function focusElement(el, setVal) { if (setVal) { var initialValue = el.value; @@ -755,7 +869,12 @@ return el ? (fillTheElement(el, op), [el]) : null; } - // do a fill by query operation + /** + * Find all elements matching `query` and fill them using the value `op` from the fill script + * @param {string} query + * @param {string} op + * @returns {HTMLElement} + */ function doFillByQuery(query, op) { var elements = selectAllFromDoc(query); return Array.prototype.map.call(Array.prototype.slice.call(elements), function (el) { @@ -764,7 +883,12 @@ }, this); } - // do a simple set value by query + /** + * Assign `valueToSet` to all elements in the DOM that match `query`. + * @param {string} query + * @param {string} valueToSet + * @returns {Array} Array of elements that were set. + */ function doSimpleSetByQuery(query, valueToSet) { var elements = selectAllFromDoc(query), arr = []; @@ -774,7 +898,11 @@ return arr; } - // focus by opid + /** + * Do a a click and focus on the element with the given `opId`. + * @param {number} opId + * @returns + */ function doFocusByOpId(opId) { var el = getElementByOpId(opId) if (el) { @@ -785,13 +913,21 @@ return null; } - // do a click by opid operation + /** + * Do a click on the element with the given `opId`. + * @param {number} opId + * @returns + */ function doClickByOpId(opId) { var el = getElementByOpId(opId); return el ? clickElement(el) ? [el] : null : null; } - // do a click by query operation + /** + * Do a `click` and `focus` on all elements that match the query. + * @param {string} query + * @returns + */ function doClickByQuery(query) { query = selectAllFromDoc(query); return Array.prototype.map.call(Array.prototype.slice.call(query), function (el) { @@ -811,7 +947,11 @@ }, styleTimeout = 200; - // fill an element + /** + * Fll an element `el` using the value `op` from the fill script + * @param {HTMLElement} el + * @param {string} op + */ function fillTheElement(el, op) { var shouldCheck; if (el && null !== op && void 0 !== op && !(el.disabled || el.a || el.readOnly)) { @@ -840,7 +980,11 @@ } } - // do all the full operations needed + /** + * Do all the fill operations needed on the element `el`. + * @param {HTMLElement} el + * @param {*} afterValSetFunc The function to perform after the operations are complete. + */ function doAllFillOperations(el, afterValSetFunc) { setValueForElement(el); afterValSetFunc(el); @@ -860,7 +1004,12 @@ document.elementForOPID = getElementByOpId; - // normalize the event based on API support + /** + * Normalize the event based on API support + * @param {HTMLElement} el + * @param {string} eventName + * @returns {Event} A normalized event + */ function normalizeEvent(el, eventName) { var ev; if ('KeyboardEvent' in window) { @@ -882,7 +1031,11 @@ return ev; } - // set value of the given element + /** + * Simulate the entry of a value into an element. + * Clicks the element, focuses it, and then fires a keydown, keypress, and keyup event. + * @param {HTMLElement} el + */ function setValueForElement(el) { var valueToSet = el.value; clickElement(el); @@ -893,7 +1046,11 @@ el.value !== valueToSet && (el.value = valueToSet); } - // set value of the given element by using events + /** + * Simulate the entry of a value into an element by using events. + * Dispatches a keydown, keypress, and keyup event, then fires the `input` and `change` events before removing focus. + * @param {HTMLElement} el + */ function setValueForElementByEvent(el) { var valueToSet = el.value, ev1 = el.ownerDocument.createEvent('HTMLEvents'), @@ -910,7 +1067,11 @@ el.value !== valueToSet && (el.value = valueToSet); } - // click on an element + /** + * Click on an element `el` + * @param {HTMLElement} el + * @returns {boolean} Returns true if the element was clicked and false if it was not able to be clicked + */ function clickElement(el) { if (!el || el && 'function' !== typeof el.click) { return false; @@ -919,7 +1080,10 @@ return true; } - // get all fields we care about + /** + * Get all the elements on the DOM that are likely to be a password field + * @returns {Array} Array of elements + */ function getAllFields() { var r = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|passe|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i'); return Array.prototype.slice.call(selectAllFromDoc("input[type='text']")).filter(function (el) { @@ -927,7 +1091,9 @@ }, this); } - // touch all the fields + /** + * Touch all the fields + */ function touchAllFields() { getAllFields().forEach(function (el) { setValueForElement(el); @@ -936,7 +1102,11 @@ }); } - // can we see the element to apply some styling? + /** + * Determine if we can apply styling to `el` to indicate that it was filled. + * @param {HTMLElement} el + * @returns {boolean} Returns true if we can see the element to apply styling. + */ function canSeeElementToStyle(el) { var currentEl; if (currentEl = animateTheFilling) { @@ -965,7 +1135,11 @@ return currentEl ? -1 !== 'email text password number tel url'.split(' ').indexOf(el.type || '') : false; } - // find the element for this operation + /** + * Find the element for the given `opid`. + * @param {number} theOpId + * @returns {HTMLElement} The element for the given `opid`, or `null` if not found. + */ function getElementByOpId(theOpId) { var theElement; if (void 0 === theOpId || null === theOpId) { @@ -993,7 +1167,11 @@ } } - // helper for doc.querySelectorAll + /** + * Helper for doc.querySelectorAll + * @param {string} theSelector + * @returns + */ function selectAllFromDoc(theSelector) { var d = document, elements = []; try { @@ -1002,7 +1180,11 @@ return elements; } - // focus an element and optionally re-set its value after focusing + /** + * Focus an element and optionally re-set its value after focusing + * @param {HTMLElement} el + * @param {boolean} setValue Re-set the value after focusing + */ function doFocusElement(el, setValue) { if (setValue) { var existingValue = el.value; diff --git a/apps/browser/src/autofill/models/autofill-field.ts b/apps/browser/src/autofill/models/autofill-field.ts index 96da54f6770..425e1dadcb7 100644 --- a/apps/browser/src/autofill/models/autofill-field.ts +++ b/apps/browser/src/autofill/models/autofill-field.ts @@ -1,26 +1,101 @@ +/** + * Represents a single field that is collected from the page source and is potentially autofilled. + */ export default class AutofillField { + /** + * The unique identifier assigned to this field during collection of the page details + */ opid: string; + /** + * Sequential number assigned to each element collected, based on its position in the DOM. + * Used to do perform proximal checks for username and password fields on the DOM. + */ elementNumber: number; + /** + * Designates whether the field is visible, based on the element's style + */ visible: boolean; + /** + * Designates whether the field is viewable on the current part of the DOM that the user can see + */ viewable: boolean; + /** + * The HTML `id` attribute of the field + */ htmlID: string; + /** + * The HTML `name` attribute of the field + */ htmlName: string; + /** + * The HTML `class` attribute of the field + */ htmlClass: string; + /** + * The concatenated `innerText` or `textContent` of all the elements that are to the "left" of the field in the DOM + */ "label-left": string; + /** + * The concatenated `innerText` or `textContent` of all the elements that are to the "right" of the field in the DOM + */ "label-right": string; + /** + * For fields in a data table, the contents of the table row immediately above the field + */ "label-top": string; + /** + * The contatenated `innerText` or `textContent` of all elements that are HTML labels for the field + */ "label-tag": string; + /** + * The `aria-label` attribute for the field + */ "label-aria": string; + /** + * The HTML `placeholder` attribute for the field + */ placeholder: string; + /** + * The HTML `type` attribute for the field + */ type: string; + /** + * The HTML `value` for the field + */ value: string; + /** + * The `disabled` status of the field + */ disabled: boolean; + /** + * The `readonly` status of the field + */ readonly: boolean; + /** + * @deprecated + * The `onePasswordFieldType` from the `dataset` on the element. + * If empty it contains the HTML `type` attribute for the field. + */ onePasswordFieldType: string; + /** + * The `opid` attribute value of the form that contains the field + */ form: string; + /** + * The `x-autocompletetype`, `autocompletetype`, or `autocomplete` attribute for the field + */ autoCompleteType: string; + /** + * For ` + + + + + + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts new file mode 100644 index 00000000000..6f98c17b9c8 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts @@ -0,0 +1,117 @@ +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { Subject, switchMap, takeUntil } from "rxjs"; + +import { ModalService } from "@bitwarden/angular/services/modal.service"; +import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { UserVerificationPromptComponent } from "@bitwarden/web-vault/app/components/user-verification-prompt.component"; + +import { SecretsManagerPortingApiService } from "../services/sm-porting-api.service"; +import { SecretsManagerPortingService } from "../services/sm-porting.service"; + +@Component({ + selector: "sm-export", + templateUrl: "./sm-export.component.html", +}) +export class SecretsManagerExportComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + + protected orgName: string; + protected orgId: string; + protected exportFormats: string[] = ["json"]; + + protected formGroup = new FormGroup({ + format: new FormControl("json", [Validators.required]), + }); + + constructor( + private route: ActivatedRoute, + private i18nService: I18nService, + private organizationService: OrganizationService, + private platformUtilsService: PlatformUtilsService, + private smPortingService: SecretsManagerPortingService, + private fileDownloadService: FileDownloadService, + private logService: LogService, + private modalService: ModalService, + private secretsManagerApiService: SecretsManagerPortingApiService + ) {} + + async ngOnInit() { + this.route.params + .pipe( + switchMap(async (params) => await this.organizationService.get(params.organizationId)), + takeUntil(this.destroy$) + ) + .subscribe((organization) => { + this.orgName = organization.name; + this.orgId = organization.id; + }); + + this.formGroup.get("format").disable(); + } + + async ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + + submit = async () => { + this.formGroup.markAllAsTouched(); + + if (this.formGroup.invalid) { + return; + } + + const userVerified = await this.verifyUser(); + if (!userVerified) { + return; + } + + await this.doExport(); + }; + + private async doExport() { + try { + const exportData = await this.secretsManagerApiService.export( + this.orgId, + this.formGroup.get("format").value + ); + + await this.downloadFile(exportData, this.formGroup.get("format").value); + this.platformUtilsService.showToast("success", null, this.i18nService.t("dataExportSuccess")); + } catch (e) { + this.logService.error(e); + } + } + + private async downloadFile(data: string, format: string) { + const fileName = await this.smPortingService.getFileName(null, format); + this.fileDownloadService.download({ + fileName: fileName, + blobData: data, + blobOptions: { type: "text/plain" }, + }); + } + + private verifyUser() { + const ref = this.modalService.open(UserVerificationPromptComponent, { + allowMultipleModals: true, + data: { + confirmDescription: "exportWarningDesc", + confirmButtonText: "exportVault", + modalTitle: "confirmVaultExport", + }, + }); + + if (ref == null) { + return; + } + + return ref.onClosedPromise(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html new file mode 100644 index 00000000000..79743d72758 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html @@ -0,0 +1,42 @@ + + +
+ + {{ "fileUpload" | i18n }} +
+ + {{ selectedFile?.name ?? ("noFileChosen" | i18n) }} +
+ + {{ "acceptedFormats" | i18n }} JSON +
+
+ {{ "or" | i18n }} +
+ + {{ "copyPasteImportContents" | i18n }} + + {{ "acceptedFormats" | i18n }} JSON + + +
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts new file mode 100644 index 00000000000..19d764658e8 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts @@ -0,0 +1,166 @@ +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { Subject, takeUntil } from "rxjs"; + +import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { DialogService } from "@bitwarden/components"; + +import { + SecretsManagerImportErrorDialogComponent, + SecretsManagerImportErrorDialogOperation, +} from "../dialog/sm-import-error-dialog.component"; +import { SecretsManagerImportError } from "../models/error/sm-import-error"; +import { SecretsManagerPortingApiService } from "../services/sm-porting-api.service"; + +@Component({ + selector: "sm-import", + templateUrl: "./sm-import.component.html", +}) +export class SecretsManagerImportComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + protected orgId: string = null; + protected selectedFile: File; + protected formGroup = new FormGroup({ + pastedContents: new FormControl(""), + }); + + constructor( + private route: ActivatedRoute, + private i18nService: I18nService, + private organizationService: OrganizationService, + private platformUtilsService: PlatformUtilsService, + protected fileDownloadService: FileDownloadService, + private logService: LogService, + private secretsManagerPortingApiService: SecretsManagerPortingApiService, + private dialogService: DialogService + ) {} + + async ngOnInit() { + this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { + this.orgId = params.organizationId; + }); + } + + async ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + + submit = async () => { + const fileElement = document.getElementById("file") as HTMLInputElement; + const importContents = await this.getImportContents( + fileElement, + this.formGroup.get("pastedContents").value.trim() + ); + + if (importContents == null) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccurred"), + this.i18nService.t("selectFile") + ); + return; + } + + try { + const error = await this.secretsManagerPortingApiService.import(this.orgId, importContents); + + if (error?.lines?.length > 0) { + this.openImportErrorDialog(error); + return; + } else if (error != null) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccurred"), + this.i18nService.t("errorReadingImportFile") + ); + return; + } + + this.platformUtilsService.showToast("success", null, this.i18nService.t("importSuccess")); + this.clearForm(); + } catch (error) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccurred"), + this.i18nService.t("errorReadingImportFile") + ); + this.logService.error(error); + } + }; + + protected async getImportContents( + fileElement: HTMLInputElement, + pastedContents: string + ): Promise { + const files = fileElement.files; + + if ( + (files == null || files.length === 0) && + (pastedContents == null || pastedContents === "") + ) { + return null; + } + + let fileContents = pastedContents; + if (files != null && files.length > 0) { + try { + const content = await this.getFileContents(files[0]); + if (content != null) { + fileContents = content; + } + } catch (e) { + this.logService.error(e); + } + } + + if (fileContents == null || fileContents === "") { + return null; + } + + return fileContents; + } + + protected setSelectedFile(event: Event) { + const fileInputEl = event.target; + const file = fileInputEl.files.length > 0 ? fileInputEl.files[0] : null; + this.selectedFile = file; + } + + private clearForm() { + (document.getElementById("file") as HTMLInputElement).value = ""; + this.selectedFile = null; + this.formGroup.reset({ + pastedContents: "", + }); + } + + private getFileContents(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsText(file, "utf-8"); + reader.onload = (evt) => { + resolve((evt.target as any).result); + }; + reader.onerror = () => { + reject(); + }; + }); + } + + private openImportErrorDialog(error: SecretsManagerImportError) { + this.dialogService.open( + SecretsManagerImportErrorDialogComponent, + { + data: { + error: error, + }, + } + ); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts new file mode 100644 index 00000000000..a2861a5ad16 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts @@ -0,0 +1,194 @@ +import { Injectable } from "@angular/core"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; + +import { SecretsManagerImportError } from "../models/error/sm-import-error"; +import { SecretsManagerImportRequest } from "../models/requests/sm-import.request"; +import { SecretsManagerImportedProjectRequest } from "../models/requests/sm-imported-project.request"; +import { SecretsManagerImportedSecretRequest } from "../models/requests/sm-imported-secret.request"; +import { SecretsManagerExportResponse } from "../models/responses/sm-export.response"; +import { + SecretsManagerExport, + SecretsManagerExportProject, + SecretsManagerExportSecret, +} from "../models/sm-export"; + +@Injectable({ + providedIn: "root", +}) +export class SecretsManagerPortingApiService { + constructor( + private apiService: ApiService, + private encryptService: EncryptService, + private cryptoService: CryptoService, + private i18nService: I18nService + ) {} + + async export(organizationId: string, exportFormat = "json"): Promise { + let response = {}; + + try { + response = await this.apiService.send( + "GET", + "/sm/" + organizationId + "/export?format=" + exportFormat, + null, + true, + true + ); + } catch (error) { + return null; + } + + return JSON.stringify( + await this.decryptExport(organizationId, new SecretsManagerExportResponse(response)), + null, + " " + ); + } + + async import(organizationId: string, fileContents: string): Promise { + let requestObject = {}; + + try { + requestObject = JSON.parse(fileContents); + const requestBody = await this.encryptImport(organizationId, requestObject); + + await this.apiService.send( + "POST", + "/sm/" + organizationId + "/import", + requestBody, + true, + true + ); + } catch (error) { + const errorResponse = new ErrorResponse(error, 400); + return this.handleServerError(errorResponse, requestObject); + } + } + + private async encryptImport( + organizationId: string, + importData: any + ): Promise { + const encryptedImport = new SecretsManagerImportRequest(); + + try { + const orgKey = await this.cryptoService.getOrgKey(organizationId); + encryptedImport.projects = []; + encryptedImport.secrets = []; + + encryptedImport.projects = await Promise.all( + importData.projects.map(async (p: any) => { + const project = new SecretsManagerImportedProjectRequest(); + project.id = p.id; + project.name = await this.encryptService.encrypt(p.name, orgKey); + return project; + }) + ); + + encryptedImport.secrets = await Promise.all( + importData.secrets.map(async (s: any) => { + const secret = new SecretsManagerImportedSecretRequest(); + + [secret.key, secret.value, secret.note] = await Promise.all([ + this.encryptService.encrypt(s.key, orgKey), + this.encryptService.encrypt(s.value, orgKey), + this.encryptService.encrypt(s.note, orgKey), + ]); + + secret.id = s.id; + secret.projectIds = s.projectIds; + + return secret; + }) + ); + } catch (error) { + return null; + } + + return encryptedImport; + } + + private async decryptExport( + organizationId: string, + exportData: SecretsManagerExportResponse + ): Promise { + const orgKey = await this.cryptoService.getOrgKey(organizationId); + const decryptedExport = new SecretsManagerExport(); + decryptedExport.projects = []; + decryptedExport.secrets = []; + + decryptedExport.projects = await Promise.all( + exportData.projects.map(async (p) => { + const project = new SecretsManagerExportProject(); + project.id = p.id; + project.name = await this.encryptService.decryptToUtf8(new EncString(p.name), orgKey); + return project; + }) + ); + + decryptedExport.secrets = await Promise.all( + exportData.secrets.map(async (s) => { + const secret = new SecretsManagerExportSecret(); + + [secret.key, secret.value, secret.note] = await Promise.all([ + this.encryptService.decryptToUtf8(new EncString(s.key), orgKey), + this.encryptService.decryptToUtf8(new EncString(s.value), orgKey), + this.encryptService.decryptToUtf8(new EncString(s.note), orgKey), + ]); + + secret.id = s.id; + secret.projectIds = s.projectIds; + + return secret; + }) + ); + + return decryptedExport; + } + + private handleServerError( + errorResponse: ErrorResponse, + importResult: any + ): SecretsManagerImportError { + if (errorResponse.validationErrors == null) { + return new SecretsManagerImportError(errorResponse.message); + } + + const result = new SecretsManagerImportError(); + result.lines = []; + + Object.entries(errorResponse.validationErrors).forEach(([key, value], index) => { + let item; + let itemType; + const id = Number(key.match(/[0-9]+/)[0]); + + switch (key.match(/^\w+/)[0]) { + case "Projects": + item = importResult.projects[id]; + itemType = "Project"; + break; + case "Secrets": + item = importResult.secrets[id]; + itemType = "Secret"; + break; + default: + return; + } + + result.lines.push({ + id: id + 1, + type: itemType == "Project" ? "Project" : "Secret", + key: item.key, + errorMessage: value.length > 0 ? value[0] : "", + }); + }); + + return result; + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts new file mode 100644 index 00000000000..eb92a4a58be --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts @@ -0,0 +1,18 @@ +import { formatDate } from "@angular/common"; +import { Injectable } from "@angular/core"; +import { firstValueFrom } from "rxjs"; + +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; + +@Injectable({ + providedIn: "root", +}) +export class SecretsManagerPortingService { + constructor(private i18nService: I18nService) {} + + async getFileName(prefix: string = null, extension = "json"): Promise { + const locale = await firstValueFrom(this.i18nService.locale$); + const dateString = formatDate(new Date(), "yyyyMMddHHmmss", locale); + return "bitwarden" + (prefix ? "_" + prefix : "") + "_export_" + dateString + "." + extension; + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts new file mode 100644 index 00000000000..6cd6249d335 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; + +import { SecretsManagerExportComponent } from "./porting/sm-export.component"; +import { SecretsManagerImportComponent } from "./porting/sm-import.component"; + +const routes: Routes = [ + { + path: "import", + component: SecretsManagerImportComponent, + data: { + titleId: "importData", + }, + }, + { + path: "export", + component: SecretsManagerExportComponent, + data: { + titleId: "exportData", + }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class SettingsRoutingModule {} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings.module.ts new file mode 100644 index 00000000000..300a17caa00 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from "@angular/core"; + +import { SecretsManagerSharedModule } from "../shared/sm-shared.module"; + +import { SecretsManagerImportErrorDialogComponent } from "./dialog/sm-import-error-dialog.component"; +import { SecretsManagerExportComponent } from "./porting/sm-export.component"; +import { SecretsManagerImportComponent } from "./porting/sm-import.component"; +import { SecretsManagerPortingApiService } from "./services/sm-porting-api.service"; +import { SecretsManagerPortingService } from "./services/sm-porting.service"; +import { SettingsRoutingModule } from "./settings-routing.module"; + +@NgModule({ + imports: [SecretsManagerSharedModule, SettingsRoutingModule], + declarations: [ + SecretsManagerImportComponent, + SecretsManagerExportComponent, + SecretsManagerImportErrorDialogComponent, + ], + providers: [SecretsManagerPortingService, SecretsManagerPortingApiService], +}) +export class SettingsModule {} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts index 19cfd97f337..34605e1114a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts @@ -11,6 +11,7 @@ import { OverviewModule } from "./overview/overview.module"; import { ProjectsModule } from "./projects/projects.module"; import { SecretsModule } from "./secrets/secrets.module"; import { ServiceAccountsModule } from "./service-accounts/service-accounts.module"; +import { SettingsModule } from "./settings/settings.module"; import { SMGuard } from "./sm.guard"; const routes: Routes = [ @@ -48,6 +49,10 @@ const routes: Routes = [ titleId: "serviceAccounts", }, }, + { + path: "settings", + loadChildren: () => SettingsModule, + }, { path: "", loadChildren: () => OverviewModule, diff --git a/libs/components/src/form-field/form-field-control.ts b/libs/components/src/form-field/form-field-control.ts index 52f3018f796..e510b4570f8 100644 --- a/libs/components/src/form-field/form-field-control.ts +++ b/libs/components/src/form-field/form-field-control.ts @@ -5,7 +5,8 @@ export type InputTypes = | "datetime-local" | "email" | "checkbox" - | "search"; + | "search" + | "file"; export abstract class BitFormFieldControl { ariaDescribedBy: string; From de9d4956a2ac7184af462495948855ad5601e259 Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Mon, 13 Feb 2023 14:19:23 -0500 Subject: [PATCH 008/232] Enabled KDF iterations warning (#4714) --- apps/web/src/vault/individual-vault/vault.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/web/src/vault/individual-vault/vault.component.ts b/apps/web/src/vault/individual-vault/vault.component.ts index 50ec3c48bef..c8f17f1f5f4 100644 --- a/apps/web/src/vault/individual-vault/vault.component.ts +++ b/apps/web/src/vault/individual-vault/vault.component.ts @@ -95,8 +95,7 @@ export class VaultComponent implements OnInit, OnDestroy { async ngOnInit() { this.showVerifyEmail = !(await this.tokenService.getEmailVerified()); this.showBrowserOutdated = window.navigator.userAgent.indexOf("MSIE") !== -1; - //disable warning for february release -> add await this.isLowKdfIteration(); when ready - this.showLowKdf = false; + this.showLowKdf = await this.isLowKdfIteration(); this.trashCleanupWarning = this.i18nService.t( this.platformUtilsService.isSelfHost() ? "trashCleanupWarningSelfHosted" From 4438ab9e3aa4cc030dcd4cda30fc6a26a6905376 Mon Sep 17 00:00:00 2001 From: mimartin12 <77340197+mimartin12@users.noreply.github.com> Date: Mon, 13 Feb 2023 15:49:03 -0700 Subject: [PATCH 009/232] [Desktop/Browser] - Renew signing certificates (#4739) --- .github/secrets/appstore-app-cert.p12.gpg | Bin 3378 -> 3352 bytes .../secrets/appstore-installer-cert.p12.gpg | Bin 3365 -> 3343 bytes .github/secrets/bitwarden-desktop-key.p12.gpg | Bin 3375 -> 3350 bytes ...rden_desktop_appstore.provisionprofile.gpg | Bin 7712 -> 7880 bytes .github/secrets/macdev-cert.p12.gpg | Bin 3271 -> 3278 bytes apps/browser/gulpfile.js | 4 ++-- 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/secrets/appstore-app-cert.p12.gpg b/.github/secrets/appstore-app-cert.p12.gpg index ef81792f3d3bce77a2610dbbad74c1b3847b02c6..284add80d5078911a8b6841123ea1ad7801a55a1 100644 GIT binary patch literal 3352 zcmV+z4d?QV4Fm}T0>3Q$cIC99UG&oG0rnw;sgKQ@SO^ioPq`W*U6Ao@YBx9b;0y6j z&@N6U(BM%Ds*NJ#Yu)o#{|ovqi7(Nlj>JBYjpygpTe+u>;1txAE<~||%O(EyQV*A? ziQUhsoohMs6&Pepe}V>1^@JivP;MyUqvG);J7AaPje{$Dr9Q3qaP2Wzw!&I4qS(@- zZtf~kK97vQ?@ml|Q${6)D%pSl{xR7*DIsmY&7+#BR0;f4^z8ugpgz z3_n{yM?sb`syd&8oZ6~ABy%y3!*?IuF0>-LRa1DLXWf!Cn`#fh_<;nMTP(h{x#Pw* zk}bEPsrOS3SnqHh{e^L%P5xr3fymY#EUOYS9wPOEFZkR))U;-Q7T77IuU-W-W=)k= z8FYOdm^mlN5#s9r;~5fjtO2<}k~aaRK35;u za&Cr6FL;!E?N%)MNl9d!Z@g}`l^TGPMxuIBEdl|+UWY&6Uph%$bbeVwI77eAXc9D< zS2EwyH1ox$Is?liaR1E+*{Ldte7Y(vYaif^E4yXhA{8J@*c37=$Vi)9$@nI?ckiQ< z|1o*dy>!nMVopg0fAZmpdg_Lf_p^@g`k3+o7rLKr7MZ)dn){`60UrUz`b|e z?+P_%Dzw-Lm+5pVY?1X4znKfsP(*7<4yPNuQ*H52{faFQt=?td(%p-C1)je_rFE*4 zmA)gTqs7e$pI%Qm%J4&L%?km*UPF-Cd*Zez-i6TZ>Elz(%Rj*3^8`6?qL3u6ABP4O zoIbL%qbJ92VpWtFt@8T7a#~1F063k5DXGWqwSL-jK9U8Y;tsu(AXP<+T<%ML?pkV^ zRw-=x2^jkR)*G)i-LfGo0oRfM=!x_|f3NYeK&$ufvJfVN2~8cCcaJLgo^mMqo**cS zFmMf51iR?-d4o}{CJM>k4r_S_m8$mFt2n={YZz2b>QC_IW!M9Ux!^ zPyRZ0yb>{N&i{)E=AktJxh)qxmR5ZL=A}m9!TXwY>^X27>q;?q)S|8nz{d6}>7wk` zQNh9oz0`=^12}R5T`PEc`4Z*9F4j>qkbfKXc=`VzDIgM-0SgL0mf0rUD!3m}qlr-P z251kWy272PYaOddZ=!%c@s+k%A^0|}ET!(mX-+P1{&CB9e&*JjB6g9zXyG-0t(%6h z);%SxH_o?B>MGZZq7ymM2m-4_X}cyk^RGBdjjLVl)D5rJ0FZ-bo=#Jq*A^i zp(voUa~RB4TMDAfYZ<#Sfl@=gzQUrR&mu}@o>Li4cFSR4v6CAYMoS%g2+%qrt2tfp z&*SoYEy*0K^DZavB%u#IDKjC}|4v%Zv-Z0r3}X?b?lB{)*hsOrT@~&prkbeaq)>k| zzBAVO3FWIGwMWvGTJ#PZ?s3VRRp(0PSa=tw1iy5z$^Fq z^G@v=@8kRULzEn4@ZDm8(_nMG0-zVdirer<&Bds#hLGnXbfbYXiD~GVp1hE%T;MfM zv$HSd3Y;iforsZFG3X0iBmdQd&S+e@v7P-MdcV-Nyt4{l^M)1V=Ar#A=sCSZIt=1( z0M3w#y|EySeBK=xMxjS4atnVt zj{UIQW;g9WAJm`oim;lQ@YLks8MbJ>LRm#@xzFA62dF|nWbL-!4}PwBNcu8l!_dCu z&u4rsmA+{K@f=B@bDWMc{dG^64<2##pIHwVdzV3M8PA(+IapTMa0k26X_*W%h^Y7l z_3w>6Irxo!k?DgbKyo^<0BaRCjTrt%yN?rMRSnoA5p#W9o(p=UKOP?I*=y7J3;R4# zbgH4BeSuX7w1Zu~d|be5=lv>vgGvHE;l_oXo~1gzRrU2+G82HIKZCzQ@+k7JXlz5k zZpnstR&B=s8mCIwypa`c=rZh9U#=e&a*6o{qbg^NZfHRAr@ssFVQkTlrq8nCKiPUA zcnBZ>{Qc?DJ?3f(Skmk5^^7!h*O@9k+)p^0XK;E7{PWG2@a;wEa~lS^6v3a3X~ z?(IALwNUy`SDQKwS{BK4#I9iVY@^=102VD2pR zflj2Y`jT9!&s~*2e`PTZuwgaJ9%KY4#Jgg2lh1Yd7!D%y_sDakHp(Eycj zFOBUowy0ZPM{*-%z9XsUZ7Ap+R1s)*`BIXJX}TfY(6_Y_93D~-mx2`GV>IFPay2oYCqS6jiPm~@5`&^<))BN9gYx0-dT8VTd#aehU#)g#FAaN5B)_mc%z zzD5sidJ7d}yY0YE-Pct0sSK?N5Z}Trc^FNh^oInd-^RyQzQE$Fx+XslSSAg+0>(r) z9uSA2*umf9NYWv#1F27Oi5LH0@n+jO%|OAO?nbo);;Ci`o%NjQ@a{zo!`aX~ z2WC;!pDU23vav!iKIFI(7p&&sNn5&GDr0+$tzushpndS4xxD$u)mWaLe8@B?LI9l6emAWwZ)lt)cpl`Mn70Cu z*^#Q10yb46>X^e^T7^+XTdl{OD}tf;UkXJhxg+$qS!ZaTIP&flm06RH1!;IUmZcIN z86aqCDP~=A==33d25$&XEje$jydsIuFO>JN>?T|Oza=X&JdA!*-;_&o6O9m-e;rL)*Mu!t3RUqJEfJ^J$gQYp7%m8vwsi7 zcK)yWUw2n5(_VM5EOJ(%GH(Az6}q0#%p1%Yz`Kx;YL?U(vnBsh7lFityy#iH&(4=?ouyaX4KVia`|ih=t&}H zkGHu~d|jxqQ9TWNzwLaAAY0W70sLe-oWR=WR0zOB6py%^NrSf_U}FzX$ueCTIDmOE zMNDl2giHm6@SFl@rc47n{@4NuqBBdso48tIsN29H*N~}p6BYFFatnDP+tUkyLkSd% zRo#GLCb>I<$W-Hm%5~zo_s@6Xb41jKE-8c>!$QOa$9QCj33o0EQMVs~pVpz@A>-pH zCB3Rg1w~>7a@7tb$)qF#XHXoy%ERDvIy#g15o1@udQ0uX%KWy5w|3M>MLf&X*CgVO#Y4UDbrsxq{OHOJVhkHK~+!g i9%4<$*?S2fizbDM=+h&`tuSnacP-t0+Tnz+cjAi&n0>{tShW zW*U{64+JF)Ftn&-v3x1~{KBSj7mgsG75i6k1*vuzZL*9qHe%OR1_uZ#4xv_Jkxrdr zGMoHJ(h-=XNONJ9 zf|8|6ip%f$uoB*!XiRR((ah_NHlwV`1))1TQ)_a?4SzUsb#e}V*3Sj|hF`L*f+R!$ zyD;xyPARik!oo3nkKRk#hUXH&5+vKsjoozEBRgdmg|;0+`|-Y$b2aomw)!^HKB9NL z#a}Z~6}rNAUX+Op;4^dFgbA>3WvjXQKJw2g2668S5Re&?^@u-us6n`hs0$)UGxQ@H zoJZOs!B~%21nxv9ch}aS=P%A8@k1hb73XhvY~V(Xh?(c#p$`%(pbzE)hFDGbb5Ss5 z73ba+$_KuL9g-npV;HlMJNTYU6xFq^ZCz{))0L~`8Y#UTM5gDU-4XWbl)0k~%XHU8-4y*;e zCM-LkpC8~|qQdXY7X}Fbn?dA>0S*V&Ykdi-rXhdE*?YhkbsGOb-Qb}EjvC`WFTR9x zK3(}}0ayc#z0Z64ns&Ely~j)AE>GLwW%JrI{C)o;@H{U#U3rs5*{(+o zX3t=D?LCaDU~^R^C78olOGk!ZMGaLA%QgW$1K+J-CYG?1?B|c;NL|Z^(tZ%iLyrfj z7n#~xY88NPHq390XUF<>jgX>*~;353S=0cCL^Rx2%XQ zA3UPl+)7brKhA5X<`X~9yklNWPKy4}ZLSTi^3sLtEsjjxZOJoMQr6T`-q$c7s=y>D zSaTkCrJ=|0Nt$N%D@~#5R;0dxe1C23_W zn0F@WBCQ;T=%P2<0AfD`{W|%r2>#)kyYZG1ClxqN`005Tym6(;zHfE-o2Cf-S3(ao z8|&2)r8EG4rRoQgviZXNzR>2|uBsv*lGvhaR#nWNb>aYSU7tVT6I0B}yv`N$Mze3r zj^vD}H|7LZewX_K#e1|hyzKW%)-MQkw z^%+|7f7(c`MCiM5au*!STIo=KHu>;;+P**vqnwH+!kQXwBjj@hu|uMW5@TP&`bh1Z4dPN06;`mudlpo&%MJB@6sJq zZAXv48P^12Kubd7!Pf#K4@|8A z@A9byF>ro%a@f$B95|S@B3)?P1MJMSf8Z?HVA=FSrJIQ(P|P}4V5peAG}YDDEqCWK_NImsqd2Mm*XMI}vxS$D93rpK z;L+%c2;$QXlOv5cp6+QfTM)~~$KpG3MjmjcCReF5i>P8r2(hy3OiDYR7yFobtufG4%w11hDdp?0BPhIgC)`th} z+B-T+t%yNs?46*a!iHRX8j+1!&~5l>Up)LeUI2L0OTfn9 z?5DA^wD^K=8bry^!ygM3;>tO4%K^mrnOuGkvO$a-qXS8Ei)P)C^(A_e>fEgwEQLx+ z(EvL=$Zc>NG-~zxp!&vCJR((P1&e8wmB}JO`@G#d$jTjnFUuH#H~EG5Fb>bl%zE5t z2s?WR)}>R$=e4|q?$isG(1$Mzq~2$wl|J=>r3`(fxA#FIg%uAJ*x?mHtbvfu*vlu` z<&)w#w{;uXvFnM0*aIq#^rf}OHEpvx%=E7f=2k@!wn3k#Ff1sl5+KszpKDY2^Rfr8 z;$Z=LXm?ama~rT8q&oXpOknI<9TY0t(K_Fbj&3sBR<3*ZZ?QE{#=mJ>Y%NXXWE2yV z#isWmd;C)LYDW8U82Lpowgfd zDiXyafJ?}i2r+FF4gX$%e^+o^-ihr&OwsIKjs8Hjm3_9}kjZxQ%k@Ci0R60x^a7w= zcHD0CGM<=x1pmGh{1#+Fi1`*wl&1x5TM(96BT5dZ6q?xwP9$O85Y?<1EsejH1UL5uB{ zZtguU;r+zxLcy8~aw@W=XaZ}h2+ed*y}lNe_;)sbOWLRjR+ro~cI9zpHsKwb+}q0H ztfI<8KF}2>svm4LMM>nNyS16CBnM<}8+4`&(EYub6-yp80uj%c*8lSg)M4qy4K|Us zB}*$@WqI3Appt-yq#`Sgz&y?=6LW|HkK8e*Vwl0l2g@9)Q0oP#o`eR9U?pX4>XwE? zomBVV>rSg56XYC?c|>bij1Wx-$#oxlfoL*?L*y4$SHEH@Pvi}D%CBlM0sRXbJIExu zv~Zx1_;&WCikX9lBCSZdv#lFCv=wJLzxUDAeQc4oHnxk!2jrLG7MkMg1K2a}{&-@$7qf!02HK0Ox!S_a>NC(ae~BSry+#|!by zTHE@m^%%_~jpX=cA4_u1GPEf|bdt7(3gFA$Cezx$*byawjz(^ ziRr$i@T_QNB1U@KEStMPmI0bcL8@QW=HXr-5%iCZ>p5LSlJeQ@>CbJ(gG~8&_OsD? zQwBj^Mvq5K<7y-AsjTyeQ(#T~<$5IYrs8ERbG^>;cx}>r*2!SeMkDdy$e#hqe+RkWDne59%B61h I*rQsLKoatq*#H0l diff --git a/.github/secrets/appstore-installer-cert.p12.gpg b/.github/secrets/appstore-installer-cert.p12.gpg index 09652a3a1ba4bcf7ee1af5e03965a0a0edccf571..cd1f58eca16e7e218c3b91e4b38f3d57c65fdff3 100644 GIT binary patch literal 3343 zcmV+q4e;`e4Fm}T0!dL|_|hKAVf51K0YP-k77`$}3CMk77V#u!K5tr-u;7bB1>c0% zgk^=(iEPd3o5V9N8%UoXc7VTAGEDW$4R6ssNy1BnmdPW8wr85v4QaES;rU*wH%zGj zdMYJO!Hwv80qWw6JfFsmJ0RjH{tGdMrnZlKM=si}2Tcrk1B=Mr^Io|BI%rt5d@s*` z87Kan@_t*a(aJZ5)U`x4rqgPuKeU9d;oMq1CmQUmRsmztdS%;8Z_1)1?;8a~A=H$KbwU?EaDkyUP6w`U0C zBm*wvu5q)N3r{Q$C^4ZoNs?tLyx8JR3GqR6`Hq%F*T&L%Lv1Z;<9-ORL5?txhlE*T z_+%NUGyHS34aSe!;AQnp&z@>>mA^*+P?)MDolLO&0k1x=5eN!S89Fr~>8-~^qp28b@ ztJx~)0IF@VuVN~Iv)f(DbrBsgOI_1TY#rzdI+%_&J04e7q z%5#I&zR1AdBO3VJ@x$GtElu-hi>Wd*Ggn)!X^Si3fVmpx!}x~gGZ5gsEtWt0CHWHC z@AUHI3?0SWP-xD021T=Bz+mbyzu7T@-o8s5w*cV(o83+e+`kROfORh5*#6L=!dXujS)a8*n2umWfH#3Nm9WLzO^#ZS=BX z7^0O<5;fh*BcWC%DXD1Z=yhP71NCtu?4+1LVE^PZ$2K%~}hJ})j zNg)2Vm8eRSJgn&_q7*^>N?vE_%i^$vCks^5Mrlr;TWns;dfSs9Usy=rmq{iX#1wKXusDy)qVf|NgqiD;HUV{MAJ_=qfm?jb z7&~NYO*CC;c`dp(Caw^b$N{uQv-RLBC#=pmPaI@g(?z3TrfZ_`cT-hi^lS=63bw_Q zWtvph>tsEh@Y4x{FkUj3lrzmkqH$Ez8uV~{Y)M4 zHLQ%N<=dY0FwX5+oAa0Ku90Q9bnB;Ji@YMs_DIDbAnvpKH-4K;XMHVo(~m#sj8oGP z(VFqKjiEJa>d?i2*}6>5Q{YoX$e^rxgAv$5n*jGgY$afH`Yx_Ae$ zDGQGC_ReMXdvim~3ur^h^`k|3B?6rF|EHLbQ!2KU@PDlxZv%Jka!3UtqDhF%_Y;o6%Ke=8thKnmlIxAw}CmG&h#lhACRq2(v#-j|i@ z*d|-8r`1rO(b2`K5VZ{sHKD!#t|7pPJTM9Mj!TSMz*bpWeps(iBBr~kDJaq5<^DfDKhM9y7(%iS94 z>8BN;Y{)Xgn49;v=rV4XX+ioCS1o%73Bs!CLcOqImO!Om~;uRee>xi{ZqozDUM5Q23* zW!o~7b^9WSIE)huZUQ?@0rka|Xg9Z~xq9=)r7%BLuviAN*}=m2F9xm$BD;4&ii<9C zrEAWFosUlQ0VK3sIbzqJRWS~LH_Ojj`poo+_FLeRKhg}Lk(-?cF1i0MeDUnIdL+ zxy_;a>xj)GT+J&lq*{X~6rfo5Ji|5$Ylcvrk@T**^7w7~Jjj0kS3<}{YD}p=_6z93 zrmtv;IMvO&4d-+E5c~=9wGahQQ-^mOpFgkR5{}pn+Z}O`2gS#|XM#IC#>*_fzsWN%*9#Q|)bB~wm?sK@4=DBb$d^eQ4z6`u) za_=pMkY;zZg0Qb+I29MZxYB4w*?O|v$!Vo3)Mw)S+m(DL4)@!_cY=1cQ~Tg?VTKpQ zzwdnNev|$RrK6=Z%00&uzh61b%01mCBf$*)cR1u;B_D0A(H?GtEN(hPgjj@@LWZP! zOOB)9jK%q`>m1n-w)+2pnI5;>FWs zO})qk86*$dA?)H~ayEyYflC|_z@k)F=+ihV(NfctM zoKlo~Iq*=gZ2;r;1&vFuEo4T`#)V1Iz^B*-_XttSaIcAhEHvzA)KHr=(qKS2`r2F6n z%#U^x*z~Nh9Ba?f7KAr0$Rm>S_Av$e<9?88Ou6C&!6pGT8W+^^8F)2=+v*N@pqB$= zT*F6j8l7tt$YEW+e)fXypU+k-eGkzpNcAyz*}CkooF?F9+nKL`8qyY*eh$yk^d-r+ z2aEtYo0~YpkZHR0GWl@q-w>%nzDf;IpuAQXglR(nU}mEfMBkGb(@qA;k)D+1s9{0E zq>=tRFT+etuOK(dJM^WR?wlnJZJt$96#cezIEVv8L$~2KaUU7DJmjQCY^U6iy3Y@5 zZwzeb{Q+?uWeu+7-Xo3(2PrbY8m8rkdGpT)$-MX*zI~&h)@4-#7^Z zk3=dC$}}z}{Z`^+a93AoP$C3marC%DR_(<`cuyudSt$}ZPKBPaf=OnbAnAV$Tfzp& zX(ALO8#Ws1bG!AXEv$A4i~W2X*SJ#RXXU8ymO{}@~$HZg{& zm(GxBGjyD7Kn|`gkso}Xx2Wr%MnG4OoHHyyDY2WroG0MzM(p+7|9`Qx08| zOBKmGr`2=W6TN5vee55Y{b3Tzsmqv{26tt*CLUmKB=vzVxy8-(Cf1|5yy?aN{xz= zc}&NxxVc`~bdeD)d0-I=!32J%p7iiQi~Qy}{7GumHHw#TZhSYiO=7Pb#Cy}vZ)lA& zVg;y>pP3A<+LCcat8XM7uD_~BkSPixG)u>TAE=Z+;+@>lc|v9eJ-x)L2aqIv_o-4w z{ZZhAGWRCYx=qwYkC~jdsdF;lfrz4%O!k96JREo4ISHi!C&r1Pt?0G`495Epux+A3 z;iI3eU1|)Z*#XN!Qn^5Vmw6Uko5ay9# zvI+r}TWXI1zq%>!o;PmZUEC)as}F>DMR-{0O^x3#1Y#E7b%tqZ;f}cz;JF*zH}-g7 z-uu+AkCTYC6Q*QjqxGDbN5=i-_#sBLu}rmAbX61pyOiRw_B9_13eeoQrjW>`^7{kI z_87{~(@ZN_Dp`%wshvdYnEtcMUuEgoT|hf*tsKB=O;jSv@NjtlW+JGbf#fgUMU7V1 zu|oyGA^lL+ox5#%rTZ@st6i>uIV{X;Z{o9|UPl{Pki#*lQim%5#jO&|;Ukh_%YZ0q&vqKmhl)jH=U~Vst;J5u`tt>q!#7d3@j4>6oUkNOpxhNeYFq*4I@=rY5}|KGo45Txxt ze?~ZV_){*Uq@-{_YMB5X`Kz_8EBSIMmM5~05!7`228FYjxWsbAcGk-lrDS4S;_rB9F{gy2qo60z58*=2PEX?lb zmN*N!tisU@$up3cBA&tdiZT*JOGh#VUeFD6_hb0$!Emt@5LxmxK?$oA#d((8B#qGed zPW6qd<2+9|-JyP^6^^Zvt#`TWYU5n5*y)7_Pc2Y;803NDJ=Nkw4P)XC59xa zm9)lFtFHZ>?y7?P-4_k!Og(Rx9aP4#P#Q#)zCJE3QDGvAkFT$l09!H4K}(VzZ@7(e z-DEXfr-4{sL@=ToJE0Dt9%e(U?WG3dQ*j2evbC9fm+angwgvzwCTr*VQxI9uE^L6W1|ayuw)n_LRIz6osl9 zgyj(2H=ZjDO^}cPacP(!CzI+H;&e_B-DEcXYx+*Bqga5x@;s7;lYt#c&c*Frdt$*3b3HBG8kTlHt%nFPow0~Aj3*~~j-D%%Ew z004K9@OSN_j#FgY3^i1T=8d}q#$z1)hYnNlNZr;DB=Sm0g)q)IZ-Y(jNUThu zKmS}&nb2m9!7g{4(@eN9zi_cwgDi4_{)$pA+NDq=5~)O615myXCG^U236PLDZqmvQ z8a=esLXE#)f`mc){{Cx`!hySD1KFj^yQj_j3$z!SkUa98X@`?i|LXu|I*x7IRmZ(c;9z(yy*$q>17YWb~j=RqLn0b+twY-GbYrL_H5^ z#-)lHLgy5F*+e*DDM*p;p;KIsPtc;))kjZoYV0c-mjFiIneM1rwsaQLN7ln1mcK%Rt|7or6$rj8>A`e?`>Rn1~KLV;= zI95A8Wz8$`ZS_i(nXa8mia^BKsM)V> z-%T+3&2&`!oTxKNe^V@qwhrI&#Y*9M^3S3#4q4xg&EheZe%yIAQ|!fc50k6b9tpc}r-_75@e-{El<8~Au-=wKdVMwLF$J^d zsfw`0lNm`f%EcNO2$!#jvWiUTREb@{b)QrD1Jten(8r_Sd{#p_+?BiXq~*>7T!w)7 zMiR|)oIHsDKXGs_DMfMS`tUso&Go@Cj~a9Sj{YhZMf_2x?!pHRIP#9J(*$hJ2A>0N zihbMt{=Z2w#HUoD9X?3C#}qbsd>Ap#USQ3G(L;V(ZnjQPHeN(Q!`Oh? z*aKTNqM%=OUn)|QFPPE(STZbP!<=*x_5E0W7XKRjQ4ya}cfE)uhjJRb3N<~f%((fI z>4XG}T#$^Zo%r&u%O3C@mrnfDO2|fE*-v3gLSHY=$`Aq?ARMJ zjoGfrz^uZ6k$0Pnq+Vv{uFGd}29Ggded3O`94 z<+K#6T=j(!P*lhVr?2K{#Xis0&C=#)%f8OhwY7@AH&0%38z&oDmz!A-307P8{R;BxQGC=?W;7$XtS zHkxParFA)FA=Q(~db4=aJS`CFTxslbw%OZ~t3HZVMS+hPd@v$O#_lhsmCZpwsX~1c zaLVXyY}i#PvtJ;abYNX0bG(3}lOqH;E|HNkj8bR4Yzmn-PpS0RWXes`sV|0xB<1&W vfo+%0I$2kVTGq#Iji0)xg)ZrhhWbC&Y81Z?P3Ju-Iu3SDV0+5SHVq_{5N@!@5!BMy)<_++FdWHpIRGY+hG_1 z@$aOatN6i2f~$%I@)nCIDIVA{^aBIFm3MWXF!M?d4G=y^5TnZ%WXFk^T}5I|Tn1?$ zVIq;Z!UH*}k|e%TlRwb~FjdJp?Qun=zpGPoJpQET60K449uG}RDtdxA1gHY_Ztoq+kK@6%2<*o7VNYpot-CNk_zL0t zcSF2B;N_XMUQirfWi?{V<0|rJvmg0zihs1Pr>v*M_e|ET+g`3k8nIv;dj21cNxI$X zd6<(F)^U(hMi{0Ze5Vkt)Q1?}p3;=P4Kv0;J^hsbwODPp%+%q?*E?(FZjg$xE6%lv zT)MNw&#YwW!yKxl+MR0#bJSzZhF#`}P$aA%+A)d$=2E+yt5m zcjmQiA*sVJ;Ird=A=MAiwnwZuM?q`kAb6=8JeFIjri%zM;g<(5Zs8=)UM&uy`KVjL zy&p6_g=P+m9Wz@$!D|gi@0mAy8BjrF0Fx&sJ$k}kQTQ_rvz>wb9A;O+z&DsYat7i$ zRUEec_k+khOyw&d-Dvp7>|C7yvZ`-P`Z6a*L}Ow$p@EG{>&Y3@P%-vis{M?dj?7J zNKC&#!(_3zk|mM5Sss3mrYI)KM9IMz%Jw%QZCLOb5y`GKhsIy}*0N=yC;i+Y>xt^8 zg5PPMurS3x5n3Qq4^T@H0niaacG;`MADUzsMYkxk$305tW?>AS%KV@}%2-;l_Kb4} zegBSLyy6dn;m09i=%>$Jj1k@(|Ea75x|%$|(jPl@DQStRi1P0+kJk==VN9@gLjMbe zgXtD$qmZX2`$8F`!%+chz~r>X&bsfh{?VV>pxAv8p@CY+HfUn0zK~{4z1~p0+bC|$>dRC9 ze+hcusII9w>e0Qw4(c$cK1b`R{xXTuo@JbpyK%H=S4K-BU7eJRxNzg@=TB^Kkew@G(6nfbO@~1ppjmz{ z{B`r+Lpq`~{+oKw)uhPbE-keX6`qxbEA0owTg{q07hR9`O*UsMaS~dY{5YubB7l!e z9)u2S2d7Y4(iA;)Z*YRpps2Qq$ydQ1g8|Y}w&Js;4vw`KN!a#OBLINGlCqQ@@g1*!U_{t% zPVxg*;HxC}T~S$;PJU2n*y-iYYFsbdrYEd}58PRIaAD|!9Z5*`(0X(5S_j_&V-Afk ziB(3F6Ws`d7vCy)$5vG0apICQH)|?3yAr4y(19#;<4jFT1>yL=*RlXb`2(4B2kl$wv#sPHG zaUZ#9z8?-*Ib>;~)BvcH=2^Bm03&8XkQPm=wbnF($HM&Qa`*A;$2Rj#)LIu?fLqG# ze#2y*BP%S1)aIp;CB$uxvM{`j`Rpc1z_2$itXMPDqdmVMrvlXySTY1Fd?i?cKrMBP zB#7s-^}SGjD%R)sm0y+|+{d-U6pI_A+#8Hjs9Kl1OV%HylC@M={9JcyEb3VBw}#c2GAfS~)Qcg?ru`y)0g z%$Or!p)ADa1!Io&~;F>Oz5bm@h2Pu)D7x(P2tyxnsk&;@~90#J~W6&6c4u~R54tA8TXA@ zI-#;KLfcz(QA?0RQ141mLi9#!Xa(-sQFUrTWY|r==$!pUO1n$8CI7C1ScnlvSYrGk z9|PT9oYv$RU$T#D@C4v%)Ao11!GD*u%vQ;xeue0oPf@kZ(4wUCHJAt(fCA$#EWZ;L z=v-kbI)Y<1G`WZ#&$>3CB>14gzz!ea zD5?Q$1b@Og-T6G3tTkH4gVW`%H@pP~7pDm(!WjU+F^s$Ipew!?0nXWol|2+n-?ddO9oQ5E2Pu3t#i>InCHoBQA= zNtE|zR21y?f}5iNeMFf51ZnXv@kVQ2UQdX7<7bkHV#o9b%`BZ&pM^A%Z6rM19XD5O(Q488+t`S%RKz?7fW8 zeqpN`p|;S<+Bi^k42=emek0n+A|_&!z8YpHF~c_QI{n?{nuyQEj+IENn zK){ys*>YZIHHKJv(R1XbJ_LLnE0gQQf$LmM)ruAJ{h=l_7zK|SS=F35T-S>H!Zb{|q#FB8g_hP=F~8Mof>D5O!_vnw(o$iw#KfeN zE{>8}j)o82Lcj%NAdp^n_{Wjipx%;Q=^aGqkU-k>_%H7Po3>Iil1{A|I>Zi!w8n&&8(L!#`J-rouJ zVKo2CH8g{<7rV>qw_-_t?GYL^+_6;xXWZ#(w;;Ew=Z3HdV4E$&+_W8{zMQ&82H70B z))eAkBYFcpW3Dn$-fD!B1LyQE%mv}G2FYm)?3lxsIc762v@g0}=(DU{bB*Yo_S?Oj zJjG$&ts1N5>oa4bTIl8GUFtr6Hj5f$h91Y<^h>}&Wh#NR&R7)C?NHRv3k?#TUY%d1 z`e7K#daS?rD5rsH_(%0HNyAKS;L98WFi6R+*(f_>%9{$8}BQV1CfYcrre23q&Ne3t)@;@5T za&G1Iw-ch==58`d>=lOM#SGlxTK264Vov?9Dhhbw3Pqbpz4CI)WLzM(7~Z*y4T=^A zBU3|SS~s>jjK}47iyf+LLDJ+CRq+6D(f9Px?S5IyoBO2(KK?z3k&}TG)VF=Rzs$Wv zVbo}E7SR;FVXkd)z}%z3ntYjC#LH zH=UdCS}^kzB;7Z-u(IPK5Cp?^_l+xq33I_U3%omplV6^=0kGNov|cbT?H{SuhxVMi z{q=rIa(5MYEXg7-N1GCBQzTjLo1oADlcW5Us*?`+h(x}vhAcvBT={QT7v$vF?Cvq6k6bc82qbB-bM}@QCndqwCMI`Qs*1&WV}0s{<>wT72yO)?_myimx+llH<1}va`Nzp zOPZ4jjnY{+cg7Cnjfw)KpdT@2*8O~t)yT!vfGW0Qw0Tpz zuW_1Otqjn0ZD1LUtPS9AT|oS&h=NirbsX8hW)RV4`y%VMfu4$kR6i(X(2Z5MxewYfOs z{Kwjg+a7km>60T6$)mUPK(Z$C4Rki5rkMP37y2ZjKj1cIF6O?I&eLQ}sHoix^-jHUr#NIM0b*VAm!jMMZ@|-ocdlHZ{B@d&?Fcc z9tGUI(!jAcQJJkO5|zt>Cm7L~6Th240}mGmrdQrGM(R*s$<~eNv)x1eQ&@fm%I;cuf{X;HxP}qNYbpIXP)EsWlFjCz2r2a>y z@H)QU>^=!zUn%Pu(oj{oRD_CEP5|qB9$iug5}RxRhph=LG#{3fSa~XwRB_k%e2Pc| zWVs&jFlidP)sL4F5xL&KT3f*Akd|HC)F$tCqL7+)LVS3C$hKr6))GNwr0DWM{m+Hy#xOlC(2wTf`n+K+oE;-P_LC%9*pZUW)`TArinfSiAD5dy-s zHFK*xnQ7$itm9BCy1+c`!lDaaj#6u|hwY6weKFd5cEO#x1;?y&Bjvy}1h`>N`|GD+ zplDdP<}lY+x(vu&cXcXf|Y)S8Ti+E(GfCI&q?c5o9F~}Ehf$V=X#rlAk2D(eSQ*KmECQJ*#Ym9ZE zSlMtTnR0)G@c=Ln`ANeC_S)xMhWk}$C@T>qY(F2E(`yW;DljQtyL?+!)53H)3tZj- z%L(t?C=BP8lvtM%SMip4!9iIl${F`j5(rNG%x;MCH>a40=cq)_6#X6p4)px( z?q$?j$QTUMuwzhrAdO8wLVcD^%|}Fd-busBP;5}&c{b=q0Tn8`v2idX85XcjkPR+D z48m%#0v1G?1n|q)viok)9iBt+dzWQct=T7b0uoA%y$eXgH|*Fe)+szJ+fwV2$uP|f z3p7u>P(Qcw&I}I!&kqzIf>P_Xsn_{C?WJ_BMG4cpP*|P&xWz~t^G0s)>L)Y93I+j% z%>H0^<~VGbtLn7LPvQZnTeisS(`;u~VHpZA5!^^6aseWNkd-r)=HS)dVM$qtMi$$} z*&gwQ-JNr@t4mhP)Wf$BEfVWdddb0m7`mV68T6BCihh3j_znpxr|B^V+OpPS@;N_% zgTJYYHOt=k9nJySV0S{}F*-!pB6hLgUl;DQ;;W$c=*f3GvbN5go7qxPD)d#8W^u)% z59Si$nk7Do@mwCn3#afOvx_Vuy?s;|N8LHeuIDI=lzy#R5aZ^)OrEGDG39=p`*tGdcBF$Z6ropXzDdOg~x>uljX>fI}P(w)GD~#;sgyb z@w@wT6`%r#kCW$aO^&Z%oyn`HSqc`#T&D9;($rArM|*y*F*6@l7ha8*PuG*$k8;O5 zT(w{BebwBdVGL|}_#KnyJ--PR*(JmMs^}-%m66U|ZfWhkMS}j&*z*EHJBQR(khT3L zOwxk?2BTO^JjL&hmtq{oBV#mHd9+iuL}5wRce9q*Es`{k@SCK2=6aiZojz8INtvF_ zhXn)%YiR@7ru(0j?s-vx>P@7pT{~7Cu07 zkoLChXCFx45Wu#n=Z!XsGp5mFZF0(TcJlJ&MQot-%B3(jp|qy=c~0n}GrZDe8UWQV zBpL*_q*aS)DnFjdoZFZv<4~7FkK=IJDpE5dzrb4ojXSarm^4dW&cTgNsv|MeEM_jlOMIPA=EJM} z261bDoE2b2Jd?K-_4>7?%V!hEAywyV*zHrEo#hZd8S>k~d(nK$5lb7dYXv+6oyLHF zXRma%%bKY0^F?Tb=yrig{=xJiQRgD7y0n+vS%+mOvdAE#7{EiZ^(~-XWl$Ew>Xd8A z!`SL=7l+yv;{9&+V*>P{2TOR|49Q*X$l>!oSJ$F01hRNas>^>0j96=zGMD}RCLHtg FPi)jCo|OOq diff --git a/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg b/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg index 32e2f79f2c246fd14c33e39612b63e83d8f9af22..d55f405517009b23a57dbc02bc3a3a55bdcb17e6 100644 GIT binary patch literal 7880 zcmV;(9yj5P4Fm}T0*%tY9hD|TyY$lP0gqQOp)v{Hey0yi(t6Nh8V#~r0H$p-_-=N3YxmSj8do!Dxi8bqP_ zpy6XtSRZp2(q6Zp#?U`L;AgLUER2GJ=Od}DD~@$npVTdp#QtR0La*QdKCUw~HlG;M zvjAz~wtDT6a9lKHg-Qwpfd;fIXQ<}g<(Wi!1DzEG4Ag83@XSvXQ^9ZH##KHfq|<9z zyV}CW9%geDyJXy-c0UfzBxM}yy9bREK74hKoh}hUa@A>aMnHZ^#L|gzu!|(f3*w>@ zA6aImy}#D8j;2EnnO(E2xCFSzL|d_7euuF6z{zD?XN>UK{PyGkH-u0`te=pypn{Gw zRqPQk%Y{z(fR&3HF1@E=oc4g^MqW`CLOr7|%d@1kwn=~6ZCcWG2N_)Yu0kmTDKTwn zn?wPqfQ0Q&2AYa~*l!i+@FG*5AiVnp=J@-iLNX<`dOL256)MXwwP~bc?&sH*Dk}>Z#7e7u&RE{Z*_tJ95;0hqb4&J5Qh3kp zS>V!*mjN;Uc2xs>67SqT!=C+!-kVl1KjZ-qK;+ zLKb2r0|R_=>o(-i)Hs>80Kb(;dX6$EhVo9GBjue%%3ZJ=ViX2)b54zHYnR1%z^cE# z3y3C&k{i+PwaTgL;iPhlq+?s2g>9r*)LA>nzJXzX9?HWy(HLPH;pBVwnLk?Id3{EI z@*fJ6T)5HWMW$#t$H@x$axvk4Ckb)2!Ng=c?G($gwL)T3!lXOKmJhJ7j>kM-gI=RjAqbEq z@hg75mwEf32F^5H)aZH}XjT#?hFrhZBdxCOzwjTClg-ny$v^Q`U)mS~@+wz#fKvZa zeUz&~(>Uq=$^d)3t9P00H-5t_U?&ABTcO-L(K@LjJRYJfBz^qED7N-{?@)4}E$xB% z2zEjG-TZ(T6uMA}oKu{>>-imVeZ%BI9|MEhL|s-5>ZqXHz+r5-|7s4^JVy_3hyhb4)JSDKdeY^6LR5 zGJ_NC>;|GTo5^VK(RhziDsOXog9KwVzjcK|&3%)~rnKpo4G4}OXFY@L&e#19vE*4JfC4H)oHNiu#zY zFDA+fUtZZ~^^(x^Pm}<=0O;kWjv4_>IFLFVo%25ucModU3`1o50;>P|2k`9233=mN zm*rtkL4U3q={d^zgu`is-p>A^O9yNYOM{gM4UJJq4@$O6VxPGs^P2(lS-z^nCenYI zJfmq5(Ip%bKjX}R;soc_6HWlACUs=_zzuen_Of5ZH0xaX|F>D?aG zhfQMEAPLlm_NjvA?V1#$t#q2VjQ=ty#_!ZA?g%1TiRtpR*!deW+FeN+o@aPe6fLr} zw6+j(*0W2di=|ixu2kHpMyPnS`*Cn962J~!i-hCPR_%N(CGWthGmEY#vu%|2k;DWh#!iXr zpfQU3+rl0WUt&?{X`;#ASe6t|nrm%v%4@Z{z0`kk@GyI=@OURo62O#rO@KK~{Z|pn z&C{o(Kn$P4CK=KZ3E( zxRhpdGt48H9UG-tT!fipD-7P(5LfUs02mT6aAcYp3un_6lnUpBF9+b+2Q6JB!)*kOOc zz3NoPHLw*(D}sR*-olGE`{v3micyZ0@x*e`&hMPk9IF_LhN}yIv7j` zRXqOoSo(f4F*aFQ>#?JQ$0d9GkKHR;pe4}tcc;X}A3M@TzPs%s=Kczs^3jR}7NxA5 zIt0by5AM!eH&d{gI%|jAl8&CJ8%{)S&6$J%l0i9drW+iti@&t~EsE5UK~CBRAyKNQIq54&k49k}XkzYVtk8 z6CC_phQB;F@nou>4Js?~XV|Jg0DcR*y}Co#SmgQO?FC5&JYC<|Gz}l1rAGT=(t^@A z#Yb4>oK2#0*be+FD);NeEmTnDNGpWejd$wB7wdKpC9QND z`LsRTQ64i@>4SQm_n(*|Om2gLN7bNDJVk3Xw#Kyur#0$a#f)JT_p47e>hvA3 zYqxDq#cmVGE22W(mI2G3+X^A|Sto0zYUu|S@Db_+nkKy6Ou4dNm;Z{)(B_*2+*FnU zA|z6ys&=d_lLM)K5r`G1rmTYljH-mQ`)SQW#-@KL&^*Q$GsIxV!);O(ydNGz@HL}l z?h$ca+KkHXfA-Fo0Gn1e%SOZ=Pqd37NlQtdbACq!XB3fI*TnP9Rm|R+z!KIWpG_QE zs(j$w`fbOoy_AgE|My%K4p*2$R~=N6&-m`?l|0Ke7241R4UpGkm`5VFp0D5R--#?I zww7-8z4tJ?}{76y&OPuH|(|CxKdC!U`UA#mRM z_@GltC2%%ZPM9x~g$J%^KurdOWVU*Wwetbdhz6B#OYA#b)^N> zV>pR|pmxKT3^N#>hUMFgE88XXcWh-peWj`EInN*>q4se+Q*<{t%e!1?(ti6~%e;`& z+sI9Exvk(|zUIQVTE73cZ)zT*^VVhZ;*vN1H_Cl`Q@buDi@}}BpYLP;FY*xZV9G-r z(pIli&CijY@E*-$1N7{R% zH`DoPg>Hgys0sBQ=z03ld2ld#wtMzelXuImrB*1cCx6h80-NaoyE2a+b^S2-C-Q^Q z`$7MR%8#u)a2&EVt{gfLSo0OjMhtl|!xBqrLjO>qL0}jKYx0xi?`^S3Uj;RZ3DD!W z{XT=Qzfi=G!k>9!NX$`XZaDWmxhza6^_ znn=1Vl<8th)CfnyTh;aDMGMKx>HYY8CC(lLGgxsX-+spNP=Md4XQxX~(1R6-)-~B?wlS*bainCB=A3?;*rMQIRhUkQH{~YY!OJ2_i7F?czISmn1dX9#&*=+?AyRb@_tPdu7(xuAoNXh_Qpo&g#+FSECbZY zfLlsvi5k$%ke~OL>L7B*rwXz&hn@7pU8YHNi2MRAqU;Ljk+aHLY(-`TBcax@J$rRU zO*s!`6QEdX{qmz0+j0&-yXat((_@<7aqZDu=`tZ~3W%cF;hygT3y7@RF)W+s0t)H{ zMpKf(kr^ywiO>AFOfqaC2lWUG#g?G@y{@WSF?!e8%1Wo^m9Dx;ZY|GQ_;n^Vrc?Hh z(==V1u>h_R-QhT+HJ9e-{N^-jDQK+~EK#>#5rMY!f`u~;W}p`*^fQ>tH8e$V<-2F} z*+%En!Hu3r<+s_}v!mo_d{VAF+~@EfEj2s$k3soL<+EV1uN3zC%i>`2P3S9tp;0VB zM8Jzk5N(Q;=0n4a%kz*kjKsjit`)j(epB&+cN+_vW)l}i55e09Dd<%rX`xvXb?<| z5EY&opzolz>0r3AosgYHGjUk^H z{!t6C+8L_+03jNohqeM^hXDSDE$T`$nLIX(eY#v7=kKIF-gPHkv+tbHv?KU`(o~6cYAWwj&vZ+AHP?-sI@?}AWk|>+rzW|*{RnV z22`66FWKG0d|0I893wV#fJU}I>AZ9<%V2%IC?9>qp?5tTM-odS@TbIXy-r%OYMoqz z3dzpm|C&t|o8?Bu3X9dSr-z$@Q3MbC`CT+v@Vt?_MRFDKloKp3-N6NRcr9w)RV-RpY3Xfod$pZLnlMMqdtTloHZl!huCLl2~*euA0w!jsadjdOa8J+sP4 z?A5&dh((L)c~7^r(Lw<^(ilKp{WRfyHqnOuKCn%I{svqGr2b1Nn$~o7Z0o(YmM$i@ zMD%&^Uf5EbH-|w*#e3QEyY1yGzO9F2OGYhR8SZGor_`DW`0+^yr8e<`PJn8j(aVZa$ESfEnhhxh@SEvM1x67UNZ__z(o^0qgVWW z#>G>N72vP^VDXfp4dn^wcqNoOH>9!#wP+F?i(iy!z_r{v!Fxhh6?%Aqx?D-9SO?LK zstf4>SZWc(xDCpGX?XhD(P)!LXQ(4GWM=Z`M(9CZ3%k|c4%YTHO^d^ub3^wWK^MHn z=8GP*CE%dqUQU0WHm-3*NoOdk0;o`&k1gf1bcP%MWqA*ftL?#t;yOYmAEF}`Mw>)} zc%TI`UQHMUZPuK|LPTzCJqAdc8^*{ayl)-4MkEqK$Ppda%x)2{P}^pk`k}*G z6~KB?JpY7ust#1XTxJmptcA_q9V4tQVpDAzp%I?`%1Bt4pfTYcVG!Oe&ko9C4I6|o ze!ZY3Y`NAM1$jts1ibL`?#wQF@X^S>%1a{IC6GGx=RZYaoD*sG^H&*e8~Z8`XH#Ze zr~~Pi8*FYkJL&Xg-OU01^5oSuM15tQGnJXT&rLTW?ombVJ?OJacA8{h#^#pFwe=SYP;7h z)H|j*CJ-U~VjpV3roF;sOHWeI^tis0!OR)7EA2j58PxANh|sk?X5xbnbyTOEC|H<8 zlCqE7yS{Xxqd#0aczR>3Z*KSbGQv7#Bu9leLMH4kk?1e&`w!W{22nHID7)l9hZ(4O zA;s2SZqx>QkgD%B#gZv_^CgM=B6GL?8zQM@J|76_bpm92UaZJyxsn_xSw)7>N;P_R z`aMqby)&=*$)^AQ%(f)_l0`eiktctfv{{RqED}gTlrY`+U3u^~A}zhdFU1?E+0;o6 zB@b+SOv~kPV6qFxLvMY$`1h*V!^HLiNn5A1;UH*PV#=6B~r#w5en4 zwTKk?$+eXa5;tB(8pG<2YSk&Yn1K*x(WDc~p^lb9GYXjHh^h~q1!H}|k2&##QE2{P zdY0pXxa10PSr*_X$sa4ZaBmW_;#0zI1}93)BAy9HQOSf8)x({Y229!eQco`vD}nVK z(Hwt{P9ovZEuUB@Ui6P-TqLDE<`1CVdCnHR8+Ois4p=GDlBujcmctKpw7p7-H+Cu* zom=9n9L4KA>rIK-$gB5}cz>_%@PNtDH)-dlTC~9JA`|C~^21EXlq;vxiW^Jx+VUcgA@gpF7Q{ahUHU{UgT3ni2P}!VoIiWcPF3uV5yek_}SC$%Kc40XUQDt zm^&EtX{unQC{{X>?pTO5P5j$%Z7D912O6iV*1ss3i!QXc8qLD2-Eo-nY~&@VD7|`W zYsrAWY;HsDu#Nparc=gigxA1CF09}lWsx2%t^Zrf^fS~u&)9z`$tZ1q-AS!*-;ghj z;z6!MSi+&aSLVt_r12c|d_MqY(pn+dFQD1h0O_XStWjuT;Ccapza^vIrr_f#I`l$) z7>HkGMmXP&GibX>UsZC}HFF^x@#@OK+IvyW1qz(`*V_%@cj&naZG@&iDcsWcb1XH` zhIAB2{xDUUtDlL}ad6bZ>lGhPNN*`^Cee7{r*M0PcLm|d5ru7zY1$c z!eSkyWIEeys=Li=Fuw_sLV{7J%`d|zg^bxS!rr*Q{}v3w3)B=DBcmIR&(tQ``u8`z zBQ)DQ#c|HBcNrLSR;9Z-LXa-YRq_>VSP9WNQR|$OWJdG#{Uy~KkM8VNQjp`bR$Q|e zj*|d5`)vgEiTw%S-lOx}1~+bxY*yF$J(4Uo6<|e=KKSxt&EDz1Pvta6nG3am$(&nW);gj-VsgJuWcNAMacu6iKykVc9uyp>oOGTy|m*TP%isq**Eff zV~Ir0dz{Knir4E>66DqTcIlb99Qz#C!Hi@OG>v$XVSV)zIOK|>wHQ;zQWmvo5(7*V zjmYICi~r0OF-JpA7l82R*GkGU0D!9oz3Ct*)?EA%FZl+TN0y^i42Vf5?o^qK`$`fC z{js7xWtS(R!wAMuTlI}_UC&DU*M1yp2>aHDQFb?;9&J=d_qbHeH#Uxqgegik)vzmy zL*Dc8xbb%F7gEy&mOIb5^Ydv55MxG}Y*MkNO2RIjDw&$MN($M5&4_4d|{ zo^n~~xybol`cSmV4eti9*%C^%4vOFUAMAf<;H_t9x$ugh$ds|iCsk#xH;2s|1KIY@wN zYDNZHv0y(WU6?Bkjfe9C(t}b3Zf21x`#*Iq0wS|kCh>$h9}3P3X6@b+<1hc$dUw(Ty7wTkv-$8a17oJ8VX$gZFu4U#ZDBsTzz3)QN1^X*R^^cNm z1!o;q)hZ|A3<>D?;2LaQMl_^U?6jy?$I8XuRt_6(x(`FVGiO_KePe5ja%mr!Itf>3 zb%fIvcx?73F^6tf39;N#VR;MbssnNBsAH}YQs75iJRo=fZdz19BxxX%iOXlL?{diM zx{z&gIBgN|yN}k4Ljq$!o}hYizdiSDdU9gsHH$=BQ?r{zNqpWjEJ1ROpl;-q?WpEc zW%Lc+r^&#a)nMQ2s)l4^e~yX@LJ0N+KA!CFVsWBtaJ>i`+DX08E))HQb^542u^@Wf zw%4%PMtT@qL5SLndGCY6jVQr0xC*d8VF8Z!c$JnwnpRC$=--OErA#vE-WC#-u49F* z9eiwt%0Xv00INN=AuG;#0GvM=CTJc(eDNFFl1S<~P5?pbQEt&rtF@3D%8_m6D&&t@ zGUl23rqczgU&*Ue7*^WcSMbo046%Z?$c@BCI`EP1h-9j9zL)|?NHu(Ot--kMU!J@z zu%e|`*>AslYfh9y_*J;NC=pWpC?OUwucM1aui&Wqx~8Ies30+HR9G(5pl%$GrU&GF%xNp2!kid& z7UX5vNSJcKjc@Fe&I~c-27X=ZA_d3Abl4PRKXz!O45n{_i1BERFVEt~&TL?Ts+nk< za}<2GMek0l&x`^rvQojKuCnbUoe*zW+KwYs3hJ|dJy84y^Ug5)wD^(`cz23}>EttE z{>;`P^jsL_CPCk&-RSNGs?=Y2}zflP0oYlY%k1-PT3m-ovJb~sPPzNA|^a5Q;WWn! literal 7712 zcmV+*9^c`N4Fm}T0KX0XrLi;Pe3kuK(4XLPZsnR&X?#CKiJp8=G`n+Q{ym`$x-f518-_{r!Ud_kzU z>z!ZmrD6LFJ@pu+r0QzCAzRdoBX?gu!CTpD`V&Ub{B#`|PJlxIW z1Vr>>t2_JlX9#70{NIM5!22J|ruK>#XSsX!NmcPg^zQ7Q#Ppz?lu+wQcn|+(+oH%R zrrBZ$B0YlV@aNH2_;m*D>nN?%(KUao(?1(kz1koA0-DQB%ILq^m0Y( zJ0in1)g}rwx2`e?9x))1dZ|-p39rouahAG_SqntJOWcb4oC04$EyRiVZFw3Gj*8f= zJ=0r|4w4XQySrzH-X-jW$Ft5jp$Mo9nr&ZuqiRA0TQ}2PWbVUh@Gei+p@nts?bN)U z6dvE9&Hy*~Rrd90g84|5Rri0KE~5G{W_&%FmxGsAizB+sz;mQ}+ed(2R3c@952u&y z(*;A(x2Km!KMvYFkeo4n4OZl)D;Rg-_rhOOs8f+6Ll9#EVkX^SnR!jf?(Di5fM6^(&21DQvq!s5DL1x##%uV4i%H!;xzD!_Fa&6I^@cCik4>O*i0LhUaB|@=XrFk#nbF8V;lF|+)kvEUg;ZB1rT&18GK4`BOVw+(_a%G8h zwTk)Z{H^-Pbp?XdKY9la_BMR=A8i$dmL0GznuY<5Vy5zZ!o$Eu_)Y*(YGx=i5^718 zdR+qIrk-jAub-y$<-*XE<*S>gqFGn#vr3^^@-2By zvpTvI$<6P7S&JY7p&cOMi#|Ea|G*ejkNIsJF;$t}mH{#6E+jH8;Qc!rZiUwmC`-t8 zTGte$MG3u>YLg2yJa)VHKJ(DZRQa;n&3_Y$@B%qEEeE~&o@!XKr6{j;^PMen`9o+i zykWVueHyy7_C9P2k5Pi#sv~%UcSU(_$n^!Y{`+s+^iUpYQwe8QbHWN_{zXQ+-AP%x zdto_I6?dWr3;^LJFoK{F`QuPF5*!+3Vh#8~6XHBspK=xaic3QX1)Sc>nG(j`{Tg4s zbv0H5$e)KC`U%*FVg7>chj%#x)hn+Un9ZbMQFPI_f}I?wUqf#TA?$v^VUBTaY6SDz zk>jLXQ|JyhP)!=ahTYgKu))1dJ|~hZ2lX&G-clT&W!Z>&p45P>G9XX~3NOO7k8MC(Z(5ANEHH#}prx=Y zDs2D8&Xn7|n!cnlEWEB2({COgr(d*n;M&7Fr{`1Cn{@;&uaHZV*iJw|Xz?uz_UoStN4QN4UQnT%J zL)kAosP5T}MnM6Uh<%JT$5z8p@R@*EJs9lU+?iwuK6n{-Lbcpm;M`t{?Y&*Tx5iRU z^kF3T@qo=V`Fp)P1EiR_?z}?tSL-5v7KH?18iH!OZ^t-fGj6c93kiA5QCQ>1Rbtjq zvZRa8bO#CsMgVtrA<&y{&rEeSyF(%j6C{x9uhHV|SN?f%wpEy+v=1S%7WyjSF(1wIdJc_F^1uvnY7F2S>k2zbBv z9kvVVqpm*L-v?3Q4)4Oj2dI86@hp>QK(r+%#<0(E-`BN!Xfr@+RXAljf&+I2c$}e1 zx%ty{Is0DDI%r;yf)z05RYyY^rCk9k3m71NaL@*3{#gUZg>d_JY_{oTZ33> zEseja<1YSqC*}O!H;Ku>XWHqzLq{vHFdJ41)t;V)3T~|N z#1X=wCKoay&z*eeBskkA2yAOA9|tHC+}rdNEoFUnv{}GQMji$2E-hU1&?oFc6IkyU z%wdSqEdnCWHo?~*?Xd3rW!k$DS)ZG-r>p&%Ld17WHj2VCk^pU=EM0y~fnj)xxRcWi z2buua%J9g?irqb+-y;{+YPVxK)pUHs66|OBjIDUj-hOxPDAnFC&lurY{{|X^i*>^c zHu2~G#fgX8kw~-;=-ksoJi);oCojh%+f(|0k>R>>5`IWl)b~o?CR|Jc5sggX&N&Al z@v-=G4HU4ieDhnO9a%C{<82M%zbT(3#E?%XVQDUQGXo6#c(XpBAGvB1-l~$%rLP@0$~f|`0ZO{sKA1#PkN7WW z5T>tnC6leXMt@6BTn}pN=`VAU>h^{6auSw5nb(}5#Hafy&vnxe_2_7;Z^2dHeGXl}! zQF$EW?D=EY8g)z^2ky}!(uE;m9V)Q{iNG8Ceti|WM^Z~TCjtbCNg#eTXpRN6;L*Kg z&1wN&{(aGa^d)cDNhUElZ5A|5=N1s!7H(Oy z>&555ELFn9;kD?nl}%cO(+}OOwjpeOoeN-sRc94?>o7DA1)o;hdZ&;hsIqquRozYP zlZWC;EdX#P4cN`KKy21UzZIl}JPod;Jf~IwdU5aRh0AmFVo>Mt!{7l{or-bzwQZ*JmH!QjZR?b{G+iJBwf?zscb_B9D!Z zF#PNcR9Z7rkE)>j-|>gdgU0fBgBm4yF-vczCJ15J>q(&it@>DA!(1$?sm#PorSviN z*`M12WE1BAWEv%CYHR3^pVf92_l*}OnFE5S$liR3#)`2N36^^ouNU{hguM1nThAlz z3w?b{Ce4DX6(*n0PGhKO)3}{BFjrWFb{gvM6A8M%o1`V0rCIBhyPqbdLQIXVSjx0* z7Vu?@+Grp_aS62y(WXtr%T&wrU$wK~)-4LNuH#Nr?wX*zrL;Yeg)~O7IWljBvSXBm4H9-%AFZ{D#-zQ9uP6M zU0EMpKZM|@T3!RzV+m%X^?!!_G^1uLG_?&2w;qBfj#8d*fdq`K;oRv8)45V%hiFu${Mjt?$Rm!oinp-7uSa`jWI@evk1N)@z<(_*qA-A@kb= zRm2<&V)I)2Kb2m^1`M7EoFN>PyHM>zR`oXu;bWDS^Ou94DQb^cTdgYA~OsQF27C2HFB zJ7;dxEkD8F;~+HhFDIA1k=H;K3`CRQ2NfI`iTyRs4=fi-@Hg(Ajt@}`3tk&0RkM3GfDjqjA|>te-abvi8J>fd52&)|LL_QvI#bJ@W@i;B$U5JSyp3+| z!`T<*IJ0`Phx92!rVW+iDj8Mco{%`lyt)b!M^hI31eY;l4LWOU=% zPWU^9%Xr+o+18XR=q4$1`#6tObu9=g&f?e4jk}5C%y51?0CFfNcQIu23)aS=#-~Xv zNkL)05uz_qd64B>?RB%v1=~+@*IaFS?k9?FVuL#SxStw-wYJ@}ght0WZ~jcxw+5_r z)T4c7;?%!C2jfpx_whFmadXN2HDKozo$@mytOnS>wK8W6yg5a(%*#^rGJO#SrYRoW z(Zt}h9N;Rh$?RT5NCBY&U_O1M@J-wKOcfUZ0x;+Bmnt37y15L-QXY zh+me_S)%{WEV-HP<+U|z(8gEG1Ea5->%^ZN?_Co?o6k8v4T>*O!Uq%QvC!nmzn}{Q(I6@veLamO^bb6+^wdktJxbq6FL91{58jvy zUm{^>zt6p?XZv%p1$@a$T#8%j_1mR)_jwWml@mhuT=e2DL^1IKIg1Q_T`xCdOLJI2 z!`PN~1U*yQ-$YOnxD?DXHTOxQ0RDHGRyz_<5@FOP7q0*u`jaG}u;6_{73c2F#MG@j zx4KDbJ)~a3oXPS*-|x3I*kv#oi>-xesVzen0#bcNfE(L5pnj?PXPBRBdmOyfNQ9T- zs?HiVB~4a<%XQK2e1vvWYGZU?I;1M=ha`utHmM|{9m{&!2uun2c5`EZPDIc99D8^k z{0rg%CDjBZ0N|>tMnfoScuj|VH<7NlFX-t7j%4?LQ-H327V*j@2jbsmy+Neq1!!uT ziOUx}f9$|AT48KZ2c>c0l$h?AK#R^Zb?e_&Ueuyu|F(yX@liI*8@rzb%wvdKWi6#% z6IF)W#D$&5O?6bCWfnsm#EoHGAt|7+>5rL>LlbMynQ`9g@cXB$-0CwF&16twpJ zLtY;OI3i!4kB4G95F$Q{&)@X1Gu21{M_?D&Z?6u28lW*xqOdrHB^0LO{x^9QGi{mMnjh`1 z7HZe+RZCxZz(CUL2Xo*&*YXr;e0$}fkwWnd^wM@uMAB%aY_0dA5(YWYLc*mh5TQYnqOTPKc4J4@}Jn(`C+vZb~dfiOpw zp#;}n<%--r=d@vR-)_c)==b3g2jEOjWss|ZA)j>J3RR*!8j`!ftk$+`%C%BM#iz0W z?;9p&oDEG|ge~`!b6I0ex@ox0rRU@qknEiQPa_|sVU}Fw;0>ZpcVW2zSR|+k|41j zm$WgfNLAXQD1m%bBRNhRc;db^(mXE?km}*>mCj`dN2{Y2)$((?+Ig%oGxyROEs-eR zEg9DIR}rQoXGzt)(){np@mBP2O#Q4oxUG zH+YIuzPTq$mC%+cd@GHm7AKQ9rnFXmD}v5Dwa3Bwx=JodR{}4Wf>{s$OvlRcux4pb z^zkwiljXXGs0QOnBnUj@NH|6S!0UAKUr^HAt9e9uyzS*Mbr}vek}|>=`mmvTJxFaa zX?-OcaDE=|P=z97c)?=wl^>^8Wpy{D;Z=|z>RMDj!w(3}R;I(lmHFl)+3v!d!%Krs z=Hsl2X>_`?7ISmee0f%sG~lsyE6>7p%h|wwG~1zeMC!{+LuxC&VuFXw^7H_>D2X*s z_=wz!IM)Z}Xlvm5Z^k_iHTfvE(@%g48@O|?^<2Ao;#p2s|z^l61tyxD4XyU zMcnMdG%`31a`>(64$4X>h^f{V`N!71N{&1trfpgfC=<>D1d&fGhb(q%(3z455HDeK zbgMElH__=NrB>Bp;vG}|cdBwKK{I$7_scGhwl)+@?090ak>`Wt6ZOdMng>yORd`7d z>(Lab&F=f@h$mPOc3%?YUFj3xe81KF+W#o<9cnhTbWHP2MUt>d2lOA6^HZz2^Bj4H zK|h?B7k`p+0GSciSZy0HsPZL-f=$xolT8+)AaO9x-`A%8)`Zn-YA(kqEr|yJ{(%jG zb@$bMe21A^O}-KrwG^_MJEfwEt4w>e%PZugi;GVGkRsZ3Q9|{=OdfkghOlSjKvkc9 zYRCemgO{`j9*)Jwb(C1sp#Y@?OYmO<7gCBCpjSt;sKZlIGPP20ch8O<7Ijb`lT9mj zzDk4A5qUi46767Clhb7*?`^8ZuWO=_m8oQ`6gE8EMY0(vR=H2&sja)V$Cf z(v-4)^}OsGCUmw-1}y+&LNB#-$&g=nRHA!g*=|0Tx!KxBz@{2kMCq?4hb4KQoROCv zN1{vQ+F}MFkah9Y#;Z~2{Imdlec!$R?AKl|dm#1M0eaB!M8JqdV#ImYmlK}_W~%lD zZrC+uFEQQhf2;C?-|BUVh$s$4(W7M;i2?G(oU(t%{Bk7s=j)Vjj{o04 z9XQysmPU9hCaF?yoVGL$79Js4X8oV7RPdE>-~>CZ!hnw`9?rbaKmXdGB+u z>UYFF(NY&);FC&=R0Krj809Gu%0>x(c;j zDB8)*Dy@zj_+DiWn(?;qS;gt|s}FUMPvLW=V7^sidwEAtV5e$wg#)SlcHE;BW`1Dw z<1&aSkW3roZ!@Nwj#99QOi8)R(`m#Ah93s=>i#WbbT5qoO|jHu1u@w!Bn;)lm;_SW z_K7i<-9NvYI5aQIK53L$11)%%m7?I5Kze6L&4xDv;jx1=@)`O+=d)dc zn9=;j{E=mM%4$z0r-O}Kz_)|Vdbx>Igva3Ef?y78)CXEMtJ~k-M{D2mTkDaxflKXm zIF^S_m^FN{b&ZL%rz9P?W|^uCrl5*6%XuonRc&SQu2idSVQOu9k*|@%<2HpGFmhc4 zJ02^fJB=BL81U)4k5B}gBZRvFt9;@=Br8pKwL94;s4K1QQ+JD4>uzJ4`DJDlmcBqX71&IWZK=O+|ymEn{w2181}3&lx+B!u(B8m a3G0r-vVtEYOoPA+E1UKxFe;4rw!7yT{smqD diff --git a/.github/secrets/macdev-cert.p12.gpg b/.github/secrets/macdev-cert.p12.gpg index 4b8e0ef474b47e75702caa8a74750fb44fbc4845..f89cfb82a117fb855b5f80abc6011fbd5806d318 100644 GIT binary patch literal 3278 zcmV;<3^DVJ4Fm}T0^!Cp4kpE8qV&@00nF}HWtDgNQR&|+jEH=)4f|;#+yrx3Q^`w)(w-#dRm6J-S}LK-L<-Q_ms>Wp{S^#N#A5md|t{ zF8)3nlr^VJxF;N2y*PoxUI9Xf@a<$C zb1$z_408e6hc`N>CwTd|0$S~@c(XS`m|e`kqpD5#CNXhlj3BkNk8z4tppL4O`3D;d zLwH@`cJmJZAx{eHnLM4oMtOn`H{lhbg z?}&k!_rxJWC@d|~QCnuna!s-|fcaF) zdZr~%J@Oj~;#GWAeMljHIpX;-E@sVqm6n85Gmu+L&hjDVeAE~OU+p(kmD7uA*jJYa z{>ZSJD6LAt_1IfyE6Ca7PdfTev64cbA%Qjd-X&aWniHy@yAFe90$!zoG@-BnUx@?Pq1abKJ^@ia{#n#g4q#S;eDoBp zvI_$A!8m#`UL`BgcXfZRpmfg2^8{v28M-N|a?u1Nb2Ytb)+dzgb{YC*3H-1z%auoT zy0quEkEp0a4F3=iyIwR?{UH4vZ8rQ{K_VXaN=B4njZ&RIuRq%wn}5i7dqVV;lH;qXn#kGOes+WToRDhT zFT`sx1Z;sr&v>RrmYO2;M#7q4-Y8&We!ol?bx{ zM=CIK*b{IRG#yzXYCvo;qZkN2MQZtg*cRnH{>}7@3&R~R$Y~eYtdP$Grq&`-vfZnR zq7`BpU~!F2f5f);ib#WxQkDVdP2#f^hEvN&>IpCFna5GIDMJ0=5Voa49g_361%X)c zjlTHh@F~|xR*C6V>Np~M2v|7)RnR7!&Lrr(UF@OuJ!X(Cd4gD6{g0q0L&$wku9{<+ znq@0Gnr`8Zm$f%IOD?M{?&8i++Gc~|JX;9gpr8YUHhWW6V791{5Bs>v(dW>_M4B`$|bk*G|1cvjY@3Zsn_^jbZ^ zygv?0NCgL+lckl=d`$2%XZ^t@Cx7wLg>;Q?S(qqV#i$G1gE~=mym!c(*1)H5KBZ}-_63PR=pj8AT?vdz{-2)D0 z|I5Mut^;&&KR+5PT^J+3NdF~$*J!=IwNQJ1mUjaQtKsfvfQ(xvxHR0Ou|u~Vv(sUs z3s}_lgTm`0TMk_NaVSdnYr)W3aG=A(R}^SZ7A-Du&H<|uAU1r(bv0cKWPT$y{$rYP zGB6TC<|LXi$x`5k$ z1y1$cH5tEq%DS%l`Sr@gsx5-JRR2Xr17V3FN>3*X1RM}2k-4B5x@jKSBG;lP@Z_H^8&zEsSu+EHyj_3;Fdcf<1hD12>`{ z5-$!WHn0U-uD!*G8oh<@o2h31s&_cD1aae4RYTY?MQ$&;Qi7(CBOhCau>{SMxs_eL z4L@G2WIa69VOo%}28_n8y0#6AM^Ow~G=0dM@Q_{6k|q1Y_k{xaN3@kZ4LLEHWsVU5 zrNT2veXcF@iSORJiq~eaIY!^ZXe9MdNkQuUK@7IQqo^ZyX@oVwt)x+A@JFf0M|Y`< z`}nwX58B!Uwx&*OOZoY2)9d=mKruGrOKX?JMIv61B0gH1@$)ePtO2p6CrP+C`vl3= zu&e)3`=FcsccvmWt8Lv5cw3MZr5ENt{|!r#h2sff7W14NdYGIEvcWd|?-1+38w#l`1?R;VU@KiNP;v^n>KCfl3WSZ!bF_r1}hcNR1U%O#nNgST)983a%*+`juI73U)_|Zm;F1& zg;0E;{5YTWrg6>By8kLt!gh2>R9JxHo*SI^OqV zR{lI+C;YxgSK%EudOzY*>gz$Gv8%hXW5h*q7`xzfAE* zw=&5Nk;vDs49k-85ziEgplbevEiF3)ON)pkj?4M9fI;nux#7~I`OH-aJFSK|_nHWW zDv|-NV1$)s(4J#$6V?}=FK0uPj7s0L+KW3-Xb~5Xz_zWg?v)B0o^mb&)Yw9}9=(03 zNREvWqqEhaSVJ=d^}ka{KZG+N(5iq*a_P>8kUJLeVr8$fS~Fz0n&H0UEW*yrt4~Mc Mx^{B*%WB3t?YuHw!TJ(nn)1@?0m^(}>5%5c5c8i0w3DG3WQedc2uWWx69=?P z5l=1O`U^2?JF~<$Elzf9tdo%~?>5CY^SQ(33i*CZiKchM$=9L3>RNfD&vhQlv~2)8 zX2_vrGG*u;)Mp0}ASxCNxhT>n-%@NJ10J)HVzMHt5|PKVcA;qLF`X8T_EvJzD`$I# zlnp-Iu1Q^cvS&WQ;LrD;kVo<(Wo?dtV~eHkd^^1#Eh|ym1-F(Gqv6)@LqGbJ_3ke! zZ*he3T_b>$bvMar3<~#4U zgT%BT-eFu!j-25gwTMUlQRS^wcy!KK06i-TIl1)0`@HKoWC`Kd z_s*5?11gcpsk1jqKV~Wll8vzqaW|u;6QXAf-&qN7-Ls^J3(?!!aRz&Ly_V{j_c75T zh3+C45CR|&1GPO;Lyf)DzVt!x%a0_aLK~LC4;d5j<`s6V%$t_d`HX;fuoFk*L2KQ# z3n%C-WlN`~R~|)jKO8^yOeSP)8ys-|IutRfauXJg99NFaeSN)STvbr;=&_+fE;1T6 znp^9xGwxJZu|jj-w;4m{07eWs2H_T0WumvP)3l6Q;jqRCIfH3kI%-g$WMN+)#O#KW z$Nma%oCoHsSO_PKBHfR6RW$v*nB4KhS2o|Mn;fKk*(co(zJS`WIROQrD|UUpNbVR| zMNsda=vZlfhWi*x=|V>9@I%C1HB7_Z%|sy*SCO2Qb|{rPsr)qV4l3FqW|^C5PCx`L zl0l;#_?9W^fgf;3%t(3DB>m}nC14yc!|mq5Kqn;MZh%d_M%05ExB{Cocz=y{zu1a8tY1D+s}t= zi}vP*y0@^J>F^^MnWloa&%;H;x_b#gksDo1s`-UZCfwuLee*kVR{RqB1JDA`rN!M4E(3%UW?vY+4GQs9SQ+vr-H-}4{OJ`s@`aoFB506S9%z9>eUsb@Y_sh@NQvBXe31Lk;&7}bd#svffX^+TxKs0b0$ z!!p{2yz~*1`xP=NCNTVI+qfYxd+pV_Xrk0Me=2jO3#{Vw^idjJAQ7Ls(*C83SOn%j zD?>IqKy>JTLl*fNt(w>`44TGs;sn4oWaM=K+zg^Z*Wyow7QT=nshBhS)o2irFK2r7 znqvBW{;O~j>2cmQeLX13N#xod%j|wt?QYe8fL&vpZM+80ubf~r0k)Yx-R^7sI>asJc ziY|@W5hNDwlyEElCl7?zP;(jZ1M{iuQIgC4#ijtorlOPgKP{Kz>k6 zNPm2UZ2n-bit>GamBk(7ltQsFI>!1sX1M77lT-%G*rlx$k0bhI-JGD>ea$$pi4B`N zUgxKofx)$7sY}6J=q(05K3;3JSSkV${YvaG>`a0+97d-&KhwD+Lu1o4?z3Vm6^sF1 zvr>AnqZ;h3Acu8v1(QW9L8_*S{Ojp^VoxzTTcVvgf<}$;@c^MtMkf)coSsI#KV+pM z#LRRIC^Qr4k#Rkx@s)@v))wZBxY@gq8K?I)T=r4%XexlglS#Q-w!6q>QAlf&-x!Xw zpDpDk3}f+hWZ>KWDn@sM{Ue4=iE_B5A$R4wrmmk=6*y_%rCy|Rg^CLm!7*vDx7(Uj zl<@EX`XA(q)QDJo`I^5X@aRtb!Z_ah|8)c{ciZ@iY^mwM-le4!RS*KR9|Csl7DAM4 zSwj4Y?NTEAG!<*Jk7PZac>$Idv26im`N0hAdl1&?grxjrzEic3_07ngg#^DR*_4T_ zPC8RZ;1-W-CI+P58q2pW2vFG4aGz|h)CJYGj;P=%Ohi$>cL+25m>|k7>QOWp`XOE6 zNSRD*Bl&$Y^1i`>wu0JNjJ*%G{@;RmiDL*D?wy9Yig-~UU&98Xds-RRGTaFNF*?mP|lQ?Rl??smc_6|QSdVG?CJ)m5o`{(`TleieTB#< zU%vI&qIU^=@KYj6^Ug<=O;upA7iyRUOTNN10^V5b`1K z950^}BbuZ|)qT(5DP{IYPQw-4)l5xLeWKfm z@a#dHjpEPwnba4;kazv=CwiCL5<3&=?rAZUG87=|df|Q*pl!Q6zJW0XwQADMEm!-| z6;vY6-`+3nrGTD_*^m_rLOKhAwOiNIE{8MSq#q=t|v&5iDbz_bS z^fhr93VC{6I(a?L>38Wj*EEj>v1N+ALlcM7>g~yMgf?#@r}OBTsjW^A2T5B{^aTv; zuq$EmsCxe-8p%jRxRY~gAc0*CYD{B1kKlz7V_xvk$hZJt^w&{GrdLMn{-XjFFTsy{ zHQM)%<&7#4vljSc1t$^iIBn4qUK(YGNXpNS#*}#XV}L(`7v;JRb(h&gJjvyd=bkyo ziMQ}b#mIXpeWuC*>=u)#^8v5XD`p7G4L26jqmo_(WM+*Q`2FK}a~4afk5Z4&dS<@s zg(em%4S|-IQm9k%?Hvi5FK7F?Q^mI$*;B4!jtE3)X!r;LVSkS*142{9^Ud#0%&H4v zwb9u1wGuNKn;Z5cy7_j%L?)amLbN3(1=1C+k^2vu6#Gb=ll1gKyraPO zAx0;Si>cy+;nRKrubCb0Os$-KHQA@6z=Yi?+yZ+TR11Cud)h$H?3poq;lddE`g z0c!h(wQThO&CUkD%M~!xcF>mEC;~22nr%a!RbAVIxl9l^6r;wjTE|-A(cl3n(p?_X zzEK=^!ks4;ug==w;Q!ae3+=1voSRyg_4pams54U-9!e?#c^KUV@vM$l7we~JK6J$i Fr6a1XRYd>* diff --git a/apps/browser/gulpfile.js b/apps/browser/gulpfile.js index 26935120ba7..2f672ffcdd4 100644 --- a/apps/browser/gulpfile.js +++ b/apps/browser/gulpfile.js @@ -122,8 +122,8 @@ function distSafariApp(cb, subBuildPath) { "--force", "--sign", subBuildPath === "mas" - ? "3rd Party Mac Developer Application: 8bit Solutions LLC" - : "6B287DD81FF922D86FD836128B0F62F358B38726", + ? "3rd Party Mac Developer Application: Bitwarden Inc" + : "E661AB6249AEB60B0F47ABBD7326B2877D2575B0", "--entitlements", entitlementsPath, ]; From c3dfb7735ff6b2770aa5def84fc53fe2c2e12108 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 14 Feb 2023 11:26:20 +0100 Subject: [PATCH 010/232] [SM-487] Fix lock and logout (#4683) --- .../dialog/project-delete-dialog.component.ts | 4 ++-- .../secrets-manager/projects/project.service.ts | 2 +- .../dialogs/bulk-status-dialog.component.html | 0 .../dialogs/bulk-status-dialog.component.ts | 0 .../{layout => shared}/header.component.html | 4 ++-- .../{layout => shared}/header.component.ts | 15 ++++++++++++++- .../{layout => shared}/header.stories.ts | 0 .../{layout => shared}/new-menu.component.html | 0 .../{layout => shared}/new-menu.component.ts | 0 .../{layout => shared}/no-items.component.html | 0 .../{layout => shared}/no-items.component.ts | 0 .../secrets-manager/shared/sm-shared.module.ts | 9 ++++----- 12 files changed, 23 insertions(+), 11 deletions(-) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/dialogs/bulk-status-dialog.component.html (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/dialogs/bulk-status-dialog.component.ts (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/header.component.html (96%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/header.component.ts (74%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/header.stories.ts (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/new-menu.component.html (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/new-menu.component.ts (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/no-items.component.html (100%) rename bitwarden_license/bit-web/src/app/secrets-manager/{layout => shared}/no-items.component.ts (100%) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts index cb175ee7569..30b00224ea2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts @@ -12,12 +12,12 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { DialogService } from "@bitwarden/components"; +import { ProjectListView } from "../../models/view/project-list.view"; import { BulkOperationStatus, BulkStatusDetails, BulkStatusDialogComponent, -} from "../../layout/dialogs/bulk-status-dialog.component"; -import { ProjectListView } from "../../models/view/project-list.view"; +} from "../../shared/dialogs/bulk-status-dialog.component"; import { ProjectService } from "../project.service"; export interface ProjectDeleteOperation { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts index 59bf9e1d962..a56112a55fe 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts @@ -8,9 +8,9 @@ import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { BulkOperationStatus } from "../layout/dialogs/bulk-status-dialog.component"; import { ProjectListView } from "../models/view/project-list.view"; import { ProjectView } from "../models/view/project.view"; +import { BulkOperationStatus } from "../shared/dialogs/bulk-status-dialog.component"; import { ProjectRequest } from "./models/requests/project.request"; import { ProjectListItemResponse } from "./models/responses/project-list-item.response"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/dialogs/bulk-status-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.html similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/dialogs/bulk-status-dialog.component.html rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.html diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/dialogs/bulk-status-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/dialogs/bulk-status-dialog.component.ts rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.html similarity index 96% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.html rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.html index 3b4bed90ab7..32dfe1d7997 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.html @@ -67,11 +67,11 @@ - - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.ts similarity index 74% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.ts rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.ts index 6d299579a32..8c9110a3a65 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/header.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.component.ts @@ -2,6 +2,7 @@ import { Component, Input } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { combineLatest, map, Observable } from "rxjs"; +import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { AccountProfile } from "@bitwarden/common/models/domain/account"; @@ -23,7 +24,11 @@ export class HeaderComponent { protected routeData$: Observable<{ titleId: string }>; protected account$: Observable; - constructor(private route: ActivatedRoute, private stateService: StateService) { + constructor( + private route: ActivatedRoute, + private stateService: StateService, + private messagingService: MessagingService + ) { this.routeData$ = this.route.data.pipe( map((params) => { return { @@ -41,4 +46,12 @@ export class HeaderComponent { }) ); } + + protected lock() { + this.messagingService.send("lockVault"); + } + + protected logout() { + this.messagingService.send("logout"); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/header.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/header.stories.ts rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/new-menu.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/new-menu.component.html rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/new-menu.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/new-menu.component.ts rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/no-items.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/no-items.component.html similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/no-items.component.html rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/no-items.component.html diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/no-items.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/no-items.component.ts similarity index 100% rename from bitwarden_license/bit-web/src/app/secrets-manager/layout/no-items.component.ts rename to bitwarden_license/bit-web/src/app/secrets-manager/shared/no-items.component.ts diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts index 2dcbb6fecf0..ecce7c3795e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts @@ -5,12 +5,11 @@ import { ProductSwitcherModule } from "@bitwarden/web-vault/app/layouts/product- import { CoreOrganizationModule } from "@bitwarden/web-vault/app/organizations/core"; import { SharedModule } from "@bitwarden/web-vault/app/shared"; -import { BulkStatusDialogComponent } from "../layout/dialogs/bulk-status-dialog.component"; -import { HeaderComponent } from "../layout/header.component"; -import { NewMenuComponent } from "../layout/new-menu.component"; -import { NoItemsComponent } from "../layout/no-items.component"; - import { AccessSelectorComponent } from "./access-policies/access-selector.component"; +import { BulkStatusDialogComponent } from "./dialogs/bulk-status-dialog.component"; +import { HeaderComponent } from "./header.component"; +import { NewMenuComponent } from "./new-menu.component"; +import { NoItemsComponent } from "./no-items.component"; import { SecretsListComponent } from "./secrets-list.component"; @NgModule({ From 42ba475c377bf4de4f707414af3b0b411ae5ee8e Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 14 Feb 2023 11:38:53 +0100 Subject: [PATCH 011/232] [SM-497] Add filtering capabilities to the table datasource (#4717) * Add filtering capabilities to the table datasource --- .../projects-list/projects-list.component.ts | 5 ++ .../projects/projects/projects.component.html | 3 +- .../projects/projects/projects.component.ts | 3 +- .../components/src/table/table-data-source.ts | 65 +++++++++++++++++-- libs/components/src/table/table.stories.ts | 35 ++++++++++ 5 files changed, 104 insertions(+), 7 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.ts index a81aea7057c..869895150a0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.ts @@ -24,6 +24,11 @@ export class ProjectsListComponent implements OnDestroy { } private _projects: ProjectListView[]; + @Input() + set search(search: string) { + this.dataSource.filter = search; + } + @Output() editProjectEvent = new EventEmitter(); @Output() deleteProjectEvent = new EventEmitter(); @Output() onProjectCheckedEvent = new EventEmitter(); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.html index 2e6c092caa6..bc0b331d7d0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.html @@ -1,5 +1,5 @@ - + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts index 1d362121717..440e88864be 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts @@ -21,7 +21,8 @@ import { ProjectService } from "../project.service"; templateUrl: "./projects.component.html", }) export class ProjectsComponent implements OnInit { - projects$: Observable; + protected projects$: Observable; + protected search: string; private organizationId: string; diff --git a/libs/components/src/table/table-data-source.ts b/libs/components/src/table/table-data-source.ts index d5f4473a8f7..b7bb4d1644e 100644 --- a/libs/components/src/table/table-data-source.ts +++ b/libs/components/src/table/table-data-source.ts @@ -15,6 +15,7 @@ export type Sort = { export class TableDataSource extends DataSource { private readonly _data: BehaviorSubject; private readonly _sort: BehaviorSubject; + private readonly _filter = new BehaviorSubject(""); private readonly _renderData = new BehaviorSubject([]); private _renderChangesSubscription: Subscription | null = null; @@ -41,6 +42,14 @@ export class TableDataSource extends DataSource { return this._sort.value; } + get filter() { + return this._filter.value; + } + + set filter(filter: string) { + this._filter.next(filter); + } + connect(): Observable { if (!this._renderChangesSubscription) { this.updateChangeSubscription(); @@ -55,20 +64,32 @@ export class TableDataSource extends DataSource { } private updateChangeSubscription() { - const orderedData = combineLatest([this._data, this._sort]).pipe( - map(([data]) => this.orderData(data)) + const filteredData = combineLatest([this._data, this._filter]).pipe( + map(([data, filter]) => this.filterData(data, filter)) + ); + + const orderedData = combineLatest([filteredData, this._sort]).pipe( + map(([data, sort]) => this.orderData(data, sort)) ); this._renderChangesSubscription?.unsubscribe(); this._renderChangesSubscription = orderedData.subscribe((data) => this._renderData.next(data)); } - private orderData(data: T[]): T[] { - if (!this.sort) { + private filterData(data: T[], filter: string): T[] { + if (filter == null || filter == "") { return data; } - return this.sortData(data, this.sort); + return data.filter((obj) => this.filterPredicate(obj, filter)); + } + + private orderData(data: T[], sort: Sort): T[] { + if (!sort) { + return data; + } + + return this.sortData(data, sort); } /** @@ -161,4 +182,38 @@ export class TableDataSource extends DataSource { return comparatorResult * (direction === "asc" ? 1 : -1); }); } + + /** + * Copied from https://github.com/angular/components/blob/main/src/material/table/table-data-source.ts + * License: MIT + * Copyright (c) 2022 Google LLC. + * + * Checks if a data object matches the data source's filter string. By default, each data object + * is converted to a string of its properties and returns true if the filter has + * at least one occurrence in that string. By default, the filter string has its whitespace + * trimmed and the match is case-insensitive. May be overridden for a custom implementation of + * filter matching. + * @param data Data object used to check against the filter. + * @param filter Filter string that has been set on the data source. + * @returns Whether the filter matches against the data + */ + protected filterPredicate(data: T, filter: string): boolean { + // Transform the data into a lowercase string of all property values. + const dataStr = Object.keys(data as unknown as Record) + .reduce((currentTerm: string, key: string) => { + // Use an obscure Unicode character to delimit the words in the concatenated string. + // This avoids matches where the values of two columns combined will match the user's query + // (e.g. `Flute` and `Stop` will match `Test`). The character is intended to be something + // that has a very low chance of being typed in by somebody in a text field. This one in + // particular is "White up-pointing triangle with dot" from + // https://en.wikipedia.org/wiki/List_of_Unicode_characters + return currentTerm + (data as unknown as Record)[key] + "◬"; + }, "") + .toLowerCase(); + + // Transform the filter by converting it to lowercase and removing whitespace. + const transformedFilter = filter.trim().toLowerCase(); + + return dataStr.indexOf(transformedFilter) != -1; + } } diff --git a/libs/components/src/table/table.stories.ts b/libs/components/src/table/table.stories.ts index 60e80117bef..76723f23d10 100644 --- a/libs/components/src/table/table.stories.ts +++ b/libs/components/src/table/table.stories.ts @@ -1,6 +1,8 @@ import { ScrollingModule } from "@angular/cdk/scrolling"; import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { countries } from "../form/countries"; + import { TableDataSource } from "./table-data-source"; import { TableModule } from "./table.module"; @@ -133,3 +135,36 @@ const ScrollableTemplate: Story = (args) => ({ }); export const Scrollable = ScrollableTemplate.bind({}); + +const data3 = new TableDataSource<{ value: string; name: string }>(); + +// Chromatic has a max page size, lowering the number of entries to ensure we don't hit it +data3.data = countries.slice(0, 100); + +const FilterableTemplate: Story = (args) => ({ + props: { + dataSource: data3, + sortFn: (a: any, b: any) => a.id - b.id, + }, + template: ` + + + + + + Name + Value + + + + + {{ r.name }} + {{ r.value }} + + + + + `, +}); + +export const Filterable = FilterableTemplate.bind({}); From eb5eb1c49e3f6f588f0aff64fd3d7b563e3dae9d Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Tue, 14 Feb 2023 08:14:51 -0500 Subject: [PATCH 012/232] Revert to MV2 Autofill Logic (#4705) --- .../browser/context-menu-clicked-handler.spec.ts | 13 ++++++------- .../browser/context-menu-clicked-handler.ts | 11 ++++++++--- apps/browser/src/background/main.background.ts | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts index 1ac8b5d9dcd..a9dbcbaacc5 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts @@ -9,13 +9,12 @@ import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { AutofillTabCommand } from "../commands/autofill-tab-command"; - import { CopyToClipboardAction, ContextMenuClickedHandler, CopyToClipboardOptions, GeneratePasswordToClipboardAction, + AutofillAction, } from "./context-menu-clicked-handler"; import { AUTOFILL_ID, @@ -59,9 +58,9 @@ describe("ContextMenuClickedHandler", () => { let copyToClipboard: CopyToClipboardAction; let generatePasswordToClipboard: GeneratePasswordToClipboardAction; + let autofill: AutofillAction; let authService: MockProxy; let cipherService: MockProxy; - let autofillTabCommand: MockProxy; let totpService: MockProxy; let eventCollectionService: MockProxy; @@ -70,18 +69,18 @@ describe("ContextMenuClickedHandler", () => { beforeEach(() => { copyToClipboard = jest.fn(); generatePasswordToClipboard = jest.fn, [tab: chrome.tabs.Tab]>(); + autofill = jest.fn, [tab: chrome.tabs.Tab, cipher: CipherView]>(); authService = mock(); cipherService = mock(); - autofillTabCommand = mock(); totpService = mock(); eventCollectionService = mock(); sut = new ContextMenuClickedHandler( copyToClipboard, generatePasswordToClipboard, + autofill, authService, cipherService, - autofillTabCommand, totpService, eventCollectionService ); @@ -106,9 +105,9 @@ describe("ContextMenuClickedHandler", () => { await sut.run(createData("T_1", AUTOFILL_ID), { id: 5 } as any); - expect(autofillTabCommand.doAutofillTabWithCipherCommand).toBeCalledTimes(1); + expect(autofill).toBeCalledTimes(1); - expect(autofillTabCommand.doAutofillTabWithCipherCommand).toBeCalledWith({ id: 5 }, cipher); + expect(autofill).toBeCalledWith({ id: 5 }, cipher); }); it("copies username to clipboard", async () => { diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 840ae7a7743..9583c077c89 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -43,6 +43,7 @@ import { export type CopyToClipboardOptions = { text: string; tab: chrome.tabs.Tab }; export type CopyToClipboardAction = (options: CopyToClipboardOptions) => void; +export type AutofillAction = (tab: chrome.tabs.Tab, cipher: CipherView) => Promise; export type GeneratePasswordToClipboardAction = (tab: chrome.tabs.Tab) => Promise; @@ -53,9 +54,9 @@ export class ContextMenuClickedHandler { constructor( private copyToClipboard: CopyToClipboardAction, private generatePasswordToClipboard: GeneratePasswordToClipboardAction, + private autofillAction: AutofillAction, private authService: AuthService, private cipherService: CipherService, - private autofillTabCommand: AutofillTabCommand, private totpService: TotpService, private eventCollectionService: EventCollectionService ) {} @@ -104,12 +105,16 @@ export class ContextMenuClickedHandler { await stateServiceFactory(cachedServices, serviceOptions) ); + const autofillCommand = new AutofillTabCommand( + await autofillServiceFactory(cachedServices, serviceOptions) + ); + return new ContextMenuClickedHandler( (options) => copyToClipboard(options.tab, options.text), (tab) => generatePasswordToClipboardCommand.generatePasswordToClipboard(tab), + (tab, cipher) => autofillCommand.doAutofillTabWithCipherCommand(tab, cipher), await authServiceFactory(cachedServices, serviceOptions), await cipherServiceFactory(cachedServices, serviceOptions), - new AutofillTabCommand(await autofillServiceFactory(cachedServices, serviceOptions)), await totpServiceFactory(cachedServices, serviceOptions), await eventCollectionServiceFactory(cachedServices, serviceOptions) ); @@ -205,7 +210,7 @@ export class ContextMenuClickedHandler { if (tab == null) { return; } - await this.autofillTabCommand.doAutofillTabWithCipherCommand(tab, cipher); + await this.autofillAction(tab, cipher); break; case COPY_USERNAME_ID: this.copyToClipboard({ text: cipher.login.username, tab: tab }); diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 5458488077c..c51b8fa9f68 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -89,7 +89,6 @@ import TabsBackground from "../autofill/background/tabs.background"; import { CipherContextMenuHandler } from "../autofill/browser/cipher-context-menu-handler"; import { ContextMenuClickedHandler } from "../autofill/browser/context-menu-clicked-handler"; import { MainContextMenuHandler } from "../autofill/browser/main-context-menu-handler"; -import { AutofillTabCommand } from "../autofill/commands/autofill-tab-command"; import { AutofillService as AutofillServiceAbstraction } from "../autofill/services/abstractions/autofill.service"; import AutofillService from "../autofill/services/autofill.service"; import { BrowserApi } from "../browser/browserApi"; @@ -543,9 +542,20 @@ export default class MainBackground { this.platformUtilsService.copyToClipboard(password, { window: window }); this.passwordGenerationService.addHistory(password); }, + async (tab, cipher) => { + this.loginToAutoFill = cipher; + if (tab == null) { + return; + } + + BrowserApi.tabSendMessage(tab, { + command: "collectPageDetails", + tab: tab, + sender: "contextMenu", + }); + }, this.authService, this.cipherService, - new AutofillTabCommand(this.autofillService), this.totpService, this.eventCollectionService ); From bc60a34e505c383ead3a9006228cee008d591d07 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 14 Feb 2023 18:13:34 +0100 Subject: [PATCH 013/232] Fix header stories (#4745) * Fix header stories * Add stories to tsconfig --- .../secrets-manager/shared/header.stories.ts | 35 ++++++++++++++----- bitwarden_license/bit-web/tsconfig.json | 3 +- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts index cb932b3f026..9a07786a646 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts @@ -1,16 +1,19 @@ import { Component, Injectable } from "@angular/core"; import { RouterModule } from "@angular/router"; import { Meta, Story, moduleMetadata, componentWrapperDecorator } from "@storybook/angular"; -import { Observable } from "rxjs"; +import { BehaviorSubject } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { + AvatarModule, BreadcrumbsModule, ButtonModule, - NavigationModule, - IconModule, IconButtonModule, + IconModule, + MenuModule, + NavigationModule, TabsModule, } from "@bitwarden/components"; import { InputModule } from "@bitwarden/components/src/input/input.module"; @@ -20,8 +23,14 @@ import { HeaderComponent } from "./header.component"; @Injectable() class MockStateService { - activeAccount$ = new Observable(); - accounts$ = new Observable(); + activeAccount$ = new BehaviorSubject("1").asObservable(); + accounts$ = new BehaviorSubject({ "1": { profile: { name: "Foo" } } }).asObservable(); +} + +class MockMessagingService implements MessagingService { + send(subscriber: string, arg?: any) { + alert(subscriber); + } } @Component({ @@ -49,17 +58,27 @@ export default { ], { useHash: true } ), + AvatarModule, BreadcrumbsModule, ButtonModule, - InputModule, - IconModule, IconButtonModule, + IconModule, + InputModule, + MenuModule, NavigationModule, PreloadedEnglishI18nModule, TabsModule, ], declarations: [HeaderComponent, MockProductSwitcher], - providers: [{ provide: StateService, useClass: MockStateService }], + providers: [ + { provide: StateService, useClass: MockStateService }, + { + provide: MessagingService, + useFactory: () => { + return new MockMessagingService(); + }, + }, + ], }), ], } as Meta; diff --git a/bitwarden_license/bit-web/tsconfig.json b/bitwarden_license/bit-web/tsconfig.json index c9b3f43cb95..34d5213e1c3 100644 --- a/bitwarden_license/bit-web/tsconfig.json +++ b/bitwarden_license/bit-web/tsconfig.json @@ -7,5 +7,6 @@ "@bitwarden/angular/*": ["../../libs/angular/src/*"], "@bitwarden/components": ["../../libs/components/src"] } - } + }, + "include": ["src/**/*.stories.ts"] } From 5dc1775cfcf5ce59ab9fcfe64d70d0839213bebb Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 14 Feb 2023 18:13:53 +0100 Subject: [PATCH 014/232] [SM-478] Resolve introduced eslint errors for button type (#4612) --- .../product-switcher/product-switcher.component.html | 3 +-- .../projects/project/project-secrets.component.html | 4 +--- .../projects-list/projects-list.component.html | 12 +++++++++--- .../secrets/dialog/secret-dialog.component.html | 2 +- .../access/access-list.component.html | 12 +++++++++--- .../dialogs/access-token-dialog.component.html | 4 +--- .../service-accounts/service-account.component.html | 10 +++++++--- .../service-accounts-list.component.html | 12 +++++++++--- .../app/secrets-manager/shared/header.component.html | 8 +++++--- .../secrets-manager/shared/new-menu.component.html | 10 +++++++--- .../shared/secrets-list.component.html | 12 +++++++++--- libs/components/src/banner/banner.component.html | 3 +-- .../src/breadcrumbs/breadcrumbs.component.html | 7 ++++--- .../simple-configurable-dialog.component.html | 10 +++++++--- .../src/navigation/nav-group.component.html | 3 +-- .../src/navigation/nav-item.component.html | 4 ++-- 16 files changed, 74 insertions(+), 42 deletions(-) diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher.component.html b/apps/web/src/app/layouts/product-switcher/product-switcher.component.html index 110aca26228..449557b6f4e 100644 --- a/apps/web/src/app/layouts/product-switcher/product-switcher.component.html +++ b/apps/web/src/app/layouts/product-switcher/product-switcher.component.html @@ -1,7 +1,6 @@ - - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.html index 78451436bb2..9f5830cda33 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects-list/projects-list.component.html @@ -1,5 +1,3 @@ - -
@@ -7,7 +5,13 @@ {{ "projectsNoItemsTitle" | i18n }} {{ "projectsNoItemsMessage" | i18n }} - @@ -31,6 +35,7 @@ {{ "lastEdited" | i18n }} @@ -33,6 +37,7 @@ {{ "lastEdited" | i18n }} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html index 4b1838edb25..12a26bb6cc0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html @@ -1,5 +1,3 @@ - - {{ "people" | i18n }} {{ "accessTokens" | i18n }} - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html index e976e113a98..a1f1730574a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html @@ -1,5 +1,3 @@ - -
@@ -7,7 +5,13 @@ {{ "serviceAccountsNoItemsTitle" | i18n }} {{ "serviceAccountsNoItemsMessage" | i18n }} - @@ -32,6 +36,7 @@ {{ "lastEdited" | i18n }} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html index 7b57a98c9a0..39b9e031a01 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html @@ -1,6 +1,10 @@ - - - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html index aeec7f818bc..509123931c4 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html @@ -1,5 +1,3 @@ - -
@@ -7,7 +5,13 @@ {{ "secretsNoItemsTitle" | i18n }} {{ "secretsNoItemsMessage" | i18n }} - @@ -32,6 +36,7 @@ {{ "lastEdited" | i18n }} @@ -70,6 +70,7 @@ @@ -128,6 +132,7 @@ @@ -230,6 +242,7 @@ + Date: Wed, 15 Feb 2023 17:59:11 +0000 Subject: [PATCH 024/232] Bump Desktop version to 2023.2.0 (#4773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [EC-1060] feat: center align table cell content (#4618) * [EC-1027] feat: remove `tw-text-sm` (#4617) (cherry picked from commit 807a13541862f133f6c544bf3d5d9eb59509c187) * Set checkForBreaches to true (checked) by default. (cherry picked from commit 28d5961ed3aab2cc804cf22946686f1bc72a4e82) * Open WebAuthn Prompt in New Tab (#4696) - We already did this for Firefox and Safari * Turn off checking for breaches in web for now (#4698) * [PS-2455] Catch and log contextmenu errors (#4699) * Set initRunning to true initRunning was checked and at the end set to false, but it never got set to true * Catch and log contextmenu errors (cherry picked from commit db202f9e9e8b7454c2fcf296c037658f4db62681) * Fix race condition when setting modal properties (#4701) (cherry picked from commit 1c18a73a56aeda281fe6c0b6b204a27346fcbdba) * SG-1047 Fix remember me on web (#4706) (cherry picked from commit d27ef74fe18e275958c4db3e430682edcc7141b0) * PS-2450 EC-1073 Do not decode and normalize query (#4708) Co-authored-by: Jake Fink (cherry picked from commit 13746c184031d9b1a67835044c023e9064e13262) * [Desktop/Browser] - Renew signing certificates (#4739) (cherry picked from commit 4438ab9e3aa4cc030dcd4cda30fc6a26a6905376) * Revert to MV2 Autofill Logic (#4705) * Bumped web version to 2023.2.0 (#4753) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> (cherry picked from commit 4e4de9812ee1b93e6ae6b38452735f3c97e2f749) * [EC-1074] fix: block interaction during async action (#4732) The user is able to interact with vault-items while actions like delete are happening. This commit is a temporary fix to disable all interaction surfaces during those async actions. (cherry picked from commit 957ed50c820476be752d6c159ff7f308dd05cb31) * Autosync the updated translations (#4712) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> (cherry picked from commit 6f45fbe2a03adf1befa7c5fcc7657908fc7cf44e) * Bump Browser version to 2023.2.0 (#4767) * [EC-1060] feat: center align table cell content (#4618) * [EC-1027] feat: remove `tw-text-sm` (#4617) (cherry picked from commit 807a13541862f133f6c544bf3d5d9eb59509c187) * Set checkForBreaches to true (checked) by default. (cherry picked from commit 28d5961ed3aab2cc804cf22946686f1bc72a4e82) * Open WebAuthn Prompt in New Tab (#4696) - We already did this for Firefox and Safari * Turn off checking for breaches in web for now (#4698) * [PS-2455] Catch and log contextmenu errors (#4699) * Set initRunning to true initRunning was checked and at the end set to false, but it never got set to true * Catch and log contextmenu errors (cherry picked from commit db202f9e9e8b7454c2fcf296c037658f4db62681) * Fix race condition when setting modal properties (#4701) (cherry picked from commit 1c18a73a56aeda281fe6c0b6b204a27346fcbdba) * SG-1047 Fix remember me on web (#4706) (cherry picked from commit d27ef74fe18e275958c4db3e430682edcc7141b0) * PS-2450 EC-1073 Do not decode and normalize query (#4708) Co-authored-by: Jake Fink (cherry picked from commit 13746c184031d9b1a67835044c023e9064e13262) * [Desktop/Browser] - Renew signing certificates (#4739) (cherry picked from commit 4438ab9e3aa4cc030dcd4cda30fc6a26a6905376) * Revert to MV2 Autofill Logic (#4705) * Bumped web version to 2023.2.0 (#4753) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> (cherry picked from commit 4e4de9812ee1b93e6ae6b38452735f3c97e2f749) * [EC-1074] fix: block interaction during async action (#4732) The user is able to interact with vault-items while actions like delete are happening. This commit is a temporary fix to disable all interaction surfaces during those async actions. (cherry picked from commit 957ed50c820476be752d6c159ff7f308dd05cb31) * Bumped browser version to 2023.2.0 --------- Co-authored-by: Andreas Coroiu Co-authored-by: Todd Martin Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> Co-authored-by: Robyn MacCallum Co-authored-by: Daniel James Smith Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Co-authored-by: Carlos Gonçalves Co-authored-by: Matt Gibson Co-authored-by: mimartin12 <77340197+mimartin12@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> Co-authored-by: Opeyemi Alao <54288773+Eeebru@users.noreply.github.com> (cherry picked from commit 61b6edadb3f6489de17e7b98e85d1b577ee3a40d) * Bumped desktop version to 2023.2.0 --------- Co-authored-by: Andreas Coroiu Co-authored-by: Todd Martin Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> Co-authored-by: Robyn MacCallum Co-authored-by: Daniel James Smith Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Co-authored-by: Carlos Gonçalves Co-authored-by: Matt Gibson Co-authored-by: mimartin12 <77340197+mimartin12@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> Co-authored-by: Opeyemi Alao <54288773+Eeebru@users.noreply.github.com> --- apps/desktop/package.json | 2 +- apps/desktop/src/package-lock.json | 4 ++-- apps/desktop/src/package.json | 2 +- package-lock.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 2d8d1aa36c2..73542570b07 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2023.1.2", + "version": "2023.2.0", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index e2abaf062ff..1daa0b6873c 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2023.1.2", + "version": "2023.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2023.1.2", + "version": "2023.2.0", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-native": "file:../desktop_native" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 4b37292ba00..6735f3aedd1 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2023.1.2", + "version": "2023.2.0", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/package-lock.json b/package-lock.json index d50f35af37e..fe62e5b0c44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -226,7 +226,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2023.1.2", + "version": "2023.2.0", "hasInstallScript": true, "license": "GPL-3.0" }, From ed69abe76c4bf25eb7516f8ba7ebea446454c178 Mon Sep 17 00:00:00 2001 From: Brandon Maharaj Date: Wed, 15 Feb 2023 13:04:43 -0500 Subject: [PATCH 025/232] [SG-1030] [Defect] - Difference in Default Color (#4645) * fix: use id in web * fix: adjust logic for org name badge to use id --- apps/web/src/app/layouts/navbar.component.html | 9 +++++++-- apps/web/src/app/settings/profile.component.html | 3 ++- .../organization-name-badge.component.ts | 11 ++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/web/src/app/layouts/navbar.component.html b/apps/web/src/app/layouts/navbar.component.html index ff96e851a44..77c14165048 100644 --- a/apps/web/src/app/layouts/navbar.component.html +++ b/apps/web/src/app/layouts/navbar.component.html @@ -47,7 +47,12 @@ [bitMenuTriggerFor]="accountMenu" class="tw-border-0 tw-bg-transparent tw-text-alt2 tw-opacity-70 hover:tw-opacity-90" > - + @@ -57,7 +62,7 @@ *ngIf="name" appStopProp > - +
{{ "loggedInAs" | i18n }} {{ diff --git a/apps/web/src/app/settings/profile.component.html b/apps/web/src/app/settings/profile.component.html index f4a887fe6e9..be0e58eaa1d 100644 --- a/apps/web/src/app/settings/profile.component.html +++ b/apps/web/src/app/settings/profile.component.html @@ -33,7 +33,8 @@
- + + + + + + {{ "automaticDomainVerificationProcess" | i18n }} + +
+
+ + + + +
+ + diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts new file mode 100644 index 00000000000..1bf22a1df4b --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts @@ -0,0 +1,270 @@ +import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from "@angular/forms"; +import { Subject, takeUntil } from "rxjs"; + +import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/abstractions/organization-domain/org-domain-api.service.abstraction"; +import { OrgDomainServiceAbstraction } from "@bitwarden/common/abstractions/organization-domain/org-domain.service.abstraction"; +import { OrganizationDomainResponse } from "@bitwarden/common/abstractions/organization-domain/responses/organization-domain.response"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; +import { HttpStatusCode } from "@bitwarden/common/enums/http-status-code.enum"; +import { Utils } from "@bitwarden/common/misc/utils"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { OrganizationDomainRequest } from "@bitwarden/common/services/organization-domain/requests/organization-domain.request"; + +import { domainNameValidator } from "./validators/domain-name.validator"; +import { uniqueInArrayValidator } from "./validators/unique-in-array.validator"; +export interface DomainAddEditDialogData { + organizationId: string; + orgDomain: OrganizationDomainResponse; + existingDomainNames: Array; +} + +@Component({ + selector: "app-domain-add-edit-dialog", + templateUrl: "domain-add-edit-dialog.component.html", +}) +export class DomainAddEditDialogComponent implements OnInit, OnDestroy { + private componentDestroyed$: Subject = new Subject(); + + domainForm: FormGroup = this.formBuilder.group({ + domainName: [ + "", + [ + Validators.required, + domainNameValidator(this.i18nService.t("invalidDomainNameMessage")), + uniqueInArrayValidator( + this.data.existingDomainNames, + this.i18nService.t("duplicateDomainError") + ), + ], + ], + txt: [{ value: null, disabled: true }], + }); + + get domainNameCtrl(): FormControl { + return this.domainForm.controls.domainName as FormControl; + } + get txtCtrl(): FormControl { + return this.domainForm.controls.txt as FormControl; + } + + rejectedDomainNameValidator: ValidatorFn = null; + + rejectedDomainNames: Array = []; + + constructor( + public dialogRef: DialogRef, + @Inject(DIALOG_DATA) public data: DomainAddEditDialogData, + private formBuilder: FormBuilder, + private cryptoFunctionService: CryptoFunctionServiceAbstraction, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + private orgDomainApiService: OrgDomainApiServiceAbstraction, + private orgDomainService: OrgDomainServiceAbstraction, + private validationService: ValidationService + ) {} + + //#region Angular Method Implementations + + async ngOnInit(): Promise { + // If we have data.orgDomain, then editing, otherwise creating new domain + await this.populateForm(); + } + + ngOnDestroy(): void { + this.componentDestroyed$.next(); + this.componentDestroyed$.complete(); + } + + //#endregion + + //#region Form methods + + async populateForm(): Promise { + if (this.data.orgDomain) { + // Edit + this.domainForm.patchValue(this.data.orgDomain); + this.domainForm.disable(); + } else { + // Add + + // Figuring out the proper length of our DNS TXT Record value was fun. + // DNS-Based Service Discovery RFC: https://www.ietf.org/rfc/rfc6763.txt; see section 6.1 + // Google uses 43 chars for their TXT record value: https://support.google.com/a/answer/2716802 + // So, chose a magic # of 33 bytes to achieve at least that once converted to base 64 (47 char length). + const generatedTxt = `bw=${Utils.fromBufferToB64( + await this.cryptoFunctionService.randomBytes(33) + )}`; + this.txtCtrl.setValue(generatedTxt); + } + + this.setupFormListeners(); + } + + setupFormListeners(): void { + // suppresses touched state on change for reactive form controls + // Manually set touched to show validation errors as the user stypes + this.domainForm.valueChanges.pipe(takeUntil(this.componentDestroyed$)).subscribe(() => { + this.domainForm.markAllAsTouched(); + }); + } + + copyDnsTxt(): void { + this.orgDomainService.copyDnsTxt(this.txtCtrl.value); + } + + //#endregion + + //#region Async Form Actions + saveDomain = async (): Promise => { + if (this.domainForm.invalid) { + this.platformUtilsService.showToast("error", null, this.i18nService.t("domainFormInvalid")); + return; + } + + this.domainNameCtrl.disable(); + + const request: OrganizationDomainRequest = new OrganizationDomainRequest( + this.txtCtrl.value, + this.domainNameCtrl.value + ); + + try { + this.data.orgDomain = await this.orgDomainApiService.post(this.data.organizationId, request); + this.platformUtilsService.showToast("success", null, this.i18nService.t("domainSaved")); + await this.verifyDomain(); + } catch (e) { + this.handleDomainSaveError(e); + } + }; + + private handleDomainSaveError(e: any): void { + if (e instanceof ErrorResponse) { + const errorResponse: ErrorResponse = e as ErrorResponse; + switch (errorResponse.statusCode) { + case HttpStatusCode.Conflict: + if (errorResponse.message.includes("The domain is not available to be claimed")) { + // If user has attempted to claim a different rejected domain first: + if (this.rejectedDomainNameValidator) { + // Remove the validator: + this.domainNameCtrl.removeValidators(this.rejectedDomainNameValidator); + this.domainNameCtrl.updateValueAndValidity(); + } + + // Update rejected domain names and add new unique in validator + // which will prevent future known bad domain name submissions. + this.rejectedDomainNames.push(this.domainNameCtrl.value); + + this.rejectedDomainNameValidator = uniqueInArrayValidator( + this.rejectedDomainNames, + this.i18nService.t("domainNotAvailable", this.domainNameCtrl.value) + ); + + this.domainNameCtrl.addValidators(this.rejectedDomainNameValidator); + this.domainNameCtrl.updateValueAndValidity(); + + // Give them another chance to enter a new domain name: + this.domainForm.enable(); + } else { + this.validationService.showError(errorResponse); + } + + break; + + default: + this.validationService.showError(errorResponse); + break; + } + } else { + this.validationService.showError(e); + } + } + + verifyDomain = async (): Promise => { + if (this.domainForm.invalid) { + // Note: shouldn't be possible, but going to leave this to be safe. + this.platformUtilsService.showToast("error", null, this.i18nService.t("domainFormInvalid")); + return; + } + + try { + this.data.orgDomain = await this.orgDomainApiService.verify( + this.data.organizationId, + this.data.orgDomain.id + ); + + if (this.data.orgDomain.verifiedDate) { + this.platformUtilsService.showToast("success", null, this.i18nService.t("domainVerified")); + this.dialogRef.close(); + } else { + this.domainNameCtrl.setErrors({ + errorPassthrough: { + message: this.i18nService.t("domainNotVerified", this.domainNameCtrl.value), + }, + }); + // For the case where user opens dialog and reverifies when domain name formControl disabled. + // The input directive only shows error if touched, so must manually mark as touched. + this.domainNameCtrl.markAsTouched(); + // Update this item so the last checked date gets updated. + await this.updateOrgDomain(); + } + } catch (e) { + this.handleVerifyDomainError(e, this.domainNameCtrl.value); + // Update this item so the last checked date gets updated. + await this.updateOrgDomain(); + } + }; + + private handleVerifyDomainError(e: any, domainName: string): void { + if (e instanceof ErrorResponse) { + const errorResponse: ErrorResponse = e as ErrorResponse; + switch (errorResponse.statusCode) { + case HttpStatusCode.Conflict: + if (errorResponse.message.includes("The domain is not available to be claimed")) { + this.domainNameCtrl.setErrors({ + errorPassthrough: { + message: this.i18nService.t("domainNotAvailable", domainName), + }, + }); + } + break; + + default: + this.validationService.showError(errorResponse); + break; + } + } + } + + private async updateOrgDomain() { + // Update this item so the last checked date gets updated. + await this.orgDomainApiService.getByOrgIdAndOrgDomainId( + this.data.organizationId, + this.data.orgDomain.id + ); + } + + deleteDomain = async (): Promise => { + const confirmed = await this.platformUtilsService.showDialog( + this.i18nService.t("removeDomainWarning"), + this.i18nService.t("removeDomain"), + this.i18nService.t("yes"), + this.i18nService.t("no"), + "warning" + ); + if (!confirmed) { + return; + } + + await this.orgDomainApiService.delete(this.data.organizationId, this.data.orgDomain.id); + this.platformUtilsService.showToast("success", null, this.i18nService.t("domainRemoved")); + + this.dialogRef.close(); + }; + + //#endregion +} diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/domain-name.validator.ts b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/domain-name.validator.ts new file mode 100644 index 00000000000..e49ca16e193 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/domain-name.validator.ts @@ -0,0 +1,47 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from "@angular/forms"; + +export function domainNameValidator(errorMessage: string): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + // Domain labels (sections) are only allowed to be 63 chars in length max + // 1st and last chars cannot be hyphens per RFC 3696 (https://www.rfc-editor.org/rfc/rfc3696#section-2) + // We do not want any prefixes per industry standards. + + // Must support top-level domains and any number of subdomains. + // / # start regex + // ^ # start of string + // (?!(http(s)?:\/\/|www\.)) # negative lookahead to check if input doesn't match "http://", "https://" or "www." + // [a-zA-Z0-9] # first character must be a letter or a number + // [a-zA-Z0-9-]{0,61} # domain name can have 0 to 61 characters that are letters, numbers, or hyphens + // [a-zA-Z0-9] # domain name must end with a letter or a number + // (?: # start of non-capturing group (subdomain sections are optional) + // \. # subdomain must have a period + // [a-zA-Z0-9] # first character of subdomain must be a letter or a number + // [a-zA-Z0-9-]{0,61} # subdomain can have 0 to 61 characters that are letters, numbers, or hyphens + // [a-zA-Z0-9] # subdomain must end with a letter or a number + // )* # end of non-capturing group (subdomain sections are optional) + // \. # domain name must have a period + // [a-zA-Z]{2,} # domain name must have at least two letters (the domain extension) + // $/ # end of string + + const validDomainNameRegex = + /^(?!(http(s)?:\/\/|www\.))[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9](?:\.[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])*\.[a-zA-Z]{2,}$/; + + const invalid = !validDomainNameRegex.test(control.value); + + if (invalid) { + return { + invalidDomainName: { + message: errorMessage, + }, + }; + } + + return null; + }; +} diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/unique-in-array.validator.ts b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/unique-in-array.validator.ts new file mode 100644 index 00000000000..4659a265959 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-add-edit-dialog/validators/unique-in-array.validator.ts @@ -0,0 +1,23 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from "@angular/forms"; +export function uniqueInArrayValidator(values: Array, errorMessage: string): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const lowerTrimmedValue = value.toLowerCase().trim(); + + // check if the entered value is unique + if (values.some((val) => val.toLowerCase().trim() === lowerTrimmedValue)) { + return { + nonUniqueValue: { + message: errorMessage, + }, + }; + } + + return null; + }; +} diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.html b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.html new file mode 100644 index 00000000000..94ddad3c175 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.html @@ -0,0 +1,105 @@ +
+

{{ "domainVerification" | i18n }}

+ + +
+ + + + {{ "loading" | i18n }} + + + + +
+ + + + {{ "name" | i18n }} + {{ "status" | i18n }} + {{ "lastChecked" | i18n }} + {{ "options" | i18n }} + + + + + + {{ + orgDomain.domainName + }} + + + {{ + "domainStatusUnverified" | i18n + }} + {{ + "domainStatusVerified" | i18n + }} + + + {{ orgDomain.lastCheckedDate | date: "medium" }} + + + + + + + + + + + + + +
+ +
+ + +
+ {{ "noDomains" | i18n }} +
+ +
+ + {{ "noDomainsSubText" | i18n }} + +
+ + +
+ + diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.ts b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.ts new file mode 100644 index 00000000000..300e90dc21e --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/domain-verification/domain-verification.component.ts @@ -0,0 +1,179 @@ +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute, Params } from "@angular/router"; +import { concatMap, Observable, Subject, take, takeUntil } from "rxjs"; + +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/abstractions/organization-domain/org-domain-api.service.abstraction"; +import { OrgDomainServiceAbstraction } from "@bitwarden/common/abstractions/organization-domain/org-domain.service.abstraction"; +import { OrganizationDomainResponse } from "@bitwarden/common/abstractions/organization-domain/responses/organization-domain.response"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; +import { HttpStatusCode } from "@bitwarden/common/enums/http-status-code.enum"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { DialogService } from "@bitwarden/components"; + +import { + DomainAddEditDialogComponent, + DomainAddEditDialogData, +} from "./domain-add-edit-dialog/domain-add-edit-dialog.component"; + +@Component({ + selector: "app-org-manage-domain-verification", + templateUrl: "domain-verification.component.html", +}) +export class DomainVerificationComponent implements OnInit, OnDestroy { + private componentDestroyed$ = new Subject(); + + loading = true; + + organizationId: string; + orgDomains$: Observable; + + constructor( + private route: ActivatedRoute, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + private orgDomainApiService: OrgDomainApiServiceAbstraction, + private orgDomainService: OrgDomainServiceAbstraction, + private dialogService: DialogService, + private validationService: ValidationService + ) {} + + // eslint-disable-next-line @typescript-eslint/no-empty-function + async ngOnInit() { + this.orgDomains$ = this.orgDomainService.orgDomains$; + + // Note: going to use concatMap as async subscribe blocks don't work as you expect and + // as such, ESLint rejects it + // ex: https://stackoverflow.com/a/71056380 + this.route.params + .pipe( + concatMap(async (params: Params) => { + this.organizationId = params.organizationId; + await this.load(); + }), + takeUntil(this.componentDestroyed$) + ) + .subscribe(); + } + + async load() { + await this.orgDomainApiService.getAllByOrgId(this.organizationId); + + this.loading = false; + } + + addDomain() { + const domainAddEditDialogData: DomainAddEditDialogData = { + organizationId: this.organizationId, + orgDomain: null, + existingDomainNames: this.getExistingDomainNames(), + }; + + this.dialogService.open(DomainAddEditDialogComponent, { + data: domainAddEditDialogData, + }); + } + + editDomain(orgDomain: OrganizationDomainResponse) { + const domainAddEditDialogData: DomainAddEditDialogData = { + organizationId: this.organizationId, + orgDomain: orgDomain, + existingDomainNames: this.getExistingDomainNames(), + }; + + this.dialogService.open(DomainAddEditDialogComponent, { + data: domainAddEditDialogData, + }); + } + + private getExistingDomainNames(): Array { + let existingDomainNames: string[]; + // eslint-disable-next-line rxjs-angular/prefer-takeuntil + this.orgDomains$.pipe(take(1)).subscribe((orgDomains: Array) => { + existingDomainNames = orgDomains.map((o) => o.domainName); + }); + return existingDomainNames; + } + + //#region Options + + copyDnsTxt(dnsTxt: string): void { + this.orgDomainService.copyDnsTxt(dnsTxt); + } + + async verifyDomain(orgDomainId: string, domainName: string): Promise { + try { + const orgDomain: OrganizationDomainResponse = await this.orgDomainApiService.verify( + this.organizationId, + orgDomainId + ); + + if (orgDomain.verifiedDate) { + this.platformUtilsService.showToast("success", null, this.i18nService.t("domainVerified")); + } else { + this.platformUtilsService.showToast( + "error", + null, + this.i18nService.t("domainNotVerified", domainName) + ); + // Update this item so the last checked date gets updated. + await this.updateOrgDomain(orgDomainId); + } + } catch (e) { + this.handleVerifyDomainError(e, domainName); + // Update this item so the last checked date gets updated. + await this.updateOrgDomain(orgDomainId); + } + } + + private async updateOrgDomain(orgDomainId: string) { + // Update this item so the last checked date gets updated. + await this.orgDomainApiService.getByOrgIdAndOrgDomainId(this.organizationId, orgDomainId); + } + + private handleVerifyDomainError(e: any, domainName: string): void { + if (e instanceof ErrorResponse) { + const errorResponse: ErrorResponse = e as ErrorResponse; + switch (errorResponse.statusCode) { + case HttpStatusCode.Conflict: + if (errorResponse.message.includes("The domain is not available to be claimed")) { + this.platformUtilsService.showToast( + "error", + null, + this.i18nService.t("domainNotAvailable", domainName) + ); + } + break; + + default: + this.validationService.showError(errorResponse); + break; + } + } + } + + async deleteDomain(orgDomainId: string): Promise { + const confirmed = await this.platformUtilsService.showDialog( + this.i18nService.t("removeDomainWarning"), + this.i18nService.t("removeDomain"), + this.i18nService.t("yes"), + this.i18nService.t("no"), + "warning" + ); + if (!confirmed) { + return; + } + + await this.orgDomainApiService.delete(this.organizationId, orgDomainId); + + this.platformUtilsService.showToast("success", null, this.i18nService.t("domainRemoved")); + } + + //#endregion + + ngOnDestroy(): void { + this.componentDestroyed$.next(); + this.componentDestroyed$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts b/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts index 7215102e956..f3b3826bb80 100644 --- a/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts @@ -10,6 +10,7 @@ import { SettingsComponent } from "@bitwarden/web-vault/app/organizations/settin import { SsoComponent } from "../auth/sso.component"; +import { DomainVerificationComponent } from "./manage/domain-verification/domain-verification.component"; import { ScimComponent } from "./manage/scim.component"; const routes: Routes = [ @@ -26,6 +27,14 @@ const routes: Routes = [ organizationPermissions: canAccessSettingsTab, }, children: [ + { + path: "domain-verification", + component: DomainVerificationComponent, + canActivate: [OrganizationPermissionsGuard], + data: { + organizationPermissions: (org: Organization) => org.canManageDomainVerification, + }, + }, { path: "sso", component: SsoComponent, diff --git a/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts b/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts index fd33bca0b06..09d14015a6f 100644 --- a/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts +++ b/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts @@ -5,11 +5,19 @@ import { SharedModule } from "@bitwarden/web-vault/app/shared/shared.module"; import { SsoComponent } from "../auth/sso.component"; import { InputCheckboxComponent } from "./components/input-checkbox.component"; +import { DomainAddEditDialogComponent } from "./manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component"; +import { DomainVerificationComponent } from "./manage/domain-verification/domain-verification.component"; import { ScimComponent } from "./manage/scim.component"; import { OrganizationsRoutingModule } from "./organizations-routing.module"; @NgModule({ imports: [SharedModule, OrganizationsRoutingModule], - declarations: [InputCheckboxComponent, SsoComponent, ScimComponent], + declarations: [ + InputCheckboxComponent, + SsoComponent, + ScimComponent, + DomainVerificationComponent, + DomainAddEditDialogComponent, + ], }) export class OrganizationsModule {} diff --git a/libs/angular/src/auth/components/login.component.ts b/libs/angular/src/auth/components/login.component.ts index 17210287778..88c0a356fa8 100644 --- a/libs/angular/src/auth/components/login.component.ts +++ b/libs/angular/src/auth/components/login.component.ts @@ -221,7 +221,9 @@ export class LoginComponent extends CaptchaProtectedComponent implements OnInit "&state=" + state + "&codeChallenge=" + - codeChallenge + codeChallenge + + "&email=" + + encodeURIComponent(this.formGroup.controls.email.value) ); } diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 12fb2c11d76..b67a3f1bf19 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -22,6 +22,11 @@ import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstrac import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/common/abstractions/messaging.service"; import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service"; +import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/abstractions/organization-domain/org-domain-api.service.abstraction"; +import { + OrgDomainServiceAbstraction, + OrgDomainInternalServiceAbstraction, +} from "@bitwarden/common/abstractions/organization-domain/org-domain.service.abstraction"; import { OrganizationUserService } from "@bitwarden/common/abstractions/organization-user/organization-user.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { @@ -91,6 +96,8 @@ import { ExportService } from "@bitwarden/common/services/export.service"; import { FileUploadService } from "@bitwarden/common/services/fileUpload.service"; import { FormValidationErrorsService } from "@bitwarden/common/services/formValidationErrors.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; +import { OrgDomainApiService } from "@bitwarden/common/services/organization-domain/org-domain-api.service"; +import { OrgDomainService } from "@bitwarden/common/services/organization-domain/org-domain.service"; import { OrganizationUserServiceImplementation } from "@bitwarden/common/services/organization-user/organization-user.service.implementation"; import { OrganizationApiService } from "@bitwarden/common/services/organization/organization-api.service"; import { OrganizationService } from "@bitwarden/common/services/organization/organization.service"; @@ -610,6 +617,20 @@ import { AbstractThemingService } from "./theming/theming.service.abstraction"; useClass: LoginService, deps: [StateServiceAbstraction], }, + { + provide: OrgDomainServiceAbstraction, + useClass: OrgDomainService, + deps: [PlatformUtilsServiceAbstraction, I18nServiceAbstraction], + }, + { + provide: OrgDomainInternalServiceAbstraction, + useExisting: OrgDomainServiceAbstraction, + }, + { + provide: OrgDomainApiServiceAbstraction, + useClass: OrgDomainApiService, + deps: [OrgDomainServiceAbstraction, ApiServiceAbstraction], + }, ], }) export class JslibServicesModule {} diff --git a/libs/common/spec/services/organization-domain/org-domain-api.service.spec.ts b/libs/common/spec/services/organization-domain/org-domain-api.service.spec.ts new file mode 100644 index 00000000000..d6299652f3d --- /dev/null +++ b/libs/common/spec/services/organization-domain/org-domain-api.service.spec.ts @@ -0,0 +1,173 @@ +import { mock, mockReset } from "jest-mock-extended"; +import { lastValueFrom } from "rxjs"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { OrganizationDomainResponse } from "@bitwarden/common/abstractions/organization-domain/responses/organization-domain.response"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { OrgDomainApiService } from "@bitwarden/common/services/organization-domain/org-domain-api.service"; +import { OrgDomainService } from "@bitwarden/common/services/organization-domain/org-domain.service"; + +const mockedGetAllByOrgIdResponse: any = { + data: [ + { + id: "ca01a674-7f2f-45f2-8245-af6d016416b7", + organizationId: "cb903acf-2361-4072-ae32-af6c014943b6", + txt: "bw=EUX6UKR8A68igAJkmodwkzMiqB00u7Iyq1QqALu6jFID", + domainName: "test.com", + creationDate: "2022-12-16T21:36:28.68Z", + nextRunDate: "2022-12-17T09:36:28.68Z", + jobRunCount: 0, + verifiedDate: null as any, + lastCheckedDate: "2022-12-16T21:36:28.7633333Z", + object: "organizationDomain", + }, + { + id: "adbd44c5-90d5-4537-97e6-af6d01644870", + organizationId: "cb903acf-2361-4072-ae32-af6c014943b6", + txt: "bw=Ql4fCfDacmcjwyAP9BPmvhSMTCz4PkEDm4uQ3fH01pD4", + domainName: "test2.com", + creationDate: "2022-12-16T21:37:10.9566667Z", + nextRunDate: "2022-12-17T09:37:10.9566667Z", + jobRunCount: 0, + verifiedDate: "totally verified", + lastCheckedDate: "2022-12-16T21:37:11.1933333Z", + object: "organizationDomain", + }, + { + id: "05cf3ab8-bcfe-4b95-92e8-af6d01680942", + organizationId: "cb903acf-2361-4072-ae32-af6c014943b6", + txt: "bw=EQNUs77BWQHbfSiyc/9nT3wCen9z2yMn/ABCz0cNKaTx", + domainName: "test3.com", + creationDate: "2022-12-16T21:50:50.96Z", + nextRunDate: "2022-12-17T09:50:50.96Z", + jobRunCount: 0, + verifiedDate: null, + lastCheckedDate: "2022-12-16T21:50:51.0933333Z", + object: "organizationDomain", + }, + ], + continuationToken: null as any, + object: "list", +}; + +const mockedOrgDomainServerResponse = { + id: "ca01a674-7f2f-45f2-8245-af6d016416b7", + organizationId: "cb903acf-2361-4072-ae32-af6c014943b6", + txt: "bw=EUX6UKR8A68igAJkmodwkzMiqB00u7Iyq1QqALu6jFID", + domainName: "test.com", + creationDate: "2022-12-16T21:36:28.68Z", + nextRunDate: "2022-12-17T09:36:28.68Z", + jobRunCount: 0, + verifiedDate: null as any, + lastCheckedDate: "2022-12-16T21:36:28.7633333Z", + object: "organizationDomain", +}; + +const mockedOrgDomainResponse = new OrganizationDomainResponse(mockedOrgDomainServerResponse); + +describe("Org Domain API Service", () => { + let orgDomainApiService: OrgDomainApiService; + + const apiService = mock(); + + let orgDomainService: OrgDomainService; + + const platformUtilService = mock(); + const i18nService = mock(); + + beforeEach(() => { + orgDomainService = new OrgDomainService(platformUtilService, i18nService); + mockReset(apiService); + + orgDomainApiService = new OrgDomainApiService(orgDomainService, apiService); + }); + + it("instantiates", () => { + expect(orgDomainApiService).not.toBeFalsy(); + }); + + it("getAllByOrgId retrieves all org domains and calls orgDomainSvc replace", () => { + apiService.send.mockResolvedValue(mockedGetAllByOrgIdResponse); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + + const orgDomainSvcReplaceSpy = jest.spyOn(orgDomainService, "replace"); + + orgDomainApiService + .getAllByOrgId("fakeOrgId") + .then((orgDomainResponses: Array) => { + expect(orgDomainResponses).toHaveLength(3); + + expect(orgDomainSvcReplaceSpy).toHaveBeenCalled(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(3); + }); + }); + + it("getByOrgIdAndOrgDomainId retrieves single org domain and calls orgDomainSvc upsert", () => { + apiService.send.mockResolvedValue(mockedOrgDomainServerResponse); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + + const orgDomainSvcUpsertSpy = jest.spyOn(orgDomainService, "upsert"); + + orgDomainApiService + .getByOrgIdAndOrgDomainId("fakeOrgId", "fakeDomainId") + .then((orgDomain: OrganizationDomainResponse) => { + expect(orgDomain.id).toEqual(mockedOrgDomainServerResponse.id); + + expect(orgDomainSvcUpsertSpy).toHaveBeenCalled(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(1); + }); + }); + + it("post success should call orgDomainSvc upsert", () => { + apiService.send.mockResolvedValue(mockedOrgDomainServerResponse); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + + const orgDomainSvcUpsertSpy = jest.spyOn(orgDomainService, "upsert"); + + orgDomainApiService + .post("fakeOrgId", mockedOrgDomainResponse) + .then((orgDomain: OrganizationDomainResponse) => { + expect(orgDomain.id).toEqual(mockedOrgDomainServerResponse.id); + + expect(orgDomainSvcUpsertSpy).toHaveBeenCalled(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(1); + }); + }); + + it("verify success should call orgDomainSvc upsert", () => { + apiService.send.mockResolvedValue(mockedOrgDomainServerResponse); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + + const orgDomainSvcUpsertSpy = jest.spyOn(orgDomainService, "upsert"); + + orgDomainApiService + .verify("fakeOrgId", "fakeOrgId") + .then((orgDomain: OrganizationDomainResponse) => { + expect(orgDomain.id).toEqual(mockedOrgDomainServerResponse.id); + + expect(orgDomainSvcUpsertSpy).toHaveBeenCalled(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(1); + }); + }); + + it("delete success should call orgDomainSvc delete", () => { + apiService.send.mockResolvedValue(true); + orgDomainService.upsert([mockedOrgDomainResponse]); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(1); + + const orgDomainSvcDeleteSpy = jest.spyOn(orgDomainService, "delete"); + + orgDomainApiService.delete("fakeOrgId", "fakeOrgId").then(() => { + expect(orgDomainSvcDeleteSpy).toHaveBeenCalled(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + }); + }); + + // TODO: add Get Domain SSO method: Retrieves SSO provider information given a domain name + // when added on back end +}); diff --git a/libs/common/spec/services/organization-domain/org-domain.service.spec.ts b/libs/common/spec/services/organization-domain/org-domain.service.spec.ts new file mode 100644 index 00000000000..e4e61d4e227 --- /dev/null +++ b/libs/common/spec/services/organization-domain/org-domain.service.spec.ts @@ -0,0 +1,168 @@ +import { mock, mockReset } from "jest-mock-extended"; +import { lastValueFrom } from "rxjs"; + +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { OrganizationDomainResponse } from "@bitwarden/common/abstractions/organization-domain/responses/organization-domain.response"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { OrgDomainService } from "@bitwarden/common/services/organization-domain/org-domain.service"; + +const mockedUnverifiedDomainServerResponse = { + creationDate: "2022-12-13T23:16:43.7066667Z", + domainName: "bacon.com", + id: "12eac4ea-9ed8-4dd4-85da-af6a017f9f97", + jobRunCount: 0, + lastCheckedDate: "2022-12-13T23:16:43.8033333Z", + nextRunDate: "2022-12-14T11:16:43.7066667Z", + object: "organizationDomain", + organizationId: "e4bffa5e-6602-4bc7-a83f-af55016566ef", + txt: "bw=eRBGgwJhZk0Kmpd8qPdSrrkSsTD006B+JgmMztk4XjDX", + verifiedDate: null as any, +}; + +const mockedVerifiedDomainServerResponse = { + creationDate: "2022-12-13T23:16:43.7066667Z", + domainName: "cat.com", + id: "58715f70-8650-4a42-9d4a-af6a0188151b", + jobRunCount: 0, + lastCheckedDate: "2022-12-13T23:16:43.8033333Z", + nextRunDate: "2022-12-14T11:16:43.7066667Z", + object: "organizationDomain", + organizationId: "e4bffa5e-6602-4bc7-a83f-af55016566ef", + txt: "bw=eRBGgwJhZk0Kmpd8qPdSrrkSsTD006B+JgmMztk4XjDX", + verifiedDate: "2022-12-13T23:16:43.7066667Z", +}; + +const mockedExtraDomainServerResponse = { + creationDate: "2022-12-13T23:16:43.7066667Z", + domainName: "dog.com", + id: "fac7cdb6-283e-4805-aa55-af6b016bf699", + jobRunCount: 0, + lastCheckedDate: "2022-12-13T23:16:43.8033333Z", + nextRunDate: "2022-12-14T11:16:43.7066667Z", + object: "organizationDomain", + organizationId: "e4bffa5e-6602-4bc7-a83f-af55016566ef", + txt: "bw=eRBGgwJhZk0Kmpd8qPdSrrkSsTD006B+JgmMztk4XjDX", + verifiedDate: null as any, +}; + +const mockedUnverifiedOrgDomainResponse = new OrganizationDomainResponse( + mockedUnverifiedDomainServerResponse +); +const mockedVerifiedOrgDomainResponse = new OrganizationDomainResponse( + mockedVerifiedDomainServerResponse +); + +const mockedExtraOrgDomainResponse = new OrganizationDomainResponse( + mockedExtraDomainServerResponse +); + +describe("Org Domain Service", () => { + let orgDomainService: OrgDomainService; + + const platformUtilService = mock(); + const i18nService = mock(); + + beforeEach(() => { + mockReset(platformUtilService); + mockReset(i18nService); + + orgDomainService = new OrgDomainService(platformUtilService, i18nService); + }); + + it("instantiates", () => { + expect(orgDomainService).not.toBeFalsy(); + }); + + it("orgDomains$ public observable exists and instantiates w/ empty array", () => { + expect(orgDomainService.orgDomains$).toBeDefined(); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toEqual([]); + }); + + it("replace and clear work", () => { + const newOrgDomains = [mockedUnverifiedOrgDomainResponse, mockedVerifiedOrgDomainResponse]; + + orgDomainService.replace(newOrgDomains); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toEqual(newOrgDomains); + + orgDomainService.clearCache(); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toEqual([]); + }); + + it("get successfully retrieves org domain by id", () => { + const orgDomains = [mockedUnverifiedOrgDomainResponse, mockedVerifiedOrgDomainResponse]; + orgDomainService.replace(orgDomains); + + expect(orgDomainService.get(mockedVerifiedOrgDomainResponse.id)).toEqual( + mockedVerifiedOrgDomainResponse + ); + + expect(orgDomainService.get(mockedUnverifiedOrgDomainResponse.id)).toEqual( + mockedUnverifiedOrgDomainResponse + ); + }); + + it("upsert both updates an existing org domain and adds a new one", () => { + const orgDomains = [mockedUnverifiedOrgDomainResponse, mockedVerifiedOrgDomainResponse]; + orgDomainService.replace(orgDomains); + + const changedOrgDomain = new OrganizationDomainResponse(mockedVerifiedDomainServerResponse); + changedOrgDomain.domainName = "changed domain name"; + + expect(mockedVerifiedOrgDomainResponse.domainName).not.toEqual(changedOrgDomain.domainName); + + orgDomainService.upsert([changedOrgDomain]); + + expect(orgDomainService.get(mockedVerifiedOrgDomainResponse.id).domainName).toEqual( + changedOrgDomain.domainName + ); + + const newOrgDomain = new OrganizationDomainResponse({ + creationDate: "2022-12-13T23:16:43.7066667Z", + domainName: "cat.com", + id: "magical-cat-id-number-999", + jobRunCount: 0, + lastCheckedDate: "2022-12-13T23:16:43.8033333Z", + nextRunDate: "2022-12-14T11:16:43.7066667Z", + object: "organizationDomain", + organizationId: "e4bffa5e-6602-4bc7-a83f-af55016566ef", + txt: "bw=eRBGgwJhZk0Kmpd8qPdSrrkSsTD006B+JgmMztk4XjDX", + verifiedDate: null as any, + }); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(2); + + orgDomainService.upsert([newOrgDomain]); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(3); + + expect(orgDomainService.get(newOrgDomain.id)).toEqual(newOrgDomain); + }); + + it("delete successfully removes multiple org domains", () => { + const orgDomains = [ + mockedUnverifiedOrgDomainResponse, + mockedVerifiedOrgDomainResponse, + mockedExtraOrgDomainResponse, + ]; + orgDomainService.replace(orgDomains); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(3); + + orgDomainService.delete([mockedUnverifiedOrgDomainResponse.id]); + + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(2); + expect(orgDomainService.get(mockedUnverifiedOrgDomainResponse.id)).toEqual(undefined); + + orgDomainService.delete([mockedVerifiedOrgDomainResponse.id, mockedExtraOrgDomainResponse.id]); + expect(lastValueFrom(orgDomainService.orgDomains$)).resolves.toHaveLength(0); + expect(orgDomainService.get(mockedVerifiedOrgDomainResponse.id)).toEqual(undefined); + expect(orgDomainService.get(mockedExtraOrgDomainResponse.id)).toEqual(undefined); + }); + + it("copyDnsTxt copies DNS TXT to clipboard and shows toast", () => { + orgDomainService.copyDnsTxt("fakeTxt"); + expect(jest.spyOn(platformUtilService, "copyToClipboard")).toHaveBeenCalled(); + expect(jest.spyOn(platformUtilService, "showToast")).toHaveBeenCalled(); + }); +}); diff --git a/libs/common/src/abstractions/organization-domain/org-domain-api.service.abstraction.ts b/libs/common/src/abstractions/organization-domain/org-domain-api.service.abstraction.ts new file mode 100644 index 00000000000..afb3703581d --- /dev/null +++ b/libs/common/src/abstractions/organization-domain/org-domain-api.service.abstraction.ts @@ -0,0 +1,19 @@ +import { OrganizationDomainRequest } from "../../services/organization-domain/requests/organization-domain.request"; + +import { OrganizationDomainSsoDetailsResponse } from "./responses/organization-domain-sso-details.response"; +import { OrganizationDomainResponse } from "./responses/organization-domain.response"; + +export abstract class OrgDomainApiServiceAbstraction { + getAllByOrgId: (orgId: string) => Promise>; + getByOrgIdAndOrgDomainId: ( + orgId: string, + orgDomainId: string + ) => Promise; + post: ( + orgId: string, + orgDomain: OrganizationDomainRequest + ) => Promise; + verify: (orgId: string, orgDomainId: string) => Promise; + delete: (orgId: string, orgDomainId: string) => Promise; + getClaimedOrgDomainByEmail: (email: string) => Promise; +} diff --git a/libs/common/src/abstractions/organization-domain/org-domain.service.abstraction.ts b/libs/common/src/abstractions/organization-domain/org-domain.service.abstraction.ts new file mode 100644 index 00000000000..ba8a7a2dd2d --- /dev/null +++ b/libs/common/src/abstractions/organization-domain/org-domain.service.abstraction.ts @@ -0,0 +1,20 @@ +import { Observable } from "rxjs"; + +import { OrganizationDomainResponse } from "./responses/organization-domain.response"; + +export abstract class OrgDomainServiceAbstraction { + orgDomains$: Observable; + + get: (orgDomainId: string) => OrganizationDomainResponse; + + copyDnsTxt: (dnsTxt: string) => void; +} + +// Note: this separate class is designed to hold methods that are not +// meant to be used in components (e.g., data write methods) +export abstract class OrgDomainInternalServiceAbstraction extends OrgDomainServiceAbstraction { + upsert: (orgDomains: OrganizationDomainResponse[]) => void; + replace: (orgDomains: OrganizationDomainResponse[]) => void; + clearCache: () => void; + delete: (orgDomainIds: string[]) => void; +} diff --git a/libs/common/src/abstractions/organization-domain/responses/organization-domain-sso-details.response.ts b/libs/common/src/abstractions/organization-domain/responses/organization-domain-sso-details.response.ts new file mode 100644 index 00000000000..8b2f458f72c --- /dev/null +++ b/libs/common/src/abstractions/organization-domain/responses/organization-domain-sso-details.response.ts @@ -0,0 +1,20 @@ +import { BaseResponse } from "../../../models/response/base.response"; + +export class OrganizationDomainSsoDetailsResponse extends BaseResponse { + id: string; + organizationIdentifier: string; + ssoAvailable: boolean; + domainName: string; + ssoRequired: boolean; + verifiedDate?: Date; + + constructor(response: any) { + super(response); + this.id = this.getResponseProperty("id"); + this.organizationIdentifier = this.getResponseProperty("organizationIdentifier"); + this.ssoAvailable = this.getResponseProperty("ssoAvailable"); + this.domainName = this.getResponseProperty("domainName"); + this.ssoRequired = this.getResponseProperty("ssoRequired"); + this.verifiedDate = this.getResponseProperty("verifiedDate"); + } +} diff --git a/libs/common/src/abstractions/organization-domain/responses/organization-domain.response.ts b/libs/common/src/abstractions/organization-domain/responses/organization-domain.response.ts new file mode 100644 index 00000000000..0ab7538e4e7 --- /dev/null +++ b/libs/common/src/abstractions/organization-domain/responses/organization-domain.response.ts @@ -0,0 +1,26 @@ +import { BaseResponse } from "../../../models/response/base.response"; + +export class OrganizationDomainResponse extends BaseResponse { + id: string; + organizationId: string; + txt: string; + domainName: string; + creationDate: string; + nextRunDate: string; + jobRunCount: number; + verifiedDate?: string; + lastCheckedDate?: string; + + constructor(response: any) { + super(response); + this.id = this.getResponseProperty("id"); + this.organizationId = this.getResponseProperty("organizationId"); + this.txt = this.getResponseProperty("txt"); + this.domainName = this.getResponseProperty("domainName"); + this.creationDate = this.getResponseProperty("creationDate"); + this.nextRunDate = this.getResponseProperty("nextRunDate"); + this.jobRunCount = this.getResponseProperty("jobRunCount"); + this.verifiedDate = this.getResponseProperty("verifiedDate"); + this.lastCheckedDate = this.getResponseProperty("lastCheckedDate"); + } +} diff --git a/libs/common/src/enums/deviceType.ts b/libs/common/src/enums/deviceType.ts index 707f83d84a1..d5ab33bbdd0 100644 --- a/libs/common/src/enums/deviceType.ts +++ b/libs/common/src/enums/deviceType.ts @@ -20,4 +20,6 @@ export enum DeviceType { VivaldiBrowser = 18, VivaldiExtension = 19, SafariExtension = 20, + SDK = 21, + Server = 22, } diff --git a/libs/common/src/enums/event-system-user.ts b/libs/common/src/enums/event-system-user.ts index cd9a73dd8f9..757b1d9d7b8 100644 --- a/libs/common/src/enums/event-system-user.ts +++ b/libs/common/src/enums/event-system-user.ts @@ -1,4 +1,5 @@ // Note: the enum key is used to describe the EventSystemUser in the UI. Be careful about changing it. export enum EventSystemUser { SCIM = 1, + DomainVerification = 2, } diff --git a/libs/common/src/enums/eventType.ts b/libs/common/src/enums/eventType.ts index 5d1e4785fbe..e7baa2e71d4 100644 --- a/libs/common/src/enums/eventType.ts +++ b/libs/common/src/enums/eventType.ts @@ -72,4 +72,9 @@ export enum EventType { ProviderOrganization_Added = 1901, ProviderOrganization_Removed = 1902, ProviderOrganization_VaultAccessed = 1903, + + OrganizationDomain_Added = 1904, + OrganizationDomain_Removed = 1905, + OrganizationDomain_Verified = 1906, + OrganizationDomain_NotVerified = 1907, } diff --git a/libs/common/src/enums/http-status-code.enum.ts b/libs/common/src/enums/http-status-code.enum.ts new file mode 100644 index 00000000000..602d7fde1b7 --- /dev/null +++ b/libs/common/src/enums/http-status-code.enum.ts @@ -0,0 +1,403 @@ +/** + * Hypertext Transfer Protocol (HTTP) response status codes. + * + * @see {@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} + * src: https://gist.github.com/RWOverdijk/6cef816cfdf5722228e01cc05fd4b094 + */ +export enum HttpStatusCode { + /** + * The server has received the request headers and the client should proceed to send the request body + * (in the case of a request for which a body needs to be sent; for example, a POST request). + * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient. + * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request + * and receive a 100 Continue status code in response before sending the body. The response 417 Expectation Failed indicates the request should not be continued. + */ + Continue = 100, + + /** + * The requester has asked the server to switch protocols and the server has agreed to do so. + */ + SwitchingProtocols = 101, + + /** + * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request. + * This code indicates that the server has received and is processing the request, but no response is available yet. + * This prevents the client from timing out and assuming the request was lost. + */ + Processing = 102, + + // ********************************************************************************************************** + //#region 200s - SUCCESS + // ********************************************************************************************************** + + /** + * Standard response for successful HTTP requests. + * The actual response will depend on the request method used. + * In a GET request, the response will contain an entity corresponding to the requested resource. + * In a POST request, the response will contain an entity describing or containing the result of the action. + */ + Ok = 200, + + /** + * The request has been fulfilled, resulting in the creation of a new resource. + */ + Created = 201, + + /** + * The request has been accepted for processing, but the processing has not been completed. + * The request might or might not be eventually acted upon, and may be disallowed when processing occurs. + */ + Accepted = 202, + + /** + * SINCE HTTP/1.1 + * The server is a transforming proxy that received a 200 OK from its origin, + * but is returning a modified version of the origin's response. + */ + NonAuthoritativeInformation = 203, + + /** + * The server successfully processed the request and is not returning any content. + */ + NoContent = 204, + + /** + * The server successfully processed the request, but is not returning any content. + * Unlike a 204 response, this response requires that the requester reset the document view. + */ + ResetContent = 205, + + /** + * The server is delivering only part of the resource (byte serving) due to a range header sent by the client. + * The range header is used by HTTP clients to enable resuming of interrupted downloads, + * or split a download into multiple simultaneous streams. + */ + PartialContent = 206, + + /** + * The message body that follows is an XML message and can contain a number of separate response codes, + * depending on how many sub-requests were made. + */ + MultiStatus = 207, + + /** + * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, + * and are not being included again. + */ + AlreadyReported = 208, + + /** + * The server has fulfilled a request for the resource, + * and the response is a representation of the result of one or more instance-manipulations applied to the current instance. + */ + ImUsed = 226, + + // #endregion + + // ********************************************************************************************************** + //#region 300s - Redirections + // ********************************************************************************************************** + + /** + * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation). + * For example, this code could be used to present multiple video format options, + * to list files with different filename extensions, or to suggest word-sense disambiguation. + */ + MultipleChoices = 300, + + /** + * This and all future requests should be directed to the given URI. + */ + MovedPermanently = 301, + + /** + * This is an example of industry practice contradicting the standard. + * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect + * (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 + * with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307 + * to distinguish between the two behaviours. However, some Web applications and frameworks + * use the 302 status code as if it were the 303. + */ + Found = 302, + + /** + * SINCE HTTP/1.1 + * The response to the request can be found under another URI using a GET method. + * When received in response to a POST (or PUT/DELETE), the client should presume that + * the server has received the data and should issue a redirect with a separate GET message. + */ + SeeOther = 303, + + /** + * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. + * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy. + */ + NotModified = 304, + + /** + * SINCE HTTP/1.1 + * The requested resource is available only through a proxy, the address for which is provided in the response. + * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons. + */ + UseProxy = 305, + + /** + * No longer used. Originally meant "Subsequent requests should use the specified proxy." + */ + SwitchProxy = 306, + + /** + * SINCE HTTP/1.1 + * In this case, the request should be repeated with another URI; however, future requests should still use the original URI. + * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request. + * For example, a POST request should be repeated using another POST request. + */ + TemporaryRedirect = 307, + + /** + * The request and all future requests should be repeated using another URI. + * 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change. + * So, for example, submitting a form to a permanently redirected resource may continue smoothly. + */ + PermanentRedirect = 308, + + // #endregion + + // ********************************************************************************************************** + // #region - 400s - Client / User messed up + // ********************************************************************************************************** + + /** + * The server cannot or will not process the request due to an apparent client error + * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing). + */ + BadRequest = 400, + + /** + * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet + * been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the + * requested resource. See Basic access authentication and Digest access authentication. 401 semantically means + * "unauthenticated",i.e. the user does not have the necessary credentials. + */ + Unauthorized = 401, + + /** + * Reserved for future use. The original intention was that this code might be used as part of some form of digital + * cash or micro payment scheme, but that has not happened, and this code is not usually used. + * Google Developers API uses this status if a particular developer has exceeded the daily limit on requests. + */ + PaymentRequired = 402, + + /** + * The request was valid, but the server is refusing action. + * The user might not have the necessary permissions for a resource. + */ + Forbidden = 403, + + /** + * The requested resource could not be found but may be available in the future. + * Subsequent requests by the client are permissible. + */ + NotFound = 404, + + /** + * A request method is not supported for the requested resource; + * for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource. + */ + MethodNotAllowed = 405, + + /** + * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request. + */ + NotAcceptable = 406, + + /** + * The client must first authenticate itself with the proxy. + */ + ProxyAuthenticationRequired = 407, + + /** + * The server timed out waiting for the request. + * According to HTTP specifications: + * "The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time." + */ + RequestTimeout = 408, + + /** + * Indicates that the request could not be processed because of conflict in the request, + * such as an edit conflict between multiple simultaneous updates. + */ + Conflict = 409, + + /** + * Indicates that the resource requested is no longer available and will not be available again. + * This should be used when a resource has been intentionally removed and the resource should be purged. + * Upon receiving a 410 status code, the client should not request the resource in the future. + * Clients such as search engines should remove the resource from their indices. + * Most use cases do not require clients and search engines to purge the resource, and a "404 Not Found" may be used instead. + */ + Gone = 410, + + /** + * The request did not specify the length of its content, which is required by the requested resource. + */ + LengthRequired = 411, + + /** + * The server does not meet one of the preconditions that the requester put on the request. + */ + PreconditionFailed = 412, + + /** + * The request is larger than the server is willing or able to process. Previously called "Request Entity Too Large". + */ + PayloadTooLarge = 413, + + /** + * The URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request, + * in which case it should be converted to a POST request. + * Called "Request-URI Too Long" previously. + */ + UriTooLong = 414, + + /** + * The request entity has a media type which the server or resource does not support. + * For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format. + */ + UnsupportedMediaType = 415, + + /** + * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion. + * For example, if the client asked for a part of the file that lies beyond the end of the file. + * Called "Requested Range Not Satisfiable" previously. + */ + RangeNotSatisfiable = 416, + + /** + * The server cannot meet the requirements of the Expect request-header field. + */ + ExpectationFailed = 417, + + /** + * This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol, + * and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by + * teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, including Google.com. + */ + IAmATeapot = 418, + + /** + * The request was directed at a server that is not able to produce a response (for example because a connection reuse). + */ + MisdirectedRequest = 421, + + /** + * The request was well-formed but was unable to be followed due to semantic errors. + */ + UnprocessableEntity = 422, + + /** + * The resource that is being accessed is locked. + */ + Locked = 423, + + /** + * The request failed due to failure of a previous request (e.g., a PROPPATCH). + */ + FailedDependency = 424, + + /** + * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field. + */ + UpgradeRequired = 426, + + /** + * The origin server requires the request to be conditional. + * Intended to prevent "the 'lost update' problem, where a client + * GETs a resource's state, modifies it, and PUTs it back to the server, + * when meanwhile a third party has modified the state on the server, leading to a conflict." + */ + PreconditionRequired = 428, + + /** + * The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes. + */ + TooManyRequests = 429, + + /** + * The server is unwilling to process the request because either an individual header field, + * or all the header fields collectively, are too large. + */ + RequestHeaderFieldsTooLarge = 431, + + /** + * A server operator has received a legal demand to deny access to a resource or to a set of resources + * that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451. + */ + UnavailableForLegalReasons = 451, + + // #endregion + + // ********************************************************************************************************** + // #region - 500s - Serve messed up + // ********************************************************************************************************** + + /** + * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. + */ + InternalServerError = 500, + + /** + * The server either does not recognize the request method, or it lacks the ability to fulfill the request. + * Usually this implies future availability (e.g., a new feature of a web-service API). + */ + NotImplemented = 501, + + /** + * The server was acting as a gateway or proxy and received an invalid response from the upstream server. + */ + BadGateway = 502, + + /** + * The server is currently unavailable (because it is overloaded or down for maintenance). + * Generally, this is a temporary state. + */ + ServiceUnavailable = 503, + + /** + * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server. + */ + GatewayTimeout = 504, + + /** + * The server does not support the HTTP protocol version used in the request + */ + HttpVersionNotSupported = 505, + + /** + * Transparent content negotiation for the request results in a circular reference. + */ + VariantAlsoNegotiates = 506, + + /** + * The server is unable to store the representation needed to complete the request. + */ + InsufficientStorage = 507, + + /** + * The server detected an infinite loop while processing the request. + */ + LoopDetected = 508, + + /** + * Further extensions to the request are required for the server to fulfill it. + */ + NotExtended = 510, + + /** + * The client needs to authenticate to gain network access. + * Intended for use by intercepting proxies used to control access to the network (e.g., "captive portals" used + * to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot). + */ + NetworkAuthenticationRequired = 511, + // #endregion +} diff --git a/libs/common/src/models/domain/domain-base.ts b/libs/common/src/models/domain/domain-base.ts index f4ece329a06..4c4bffd4cd5 100644 --- a/libs/common/src/models/domain/domain-base.ts +++ b/libs/common/src/models/domain/domain-base.ts @@ -3,6 +3,7 @@ import { View } from "../view/view"; import { EncString } from "./enc-string"; import { SymmetricCryptoKey } from "./symmetric-crypto-key"; +// https://contributing.bitwarden.com/architecture/clients/data-model#domain export default class Domain { protected buildDomainModel( domain: D, diff --git a/libs/common/src/models/domain/organization.ts b/libs/common/src/models/domain/organization.ts index e4e5e746275..96b197d3ee6 100644 --- a/libs/common/src/models/domain/organization.ts +++ b/libs/common/src/models/domain/organization.ts @@ -172,6 +172,10 @@ export class Organization { return (this.isAdmin || this.permissions.manageSso) && this.useSso; } + get canManageDomainVerification() { + return (this.isAdmin || this.permissions.manageSso) && this.useSso; + } + get canManageScim() { return (this.isAdmin || this.permissions.manageScim) && this.useScim; } diff --git a/libs/common/src/models/response/event.response.ts b/libs/common/src/models/response/event.response.ts index 10897494ab7..27fc223ab6d 100644 --- a/libs/common/src/models/response/event.response.ts +++ b/libs/common/src/models/response/event.response.ts @@ -22,6 +22,7 @@ export class EventResponse extends BaseResponse { ipAddress: string; installationId: string; systemUser: EventSystemUser; + domainName: string; constructor(response: any) { super(response); @@ -42,5 +43,6 @@ export class EventResponse extends BaseResponse { this.ipAddress = this.getResponseProperty("IpAddress"); this.installationId = this.getResponseProperty("InstallationId"); this.systemUser = this.getResponseProperty("SystemUser"); + this.domainName = this.getResponseProperty("DomainName"); } } diff --git a/libs/common/src/services/organization-domain/org-domain-api.service.ts b/libs/common/src/services/organization-domain/org-domain-api.service.ts new file mode 100644 index 00000000000..62b379ac2d3 --- /dev/null +++ b/libs/common/src/services/organization-domain/org-domain-api.service.ts @@ -0,0 +1,112 @@ +import { ApiService } from "../../abstractions/api.service"; +import { OrgDomainApiServiceAbstraction } from "../../abstractions/organization-domain/org-domain-api.service.abstraction"; +import { OrgDomainInternalServiceAbstraction } from "../../abstractions/organization-domain/org-domain.service.abstraction"; +import { OrganizationDomainSsoDetailsResponse } from "../../abstractions/organization-domain/responses/organization-domain-sso-details.response"; +import { OrganizationDomainResponse } from "../../abstractions/organization-domain/responses/organization-domain.response"; +import { ListResponse } from "../../models/response/list.response"; + +import { OrganizationDomainSsoDetailsRequest } from "./requests/organization-domain-sso-details.request"; +import { OrganizationDomainRequest } from "./requests/organization-domain.request"; + +export class OrgDomainApiService implements OrgDomainApiServiceAbstraction { + constructor( + private orgDomainService: OrgDomainInternalServiceAbstraction, + private apiService: ApiService + ) {} + + async getAllByOrgId(orgId: string): Promise> { + const listResponse: ListResponse = await this.apiService.send( + "GET", + `/organizations/${orgId}/domain`, + null, + true, + true + ); + + const orgDomains = listResponse.data.map( + (resultOrgDomain: any) => new OrganizationDomainResponse(resultOrgDomain) + ); + + this.orgDomainService.replace(orgDomains); + + return orgDomains; + } + + async getByOrgIdAndOrgDomainId( + orgId: string, + orgDomainId: string + ): Promise { + const result = await this.apiService.send( + "GET", + `/organizations/${orgId}/domain/${orgDomainId}`, + null, + true, + true + ); + + const response = new OrganizationDomainResponse(result); + + this.orgDomainService.upsert([response]); + + return response; + } + + async post( + orgId: string, + orgDomainReq: OrganizationDomainRequest + ): Promise { + const result = await this.apiService.send( + "POST", + `/organizations/${orgId}/domain`, + orgDomainReq, + true, + true + ); + + const response = new OrganizationDomainResponse(result); + + this.orgDomainService.upsert([response]); + + return response; + } + + async verify(orgId: string, orgDomainId: string): Promise { + const result = await this.apiService.send( + "POST", + `/organizations/${orgId}/domain/${orgDomainId}/verify`, + null, + true, + true + ); + + const response = new OrganizationDomainResponse(result); + + this.orgDomainService.upsert([response]); + + return response; + } + + async delete(orgId: string, orgDomainId: string): Promise { + await this.apiService.send( + "DELETE", + `/organizations/${orgId}/domain/${orgDomainId}`, + null, + true, + false + ); + this.orgDomainService.delete([orgDomainId]); + } + + async getClaimedOrgDomainByEmail(email: string): Promise { + const result = await this.apiService.send( + "POST", + `/organizations/domain/sso/details`, + new OrganizationDomainSsoDetailsRequest(email), + false, // anonymous + true + ); + const response = new OrganizationDomainSsoDetailsResponse(result); + + return response; + } +} diff --git a/libs/common/src/services/organization-domain/org-domain.service.ts b/libs/common/src/services/organization-domain/org-domain.service.ts new file mode 100644 index 00000000000..617bd3698d6 --- /dev/null +++ b/libs/common/src/services/organization-domain/org-domain.service.ts @@ -0,0 +1,73 @@ +import { BehaviorSubject } from "rxjs"; + +import { I18nService } from "../../abstractions/i18n.service"; +import { OrgDomainInternalServiceAbstraction } from "../../abstractions/organization-domain/org-domain.service.abstraction"; +import { OrganizationDomainResponse } from "../../abstractions/organization-domain/responses/organization-domain.response"; +import { PlatformUtilsService } from "../../abstractions/platformUtils.service"; + +export class OrgDomainService implements OrgDomainInternalServiceAbstraction { + protected _orgDomains$: BehaviorSubject = new BehaviorSubject([]); + + orgDomains$ = this._orgDomains$.asObservable(); + + constructor( + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService + ) {} + + get(orgDomainId: string): OrganizationDomainResponse { + const orgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue(); + + return orgDomains.find((orgDomain) => orgDomain.id === orgDomainId); + } + + copyDnsTxt(dnsTxt: string): void { + this.platformUtilsService.copyToClipboard(dnsTxt); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("dnsTxtRecord")) + ); + } + + upsert(orgDomains: OrganizationDomainResponse[]): void { + const existingOrgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue(); + + orgDomains.forEach((orgDomain: OrganizationDomainResponse) => { + // Determine if passed in orgDomain exists in existing array: + const index = existingOrgDomains.findIndex( + (existingOrgDomain) => existingOrgDomain.id === orgDomain.id + ); + if (index !== -1) { + existingOrgDomains[index] = orgDomain; + } else { + existingOrgDomains.push(orgDomain); + } + }); + + this._orgDomains$.next(existingOrgDomains); + } + + replace(orgDomains: OrganizationDomainResponse[]): void { + this._orgDomains$.next(orgDomains); + } + + clearCache(): void { + this._orgDomains$.next([]); + } + + delete(orgDomainIds: string[]): void { + const existingOrgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue(); + + orgDomainIds.forEach((orgDomainId: string) => { + const index = existingOrgDomains.findIndex( + (existingOrgDomain) => existingOrgDomain.id === orgDomainId + ); + if (index !== -1) { + existingOrgDomains.splice(index, 1); + } + }); + + this._orgDomains$.next(existingOrgDomains); + } +} diff --git a/libs/common/src/services/organization-domain/requests/organization-domain-sso-details.request.ts b/libs/common/src/services/organization-domain/requests/organization-domain-sso-details.request.ts new file mode 100644 index 00000000000..55e6ab8e833 --- /dev/null +++ b/libs/common/src/services/organization-domain/requests/organization-domain-sso-details.request.ts @@ -0,0 +1,3 @@ +export class OrganizationDomainSsoDetailsRequest { + constructor(public email: string) {} +} diff --git a/libs/common/src/services/organization-domain/requests/organization-domain.request.ts b/libs/common/src/services/organization-domain/requests/organization-domain.request.ts new file mode 100644 index 00000000000..fb515e3cbc9 --- /dev/null +++ b/libs/common/src/services/organization-domain/requests/organization-domain.request.ts @@ -0,0 +1,9 @@ +export class OrganizationDomainRequest { + txt: string; + domainName: string; + + constructor(txt: string, domainName: string) { + this.txt = txt; + this.domainName = domainName; + } +} diff --git a/libs/components/src/async-actions/bit-submit.directive.ts b/libs/components/src/async-actions/bit-submit.directive.ts index 82b459c2d56..1afaf11b907 100644 --- a/libs/components/src/async-actions/bit-submit.directive.ts +++ b/libs/components/src/async-actions/bit-submit.directive.ts @@ -20,6 +20,8 @@ export class BitSubmitDirective implements OnInit, OnDestroy { @Input("bitSubmit") protected handler: FunctionReturningAwaitable; + @Input() allowDisabledFormSubmit?: boolean = false; + readonly loading$ = this._loading$.asObservable(); readonly disabled$ = this._disabled$.asObservable(); @@ -56,9 +58,13 @@ export class BitSubmitDirective implements OnInit, OnDestroy { } ngOnInit(): void { - this.formGroupDirective.statusChanges - .pipe(takeUntil(this.destroy$)) - .subscribe((c) => this._disabled$.next(c === "DISABLED")); + this.formGroupDirective.statusChanges.pipe(takeUntil(this.destroy$)).subscribe((c) => { + if (this.allowDisabledFormSubmit) { + this._disabled$.next(false); + } else { + this._disabled$.next(c === "DISABLED"); + } + }); } get disabled() { diff --git a/libs/components/src/async-actions/form-button.directive.ts b/libs/components/src/async-actions/form-button.directive.ts index c41b24da4e2..a21dea00f78 100644 --- a/libs/components/src/async-actions/form-button.directive.ts +++ b/libs/components/src/async-actions/form-button.directive.ts @@ -17,6 +17,9 @@ import { BitSubmitDirective } from "./bit-submit.directive"; * - Disables the button while the `bitSubmit` directive is processing an async submit action. * - Disables the button while a `bitAction` directive on another button is being processed. * - Disables form submission while the `bitAction` directive is processing an async action. + * + * Note: you must use a directive that implements the ButtonLikeAbstraction (bitButton or bitIconButton for example) + * along with this one in order to avoid provider errors. */ @Directive({ selector: "button[bitFormButton]", diff --git a/libs/components/src/async-actions/in-forms.stories.mdx b/libs/components/src/async-actions/in-forms.stories.mdx index 6a07fcda6ee..07db5f4e2a0 100644 --- a/libs/components/src/async-actions/in-forms.stories.mdx +++ b/libs/components/src/async-actions/in-forms.stories.mdx @@ -105,7 +105,7 @@ class Component { ### 2. Add directive to the `form` element -The `bitSubmit` directive is required beacuse of its coordinating role inside of a form. +The `bitSubmit` directive is required because of its coordinating role inside of a form. ```html
...
@@ -121,3 +121,11 @@ Add `bitButton`, `bitFormButton`, `bitAction` directives to the button. Make sur ``` + +## `[bitSubmit]` Disabled Form Submit + +If you need your form to be able to submit even when the form is disabled, then add `[allowDisabledFormSubmit]="true"` to your `
` + +```html +...
+``` diff --git a/libs/components/src/input/input.directive.ts b/libs/components/src/input/input.directive.ts index ed7faeac829..2c4cb61eb2b 100644 --- a/libs/components/src/input/input.directive.ts +++ b/libs/components/src/input/input.directive.ts @@ -72,6 +72,8 @@ export class BitInputDirective implements BitFormFieldControl { @Input() hasPrefix = false; @Input() hasSuffix = false; + @Input() showErrorsWhenDisabled? = false; + get labelForId(): string { return this.id; } @@ -88,7 +90,15 @@ export class BitInputDirective implements BitFormFieldControl { } get hasError() { - return this.ngControl?.status === "INVALID" && this.ngControl?.touched && this.isActive; + if (this.showErrorsWhenDisabled) { + return ( + (this.ngControl?.status === "INVALID" || this.ngControl?.status === "DISABLED") && + this.ngControl?.touched && + this.ngControl?.errors != null + ); + } else { + return this.ngControl?.status === "INVALID" && this.ngControl?.touched && this.isActive; + } } get error(): [string, any] { diff --git a/libs/components/src/stories/input-docs.stories.mdx b/libs/components/src/stories/input-docs.stories.mdx new file mode 100644 index 00000000000..0ee23625ad1 --- /dev/null +++ b/libs/components/src/stories/input-docs.stories.mdx @@ -0,0 +1,48 @@ +import { Meta } from "@storybook/addon-docs"; + + + +# `bitInput` + +`bitInput` is an Angular directive to be used on ``, ` - {{ "secretProjectAssociationDescription" | i18n From 581f69256d0dc407bee8dc7e4033e12369c44bc1 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Tue, 21 Feb 2023 11:25:41 -0500 Subject: [PATCH 056/232] [SM-453] user onboarding component (#4707) * wip onboarding component * fix button type * remove dismiss button * add completion logic * update styles; add download cli section; add click logic; add loading spinner * update i18n * update icons; rearrange items; fix import item logic * add complete i18n * fix reactivity * move visibility logic into presentational component * add button type * apply code reviews * add loading spinner to page * onboarding dismissal should persist when switching orgs * add workaround for inconsistent icon size * fix full storybook * apply code review; update stories --- apps/web/src/locales/en/messages.json | 35 ++++++ .../overview/onboarding-task.component.html | 21 ++++ .../overview/onboarding-task.component.ts | 22 ++++ .../overview/onboarding.component.html | 41 +++++++ .../overview/onboarding.component.ts | 39 ++++++ .../overview/onboarding.module.ts | 14 +++ .../overview/onboarding.stories.ts | 92 ++++++++++++++ .../overview/overview.component.html | 93 +++++++++----- .../overview/overview.component.ts | 115 ++++++++++++------ .../overview/overview.module.ts | 3 +- libs/components/src/index.ts | 1 + 11 files changed, 408 insertions(+), 68 deletions(-) create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.module.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index b74bebe1617..06025f869d0 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6420,6 +6420,41 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, "restoreSecret": { "message": "Restore secret" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.html new file mode 100644 index 00000000000..5904be7487c --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.html @@ -0,0 +1,21 @@ + + {{ title }} + + +
  • + + + + +
    + +
    +
  • diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.ts new file mode 100644 index 00000000000..cfd6d77dec3 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding-task.component.ts @@ -0,0 +1,22 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "sm-onboarding-task", + templateUrl: "./onboarding-task.component.html", + host: { + class: "tw-max-w-max", + }, +}) +export class OnboardingTaskComponent { + @Input() + completed = false; + + @Input() + icon = "bwi-info-circle"; + + @Input() + title: string; + + @Input() + route: string | any[]; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.html new file mode 100644 index 00000000000..5aa57b087dc --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.html @@ -0,0 +1,41 @@ +
    + +
    + +
    {{ title }}
    + + + {{ "complete" | i18n: amountCompleted:tasks.length }} + + +
    +
    +
      + +
    +
    + +
    +
    + + + + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts new file mode 100644 index 00000000000..06e5761b3d0 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts @@ -0,0 +1,39 @@ +import { AfterContentInit, Component, ContentChildren, Input, QueryList } from "@angular/core"; + +import { OnboardingTaskComponent } from "./onboarding-task.component"; + +@Component({ + selector: "sm-onboarding", + templateUrl: "./onboarding.component.html", +}) +export class OnboardingComponent implements AfterContentInit { + @ContentChildren(OnboardingTaskComponent) tasks: QueryList; + @Input() title: string; + + protected open = true; + protected visible = false; + + ngAfterContentInit() { + this.visible = !this.isComplete; + } + + protected get amountCompleted(): number { + return this.tasks.filter((task) => task.completed).length; + } + + protected get barWidth(): number { + return this.tasks.length === 0 ? 0 : (this.amountCompleted / this.tasks.length) * 100; + } + + protected get isComplete(): boolean { + return this.tasks.length > 0 && this.tasks.length === this.amountCompleted; + } + + protected toggle() { + this.open = !this.open; + } + + protected dismiss() { + this.visible = false; + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.module.ts new file mode 100644 index 00000000000..867475165ef --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from "@angular/core"; + +import { ProgressModule } from "@bitwarden/components"; +import { SharedModule } from "@bitwarden/web-vault/app/shared"; + +import { OnboardingTaskComponent } from "./onboarding-task.component"; +import { OnboardingComponent } from "./onboarding.component"; + +@NgModule({ + imports: [SharedModule, ProgressModule], + exports: [OnboardingComponent, OnboardingTaskComponent], + declarations: [OnboardingComponent, OnboardingTaskComponent], +}) +export class OnboardingModule {} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts new file mode 100644 index 00000000000..f8d156c3cb7 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts @@ -0,0 +1,92 @@ +import { RouterModule } from "@angular/router"; +import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { delay, of, startWith } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { LinkModule, IconModule, ProgressModule } from "@bitwarden/components"; +import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/app/tests/preloaded-english-i18n.module"; + +import { OnboardingTaskComponent } from "./onboarding-task.component"; +import { OnboardingComponent } from "./onboarding.component"; + +export default { + title: "Web/Onboarding", + component: OnboardingComponent, + decorators: [ + moduleMetadata({ + imports: [ + JslibModule, + RouterModule.forRoot( + [ + { + path: "", + component: OnboardingComponent, + }, + ], + { useHash: true } + ), + LinkModule, + IconModule, + ProgressModule, + PreloadedEnglishI18nModule, + ], + declarations: [OnboardingTaskComponent], + }), + ], +} as Meta; + +const Template: Story = (args) => ({ + props: { + createServiceAccount: false, + importSecrets$: of(false), + createSecret: false, + createProject: false, + ...args, + }, + template: ` + + + + {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} + + + + + + + `, +}); + +export const Empty = Template.bind({}); + +export const Partial = Template.bind({}); +Partial.args = { + ...Template.args, + createServiceAccount: true, + createProject: true, +}; + +export const Full = Template.bind({}); +Full.args = { + ...Template.args, + createServiceAccount: true, + createProject: true, + createSecret: true, + importSecrets$: of(true).pipe(delay(0), startWith(false)), +}; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index aa9c2436229..2182c9ca44a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -1,37 +1,68 @@ -
    - -

    {{ "projects" | i18n }}

    - -
    - {{ "showingPortionOfTotal" | i18n: view.latestProjects.length:view.allProjects.length }} - {{ "viewAll" | i18n }} -
    -
    - -

    {{ "secrets" | i18n }}

    - -
    - {{ "showingPortionOfTotal" | i18n: view.latestSecrets.length:view.allSecrets.length }} - {{ "viewAll" | i18n }} -
    -
    + +
    + + + + {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} + + + + + + + +
    + +

    {{ "projects" | i18n }}

    + +
    + {{ "showingPortionOfTotal" | i18n: view.latestProjects.length:view.allProjects.length }} + {{ "viewAll" | i18n }} +
    +
    + +

    {{ "secrets" | i18n }}

    + +
    + {{ "showingPortionOfTotal" | i18n: view.latestSecrets.length:view.allSecrets.length }} + {{ "viewAll" | i18n }} +
    +
    +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts index 97cce8d2b85..986e56bfab9 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts @@ -1,14 +1,14 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; +import { ActivatedRoute, Router } from "@angular/router"; import { - combineLatest, - combineLatestWith, map, Observable, - startWith, - Subject, switchMap, + Subject, takeUntil, + combineLatest, + startWith, + distinct, } from "rxjs"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; @@ -21,7 +21,6 @@ import { ProjectDeleteOperation, } from "../projects/dialog/project-delete-dialog.component"; import { - OperationType, ProjectDialogComponent, ProjectOperation, } from "../projects/dialog/project-dialog.component"; @@ -30,41 +29,68 @@ import { SecretDeleteDialogComponent, SecretDeleteOperation, } from "../secrets/dialog/secret-delete.component"; -import { SecretDialogComponent, SecretOperation } from "../secrets/dialog/secret-dialog.component"; +import { + OperationType, + SecretDialogComponent, + SecretOperation, +} from "../secrets/dialog/secret-dialog.component"; import { SecretService } from "../secrets/secret.service"; +import { + ServiceAccountDialogComponent, + ServiceAccountOperation, +} from "../service-accounts/dialog/service-account-dialog.component"; +import { ServiceAccountService } from "../service-accounts/service-account.service"; + +type Tasks = { + importSecrets: boolean; + createSecret: boolean; + createProject: boolean; + createServiceAccount: boolean; +}; @Component({ selector: "sm-overview", templateUrl: "./overview.component.html", }) export class OverviewComponent implements OnInit, OnDestroy { - private destroy$ = new Subject(); - /** - * Number of items to show in tables - */ + private destroy$: Subject = new Subject(); private tableSize = 10; private organizationId: string; - protected organizationName: string; + protected view$: Observable<{ allProjects: ProjectListView[]; allSecrets: SecretListView[]; latestProjects: ProjectListView[]; latestSecrets: SecretListView[]; + tasks: Tasks; }>; constructor( private route: ActivatedRoute, + private router: Router, private projectService: ProjectService, + private secretService: SecretService, + private serviceAccountService: ServiceAccountService, private dialogService: DialogService, - private organizationService: OrganizationService, - private secretService: SecretService - ) {} + private organizationService: OrganizationService + ) { + /** + * We want to remount the `sm-onboarding` component on route change. + * The component only toggles its visibility on init and on user dismissal. + */ + this.router.routeReuseStrategy.shouldReuseRoute = () => false; + } ngOnInit() { - this.route.params + const orgId$ = this.route.params.pipe( + map((p) => p.organizationId), + distinct() + ); + + orgId$ .pipe( - map((params) => this.organizationService.get(params.organizationId)), + map((orgId) => this.organizationService.get(orgId)), takeUntil(this.destroy$) ) .subscribe((org) => { @@ -72,25 +98,33 @@ export class OverviewComponent implements OnInit, OnDestroy { this.organizationName = org.name; }); - const projects$ = this.projectService.project$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(() => this.getProjects()) + const projects$ = combineLatest([ + orgId$, + this.projectService.project$.pipe(startWith(null)), + ]).pipe(switchMap(([orgId]) => this.projectService.getProjects(orgId))); + + const secrets$ = combineLatest([orgId$, this.secretService.secret$.pipe(startWith(null))]).pipe( + switchMap(([orgId]) => this.secretService.getSecrets(orgId)) ); - const secrets$ = this.secretService.secret$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(() => this.getSecrets()) - ); + const serviceAccounts$ = combineLatest([ + orgId$, + this.serviceAccountService.serviceAccount$.pipe(startWith(null)), + ]).pipe(switchMap(([orgId]) => this.serviceAccountService.getServiceAccounts(orgId))); - this.view$ = combineLatest([projects$, secrets$]).pipe( - map(([projects, secrets]) => { + this.view$ = combineLatest([projects$, secrets$, serviceAccounts$]).pipe( + map(([projects, secrets, serviceAccounts]) => { return { - allProjects: projects, - allSecrets: secrets, latestProjects: this.getRecentItems(projects, this.tableSize), latestSecrets: this.getRecentItems(secrets, this.tableSize), + allProjects: projects, + allSecrets: secrets, + tasks: { + importSecrets: secrets.length > 0, + createSecret: secrets.length > 0, + createProject: projects.length > 0, + createServiceAccount: serviceAccounts.length > 0, + }, }; }) ); @@ -111,10 +145,6 @@ export class OverviewComponent implements OnInit, OnDestroy { // Projects --- - private async getProjects(): Promise { - return await this.projectService.getProjects(this.organizationId); - } - openEditProject(projectId: string) { this.dialogService.open(ProjectDialogComponent, { data: { @@ -134,6 +164,14 @@ export class OverviewComponent implements OnInit, OnDestroy { }); } + openServiceAccountDialog() { + this.dialogService.open(ServiceAccountDialogComponent, { + data: { + organizationId: this.organizationId, + }, + }); + } + openDeleteProjectDialog(event: ProjectListView[]) { this.dialogService.open(ProjectDeleteDialogComponent, { data: { @@ -144,8 +182,13 @@ export class OverviewComponent implements OnInit, OnDestroy { // Secrets --- - private async getSecrets(): Promise { - return await this.secretService.getSecrets(this.organizationId); + openSecretDialog() { + this.dialogService.open(SecretDialogComponent, { + data: { + organizationId: this.organizationId, + operation: OperationType.Add, + }, + }); } openEditSecret(secretId: string) { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.module.ts index 9b824ee4d90..a526075518e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.module.ts @@ -2,12 +2,13 @@ import { NgModule } from "@angular/core"; import { SecretsManagerSharedModule } from "../shared/sm-shared.module"; +import { OnboardingModule } from "./onboarding.module"; import { OverviewRoutingModule } from "./overview-routing.module"; import { OverviewComponent } from "./overview.component"; import { SectionComponent } from "./section.component"; @NgModule({ - imports: [SecretsManagerSharedModule, OverviewRoutingModule], + imports: [SecretsManagerSharedModule, OverviewRoutingModule, OnboardingModule], declarations: [OverviewComponent, SectionComponent], providers: [], }) diff --git a/libs/components/src/index.ts b/libs/components/src/index.ts index f6989232683..a5766287bf1 100644 --- a/libs/components/src/index.ts +++ b/libs/components/src/index.ts @@ -16,6 +16,7 @@ export * from "./link"; export * from "./menu"; export * from "./multi-select"; export * from "./navigation"; +export * from "./progress"; export * from "./radio-button"; export * from "./table"; export * from "./tabs"; From 3305c808d1c6d12c00926171ab6b3259501abbcc Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 21 Feb 2023 18:24:55 +0100 Subject: [PATCH 057/232] [SM-396] Self-enroll Secrets Manager (#4666) --- .../billing/organization-billing.module.ts | 2 + ...nization-subscription-cloud.component.html | 7 +++ ...ganization-subscription-cloud.component.ts | 4 ++ .../secrets-manager/enroll.component.html | 13 +++++ .../secrets-manager/enroll.component.ts | 52 +++++++++++++++++++ apps/web/src/locales/en/messages.json | 6 +++ .../organization-api.service.abstraction.ts | 5 ++ ...nization-enroll-secrets-manager.request.ts | 3 ++ .../models/response/organization.response.ts | 2 + .../organization/organization-api.service.ts | 11 ++++ 10 files changed, 105 insertions(+) create mode 100644 apps/web/src/app/organizations/billing/secrets-manager/enroll.component.html create mode 100644 apps/web/src/app/organizations/billing/secrets-manager/enroll.component.ts create mode 100644 libs/common/src/models/request/organization/organization-enroll-secrets-manager.request.ts diff --git a/apps/web/src/app/organizations/billing/organization-billing.module.ts b/apps/web/src/app/organizations/billing/organization-billing.module.ts index 71222e3ba5f..17d825fbae7 100644 --- a/apps/web/src/app/organizations/billing/organization-billing.module.ts +++ b/apps/web/src/app/organizations/billing/organization-billing.module.ts @@ -11,6 +11,7 @@ import { OrganizationBillingRoutingModule } from "./organization-billing-routing import { OrganizationBillingTabComponent } from "./organization-billing-tab.component"; import { OrganizationSubscriptionCloudComponent } from "./organization-subscription-cloud.component"; import { OrganizationSubscriptionSelfhostComponent } from "./organization-subscription-selfhost.component"; +import { SecretsManagerEnrollComponent } from "./secrets-manager/enroll.component"; import { SubscriptionHiddenComponent } from "./subscription-hidden.component"; @NgModule({ @@ -25,6 +26,7 @@ import { SubscriptionHiddenComponent } from "./subscription-hidden.component"; OrganizationSubscriptionSelfhostComponent, OrganizationSubscriptionCloudComponent, SubscriptionHiddenComponent, + SecretsManagerEnrollComponent, ], }) export class OrganizationBillingModule {} diff --git a/apps/web/src/app/organizations/billing/organization-subscription-cloud.component.html b/apps/web/src/app/organizations/billing/organization-subscription-cloud.component.html index 25dc12dc2fb..3e7fda5cafc 100644 --- a/apps/web/src/app/organizations/billing/organization-subscription-cloud.component.html +++ b/apps/web/src/app/organizations/billing/organization-subscription-cloud.component.html @@ -108,6 +108,13 @@ *ngIf="showChangePlan" > + + +

    {{ "manageSubscription" | i18n }}

    {{ subscriptionDesc }}

    i.sponsoredSubscriptionItem); } diff --git a/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.html b/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.html new file mode 100644 index 00000000000..56a48e09fe7 --- /dev/null +++ b/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.html @@ -0,0 +1,13 @@ +
    +

    {{ "secretsManagerBeta" | i18n }}

    +

    {{ "secretsManagerSubscriptionDesc" | i18n }}

    + + + + {{ "secretsManagerEnable" | i18n }} + + + +
    diff --git a/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.ts b/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.ts new file mode 100644 index 00000000000..e28e089a3a9 --- /dev/null +++ b/apps/web/src/app/organizations/billing/secrets-manager/enroll.component.ts @@ -0,0 +1,52 @@ +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; + +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { OrganizationEnrollSecretsManagerRequest } from "@bitwarden/common/models/request/organization/organization-enroll-secrets-manager.request"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +import { flagEnabled } from "../../../../utils/flags"; + +@Component({ + selector: "sm-enroll", + templateUrl: "enroll.component.html", +}) +export class SecretsManagerEnrollComponent implements OnInit { + @Input() enabled: boolean; + @Input() organizationId: string; + + protected formGroup = this.formBuilder.group({ + enabled: [false], + }); + + protected showSecretsManager = false; + + constructor( + private formBuilder: FormBuilder, + private organizationApiService: OrganizationApiServiceAbstraction, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + private syncService: SyncService + ) { + this.showSecretsManager = flagEnabled("secretsManager"); + } + + ngOnInit(): void { + this.formGroup.setValue({ + enabled: this.enabled, + }); + } + + protected submit = async () => { + this.formGroup.markAllAsTouched(); + + const request = new OrganizationEnrollSecretsManagerRequest(); + request.enabled = this.formGroup.value.enabled; + + await this.organizationApiService.updateEnrollSecretsManager(this.organizationId, request); + await this.syncService.fullSync(true); + this.platformUtilsService.showToast("success", null, this.i18nService.t("subscriptionUpdated")); + }; +} diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 06025f869d0..de2f1119f2a 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6475,5 +6475,11 @@ }, "selectionIsRequired": { "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" } } diff --git a/libs/common/src/abstractions/organization/organization-api.service.abstraction.ts b/libs/common/src/abstractions/organization/organization-api.service.abstraction.ts index 6fe56db2269..f3aec0a72e8 100644 --- a/libs/common/src/abstractions/organization/organization-api.service.abstraction.ts +++ b/libs/common/src/abstractions/organization/organization-api.service.abstraction.ts @@ -11,6 +11,7 @@ import { OrganizationSubscriptionUpdateRequest } from "../../models/request/orga import { OrganizationTaxInfoUpdateRequest } from "../../models/request/organization-tax-info-update.request"; import { OrganizationUpdateRequest } from "../../models/request/organization-update.request"; import { OrganizationUpgradeRequest } from "../../models/request/organization-upgrade.request"; +import { OrganizationEnrollSecretsManagerRequest } from "../../models/request/organization/organization-enroll-secrets-manager.request"; import { PaymentRequest } from "../../models/request/payment.request"; import { SeatRequest } from "../../models/request/seat.request"; import { StorageRequest } from "../../models/request/storage.request"; @@ -59,4 +60,8 @@ export class OrganizationApiServiceAbstraction { getSso: (id: string) => Promise; updateSso: (id: string, request: OrganizationSsoRequest) => Promise; selfHostedSyncLicense: (id: string) => Promise; + updateEnrollSecretsManager: ( + id: string, + request: OrganizationEnrollSecretsManagerRequest + ) => Promise; } diff --git a/libs/common/src/models/request/organization/organization-enroll-secrets-manager.request.ts b/libs/common/src/models/request/organization/organization-enroll-secrets-manager.request.ts new file mode 100644 index 00000000000..a213b07bba7 --- /dev/null +++ b/libs/common/src/models/request/organization/organization-enroll-secrets-manager.request.ts @@ -0,0 +1,3 @@ +export class OrganizationEnrollSecretsManagerRequest { + enabled: boolean; +} diff --git a/libs/common/src/models/response/organization.response.ts b/libs/common/src/models/response/organization.response.ts index ce684e34521..9f7649646df 100644 --- a/libs/common/src/models/response/organization.response.ts +++ b/libs/common/src/models/response/organization.response.ts @@ -26,6 +26,7 @@ export class OrganizationResponse extends BaseResponse { use2fa: boolean; useApi: boolean; useResetPassword: boolean; + useSecretsManager: boolean; hasPublicAndPrivateKeys: boolean; constructor(response: any) { @@ -53,6 +54,7 @@ export class OrganizationResponse extends BaseResponse { this.use2fa = this.getResponseProperty("Use2fa"); this.useApi = this.getResponseProperty("UseApi"); this.useResetPassword = this.getResponseProperty("UseResetPassword"); + this.useSecretsManager = this.getResponseProperty("UseSecretsManager"); this.hasPublicAndPrivateKeys = this.getResponseProperty("HasPublicAndPrivateKeys"); } } diff --git a/libs/common/src/services/organization/organization-api.service.ts b/libs/common/src/services/organization/organization-api.service.ts index 1b86511a045..b5c02e7b08d 100644 --- a/libs/common/src/services/organization/organization-api.service.ts +++ b/libs/common/src/services/organization/organization-api.service.ts @@ -13,6 +13,7 @@ import { OrganizationSubscriptionUpdateRequest } from "../../models/request/orga import { OrganizationTaxInfoUpdateRequest } from "../../models/request/organization-tax-info-update.request"; import { OrganizationUpdateRequest } from "../../models/request/organization-update.request"; import { OrganizationUpgradeRequest } from "../../models/request/organization-upgrade.request"; +import { OrganizationEnrollSecretsManagerRequest } from "../../models/request/organization/organization-enroll-secrets-manager.request"; import { PaymentRequest } from "../../models/request/payment.request"; import { SeatRequest } from "../../models/request/seat.request"; import { StorageRequest } from "../../models/request/storage.request"; @@ -292,4 +293,14 @@ export class OrganizationApiService implements OrganizationApiServiceAbstraction false ); } + + async updateEnrollSecretsManager(id: string, request: OrganizationEnrollSecretsManagerRequest) { + await this.apiService.send( + "POST", + "/organizations/" + id + "/enroll-secrets-manager", + request, + true, + true + ); + } } From 72283d0a3564d3a41f140c41824086fb159397d2 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 21 Feb 2023 19:04:35 +0100 Subject: [PATCH 058/232] [SM-525] Fix projects not being active when on subroute (#4815) * Move overview to separate route. Change nav-item to use subset instead of exact * Add support for setting exactMatch in nav-item and nav-group * Change default to subset --- .../layout/org-switcher.component.html | 1 + .../src/navigation/nav-group.component.html | 1 + .../src/navigation/nav-group.component.ts | 6 ++++++ .../components/src/navigation/nav-item.component.ts | 13 ++++++++++--- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/org-switcher.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/org-switcher.component.html index c08c2b17a21..e639c5f126d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/org-switcher.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/org-switcher.component.html @@ -5,6 +5,7 @@ icon="bwi-business" [route]="['../', activeOrganization.id]" [(open)]="open" + [exactMatch]="true" >
    - - +
    + + +
    @@ -100,6 +107,17 @@
    +
    + + +
    diff --git a/apps/web/src/app/settings/change-password.component.ts b/apps/web/src/app/settings/change-password.component.ts index a7d2930c359..fa57b9f4ae3 100644 --- a/apps/web/src/app/settings/change-password.component.ts +++ b/apps/web/src/app/settings/change-password.component.ts @@ -4,6 +4,7 @@ import { firstValueFrom } from "rxjs"; import { ChangePasswordComponent as BaseChangePasswordComponent } from "@bitwarden/angular/auth/components/change-password.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; @@ -39,6 +40,8 @@ export class ChangePasswordComponent extends BaseChangePasswordComponent { rotateEncKey = false; currentMasterPassword: string; masterPasswordHint: string; + checkForBreaches = true; + characterMinimumMessage = ""; constructor( i18nService: I18nService, @@ -48,6 +51,7 @@ export class ChangePasswordComponent extends BaseChangePasswordComponent { passwordGenerationService: PasswordGenerationService, platformUtilsService: PlatformUtilsService, policyService: PolicyService, + private auditService: AuditService, private folderService: FolderService, private cipherService: CipherService, private syncService: SyncService, @@ -77,6 +81,8 @@ export class ChangePasswordComponent extends BaseChangePasswordComponent { this.masterPasswordHint = (await this.apiService.getProfile()).masterPasswordHint; await super.ngOnInit(); + + this.characterMinimumMessage = this.i18nService.t("characterMinimum", this.minimumLength); } async rotateEncKeyClicked() { @@ -133,6 +139,20 @@ export class ChangePasswordComponent extends BaseChangePasswordComponent { return; } + if (this.masterPasswordHint != null && this.masterPasswordHint == this.masterPassword) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccurred"), + this.i18nService.t("hintEqualsPassword") + ); + return; + } + + this.leakedPassword = false; + if (this.checkForBreaches) { + this.leakedPassword = (await this.auditService.passwordLeaked(this.masterPassword)) > 0; + } + await super.submit(); } diff --git a/apps/web/src/auth/register-form/register-form.component.html b/apps/web/src/auth/register-form/register-form.component.html index ad091295687..f7c24f6a963 100644 --- a/apps/web/src/auth/register-form/register-form.component.html +++ b/apps/web/src/auth/register-form/register-form.component.html @@ -48,7 +48,7 @@ > {{ "important" | i18n }} - {{ "masterPassImportant" | i18n }} + {{ "masterPassImportant" | i18n }} {{ characterMinimumMessage }} - {{ "masterPassHint" | i18n }} + {{ "masterPassHintLabel" | i18n }} {{ "masterPassHintDesc" | i18n }} @@ -91,7 +91,20 @@
    - +
    +
    + + +
    +
    0) { + this.characterMinimumMessage = ""; + } else { + this.characterMinimumMessage = this.i18nService.t("characterMinimum", this.minimumLength); + } } async submit() { diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index de2f1119f2a..6562e4f5aac 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -659,7 +659,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3533,7 +3533,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -6481,5 +6481,41 @@ }, "secretsManagerEnable": { "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "important": { + "message": "Important:" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/libs/angular/src/auth/components/change-password.component.ts b/libs/angular/src/auth/components/change-password.component.ts index 3421b509e18..989b18f90f0 100644 --- a/libs/angular/src/auth/components/change-password.component.ts +++ b/libs/angular/src/auth/components/change-password.component.ts @@ -26,6 +26,8 @@ export class ChangePasswordComponent implements OnInit, OnDestroy { passwordStrengthResult: any; color: string; text: string; + leakedPassword: boolean; + minimumLength = Utils.minimumPasswordLength; protected email: string; protected kdf: KdfType; @@ -117,11 +119,11 @@ export class ChangePasswordComponent implements OnInit, OnDestroy { ); return false; } - if (this.masterPassword.length < 8) { + if (this.masterPassword.length < this.minimumLength) { this.platformUtilsService.showToast( "error", this.i18nService.t("errorOccurred"), - this.i18nService.t("masterPasswordMinlength", Utils.minimumPasswordLength) + this.i18nService.t("masterPasswordMinimumlength", this.minimumLength) ); return false; } @@ -152,7 +154,21 @@ export class ChangePasswordComponent implements OnInit, OnDestroy { return false; } - if (strengthResult != null && strengthResult.score < 3) { + const weakPassword = strengthResult != null && strengthResult.score < 3; + + if (weakPassword && this.leakedPassword) { + const result = await this.platformUtilsService.showDialog( + this.i18nService.t("weakAndBreachedMasterPasswordDesc"), + this.i18nService.t("weakAndExposedMasterPassword"), + this.i18nService.t("yes"), + this.i18nService.t("no"), + "warning" + ); + if (!result) { + return false; + } + } + if (weakPassword) { const result = await this.platformUtilsService.showDialog( this.i18nService.t("weakMasterPasswordDesc"), this.i18nService.t("weakMasterPassword"), @@ -164,7 +180,18 @@ export class ChangePasswordComponent implements OnInit, OnDestroy { return false; } } - + if (this.leakedPassword) { + const result = await this.platformUtilsService.showDialog( + this.i18nService.t("exposedMasterPasswordDesc"), + this.i18nService.t("exposedMasterPassword"), + this.i18nService.t("yes"), + this.i18nService.t("no"), + "warning" + ); + if (!result) { + return false; + } + } return true; } From a7e0be101473d5faf52ecc9f8f84880576134c8f Mon Sep 17 00:00:00 2001 From: Will Martin Date: Thu, 23 Feb 2023 11:26:07 -0500 Subject: [PATCH 064/232] [SM-539] hide HTML Details marker on Safari (#4828) --- apps/web/src/scss/tailwind.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/web/src/scss/tailwind.css b/apps/web/src/scss/tailwind.css index 41b79f8191f..a5eae6122ea 100644 --- a/apps/web/src/scss/tailwind.css +++ b/apps/web/src/scss/tailwind.css @@ -11,3 +11,12 @@ td.tw-break-words { overflow-wrap: anywhere; } + +/** + * tw-list-none hides summary arrow in Firefox & Chrome but not Safari: + * https://github.com/tailwindlabs/tailwindcss/issues/924#issuecomment-915509785 + */ +summary.tw-list-none::marker, +summary.tw-list-none::-webkit-details-marker { + display: none; +} From c184ff73cfaa2142b94d8617db33d266f6adbe51 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Thu, 23 Feb 2023 18:06:07 +0100 Subject: [PATCH 065/232] [SM-553] Fix header sometimes taking up to much space (#4840) --- .../src/app/secrets-manager/layout/layout.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.component.html index 36f6600d7ff..f47fc8968ae 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.component.html @@ -2,7 +2,7 @@ -
    +
    From d67257218ef80c70541304a070e7e6b1816e1f7a Mon Sep 17 00:00:00 2001 From: Will Martin Date: Thu, 23 Feb 2023 12:45:08 -0500 Subject: [PATCH 066/232] [SM-538] truncate project badge (#4842) * truncate project badge * use ellipsis pipe --- .../src/app/secrets-manager/shared/secrets-list.component.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html index 8538ce52d9c..34295f2b3b5 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html @@ -75,8 +75,9 @@ bitBadge badgeType="secondary" class="tw-ml-1" + [title]="project.name" > - {{ project.name }} + {{ project.name | ellipsis: 32 }} {{ secret.revisionDate | date: "medium" }} From 4d38c7a92a159bc8a1f5674d44cb315d9d32ee91 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Thu, 23 Feb 2023 23:50:38 +0100 Subject: [PATCH 067/232] [SM-557] Use bitTypography for headers (#4839) * Use bitTypography * Remove tw-text-xl from menu items --- apps/web/src/app/shared/shared.module.ts | 9 +++-- .../overview/overview.component.html | 4 +-- .../service-accounts-list.component.html | 8 ++--- .../access-selector.component.html | 2 +- .../shared/header.component.html | 4 ++- .../shared/new-menu.component.html | 6 ++-- .../shared/projects-list.component.html | 10 +++--- .../shared/secrets-list.component.html | 16 ++++----- .../src/typography/typography.directive.ts | 33 +++++++++++++++---- 9 files changed, 58 insertions(+), 34 deletions(-) diff --git a/apps/web/src/app/shared/shared.module.ts b/apps/web/src/app/shared/shared.module.ts index 7ac8e3a8e39..27649f12d1b 100644 --- a/apps/web/src/app/shared/shared.module.ts +++ b/apps/web/src/app/shared/shared.module.ts @@ -23,10 +23,11 @@ import { LinkModule, MenuModule, MultiSelectModule, + RadioButtonModule, TableModule, TabsModule, - RadioButtonModule, ToggleGroupModule, + TypographyModule, } from "@bitwarden/components"; // Register the locales for the application @@ -67,10 +68,11 @@ import "./locales"; LinkModule, MenuModule, MultiSelectModule, + RadioButtonModule, TableModule, TabsModule, - RadioButtonModule, ToggleGroupModule, + TypographyModule, // Web specific ], @@ -100,10 +102,11 @@ import "./locales"; LinkModule, MenuModule, MultiSelectModule, + RadioButtonModule, TableModule, TabsModule, - RadioButtonModule, ToggleGroupModule, + TypographyModule, // Web specific ], diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index 2182c9ca44a..1da49ab344e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -36,7 +36,7 @@
    -

    {{ "projects" | i18n }}

    +

    {{ "projects" | i18n }}

    -

    {{ "secrets" | i18n }}

    +

    {{ "secrets" | i18n }}

    - + @@ -80,11 +80,11 @@ - + {{ "viewServiceAccount" | i18n }}

    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html index 39b9e031a01..528514e678a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.html @@ -10,15 +10,15 @@ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html index 19fc68fb127..6bf5232152e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html @@ -56,7 +56,7 @@
    - + {{ project.name }} @@ -75,15 +75,15 @@ - + {{ "viewProject" | i18n }} @@ -93,7 +93,7 @@ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html index 34295f2b3b5..96f5dff87fc 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html @@ -63,7 +63,7 @@
    - + @@ -94,15 +94,15 @@ @@ -125,11 +125,11 @@ diff --git a/libs/components/src/typography/typography.directive.ts b/libs/components/src/typography/typography.directive.ts index 69dfd903afa..f8034fd98fb 100644 --- a/libs/components/src/typography/typography.directive.ts +++ b/libs/components/src/typography/typography.directive.ts @@ -1,26 +1,45 @@ +import { coerceBooleanProperty } from "@angular/cdk/coercion"; import { Directive, HostBinding, Input } from "@angular/core"; type TypographyType = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "body1" | "body2" | "helper"; const styles: Record = { - h1: ["tw-text-3xl", "tw-font-semibold", "tw-mb-2"], - h2: ["tw-text-2xl", "tw-font-semibold", "tw-mb-2"], - h3: ["tw-text-xl", "tw-font-semibold", "tw-mb-2"], - h4: ["tw-text-lg", "tw-font-semibold", "tw-mb-2"], - h5: ["tw-text-base", "tw-font-semibold", "tw-mb-2"], - h6: ["tw-text-sm", "tw-font-semibold", "tw-mb-2"], + h1: ["tw-text-3xl", "tw-font-semibold"], + h2: ["tw-text-2xl", "tw-font-semibold"], + h3: ["tw-text-xl", "tw-font-semibold"], + h4: ["tw-text-lg", "tw-font-semibold"], + h5: ["tw-text-base", "tw-font-semibold"], + h6: ["tw-text-sm", "tw-font-semibold"], body1: ["tw-text-base"], body2: ["tw-text-sm"], helper: ["tw-text-xs"], }; +const margins: Record = { + h1: ["tw-mb-2"], + h2: ["tw-mb-2"], + h3: ["tw-mb-2"], + h4: ["tw-mb-2"], + h5: ["tw-mb-2"], + h6: ["tw-mb-2"], + body1: [], + body2: [], + helper: [], +}; + @Directive({ selector: "[bitTypography]", }) export class TypographyDirective { @Input("bitTypography") bitTypography: TypographyType; + private _margin = true; + @Input() + set noMargin(value: boolean | "") { + this._margin = !coerceBooleanProperty(value); + } + @HostBinding("class") get classList() { - return styles[this.bitTypography]; + return styles[this.bitTypography].concat(this._margin ? margins[this.bitTypography] : []); } } From e68c150f1e1c4707d474dbaaed80777784e347b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 13:37:27 +0100 Subject: [PATCH 068/232] Autosync the updated translations (#4851) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/ar/messages.json | 66 ++++++------ apps/desktop/src/locales/ca/messages.json | 2 +- apps/desktop/src/locales/de/messages.json | 2 +- apps/desktop/src/locales/es/messages.json | 2 +- apps/desktop/src/locales/fi/messages.json | 2 +- apps/desktop/src/locales/fil/messages.json | 2 +- apps/desktop/src/locales/fr/messages.json | 2 +- apps/desktop/src/locales/id/messages.json | 10 +- apps/desktop/src/locales/pt_BR/messages.json | 104 +++++++++---------- apps/desktop/src/locales/ru/messages.json | 2 +- apps/desktop/src/locales/uk/messages.json | 2 +- 11 files changed, 98 insertions(+), 98 deletions(-) diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index d11238e9d31..05395decee3 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -542,7 +542,7 @@ "message": "مطلوب إعادة كتابة كلمة المرور الرئيسية." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "كلمة المرور الرئيسية يجب أن تكون على الأقل $VALUE$ حرفاً.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2069,35 +2069,35 @@ "message": "تسجيل الدخول باستخدام جهاز آخر" }, "logInInitiated": { - "message": "Log in initiated" + "message": "بدء تسجيل الدخول" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "تم إرسال إشعار إلى جهازك." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "الرجاء التأكد من أن المخزن الخاص بك غير مقفل وأن عبارة بصمة الإصبع تطابق الجهاز الآخر." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "عبارة بصمة الإصبع" }, "needAnotherOption": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "تسجيل الدخول باستخدام الجهاز يجب أن يتم إعداده في إعدادات تطبيق Bitwarden. هل تحتاج إلى خيار آخر؟" }, "viewAllLoginOptions": { - "message": "View all login options" + "message": "عرض جميع خيارات تسجيل الدخول" }, "resendNotification": { - "message": "Resend notification" + "message": "إعادة إرسال الإشعار" }, "toggleCharacterCount": { "message": "تبديل عدد الأحرف", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "هل تحاول تسجيل الدخول؟" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "محاولة تسجيل الدخول بواسطة $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2106,25 +2106,25 @@ } }, "deviceType": { - "message": "Device Type" + "message": "نوع الجهاز" }, "ipAddress": { - "message": "IP Address" + "message": "عنوان IP" }, "time": { - "message": "Time" + "message": "الوقت" }, "confirmLogIn": { - "message": "Confirm login" + "message": "تأكيد تسجيل الدخول" }, "denyLogIn": { - "message": "Deny login" + "message": "رفض تسجيل الدخول" }, "approveLoginRequests": { - "message": "Approve login requests" + "message": "الموافقة على طلبات تسجيل الدخول" }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "تم تأكيد تسجيل الدخول لـ $EMAIL$ في $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -2137,13 +2137,13 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "لقد رفضت محاولة تسجيل الدخول من جهاز آخر. إذا كان هذا بالفعل أنت ، حاول تسجيل الدخول مرة أخرى باستخدام الجهاز." }, "justNow": { - "message": "Just now" + "message": "للتو الآن" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "طلب قبل $MINUTES$ دقائق", "placeholders": { "minutes": { "content": "$1", @@ -2152,16 +2152,16 @@ } }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "لقد انتهت صلاحية طلب تسجيل الدخول." }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "هذا الطلب لم يعد صالحًا." }, "approveLoginRequestDesc": { - "message": "Use this device to approve login requests made from other devices." + "message": "استخدم هذا الجهاز للموافقة على طلبات تسجيل الدخول من الأجهزة الأخرى." }, "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "message": "تأكيد محاولة تسجيل الدخول لـ $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2170,31 +2170,31 @@ } }, "logInRequested": { - "message": "Log in requested" + "message": "طلب تسجيل الدخول" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "كلمة المرور الرئيسية مكشوفة" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "كلمة المرور موجودة في خرق البيانات. استخدم كلمة مرور فريدة لحماية حسابك. هل أنت متأكد من أنك تريد استخدام كلمة مرور مكشوفة؟" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "كلمة المرور الرئيسية ضعيفة ومكشوفة" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "كلمة مرور ضعيفة محددة وموجودة في خرق البيانات. استخدم كلمة مرور قوية وفريدة لحماية حسابك. هل أنت متأكد من أنك تريد استخدام كلمة المرور هذه؟" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "تحقق من خروقات البيانات المعروفة لكلمة المرور هذه" }, "important": { - "message": "Important:" + "message": "مهم:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "لا يمكن استعادة كلمة المرور الرئيسية إذا نسيتها!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ حرف أدنى", "placeholders": { "length": { "content": "$1", diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index b6c76bc5542..45ecee7fc96 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -542,7 +542,7 @@ "message": "Cal tornar a escriure la contrasenya mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "La contrasenya mestra ha de contenir almenys $VALUE$ caràcters.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 9b082ab1275..7b12e493dac 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -542,7 +542,7 @@ "message": "Erneute Eingabe des Master-Passworts ist erforderlich." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Das Master-Passwort muss mindestens $VALUE$ Zeichen lang sein.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 76c3504a402..191b02606d4 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -542,7 +542,7 @@ "message": "Se requiere volver a teclear la contraseña maestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "La contraseña maestra debe tener al menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 25c29a12a65..66e0dc7400f 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -542,7 +542,7 @@ "message": "Pääsalasanan uudelleensyöttö vaaditaan." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Pääsalasanan tulee sisältää vähintään $VALUE$ merkkiä.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 8f114993fbe..f10ff007efe 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -542,7 +542,7 @@ "message": "Kailangan ang master password retype." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ang master password ay dapat na hindi bababa sa $VALUE$ na mga character.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 09444985654..867bf6860e2 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -542,7 +542,7 @@ "message": "Une nouvelle saisie du mot de passe principal est nécessaire." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Le mot de passe principal doit comporter au moins $VALUE$ caractères.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 038fcfb88d4..1bbc38dad2b 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2173,7 +2173,7 @@ "message": "Log in requested" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Kata Sandi Utama terekspos" }, "exposedMasterPasswordDesc": { "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" @@ -2185,16 +2185,16 @@ "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Periksa pelanggaran data yang diketahui untuk kata sandi ini" }, "important": { - "message": "Important:" + "message": "Penting:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Kata sandi utama Anda tidak dapat dipulihkan jika Anda lupa!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ karakter minimal", "placeholders": { "length": { "content": "$1", diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index d17f5563cdd..241b95bb71b 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -101,7 +101,7 @@ "message": "Editar Item" }, "emailAddress": { - "message": "Endereço de E-mail" + "message": "Endereço de e-mail" }, "verificationCodeTotp": { "message": "Código de Verificação (TOTP)" @@ -272,7 +272,7 @@ "message": "Último Nome" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "address1": { "message": "Endereço 1" @@ -373,7 +373,7 @@ "message": "Você tem certeza que deseja substituir a senha atual?" }, "overwriteUsername": { - "message": "Substituir Usuário" + "message": "Sobrescrever usuário" }, "overwriteUsernameConfirmation": { "message": "Tem certeza que deseja substituir o usuário atual?" @@ -413,7 +413,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { "message": "Número de palavras" @@ -426,7 +426,7 @@ "description": "Make the first letter of a word uppercase." }, "includeNumber": { - "message": "Incluir Número" + "message": "Incluir número" }, "close": { "message": "Fechar" @@ -488,7 +488,7 @@ "message": "Você tem certeza que deseja excluir esta pasta?" }, "deletedFolder": { - "message": "Pasta apagada" + "message": "Pasta excluída" }, "loginOrCreateNewAccount": { "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." @@ -536,13 +536,13 @@ "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A senha mestre é obrigatória." + "message": "A senha mestra é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "É necessário redigitar a senha mestre." + "message": "É necessário redigitar a senha mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -573,10 +573,10 @@ "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { - "message": "Enviar Código" + "message": "Enviar código" }, "codeSent": { - "message": "Código Enviado" + "message": "Código enviado" }, "verificationCode": { "message": "Código de Verificação" @@ -660,7 +660,7 @@ "message": "WebAuthn FIDO2" }, "webAuthnDesc": { - "message": "Utilize qualquer chave de segurança ativada por WebAuthn para acessar a sua conta." + "message": "Utilize qualquer chave de segurança compatível com WebAuthn para acessar a sua conta." }, "emailTitle": { "message": "E-mail" @@ -672,7 +672,7 @@ "message": "Sessão Indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem o início de sessão em duas etapas ativada, no entanto, nenhum dos provedores de início de sessão em duas etapas configurados são suportados por este dispositivo." + "message": "Esta conta tem a autenticação por duas etapas ativado, no entanto, nenhum dos provedores de início de sessão em duas etapas configurados são suportados por este dispositivo." }, "noTwoStepProviders2": { "message": "Por favor inclua provedores adicionais que são melhor suportados entre dispositivos (como um aplicativo de autenticação)." @@ -711,7 +711,7 @@ "message": "URL do Servidor de Ícones" }, "environmentSaved": { - "message": "Os URLs de ambiente foram salvos." + "message": "As URLs de ambiente foram salvas" }, "ok": { "message": "Ok" @@ -762,7 +762,7 @@ "message": "Carregando..." }, "lockVault": { - "message": "Bloquear Cofre" + "message": "Bloquear cofre" }, "passwordGenerator": { "message": "Gerador de Senha" @@ -774,7 +774,7 @@ "message": "Obter Ajuda" }, "fileBugReport": { - "message": "Enviar um Relatório de Bug" + "message": "Relate um bug" }, "blog": { "message": "Blog" @@ -840,7 +840,7 @@ "message": "A autenticação em duas etapas torna sua conta mais segura, exigindo que você verifique o seu login com outro dispositivo, como uma chave de segurança, um aplicativo de autenticação, SMS, chamada telefônica ou e-mail. A autenticação em duas etapas pode ser ativada no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "twoStepLogin": { - "message": "Login em Duas Etapas" + "message": "Autenticação em duas etapas" }, "vaultTimeout": { "message": "Tempo Limite do Cofre" @@ -911,7 +911,7 @@ "message": "Mostrar ícones dos sites" }, "faviconDesc": { - "message": "Mostre uma imagem reconhecível ao lado de cada login." + "message": "Mostre uma imagem reconhecível ao lado de cada credencial." }, "enableMinToTray": { "message": "Minimizar para Ícone da Bandeja" @@ -959,7 +959,7 @@ "message": "Iniciar automaticamente ao iniciar sessão" }, "openAtLoginDesc": { - "message": "Inicia o aplicativo Bitwarden Desktop automaticamente no logon." + "message": "Inicie o aplicativo Bitwarden Desktop automaticamente no login." }, "alwaysShowDock": { "message": "Exibir sempre na Dock" @@ -998,7 +998,7 @@ "description": "Copy to clipboard" }, "checkForUpdates": { - "message": "Verificar por atualizações" + "message": "Verificar por atualizações…" }, "version": { "message": "Versão $VERSION_NUM$", @@ -2069,35 +2069,35 @@ "message": "Fazer login com outro dispositivo" }, "logInInitiated": { - "message": "Log in initiated" + "message": "Login iniciado" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "Uma notificação foi enviada para seu dispositivo." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "Por favor, certifique-se de que o seu cofre esteja desbloqueado e a frase de identificação corresponda ao outro dispositivo." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Frase de identificação" }, "needAnotherOption": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" }, "viewAllLoginOptions": { - "message": "View all login options" + "message": "Ver todas as opções de login" }, "resendNotification": { - "message": "Resend notification" + "message": "Reenviar notificação" }, "toggleCharacterCount": { "message": "Ativar/Desativar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Você está tentando fazer login?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Tentativa de login por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2106,25 +2106,25 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Tipo de dispositivo" }, "ipAddress": { - "message": "IP Address" + "message": "Endereço IP" }, "time": { - "message": "Time" + "message": "Horário" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Confirmar acesso" }, "denyLogIn": { - "message": "Deny login" + "message": "Negar acesso" }, "approveLoginRequests": { - "message": "Approve login requests" + "message": "Aprovar solicitações de acesso" }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "Acesso confirmado para $EMAIL$ em $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -2137,13 +2137,13 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Você negou uma tentativa de acesso de outro dispositivo. Se isso realmente foi você, tente fazer login com o dispositivo novamente." }, "justNow": { - "message": "Just now" + "message": "Agora há pouco" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Solicitado há $MINUTES$ minutos", "placeholders": { "minutes": { "content": "$1", @@ -2152,16 +2152,16 @@ } }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "O pedido de login já expirou." }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Este pedido não é mais válido." }, "approveLoginRequestDesc": { - "message": "Use this device to approve login requests made from other devices." + "message": "Use este dispositivo para aprovar solicitações de acesso feitas de outros dispositivos." }, "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "message": "Confirmar tentativa de acesso de $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2170,31 +2170,31 @@ } }, "logInRequested": { - "message": "Log in requested" + "message": "Acesso solicitado" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Senha Mestra comprometida" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Senha encontrada em um vazamento de dados. Use uma senha única para proteger sua conta. Tem certeza de que deseja usar uma senha já exposta?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Senha Mestra Fraca e Comprometida" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Senha fraca identificada e encontrada em um vazamento de dados. Use uma senha forte e única para proteger a sua conta. Tem certeza de que deseja usar essa senha?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Verificar vazamentos de dados conhecidos para esta senha" }, "important": { - "message": "Important:" + "message": "Importante:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "A sua senha mestra não pode ser recuperada se você esquecê-la!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ caracteres mínimos", "placeholders": { "length": { "content": "$1", diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 669f9452ac1..a409a0e0c0b 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -542,7 +542,7 @@ "message": "Необходимо повторно ввести мастер-пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Мастер-пароль должен содержать не менее $VALUE$ символов.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index a3776f8a9e1..18943adba16 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -542,7 +542,7 @@ "message": "Необхідно повторно ввести головний пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Довжина головного пароля має бути принаймні $VALUE$ символів.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { From 5d25b648d0469f4cfbdcb2964a265c190edc1e79 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 14:46:13 +0100 Subject: [PATCH 069/232] Autosync the updated translations (#4853) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 112 +++++++++------ apps/browser/src/_locales/az/messages.json | 52 +++++-- apps/browser/src/_locales/be/messages.json | 54 ++++++-- apps/browser/src/_locales/bg/messages.json | 52 +++++-- apps/browser/src/_locales/bn/messages.json | 52 +++++-- apps/browser/src/_locales/bs/messages.json | 52 +++++-- apps/browser/src/_locales/ca/messages.json | 54 ++++++-- apps/browser/src/_locales/cs/messages.json | 52 +++++-- apps/browser/src/_locales/da/messages.json | 52 +++++-- apps/browser/src/_locales/de/messages.json | 128 +++++++++++------- apps/browser/src/_locales/el/messages.json | 52 +++++-- apps/browser/src/_locales/en_GB/messages.json | 52 +++++-- apps/browser/src/_locales/en_IN/messages.json | 52 +++++-- apps/browser/src/_locales/es/messages.json | 58 +++++--- apps/browser/src/_locales/et/messages.json | 58 +++++--- apps/browser/src/_locales/eu/messages.json | 52 +++++-- apps/browser/src/_locales/fa/messages.json | 54 ++++++-- apps/browser/src/_locales/fi/messages.json | 54 ++++++-- apps/browser/src/_locales/fil/messages.json | 54 ++++++-- apps/browser/src/_locales/fr/messages.json | 54 ++++++-- apps/browser/src/_locales/gl/messages.json | 52 +++++-- apps/browser/src/_locales/he/messages.json | 52 +++++-- apps/browser/src/_locales/hi/messages.json | 52 +++++-- apps/browser/src/_locales/hr/messages.json | 52 +++++-- apps/browser/src/_locales/hu/messages.json | 54 ++++++-- apps/browser/src/_locales/id/messages.json | 52 +++++-- apps/browser/src/_locales/it/messages.json | 54 ++++++-- apps/browser/src/_locales/ja/messages.json | 58 +++++--- apps/browser/src/_locales/ka/messages.json | 52 +++++-- apps/browser/src/_locales/km/messages.json | 52 +++++-- apps/browser/src/_locales/kn/messages.json | 52 +++++-- apps/browser/src/_locales/ko/messages.json | 52 +++++-- apps/browser/src/_locales/lt/messages.json | 52 +++++-- apps/browser/src/_locales/lv/messages.json | 52 +++++-- apps/browser/src/_locales/ml/messages.json | 52 +++++-- apps/browser/src/_locales/nb/messages.json | 54 ++++++-- apps/browser/src/_locales/ne/messages.json | 52 +++++-- apps/browser/src/_locales/nl/messages.json | 52 +++++-- apps/browser/src/_locales/nn/messages.json | 52 +++++-- apps/browser/src/_locales/pl/messages.json | 52 +++++-- apps/browser/src/_locales/pt_BR/messages.json | 88 +++++++----- apps/browser/src/_locales/pt_PT/messages.json | 52 +++++-- apps/browser/src/_locales/ro/messages.json | 52 +++++-- apps/browser/src/_locales/ru/messages.json | 54 ++++++-- apps/browser/src/_locales/si/messages.json | 52 +++++-- apps/browser/src/_locales/sk/messages.json | 54 ++++++-- apps/browser/src/_locales/sl/messages.json | 52 +++++-- apps/browser/src/_locales/sr/messages.json | 52 +++++-- apps/browser/src/_locales/sv/messages.json | 52 +++++-- apps/browser/src/_locales/te/messages.json | 52 +++++-- apps/browser/src/_locales/th/messages.json | 52 +++++-- apps/browser/src/_locales/tr/messages.json | 52 +++++-- apps/browser/src/_locales/uk/messages.json | 54 ++++++-- apps/browser/src/_locales/vi/messages.json | 54 ++++++-- apps/browser/src/_locales/zh_CN/messages.json | 54 ++++++-- apps/browser/src/_locales/zh_TW/messages.json | 52 +++++-- apps/browser/store/locales/fr/copy.resx | 2 +- 57 files changed, 2238 insertions(+), 894 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 78fca92a111..734c18f86f6 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -430,7 +430,7 @@ "message": "مطلوب إعادة كتابة كلمة المرور الرئيسية." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "كلمة المرور الرئيسية يجب أن تكون على الأقل $VALUE$ حرفاً.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -964,70 +964,70 @@ "message": "ملء تلقائي عند تحميل الصفحة" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "إذا تم اكتشاف نموذج تسجيل الدخول، يتم التعبئة التلقائية عند تحميل صفحة الويب." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "مواقع المساومة أو غير الموثوق بها يمكن أن تستغل الملء التلقائي في تحميل الصفحة." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "تعرف على المزيد حول الملء التلقائي" }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "الإعداد الافتراضي للملء التلقائي لعناصر تسجيل الدخول" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "يمكنك إيقاف الملء التلقائي في تحميل الصفحة لعناصر تسجيل الدخول الفردية من عرض تحرير العنصر." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "ملء تلقائي عند تحميل الصفحة (إذا كان الإعداد في الخيارات)" }, "autoFillOnPageLoadUseDefault": { "message": "إستخدم الإعداد الإفتراضي" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "ملء تلقائي عند تحميل الصفحة" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "لا تملأ تلقائياً عند تحميل الصفحة" }, "commandOpenPopup": { - "message": "Open vault popup" + "message": "فتح منبثقات المخزن" }, "commandOpenSidebar": { - "message": "Open vault in sidebar" + "message": "فتح المخزن في الشريط الجانبي" }, "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "message": "ملء تلقائي لآخر تسجيل دخول مستخدم للموقع الحالي" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "إنشاء واستنساخ كلمة مرور عشوائية جديدة إلى الحافظة" }, "commandLockVaultDesc": { - "message": "Lock the vault" + "message": "قفل المخزن" }, "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." + "message": "دعم الوضع الخاص تجريبي وبعض الميزات محدودة." }, "customFields": { - "message": "Custom fields" + "message": "الحقول المخصصة" }, "copyValue": { - "message": "Copy value" + "message": "نسخ القيمة" }, "value": { - "message": "Value" + "message": "القيمة" }, "newCustomField": { - "message": "New custom field" + "message": "حقل مخصص جديد" }, "dragToSort": { - "message": "Drag to sort" + "message": "اسحب للفرز" }, "cfTypeText": { - "message": "Text" + "message": "نص" }, "cfTypeHidden": { - "message": "Hidden" + "message": "مخفي" }, "cfTypeBoolean": { "message": "قيمة منطقية" @@ -1306,30 +1306,30 @@ "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "أنواع" }, "allItems": { - "message": "All items" + "message": "كافة العناصر" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "لا توجد كلمات مرور للعرض." }, "remove": { - "message": "Remove" + "message": "إزالة" }, "default": { - "message": "Default" + "message": "الافتراضي" }, "dateUpdated": { - "message": "Updated", + "message": "تم التحديث", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "أنشئ", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "تحديث كلمة المرور", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 6615c30d6a3..dad4a0600ab 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Səhifə yüklənəndə avto-doldurma sınansın?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Avto-doldurma necə edilir" }, - "autofillPageLoadInfo": { - "message": "Səhifə yüklənərkən avto-doldurmanı işə salsanız giriş formları uyğun gələn kimlik məlumatlarını avtomatik dolduracaq." - }, "autofillSelectInfo": { - "message": "Aktiv vərəqin formunu avtomatik doldurmaq üçün bu səhifədən bir element seçin." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Səhifə yüklənərkən avto-doldurma işə salındı" + "autofillSelectInfoNoCommand": { + "message": "Bu səhifədən bir element seçin və ya tənzimləmələrdə bir qısayol tənzimləyin. Həmçinin səhifə yüklənəndə avto-doldurmanı sınaya bilərsiniz." }, - "turnOn": { - "message": "İşə sal" + "gotIt": { + "message": "Anladım" }, - "notNow": { - "message": "İndi yox" + "autofillSettings": { + "message": "Avto-doldurma tənzimləmələri" + }, + "autofillShortcut": { + "message": "Avto-doldurma klaviatura qısayolu" + }, + "autofillShortcutNotSet": { + "message": "Avto-doldurma qısayolu tənzimlənməyib. Bunu brauzerin tənzimləmələrində dəyişdirin." + }, + "autofillShortcutText": { + "message": "Avto-doldurma qısayolu: $COMMAND$. Bunu brauzerin tənzimləmələrində dəyişdirin.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "İlkin avto-doldurma qısayolu: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index c6e5ab4aff3..89ce61b37a3 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -430,7 +430,7 @@ "message": "Неабходна паўторна ўвесці асноўны пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Асноўны пароль павінен змяшчаць прынамсі $VALUE$ сімвалаў.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Паспрабаваць аўтазапоўніць пры загрузцы старонкі?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Як аўтазапоўніць" }, - "autofillPageLoadInfo": { - "message": "Калі аўтазапаўненне пры загрузцы старонкі ўключана, формы ўваходу будуць аўтаматычна запаўняцца адпаведнымі ўліковымі данымі." - }, "autofillSelectInfo": { - "message": "Выберыце элемент з гэтай старонкі для аўтазапаўнення формы на актыўнай укладцы." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Аўтазапаўненне пры загрузцы старонкі ўключана" + "autofillSelectInfoNoCommand": { + "message": "Выберыце элемент на гэтай старонцы або задайце спалучэнні клавіш у наладах. Вы таксама можаце паспрабаваць аўтазапаўненне пры загрузцы старонкі." }, - "turnOn": { - "message": "Уключыць" + "gotIt": { + "message": "Зразумела" }, - "notNow": { - "message": "Не зараз" + "autofillSettings": { + "message": "Налады аўтазапаўнення" + }, + "autofillShortcut": { + "message": "Спалучэнні клавіш аўтазапаўнення" + }, + "autofillShortcutNotSet": { + "message": "Спалучэнні клавіш аўтазапаўнення не зададзены. Змяніце гэта ў наладах браўзера." + }, + "autofillShortcutText": { + "message": "Спалучэнні клавіш аўтазапаўнення: $COMMAND$. Змяніце гэта ў наладах браўзера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Прадвызначаная спалучэнні клавіш аўтазапаўнення: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 8684c3f865e..830c35d8f82 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Да се направи ли опит за автоматично попълване при зареждане на страницата?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Как се ползва автоматичното попълване" }, - "autofillPageLoadInfo": { - "message": "Ако включите автоматичното попълване при зареждане на страницата, формулярите за вписване ще бъдат автоматично попълвани при наличие на съвпадение в трезора." - }, "autofillSelectInfo": { - "message": "Изберете елемент от тази страница, за да се попълни автоматично формуляра в текущия раздел." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Авт. попълване при зареждане на страницата е включено" + "autofillSelectInfoNoCommand": { + "message": "Изберете елемент от тази страница или задайте клавишна комбинация в настройките. Можете да опитате и функцията за автоматично попълване при зареждане на страницата." }, - "turnOn": { - "message": "Включване" + "gotIt": { + "message": "Разбрано" }, - "notNow": { - "message": "Не сега" + "autofillSettings": { + "message": "Настройки за автоматичното попълване" + }, + "autofillShortcut": { + "message": "Клавишна комбинация за автоматично попълване" + }, + "autofillShortcutNotSet": { + "message": "Няма зададена клавишна комбинация за автоматичното попълване. Променете това в настройките на браузъра." + }, + "autofillShortcutText": { + "message": "Клавишната комбинация за автоматично попълване е: $COMMAND$. Може да я промените в настройките на браузъра.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Стандартна клавишна комбинация за автоматично попълване: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index c03876ba83a..133a8510111 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 5aa83bb1e18..736ed372d4c 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 8c8569a451e..2d4017f98a6 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -430,7 +430,7 @@ "message": "Cal tornar a escriure la contrasenya mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "La contrasenya mestra ha de contenir almenys $VALUE$ caràcters.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Es prova l'emplenament automàtic en carregar la pàgina?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Com emplenar automàticament" }, - "autofillPageLoadInfo": { - "message": "Els formularis d'inici de sessió emplenaran automàticament les credencials coincidents si activeu l'emplenament automàtic en carregar la pàgina." - }, "autofillSelectInfo": { - "message": "Selecciona un element d'aquesta pàgina per emplenar automàticament el formulari de la pestanya activa." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "S'ha activat l'emplenament automàtic en carregar de la pàgina" + "autofillSelectInfoNoCommand": { + "message": "Seleccioneu un element d'aquesta pàgina o definiu una drecera a la configuració. També podeu provar l'emplenament automàtic en carregar la pàgina." }, - "turnOn": { - "message": "Activa" + "gotIt": { + "message": "D'acord" }, - "notNow": { - "message": "Ara no" + "autofillSettings": { + "message": "Configuració d'emplenament automàtic" + }, + "autofillShortcut": { + "message": "Drecera de teclat d'emplenament automàtic" + }, + "autofillShortcutNotSet": { + "message": "La drecera d'emplenament automàtic no està configurada. Canvieu-ho a la configuració del navegador." + }, + "autofillShortcutText": { + "message": "La drecera d'emplenament automàtic és: $COMMAND$. Canvieu-ho a la configuració del navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Drecera d'emplenament automàtic per defecte: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index a66ec03ac02..daa3923fd30 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 36d36016691..38f8b4bec47 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Prøv autoudfyldning ved sideindlæsning?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Sådan autoudfyldes" }, - "autofillPageLoadInfo": { - "message": "Login-formularer udfyldes automatisk med matchende legitimationsoplysninger, hvis autoudfyldning ved sideindlæsning aktiveres." - }, "autofillSelectInfo": { - "message": "Vælg et element fra denne side for at autoudfylde den aktive fanes formular." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Autoudfyldning ved sideindlæsning aktiveret" + "autofillSelectInfoNoCommand": { + "message": "Vælg et element fra denne side eller opsæt en genvej i indstillinger. Man kan også prøve autoudfyld ved sideindlæsning." }, - "turnOn": { - "message": "Aktivér" + "gotIt": { + "message": "Forstået" }, - "notNow": { - "message": "Ikke nu" + "autofillSettings": { + "message": "Autoudfyldelsesindstillinger" + }, + "autofillShortcut": { + "message": "Autoudfyld-tastaturgenvej" + }, + "autofillShortcutNotSet": { + "message": "Autoudfyldningsgenvejen er ikke opsat. Ændr dette i browserens indstillinger." + }, + "autofillShortcutText": { + "message": "Autoudfyldningsgenvejen er: $COMMAND$. Ændr dette i browserens indstillinger.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standard autoudfyldningsgenvej: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index d54cbea44f2..075079e04cc 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -131,7 +131,7 @@ "message": "Einen Bestätigungscode an deine E-Mail senden" }, "sendCode": { - "message": "Send Code" + "message": "Code senden" }, "codeSent": { "message": "Code gesendet" @@ -430,7 +430,7 @@ "message": "Erneute Eingabe des Master-Passworts ist erforderlich." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Das Master-Passwort muss mindestens $VALUE$ Zeichen lang sein.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -541,10 +541,10 @@ "message": "Neue URL" }, "addedItem": { - "message": "Neuer Eintrag" + "message": "Eintrag hinzugefügt" }, "editedItem": { - "message": "Eintrag bearbeitet" + "message": "Eintrag gespeichert" }, "deleteItemConfirmation": { "message": "Soll dieser Eintrag wirklich in den Papierkorb verschoben werden?" @@ -559,7 +559,7 @@ "message": "Sind Sie sicher, dass Sie das aktuelle Passwort ersetzen möchten?" }, "overwriteUsername": { - "message": "Benutzername überschreiben" + "message": "Benutzername ersetzten" }, "overwriteUsernameConfirmation": { "message": "Bist du sicher, dass du den aktuellen Benutzernamen überschreiben möchtest?" @@ -581,7 +581,7 @@ "message": "Danach fragen Zugangsdaten hinzuzufügen" }, "addLoginNotificationDesc": { - "message": "Die \"Login hinzufügen\" Benachrichtigung fragt dich automatisch, ob du neue Zugangsdaten im Tresor speichern möchtest, wenn du dich zum ersten Mal mit ihnen anmeldest." + "message": "Wenn ein Eintrag nicht in deinem Tresor gefunden wurde, danach fragen." }, "showCardsCurrentTab": { "message": "Karten auf Tab Seite anzeigen" @@ -730,16 +730,16 @@ "message": "Möchtest du diesen Anhang wirklich löschen?" }, "deletedAttachment": { - "message": "Gelöschter Anhang" + "message": "Anhang gelöscht" }, "newAttachment": { - "message": "Anhang hinzufügen" + "message": "Neuen Anhang hinzufügen" }, "noAttachments": { "message": "Keine Anhänge." }, "attachmentSaved": { - "message": "Der Anhang wurde gespeichert." + "message": "Anhang gespeichert" }, "file": { "message": "Datei" @@ -772,7 +772,7 @@ "message": "Du bist derzeit kein Premium-Mitglied." }, "premiumSignUpAndGet": { - "message": "Werde Premium-Mitglied und erhalte dafür:" + "message": "Melde dich für eine Premium-Mitgliedschaft an und erhalte dafür:" }, "ppremiumSignUpStorage": { "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." @@ -820,13 +820,13 @@ "message": "TOTP automatisch kopieren" }, "disableAutoTotpCopyDesc": { - "message": "Ist ein Authentifizierungsschlüssel mit Ihren Zugangsdaten verknüpft, wird der TOTP Verifizierungscode automatisch in die Zwischenablage kopiert, wenn Sie die Zugangsdaten automatisch ausfüllen lassen." + "message": "Ist ein Authentifizierungsschlüssel mit deinen Zugangsdaten verknüpft, wird der TOTP Verifizierungscode in die Zwischenablage kopiert, wenn du die Zugangsdaten automatisch einfügen lässt." }, "enableAutoBiometricsPrompt": { "message": "Beim Start nach biometrischen Daten fragen" }, "premiumRequired": { - "message": "Erweiterte Mitgliedschaft wird benötigt" + "message": "Premium-Mitgliedschaft benötigt" }, "premiumRequiredDesc": { "message": "Eine Premium-Mitgliedschaft ist für diese Funktion notwendig." @@ -880,7 +880,7 @@ "message": "Anmeldung nicht verfügbar" }, "noTwoStepProviders": { - "message": "Dieses Konto hat eine aktive Zwei-Faktor Authentifizierung, allerdings wird keiner der konfigurierten Zwei-Faktor Anbieter von diesem Browser unterstützt." + "message": "Für dieses Konto wurde eine Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Browser unterstützt." }, "noTwoStepProviders2": { "message": "Bitte benutze einen unterstützten Browser (z.B. Chrome) und / oder füge zusätzliche Anbieter hinzu, die von mehr Browsern unterstützt werden (wie eine Authentifizierungs-App)." @@ -889,7 +889,7 @@ "message": "Optionen für Zwei-Faktor Authentifizierung" }, "recoveryCodeDesc": { - "message": "Zugang zu allen Zwei-Faktor-Anbietern verloren? Benutzen Sie Ihren Wiederherstellungscode, um alle Zwei-Faktor-Anbieter in Ihrem Konto zu deaktivieren." + "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren." }, "recoveryCodeTitle": { "message": "Wiederherstellungscode" @@ -928,7 +928,7 @@ "message": "Bestätigungscodes werden Ihnen per E-Mail zugesandt." }, "selfHostedEnvironment": { - "message": "Selbstgehostete Umgebung" + "message": "Selbst gehostete Umgebung" }, "selfHostedEnvironmentFooter": { "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an." @@ -946,7 +946,7 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web-Tresor Server URL" + "message": "URL des Web-Tresor-Servers" }, "identityUrl": { "message": "URL des Identitätsservers" @@ -955,28 +955,28 @@ "message": "URL des Benachrichtigungsserver" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "URL des Icons-Servers" }, "environmentSaved": { - "message": "Die URLs der Umgebung wurden gespeichert." + "message": "URLs der Umgebung gespeichert" }, "enableAutoFillOnPageLoad": { "message": "Auto-Ausfüllen beim Laden einer Seite aktivieren" }, "enableAutoFillOnPageLoadDesc": { - "message": "Wenn eine Zugangsmaske erkannt wird, füge automatisch die Zugangsdaten ein während die Webseite lädt." + "message": "Wenn eine Zugangsmaske erkannt wird, automatisch Zugangsdaten einfügen während die Webseite lädt." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromittierte oder nicht vertrauenswürdige Webseiten können das automatische Ausfüllen beim Laden einer Seiten ausnutzen." }, "learnMoreAboutAutofill": { - "message": "Erfahre mehr über Auto-Ausfüllen" + "message": "Erfahre mehr über automatisches Ausfüllen" }, "defaultAutoFillOnPageLoad": { "message": "Standard Auto-Ausfüllen Einstellung für Login-Einträge" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Nachdem du das automatische Ausfüllen beim Laden der Seite aktiviert hast, kannst du die Funktion für einzelne Login-Einträge aktivieren oder deaktivieren. Dies ist die Standardeinstellung für Login-Einträge, die nicht separat konfiguriert wurden." + "message": "Nachdem du das automatische Ausfüllen beim Laden der Seite aktiviert hast, kannst du die Funktion für einzelne Login-Einträge aktivieren oder deaktivieren. Dies ist die Standardeinstellung für Zugangsdaten-Einträge, die nicht separat konfiguriert wurden." }, "itemAutoFillOnPageLoad": { "message": "Automatisches Ausfüllen beim Laden der Seite (wenn in Optionen aktiviert)" @@ -1212,7 +1212,7 @@ "message": "Identität" }, "passwordHistory": { - "message": "Kennwort-Historie" + "message": "Passwortverlauf" }, "back": { "message": "Zurück" @@ -1239,7 +1239,7 @@ "message": "Zugangsdaten" }, "secureNotes": { - "message": "Sichere Notiz" + "message": "Sichere Notizen" }, "clear": { "message": "Löschen", @@ -1447,10 +1447,10 @@ "message": "Automatisch ausfüllen und speichern" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-Ausgefüllter Eintrag und gespeicherte URI" + "message": "Eintrag automatisch ausgefüllt und URI gespeichert" }, "autoFillSuccess": { - "message": "Automatisch ausgefüllter Eintrag" + "message": "Eintrag automatisch ausgefüllt " }, "setMasterPassword": { "message": "Master-Passwort festlegen" @@ -1519,19 +1519,19 @@ "message": "Desktop-Sync-Überprüfung" }, "desktopIntegrationVerificationText": { - "message": "Bitte bestätigen Sie, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: " + "message": "Bitte verifiziere, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: " }, "desktopIntegrationDisabledTitle": { "message": "Browser-Einbindung ist nicht aktiviert" }, "desktopIntegrationDisabledDesc": { - "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktivieren Sie diese in den Einstellungen innerhalb der Desktop-Anwendung." + "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktiviere diese in den Einstellungen innerhalb der Desktop-Anwendung." }, "startDesktopTitle": { "message": "Bitwarden Desktop-Anwendung starten" }, "startDesktopDesc": { - "message": "Die Bitwarden Desktop-Anwendung muss gestartet werden, bevor diese Funktion verwendet werden kann." + "message": "Die Bitwarden Desktop-Anwendung muss gestartet werden, bevor Entsperren mit Biometrie verwendet werden kann." }, "errorEnableBiometricTitle": { "message": "Biometrie kann nicht aktiviert werden" @@ -1588,7 +1588,7 @@ "message": "Bitwarden wird keine Login-Daten für diese Domäne speichern. Du musst die Seite aktualisieren, damit die Änderungen wirksam werden." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ ist keine gültige Domäne", + "message": "$DOMAIN$ ist keine gültige Domain", "placeholders": { "domain": { "content": "$1", @@ -1744,14 +1744,14 @@ "message": "Aktuelle Zugriffsanzahl" }, "createSend": { - "message": "Neues Send erstellen", + "message": "Neues Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Neues Passwort" }, "sendDisabled": { - "message": "Send deaktiviert", + "message": "Send gelöscht", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1763,7 +1763,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Bearbeitetes Send", + "message": "Send gespeichert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1833,7 +1833,7 @@ "message": "Master-Passwort aktualisieren" }, "updateMasterPasswordWarning": { - "message": "Dein Master-Passwort wurde kürzlich von einem Administrator Ihrer Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet, eine erneute Anmeldung wird erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." + "message": "Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatische Registrierung" @@ -1897,7 +1897,7 @@ "message": "Master-Passwort entfernen" }, "removedMasterPassword": { - "message": "Master-Passwort entfernt." + "message": "Master-Passwort entfernt" }, "leaveOrganizationConfirmation": { "message": "Bist du sicher, dass du diese Organisation verlassen möchtest?" @@ -1912,10 +1912,10 @@ "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut einzuloggen." }, "exportingPersonalVaultTitle": { - "message": "Persönlichen Tresor exportieren" + "message": "Einzelnen Tresor exportieren" }, "exportingPersonalVaultDescription": { - "message": "Nur die persönlichen Tresoreinträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", + "message": "Nur die einzelnen Tresor-Einträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresor-Einträge der Organisation werden nicht berücksichtigt.", "placeholders": { "email": { "content": "$1", @@ -2019,7 +2019,7 @@ "message": "Server-Version" }, "selfHosted": { - "message": "Selbst-gehostet" + "message": "Selbst gehostet" }, "thirdParty": { "message": "Drittanbieter" @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Auto-Ausfüllen beim Laden einer Seite versuchen?" - }, - "tryAutofill": { + "howToAutofill": { "message": "So funktioniert Auto-Ausfüllen" }, - "autofillPageLoadInfo": { - "message": "Anmeldeformulare werden automatisch die passenden Anmeldedaten ausfüllen, wenn du Auto-Ausfüllen beim Laden einer Seite aktivierst." - }, "autofillSelectInfo": { - "message": "Wähle einen Eintrag von dieser Seite, um das Formular auf dem aktiven Tab automatisch auszufüllen." + "message": "Wähle einen Eintrag von dieser Seite aus oder verwende das Tastaturkürzel: $COMMAND$. Du kannst es auch mit dem automatischen Ausfüllen beim Laden der Seite versuchen.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-Ausfüllen beim Laden einer Seite eingeschaltet" + "autofillSelectInfoNoCommand": { + "message": "Wähle einen Eintrag von dieser Seite aus oder lege ein Tastaturkürzel in den Einstellungen fest. Du kannst es auch mit dem automatischen Ausfüllen beim Laden der Seite versuchen." }, - "turnOn": { - "message": "Einschalten" + "gotIt": { + "message": "Verstanden" }, - "notNow": { - "message": "Nicht jetzt" + "autofillSettings": { + "message": "Auto-Ausfüllen Einstellungen" + }, + "autofillShortcut": { + "message": "Auto-Ausfüllen Tastaturkürzel" + }, + "autofillShortcutNotSet": { + "message": "Das Auto-Ausfüllen-Tastaturkürzel ist nicht gesetzt. Ändere das in den Browser-Einstellungen." + }, + "autofillShortcutText": { + "message": "Das Auto-Ausfüllen-Tastaturkürzel ist: $COMMAND$. Ändere das in den Browser-Einstellungen.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standard-Auto-Ausfüllen-Tastaturkürzel: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 05dc654994a..c40216d83fc 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας;" - }, - "tryAutofill": { + "howToAutofill": { "message": "Πώς να συμπληρώσετε αυτόματα" }, - "autofillPageLoadInfo": { - "message": "Οι φόρμες σύνδεσης θα συμπληρώσουν αυτόματα τα αντίστοιχα διαπιστευτήρια αν ενεργοποιήσετε την αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας." - }, "autofillSelectInfo": { - "message": "Επιλέξτε ένα στοιχείο από αυτή τη σελίδα για να συμπληρώσετε αυτόματα τη φόρμα της ενεργής καρτέλας." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Η αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας ενεργοποιήθηκε" + "autofillSelectInfoNoCommand": { + "message": "Επιλέξτε ένα στοιχείο από αυτή τη σελίδα ή ορίστε μια συντόμευση στις ρυθμίσεις. Μπορείτε επίσης να δοκιμάσετε την αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας." }, - "turnOn": { - "message": "Ενεργοποίηση" + "gotIt": { + "message": "Το κατάλαβα" }, - "notNow": { - "message": "Όχι τώρα" + "autofillSettings": { + "message": "Ρυθμίσεις αυτόματης συμπλήρωσης" + }, + "autofillShortcut": { + "message": "Συντόμευση πληκτρολογίου αυτόματης συμπλήρωσης" + }, + "autofillShortcutNotSet": { + "message": "Η συντόμευση αυτόματης συμπλήρωσης δεν έχει οριστεί. Αλλάξτε τη στις ρυθμίσεις του περιηγητή." + }, + "autofillShortcutText": { + "message": "Η συντόμευση αυτόματης συμπλήρωσης είναι: $COMMAND$. Αλλάξτε τη στις ρυθμίσεις του προγράμματος περιήγησης.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Προεπιλεγμένη συντόμευση αυτόματης συμπλήρωσης: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index f177503909e..23fd86f1266 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 2170216f5ac..a3df85ce384 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 70019539516..b515c605435 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -430,7 +430,7 @@ "message": "Se requiere volver a teclear la contraseña maestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "La contraseña maestra debe tener al menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -967,7 +967,7 @@ "message": "Si se detecta un formulario, realizar automáticamente un autorellenado cuando la web cargue." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Los sitios web vulnerados o no confiables pueden explotar el autorelleno al cargar la página." }, "learnMoreAboutAutofill": { "message": "Más información sobre el relleno automático" @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { - "message": "How to auto-fill" - }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." + "howToAutofill": { + "message": "Cómo autorellenar" }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Seleccione un elemento de esta página o utilice el acceso directo: $COMMAND$. También puede intentar autorellenar al cargar la página.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Seleccione un elemento de esta página o establezca un acceso directo en los ajustes. También puede intentar autocompletar automáticamente en la carga de la página." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Entendido" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Ajustes de autocompletar" + }, + "autofillShortcut": { + "message": "Atajo de teclado para autocompletar" + }, + "autofillShortcutNotSet": { + "message": "El atajo de autocompletar no está establecido. Cambie esto en los ajustes del navegador." + }, + "autofillShortcutText": { + "message": "El atajo de autocompletar es $COMMAND$. Cambie esto en los ajustes del navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Atajo de autocompletar predeterminado: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index cbdeda5e9c4..bae9cbbabe4 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -805,7 +805,7 @@ "message": "Täname, et toetad Bitwardenit." }, "premiumPrice": { - "message": "Kõik see ainult %price% aastas!", + "message": "Kõik see ainult $PRICE$ / aastas!", "placeholders": { "price": { "content": "$1", @@ -835,7 +835,7 @@ "message": "Sisesta autentimise rakendusest 6 kohaline number." }, "enterVerificationCodeEmail": { - "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile", + "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Proovi automaatset täitmist lehe laadimisel?" - }, - "tryAutofill": { - "message": "Kuidas automaatselt täita" - }, - "autofillPageLoadInfo": { - "message": "Automaatse täitmise sisselülitamiselt sisestatakse kontoandmete lahtritesse automaatselt sobivad kirjed." + "howToAutofill": { + "message": "How to auto-fill" }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automaatne täitmine on sisselülitatud" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Lülita sisse" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Mitte praegu" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 57c57c927eb..934d4234db7 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 52db59b306d..dfd18625c85 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "پر کردن خودکار در بارگیری صفحه را امتحان می‌کنید؟" - }, - "tryAutofill": { - "message": "نحوه پر کردن خودکار" - }, - "autofillPageLoadInfo": { - "message": "اگر در بارگذاری صفحه، پر کردن خودکار را روشن کنید، فرم‌های ورود به‌طور خودکار اعتبارنامه‌های منطبق را پر می‌کنند." + "howToAutofill": { + "message": "How to auto-fill" }, "autofillSelectInfo": { - "message": "برای پر کردن خودکار فرم برگه فعال، موردی را از این صفحه انتخاب کنید." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "پر کردن خودکار در بارگیری صفحه روشن شد" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "روشن" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "الان نه" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 9b794e107db..0a3450e1fe8 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -430,7 +430,7 @@ "message": "Pääsalasanan uudelleensyöttö vaaditaan." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Pääsalasanan tulee sisältää vähintään $VALUE$ merkkiä.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Pyritäänkö lomakkeet täyttämään sivun avautuessa automaattisesti?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Miten täytetään automaattisesti" }, - "autofillPageLoadInfo": { - "message": "Jos otat automaattisen täytön sivun avautuessa käyttöön, täytetään kirjautumislomakkeet automaattisesti sopivilla tunnuksilla." - }, "autofillSelectInfo": { - "message": "Valitse tältä sivulta aktiivisella välilehdellä olevan lomakkeen automaattiseen täyttöön käytettävä kohde." + "message": "Valitse kohde sivulta tai käytä pikanäppäintä $COMMAND$. Voit myös kokeilla automaattista täyttöä sivun avautuessa.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automaattinen täyttö sivun avautuessa otettiin käyttöön" + "autofillSelectInfoNoCommand": { + "message": "Valitse kohde sivulta tai määritä pikanäppäin asetuksista. Voit myös kokeilla automaattista täyttöä sivun avautuessa." }, - "turnOn": { - "message": "Ota käyttöön" + "gotIt": { + "message": "Selvä" }, - "notNow": { - "message": "Ei nyt" + "autofillSettings": { + "message": "Automaattisen täytön asetukset" + }, + "autofillShortcut": { + "message": "Automaattisen täytön pikanäppäin" + }, + "autofillShortcutNotSet": { + "message": "Automaattisen täytön pikanäppäintä ei ole määritetty. Määritä se selaimen asetuksista." + }, + "autofillShortcutText": { + "message": "Automaattisen täytön pikanäppäin on $COMMAND$. Vaihda se selaimen asetuksista.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Automaattisen täytön oletuspikanäppäin on $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 92235c3fa2c..d8fd63c41bd 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -430,7 +430,7 @@ "message": "Kinakailangan ang ulitin ang master password." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ang master password ay dapat na hindi bababa sa $VALUE$ na mga character.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Subukan ang auto-fill sa pag-load ng pahina?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Paano mag-auto-fill" }, - "autofillPageLoadInfo": { - "message": "Ang mga form ng login ay awtomatikong bubunuin ang katugmang mga kredensyal kung ikaw ay nag-on ng auto-fill sa pag-load ng pahina." - }, "autofillSelectInfo": { - "message": "Pumili ng isang item mula sa pahinang ito upang auto-fill ang form ng aktibong tab." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill sa pag-load ng pahina na naka-on" + "autofillSelectInfoNoCommand": { + "message": "Pumili ng isang item mula sa pahinang ito o magtakda ng shortcut sa mga setting. Maaari mo ring subukan ang auto-fill sa paglo-load ng page." }, - "turnOn": { - "message": "I-on" + "gotIt": { + "message": "Nakuha ko" }, - "notNow": { - "message": "Hindi ngayon" + "autofillSettings": { + "message": "Mga setting ng auto-fill" + }, + "autofillShortcut": { + "message": "Keyboard shortcut para sa auto-fill" + }, + "autofillShortcutNotSet": { + "message": "Hindi naka-set ang shortcut ng auto-fill. Baguhin ito sa mga setting ng browser." + }, + "autofillShortcutText": { + "message": "Ang shortcut ng auto-fill ay: $COMMAND$. Baguhin ito sa mga setting ng browser.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default shortcut ng auto-fill: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 34e25e07528..491a124c0aa 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -430,7 +430,7 @@ "message": "Une nouvelle saisie du mot de passe principal est nécessaire." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Le mot de passe principal doit comporter au moins $VALUE$ caractères.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Essayer la saisie automatique au chargement de la page ?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Comment saisir automatiquement" }, - "autofillPageLoadInfo": { - "message": "Les formulaires de connexion saisiront automatiquement les informations d'identification correspondantes si vous activez la fonction de saisie automatique au chargement de la page." - }, "autofillSelectInfo": { - "message": "Sélectionnez un élément depuis cette page pour saisir automatiquement le formulaire de l'onglet actif." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Saisie automatique au chargement de la page activé" + "autofillSelectInfoNoCommand": { + "message": "Sélectionnez un élément depuis cette page ou définissez un raccourci dans les paramètres. Vous pouvez également essayer la saisie automatique au chargement de la page." }, - "turnOn": { - "message": "Activer" + "gotIt": { + "message": "Compris" }, - "notNow": { - "message": "Pas maintenant" + "autofillSettings": { + "message": "Paramètres de saisie automatique" + }, + "autofillShortcut": { + "message": "Raccourci clavier de saisie automatique" + }, + "autofillShortcutNotSet": { + "message": "Le raccourci de saisie automatique n'est pas défini. Changez-le dans les paramètres du navigateur." + }, + "autofillShortcutText": { + "message": "Le raccourci de saisie automatique est : $COMMAND$. Changez-le dans les paramètres du navigateur.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Raccourci de saisie automatique par défaut : $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index da45b2756be..aa171074f5f 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 9ea764c0493..c45285c26a5 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index c0c85526fc8..d6669814de6 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "पृष्ठ लोड पर ऑटो-फ़िल का प्रयोग करें?" - }, - "tryAutofill": { + "howToAutofill": { "message": "ऑटो-फ़िल कैसे करें" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 67a67dbc11f..dcd6837d37f 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index e26f80e9cb7..3121a837acf 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Az automatikus kitöltést kipróbálása oldalbetöltésnél?" - }, - "tryAutofill": { - "message": "Automatikus kitöltés működése" - }, - "autofillPageLoadInfo": { - "message": "A bejelentkező űrlapok akutomatikusan kitöltődnek hozzáillő adatokkal ha az automatikus kitöltés oldalbetöltésnél be van kapcsolva." + "howToAutofill": { + "message": "Az automatikus kitöltés működése" }, "autofillSelectInfo": { - "message": "Erről az oldalról egy elemet kiválasztva az aktív fül űrlapját automatikusan kitölti." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automatikus kitöltés oldalbetöltésnél bekapcsolva" + "autofillSelectInfoNoCommand": { + "message": "Válasszunk ki egy elemet erről az oldalról vagy állítsunk be egy billentyűparancs a beállításokban. Kipróbálhatjuk az automatikus kitöltést is az oldal betöltésekor." }, - "turnOn": { - "message": "Bekapcsolás" + "gotIt": { + "message": "Rendben" }, - "notNow": { - "message": "Most nem" + "autofillSettings": { + "message": "Automatikus kitöltés beállítások" + }, + "autofillShortcut": { + "message": "Automatikus kitöltés billentyűparancs" + }, + "autofillShortcutNotSet": { + "message": "Az automatikus kitöltés billentyűzetparancs nincs beállítva. Módosítsuk ezt a böngésző beállításaiban." + }, + "autofillShortcutText": { + "message": "Az automatikus kitöltés billentyűparancsa: $COMMAND$. Módosítsuk ezt a böngésző beállításaiban.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Alapértelmezett automatikus kitöltési billenytűparancs: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 03fb75fb4b0..e7fef9228b2 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index de5d4939ef8..d7b3141409e 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Vuoi provare l'autocompletamento al caricamento della pagina?" - }, - "tryAutofill": { - "message": "Come utilizzare l'autocompletamento" - }, - "autofillPageLoadInfo": { - "message": "I moduli di accesso verranno completati automaticamente con le credenziali corrispondenti se si attiva l'autocompletamento al caricamento della pagina." + "howToAutofill": { + "message": "How to auto-fill" }, "autofillSelectInfo": { - "message": "Seleziona un elemento da questa pagina per completare automaticamente il modulo della scheda attiva." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Autocompletamento al caricamento della pagina attivato" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Attiva" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Non ora" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 65c7690715c..02b7fd4e841 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -430,7 +430,7 @@ "message": "マスターパスワードの再入力が必要です。" }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "マスターパスワードは少なくとも $VALUE$ 文字以上でなければなりません。", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -967,7 +967,7 @@ "message": "ページ読み込み時にログインフォームを検出したとき、ログイン情報を自動入力します。" }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "ウイルス感染したり信頼できないウェブサイトは、ページの読み込み時の自動入力を悪用できてしまいます。" }, "learnMoreAboutAutofill": { "message": "自動入力についての詳細" @@ -2091,7 +2091,7 @@ "message": "脆弱で流出済みのマスターパスワード" }, "weakAndBreachedMasterPasswordDesc": { - "message": "入力されたパスワードは脆弱かつすでに流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" + "message": "入力されたパスワードは脆弱かつ流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" }, "checkForBreaches": { "message": "このパスワードの既知のデータ流出を確認" @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "ページ読み込み時に自動入力しますか?" - }, - "tryAutofill": { + "howToAutofill": { "message": "自動入力する方法" }, - "autofillPageLoadInfo": { - "message": "ページ読み込み時の自動入力をオンにすると、一致するログイン情報を自動的にフォームに入力します。" - }, "autofillSelectInfo": { - "message": "アクティブなタブのフォームを自動入力するには、このページでアイテムを選択してください。" + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "ページ読み込み時の自動入力をオンにしました" + "autofillSelectInfoNoCommand": { + "message": "このページからアイテムを選択するか、設定でショートカットを設定します。ページの読み込み時に自動入力を試すこともできます。" }, - "turnOn": { - "message": "オンにする" + "gotIt": { + "message": "了解" }, - "notNow": { - "message": "後でする" + "autofillSettings": { + "message": "自動入力の設定" + }, + "autofillShortcut": { + "message": "自動入力キーボードショートカット" + }, + "autofillShortcutNotSet": { + "message": "自動入力のショートカットが設定されていません。ブラウザの設定で変更してください。" + }, + "autofillShortcutText": { + "message": "自動入力のショートカットは $COMMAND$ です。ブラウザの設定でこれを変更してください。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "デフォルトの自動入力ショートカットは $COMMAND$ です。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 8cfd544ae27..73399132bc1 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index da45b2756be..aa171074f5f 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 259c8a8b75d..770c4ee4ebd 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 69fbb081071..d9295151bb0 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 92e5d488e3b..1b0c165b20c 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 808093daf7b..bf2d46fe40e 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Vai mēģināt automātiski aizpildīt pēc lapas ielādes?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Kā automātiski aizpildīt" }, - "autofillPageLoadInfo": { - "message": "Pieteikšanās veidnēs automātiski tiks ievadīta atbilstoša pieteikšanās informācija, ja ir ieslēgta automātiskā aizpildīšana pēc lapas ielādēšanas." - }, "autofillSelectInfo": { - "message": "Atlasīt šīs lapas vienumu, lai automātiski aizpildītu pašreizējās cilnes veidlapu." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Ir ieslēgta automātiskā aizpilde pēc lapas ielādes" + "autofillSelectInfoNoCommand": { + "message": "Jāatlasa šīs lapas vienums vai jāizveido īsceļš iestatījumos. Ir iespējams arī mēģināt automātiski aizpildīt pēc lapas ielādes." }, - "turnOn": { - "message": "Ieslēgt" + "gotIt": { + "message": "Sapratu" }, - "notNow": { - "message": "Ne tagad" + "autofillSettings": { + "message": "Automātiskās aizpildes iestatījumi" + }, + "autofillShortcut": { + "message": "Automātiskās aizpildes īsinājumtaustiņi" + }, + "autofillShortcutNotSet": { + "message": "Automātiskās aizpildes īsceļš nav uzstādīts. To var izdarīt pārlūka iestatījumos." + }, + "autofillShortcutText": { + "message": "Automātiskās aizpildes īsceļš ir: $COMMAND$. To var mainīt pārlūka iestatījumos.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Automātiskās aizpildes noklusējuma īsceļš: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index d16ff16c1d4..7f1e10f5ff0 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 333705ebd91..30041c45df9 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Prøv auto-utfylling når siden lastes?" - }, - "tryAutofill": { - "message": "Hvordan bruke auto-utfylling" - }, - "autofillPageLoadInfo": { - "message": "Innloggingsskjemaer vil fylle ut matchende innloggingsinformasjon dersom du aktiverer auto-utfylling ved innlastning av side." + "howToAutofill": { + "message": "How to auto-fill" }, "autofillSelectInfo": { - "message": "Velg et element fra denne siden for å auto-utfylle den aktive fanens skjema." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-utfyll ved innlastning av side aktivert" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Slå på" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Ikke nå" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index da45b2756be..aa171074f5f 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 99b4445d249..77334a741e1 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Automatisch invullen bij laden van pagina?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Hoe automatisch aanvullen" }, - "autofillPageLoadInfo": { - "message": "Inlogformulieren worden automatisch ingevuld als je automatisch invullen bij laden van pagina inschakelt." - }, "autofillSelectInfo": { - "message": "Kies een item van deze pagina om het formulier op het actieve tabblad automatisch in te vullen." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automatisch invullen bij laden van pagina ingeschakeld" + "autofillSelectInfoNoCommand": { + "message": "Kies een item van deze pagina of stel een snelkoppeling in de instellingen in. Je kunt ook automatisch invullen bij het laden van een pagina proberen." }, - "turnOn": { - "message": "Inschakelen" + "gotIt": { + "message": "Ik snap het" }, - "notNow": { - "message": "Niet nu" + "autofillSettings": { + "message": "Instellingen automatisch invullen" + }, + "autofillShortcut": { + "message": "Snelkoppeling automatisch invullen" + }, + "autofillShortcutNotSet": { + "message": "De sneltoets voor automatisch invullen is niet ingesteld. Wijzig dit in de instellingen van de browser." + }, + "autofillShortcutText": { + "message": "De sneltoets voor automatisch invullen is: $COMMAND$. Wijzig dit in de instellingen van de browser.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standaard snelkoppeling voor automatisch invullen:: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index da45b2756be..aa171074f5f 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 18ece54f973..fad47f34151 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Spróbować autouzupełnić po załadowaniu strony?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Jak autouzupełniać" }, - "autofillPageLoadInfo": { - "message": "Formularze logowania automatycznie wypełnią się pasującymi danymi uwierzytelniającymi, jeśli włączysz autouzupełnianie po załadowaniu strony." - }, "autofillSelectInfo": { - "message": "Wybierz element z tej strony, aby automatycznie wypełnić formularz na aktywnej karcie." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automatyczne uzupełnianie przy wczytywaniu strony zostało włączone" + "autofillSelectInfoNoCommand": { + "message": "Wybierz element z tej strony lub ustaw skrót w ustawieniach. Możesz również spróbować autouzupełniania przy wczytywaniu strony." }, - "turnOn": { - "message": "Włącz" + "gotIt": { + "message": "Rozumiem" }, - "notNow": { - "message": "Nie teraz" + "autofillSettings": { + "message": "Ustawienia autouzupełniania" + }, + "autofillShortcut": { + "message": "Skrót klawiaturowy autouzupełniania" + }, + "autofillShortcutNotSet": { + "message": "Skrót autouzupełniania nie jest ustawiony. Zmień to w ustawieniach przeglądarki." + }, + "autofillShortcutText": { + "message": "Skrót autouzupełniania to: $COMMAND$. Zmień to w ustawieniach przeglądarki.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Domyślny skrót autouzupełniania: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 718deb6f938..6d37c251892 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -245,7 +245,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { "message": "Número de Palavras" @@ -424,13 +424,13 @@ "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A senha mestre é obrigatória." + "message": "A senha mestra é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "É necessário redigitar a senha mestre." + "message": "É necessário redigitar a senha mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -656,7 +656,7 @@ "message": "Exportar Cofre" }, "fileFormat": { - "message": "Formato do Arquivo" + "message": "Formato de arquivo" }, "warning": { "message": "AVISO", @@ -751,7 +751,7 @@ "message": "O tamanho máximo do arquivo é de 500 MB." }, "featureUnavailable": { - "message": "Recurso Indisponível" + "message": "Funcionalidade Indisponível" }, "updateKey": { "message": "Você não pode usar este recurso, até você atualizar sua chave de criptografia." @@ -769,10 +769,10 @@ "message": "Atualizar Assinatura" }, "premiumNotCurrentMember": { - "message": "Você não é atualmente um membro premium." + "message": "Você não é um membro Premium atualmente." }, "premiumSignUpAndGet": { - "message": "Registe-se para uma assinatura premium e obtenha:" + "message": "Registre-se para uma assinatura Premium e obtenha:" }, "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." @@ -790,7 +790,7 @@ "message": "Prioridade no suporte ao cliente." }, "ppremiumSignUpFuture": { - "message": "Todos os recursos premium no futuro. Mais em breve!" + "message": "Todas as funcionalidades Premium no futuro. Mais em breve!" }, "premiumPurchase": { "message": "Comprar Premium" @@ -820,7 +820,7 @@ "message": "Copiar TOTP automaticamente" }, "disableAutoTotpCopyDesc": { - "message": "Se a sua credencial tiver uma chave de autenticação anexada, o código de verificação TOTP será copiado automaticamente para a área de transferência quando você autopreencher a credencial." + "message": "Se sua credencial tiver uma chave de autenticação, copie o código de verificação TOTP quando for autopreenchê-la." }, "enableAutoBiometricsPrompt": { "message": "Pedir biometria ao iniciar" @@ -967,7 +967,7 @@ "message": "Se um formulário de login for detectado, realizar automaticamente um auto-preenchimento quando a página web carregar." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Sites comprometidos ou não confiáveis podem tomar vantagem do autopreenchimento ao carregar a página." }, "learnMoreAboutAutofill": { "message": "Saiba mais sobre preenchimento automático" @@ -2058,19 +2058,19 @@ "message": "Lembrar e-mail" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Fazer login com dispositivo" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Frase de impressão digital" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Certifique-se que o cofre esteja desbloqueado e que a frase de impressão digital corresponda à do outro dispositivo." }, "resendNotification": { - "message": "Resend notification" + "message": "Reenviar notificação" }, "viewAllLoginOptions": { "message": "Ver todas as opções de login" @@ -2079,7 +2079,7 @@ "message": "Uma notificação foi enviada para seu dispositivo." }, "logInInitiated": { - "message": "Log in initiated" + "message": "Login iniciado" }, "exposedMasterPassword": { "message": "Senha Mestra comprometida" @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { - "message": "How to auto-fill" - }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." + "howToAutofill": { + "message": "Como autopreencher" }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Selecione um item desta página ou use o atalho: $COMMAND$. Você também pode tentar o autopreenchimento ao carregar a página.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Selecione um item desta página ou use o atalho nas configurações. Você também pode tentar o autopreenchimento ao carregar a página." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Entendi" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Configurações de autopreenchimento" + }, + "autofillShortcut": { + "message": "Atalho para autopreenchimento" + }, + "autofillShortcutNotSet": { + "message": "O atalho de preenchimento automático não está definido. Altere-o nas configurações do navegador." + }, + "autofillShortcutText": { + "message": "O atalho de preenchimento automático é: $COMMAND$. Altere-o nas configurações do navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Atalho padrão de autopreenchimento: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 7441940c3b6..ed9aec52342 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index b593f0bc584..69a5e8eaeb5 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 9eeb4aebd26..c0b49ce151c 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -430,7 +430,7 @@ "message": "Необходимо повторно ввести мастер-пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Мастер-пароль должен содержать не менее $VALUE$ символов.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Попробовать автозаполнение при загрузке страницы?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Как использовать автозаполнение" }, - "autofillPageLoadInfo": { - "message": "Если включить автозаполнение при загрузке страницы, то формы входа в систему автоматически заполняются соответствующими учетными данными." - }, "autofillSelectInfo": { - "message": "Выберите элемент с этой страницы для автоматического заполнения формы на активной вкладке." + "message": "Выберите элемент на этой странице или воспользуйтесь сочетанием клавиш: $COMMAND$. Также вы можете попробовать автозаполнение при загрузке страницы.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Автозаполнение при загрузке страницы включено" + "autofillSelectInfoNoCommand": { + "message": "Выберите элемент на этой странице или задайте сочетание клавиш в настройках. Также вы можете попробовать автозаполнение при загрузке страницы." }, - "turnOn": { - "message": "Включить" + "gotIt": { + "message": "Понятно" }, - "notNow": { - "message": "Не сейчас" + "autofillSettings": { + "message": "Настройки автозаполнения" + }, + "autofillShortcut": { + "message": "Сочетание клавиш для автозаполнения" + }, + "autofillShortcutNotSet": { + "message": "Сочетание клавиш для автозаполнения не установлено. Установите его в настройках браузера." + }, + "autofillShortcutText": { + "message": "Сочетание клавиш для автозаполнения: $COMMAND$. Измените его в настройках браузера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Сочетание клавиш для автозаполнения по умолчанию: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 7c18f263e6c..884427abe89 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index da39c85358b..1aebb5cba7c 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -430,7 +430,7 @@ "message": "Vyžaduje sa opätovné zadanie hlavného hesla." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Hlavné heslo musí mať aspoň $VALUE$ znakov.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Chcete vyskúšať automatické vypĺňanie pri načítaní stránky?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Ako používať automatické vypĺňanie" }, - "autofillPageLoadInfo": { - "message": "Ak zapnete automatické vyplňovanie pri načítaní stránky, prihlasovacie polia sa automaticky vyplnia zodpovedajúce povereniami." - }, "autofillSelectInfo": { - "message": "Výberom položky na tejto stránke automaticky vyplníte formulár aktívnej karty." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Automatické vypĺňanie pri načítaní stránky zapnuté" + "autofillSelectInfoNoCommand": { + "message": "Vyberte položku z tejto stránky alebo nastavte skratku v nastaveniach. Môžete tiež vyskúšať automatické vypĺňanie pri načítaní stránky." }, - "turnOn": { - "message": "Zapnúť" + "gotIt": { + "message": "Chápem" }, - "notNow": { - "message": "Teraz nie" + "autofillSettings": { + "message": "Nastavenia automatického vypĺňania" + }, + "autofillShortcut": { + "message": "Klávesová skratka automatického vypĺňania" + }, + "autofillShortcutNotSet": { + "message": "Skratka automatického vypĺňania nie je nastavená. Zmeníte ju v nastaveniach prehliadača." + }, + "autofillShortcutText": { + "message": "Skratka automatického vypĺňania je: $COMMAND$. Zmeníte ju v nastaveniach prehliadača.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Predvolená skratka automatického vypĺňania: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index e1c4d179250..fa9e1b000d3 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index bd2f95255a3..3d6bfaa234d 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Пробај Аутоматско попуњавање наконг учитавања странице?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Како ауто-попуњавати" }, - "autofillPageLoadInfo": { - "message": "Обрасци за пријаву ће аутоматски бити попуњени одговарајућим акредитивима ако укључите аутоматско попуњавање при учитавању странице." - }, "autofillSelectInfo": { - "message": "Изаберите ставку са ове странице да бисте аутоматски попунили образац из активне картице." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Аутоматско попуњавање при учитавању странице је укључено" + "autofillSelectInfoNoCommand": { + "message": "Изаберите ставку са ове странице или поставите пречицу у подешавањима. Такође можете покушати са аутоматским попуњавањем при учитавању странице." }, - "turnOn": { - "message": "Укључи" + "gotIt": { + "message": "Разумем" }, - "notNow": { - "message": "Не сада" + "autofillSettings": { + "message": "Подешавања Ауто-пуњења" + }, + "autofillShortcut": { + "message": "Пречице Ауто-пуњења" + }, + "autofillShortcutNotSet": { + "message": "Пречица за ауто-попуњавање није подешена. Промените ово у подешавањима претраживача." + }, + "autofillShortcutText": { + "message": "Пречица ауто-пуњења је: $COMMAND$. Промените ово у подешавањима претраживача.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Подразумевана пречица за ауто-пуњење: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index ade55b7d3aa..cf68a86b850 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Inte nu" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index da45b2756be..aa171074f5f 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 26dc0e66204..bc38703c90b 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index d7fec9deecb..58bb32e1165 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Sayfa yüklenince otomatik doldurma denensin mi?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Otomatik doldurma nasıl yapılır?" }, - "autofillPageLoadInfo": { - "message": "Sayfa yüklendiğinde otomatik doldurmayı açarsanız giriş formlarıyla eşleşen hesap bilgileri otomatik olarak dolduracaktır." - }, "autofillSelectInfo": { - "message": "Etkin sekmedeki formu otomatik doldurmak için bu sayfadan bir kayıt seçin." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Sayfa yüklendiğinde otomatik doldurma açık" + "autofillSelectInfoNoCommand": { + "message": "Bu sayfadan bir kayıt seçin veya ayarlardan bir kısayol ayarlayın. Sayfa yüklenirken otomatik doldurmayı da deneyebilirsiniz." }, - "turnOn": { - "message": "Aç" + "gotIt": { + "message": "Anladım" }, - "notNow": { - "message": "Henüz değil" + "autofillSettings": { + "message": "Otomatik doldurma ayarları" + }, + "autofillShortcut": { + "message": "Otomatik doldurma klavye kısayolu" + }, + "autofillShortcutNotSet": { + "message": "Otomatik doldurma kısayolu ayarlanmamış. Bunu tarayıcının ayarlarından değiştirebilirsiniz." + }, + "autofillShortcutText": { + "message": "Otomatik doldurma kısayolu: $COMMAND$. Bunu tarayıcının ayarlarından değiştirebilirsiniz.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Varsayılan otomatik doldurma kısayolu: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 44ca5901f45..f71dce8ff71 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -430,7 +430,7 @@ "message": "Необхідно повторно ввести головний пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Довжина головного пароля має бути принаймні $VALUE$ символів.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Спробувати автозаповнення на сторінці?" - }, - "tryAutofill": { + "howToAutofill": { "message": "Як працює автозаповнення" }, - "autofillPageLoadInfo": { - "message": "Якщо ви увімкнете автозаповнення на сторінці, форми входу автоматично заповнюватимуться відповідними обліковими даними." - }, "autofillSelectInfo": { - "message": "Перебуваючи на цій сторінці, оберіть запис для автоматичного заповнення форми входу." + "message": "Виберіть елемент на цій сторінці або скористайтеся комбінацією клавіш: $COMMAND$. Ви також можете спробувати автозаповнення під час завантаження сторінки.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Автозаповнення на сторінці увімкнено" + "autofillSelectInfoNoCommand": { + "message": "Виберіть елемент на цій сторінці або встановіть комбінацію клавіш. Ви також можете спробувати автозаповнення під час завантаження сторінки." }, - "turnOn": { - "message": "Увімкнути" + "gotIt": { + "message": "Зрозуміло" }, - "notNow": { - "message": "Не зараз" + "autofillSettings": { + "message": "Налаштування автозаповнення" + }, + "autofillShortcut": { + "message": "Комбінації клавіш автозаповнення" + }, + "autofillShortcutNotSet": { + "message": "Комбінацію клавіш для автозаповнення не встановлено. Змініть це в налаштуваннях браузера." + }, + "autofillShortcutText": { + "message": "Комбінація клавіш автозаповнення: $COMMAND$. Змініть це в налаштуваннях браузера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Типова комбінація клавіш автозаповнення: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 2a1dc9409a2..ce9c7b84405 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { - "message": "Cách tự động điền" - }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." + "howToAutofill": { + "message": "How to auto-fill" }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Bật" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Không phải bây giờ" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 55304d4661e..a59ed8aeddb 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -2103,7 +2103,7 @@ "message": "检查此密码的已知数据泄露" }, "characterMinimum": { - "message": "重要", + "message": "$LENGTH$ character minimum", "placeholders": { "length": { "content": "$1", @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "如何自动填充" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "开启" + "gotIt": { + "message": "明白了" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "自动填充设置" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "默认自动填充快捷键: $COMMAND$", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 61e2a58d2f5..aeb877cac90 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -2111,25 +2111,49 @@ } } }, - "tryAutofillPageLoad": { - "message": "Try auto-fill on page load?" - }, - "tryAutofill": { + "howToAutofill": { "message": "How to auto-fill" }, - "autofillPageLoadInfo": { - "message": "Login forms will automatically fill in matching credentials if you turn on auto-fill on page load." - }, "autofillSelectInfo": { - "message": "Select an item from this page to auto-fill the active tab's form." + "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } }, - "autofillTurnedOn": { - "message": "Auto-fill on page load turned on" + "autofillSelectInfoNoCommand": { + "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, - "turnOn": { - "message": "Turn on" + "gotIt": { + "message": "Got it" }, - "notNow": { - "message": "Not now" + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } } } diff --git a/apps/browser/store/locales/fr/copy.resx b/apps/browser/store/locales/fr/copy.resx index 0de6cd029a8..9d311fe7cf8 100644 --- a/apps/browser/store/locales/fr/copy.resx +++ b/apps/browser/store/locales/fr/copy.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden – Gestionnaire de mots de passe gratuit + Bitwarden – Gestion des mots de passe Un gestionnaire de mots de passe sécurisé et gratuit pour tous vos appareils From b7f465e55246248e31c92543227b49a8409f2d1a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 14:46:56 +0100 Subject: [PATCH 070/232] Autosync the updated translations (#4857) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/de/messages.json | 6 +++--- apps/desktop/src/locales/fr/messages.json | 4 ++-- apps/desktop/src/locales/ja/messages.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 7b12e493dac..623708d29e7 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -1585,13 +1585,13 @@ "message": "Die Browser-Integration wird für Biometrie im Browser verwendet." }, "enableDuckDuckGoBrowserIntegration": { - "message": "DuckDuckGo Browser-Integration erlauben" + "message": "DuckDuckGo Browser-Einbindung erlauben" }, "enableDuckDuckGoBrowserIntegrationDesc": { "message": "Verwende deinen Bitwarden-Tresor, wenn du mit DuckDuckGo surfst." }, "browserIntegrationUnsupportedTitle": { - "message": "Browser-Integration wird nicht unterstützt" + "message": "Browser-Einbindung wird nicht unterstützt" }, "browserIntegrationMasOnlyDesc": { "message": "Leider wird die Browser-Integration derzeit nur in der Mac App Store Version unterstützt." @@ -1600,7 +1600,7 @@ "message": "Leider wird die Browser-Integration derzeit nicht in der Windows Store Version unterstützt." }, "browserIntegrationLinuxDesc": { - "message": "Leider wird die Browser-Integration derzeit nicht in der Linux Version unterstützt." + "message": "Leider wird die Browser-Einbindung derzeit nicht in der Linux Version unterstützt." }, "enableBrowserIntegrationFingerprint": { "message": "Überprüfung für Browser-Integration verlangen" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 867bf6860e2..d497bcf3645 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -67,7 +67,7 @@ "message": "Pièces jointes" }, "viewItem": { - "message": "Voir l'élément" + "message": "Afficher l'élément" }, "name": { "message": "Nom" @@ -753,7 +753,7 @@ "message": "Ajouter un dossier" }, "view": { - "message": "Voir" + "message": "Affichage" }, "account": { "message": "Compte" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 8b9ec93603d..e663023482d 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -542,7 +542,7 @@ "message": "マスターパスワードの再入力が必要です。" }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "マスターパスワードは少なくとも $VALUE$ 文字以上でなければなりません。", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { From da9f4e1fb38240520723b465cf2f14f69bce5aff Mon Sep 17 00:00:00 2001 From: Will Martin Date: Fri, 24 Feb 2023 08:58:00 -0500 Subject: [PATCH 071/232] [SM-554] hide admin onboarding items from non-admin (#4843) * hide onboarding items if not admin * fix inconsistent padding --- .../src/app/secrets-manager/overview/overview.component.html | 4 +++- .../src/app/secrets-manager/overview/overview.component.ts | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index 1da49ab344e..8f35776a60d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -10,11 +10,12 @@ icon="bwi-cli" [completed]="view.tasks.createServiceAccount" > - + {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} { this.organizationId = org.id; this.organizationName = org.name; + this.userIsAdmin = org.isAdmin; }); const projects$ = combineLatest([ From 47a08e0bc87e050371fe190234833548dfe64143 Mon Sep 17 00:00:00 2001 From: dwbit <98768076+dwbit@users.noreply.github.com> Date: Fri, 24 Feb 2023 09:06:36 -0500 Subject: [PATCH 072/232] Creating a template for community discussions (#4855) --- .../DISCUSSION_TEMPLATE/community-pr-proposals.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/DISCUSSION_TEMPLATE/community-pr-proposals.yml diff --git a/.github/DISCUSSION_TEMPLATE/community-pr-proposals.yml b/.github/DISCUSSION_TEMPLATE/community-pr-proposals.yml new file mode 100644 index 00000000000..ac778935b14 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/community-pr-proposals.yml @@ -0,0 +1,11 @@ +body: + - type: markdown + attributes: + value: | + Welcome to the Bitwarden clients repo! As an open source project, Bitwarden is built in part by you—the community! To learn how to submit a pull request for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) and share your proposal in the [Community PR Proposals](https://github.com/orgs/bitwarden/discussions/categories/community-pr-proposals) category. To keep discussion on topic, posts that do not include a specific PR proposal (for a code contribution you wish to develop) will be removed. For feature requests and community discussion, please visit https://community.bitwarden.com/ + - type: textarea + attributes: + label: Code Contribution Proposal + description: "Please share details about the PR you would like to work on. Be sure to include a description of your proposed contribution, screenshots, and links to any relevant [feature requests](https://community.bitwarden.com/c/feature-requests/5/none). This helps get feedback from the community and Bitwarden team members before you start writing code" + validations: + required: true From 7268d272f0b3fbd724c9fd6438fddf8e0b8713d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 15:11:14 +0100 Subject: [PATCH 073/232] Autosync the updated translations (#4852) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 119 +++++++ apps/web/src/locales/ar/messages.json | 123 ++++++- apps/web/src/locales/az/messages.json | 123 ++++++- apps/web/src/locales/be/messages.json | 119 +++++++ apps/web/src/locales/bg/messages.json | 121 ++++++- apps/web/src/locales/bn/messages.json | 121 ++++++- apps/web/src/locales/bs/messages.json | 123 ++++++- apps/web/src/locales/ca/messages.json | 125 ++++++- apps/web/src/locales/cs/messages.json | 119 +++++++ apps/web/src/locales/da/messages.json | 125 ++++++- apps/web/src/locales/de/messages.json | 147 +++++++- apps/web/src/locales/el/messages.json | 121 ++++++- apps/web/src/locales/en_GB/messages.json | 119 +++++++ apps/web/src/locales/en_IN/messages.json | 119 +++++++ apps/web/src/locales/eo/messages.json | 119 +++++++ apps/web/src/locales/es/messages.json | 119 +++++++ apps/web/src/locales/et/messages.json | 119 +++++++ apps/web/src/locales/eu/messages.json | 119 +++++++ apps/web/src/locales/fa/messages.json | 119 +++++++ apps/web/src/locales/fi/messages.json | 323 +++++++++++------ apps/web/src/locales/fil/messages.json | 199 ++++++++--- apps/web/src/locales/fr/messages.json | 123 ++++++- apps/web/src/locales/gl/messages.json | 123 ++++++- apps/web/src/locales/he/messages.json | 121 ++++++- apps/web/src/locales/hi/messages.json | 123 ++++++- apps/web/src/locales/hr/messages.json | 119 +++++++ apps/web/src/locales/hu/messages.json | 121 ++++++- apps/web/src/locales/id/messages.json | 119 +++++++ apps/web/src/locales/it/messages.json | 119 +++++++ apps/web/src/locales/ja/messages.json | 119 +++++++ apps/web/src/locales/ka/messages.json | 123 ++++++- apps/web/src/locales/km/messages.json | 123 ++++++- apps/web/src/locales/kn/messages.json | 121 ++++++- apps/web/src/locales/ko/messages.json | 119 +++++++ apps/web/src/locales/lv/messages.json | 135 ++++++- apps/web/src/locales/ml/messages.json | 121 ++++++- apps/web/src/locales/nb/messages.json | 119 +++++++ apps/web/src/locales/ne/messages.json | 123 ++++++- apps/web/src/locales/nl/messages.json | 141 +++++++- apps/web/src/locales/nn/messages.json | 123 ++++++- apps/web/src/locales/pl/messages.json | 139 +++++++- apps/web/src/locales/pt_BR/messages.json | 429 +++++++++++++++-------- apps/web/src/locales/pt_PT/messages.json | 119 +++++++ apps/web/src/locales/ro/messages.json | 119 +++++++ apps/web/src/locales/ru/messages.json | 123 ++++++- apps/web/src/locales/si/messages.json | 123 ++++++- apps/web/src/locales/sk/messages.json | 121 ++++++- apps/web/src/locales/sl/messages.json | 121 ++++++- apps/web/src/locales/sr/messages.json | 121 ++++++- apps/web/src/locales/sr_CS/messages.json | 123 ++++++- apps/web/src/locales/sv/messages.json | 119 +++++++ apps/web/src/locales/te/messages.json | 123 ++++++- apps/web/src/locales/th/messages.json | 123 ++++++- apps/web/src/locales/tr/messages.json | 121 ++++++- apps/web/src/locales/uk/messages.json | 201 ++++++++--- apps/web/src/locales/vi/messages.json | 121 ++++++- apps/web/src/locales/zh_CN/messages.json | 119 +++++++ apps/web/src/locales/zh_TW/messages.json | 121 ++++++- 58 files changed, 7332 insertions(+), 430 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 2aad916189b..04b7fbbd20d 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 31b38707745..62d51cdc336 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "يمكن أن يساعدك تلميح كلمة المرور الرئيسية في تذكر كلمة المرور الخاصة بك في حال نسيتها." @@ -3532,7 +3532,7 @@ "message": "كلمة المرور الرئيسية ضعيفة" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index a6b4fa5c074..0def0324473 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -697,7 +697,7 @@ "message": "Ana parolun yenidən yazılması lazımdır." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ana parol ən azı $VALUE$ simvol uzunluğunda olmalıdır.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "\"Sirr\"ləri sil" }, + "hardDeleteSecret": { + "message": "Sirri birdəfəlik sil" + }, + "hardDeleteSecrets": { + "message": "Sirləri birdəfəlik sil" + }, "secretProjectAssociationDescription": { "message": "Sirrin əlaqələndiriləcəyi layihələri seçin. Yalnız bu layihələrə müraciəti olan təşkilat istifadəçiləri sirri görə biləcək." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Başlamaq üçün yeni bir sirr əlavə edin və ya daxilə köçürün." }, + "secretsTrashNoItemsMessage": { + "message": "Tullantı qutusunda heç bir sirr yoxdur." + }, "serviceAccountsNoItemsTitle": { "message": "Göstəriləcək heç nə yoxdur" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "\"Sirr\"lər tullantı qutusuna göndərildi" }, + "hardDeleteSecretConfirmation": { + "message": "Bu sirri birdəfəlik silmək istədiyinizə əminsiniz?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Bu sirləri birdəfəlik silmək istədiyinizə əminsiniz?" + }, + "hardDeletesSuccessToast": { + "message": "Sirlər birdəfəlik silindi" + }, "serviceAccountCreated": { "message": "Servis hesabı yaradıldı" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Sirr tullantı qutusuna göndərildi" }, + "hardDeleteSuccessToast": { + "message": "Sirr birdəfəlik silindi" + }, "searchProjects": { "message": "Layihə axtar" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Son yoxlama" }, + "editDomain": { + "message": "Domenə düzəliş et" + }, "domainFormInvalid": { "message": "Diqqətinizi tələb edən form xətaları var" }, @@ -6365,7 +6389,7 @@ "message": "Bu istifadəçi \"Secrets Manager Beta\"ya müraciət edə bilər" }, "important": { - "message": "Important:" + "message": "Vacib:" }, "viewAll": { "message": "Hamısına bax" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Daxilə köçürmə faylını oxumağa çalışarkən xəta baş verdi" + }, + "createSecret": { + "message": "Bir sirr yarat" + }, + "createProject": { + "message": "Bir layihə yarat" + }, + "createServiceAccount": { + "message": "Bir xidmət hesabı yarat" + }, + "downloadThe": { + "message": "Endir", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "\"Sirr\"ləri daxilə köçür" + }, + "getStarted": { + "message": "Başla" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ tamamlandı", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "\"Sirr\"i bərpa et" + }, + "restoreSecrets": { + "message": "\"Sirr\"ləri bərpa et" + }, + "restoreSecretPrompt": { + "message": "Bu sirri bərpa etmək istədiyinizə əminsiniz?" + }, + "restoreSecretsPrompt": { + "message": "Bu sirləri bərpa etmək istədiyinizə əminsiniz?" + }, + "secretRestoredSuccessToast": { + "message": "Sirr bərpa olundu" + }, + "secretsRestoredSuccessToast": { + "message": "Sirlər bərpa olundu" + }, + "selectionIsRequired": { + "message": "Seçim tələb olunur." + }, + "secretsManagerSubscriptionDesc": { + "message": "Beta proqramı əsnasında \"Secret Manager\"ə təşkilat müraciətini ödənişsiz işə salın. İstifadəçilərə, Üzvlərdə Betaya müraciət icazəsi verilə bilər." + }, + "secretsManagerEnable": { + "message": "\"Secrets Manager Beta\"nı fəallaşdır" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index d1db3d7a40a..c024bde213e 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Выдаліць сакрэты" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Выберыце праекты з якімі будзе звязаны сакрэт. Толькі карыстальнікі арганізацыі з доступам да гэтых праектаў змогуць бачыць сакрэт." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Каб пачаць, дадайце новы сакрэт або імпартуйце сакрэты." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Адсутнічаюць элементы для паказу" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Сакрэты адпраўлены ў сметніцу" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Сэрвісныя ўліковыя запісы створаны" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Сакрэт адпраўлены ў сметніцу" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Шукаць праекты" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 1406c8e39ce..f469ed16749 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Изтриване на тайните" }, + "hardDeleteSecret": { + "message": "Окончателно изтриване на тайната" + }, + "hardDeleteSecrets": { + "message": "Окончателно изтриване на тайните" + }, "secretProjectAssociationDescription": { "message": "Изберете проектите, с които ще бъде свързана тази тайна. Само потребителите в организацията, които имат достъп до тези проекти, ще могат да виждат тайната." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "За да започнете, добавете нова тайна или внесете тайни." }, + "secretsTrashNoItemsMessage": { + "message": "Няма тайни в кошчето." + }, "serviceAccountsNoItemsTitle": { "message": "Все още няма нищо за показване" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Тайните са преместени в кошчето" }, + "hardDeleteSecretConfirmation": { + "message": "Наистина ли искате да изтриете тайната окончателно?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Наистина ли искате да изтриете тайните окончателно?" + }, + "hardDeletesSuccessToast": { + "message": "Тайните са изтрити окончателно" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Тайната е изтрита окончателно" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Последна проверка" }, + "editDomain": { + "message": "Редактиране на домейна" + }, "domainFormInvalid": { "message": "Във формуляра има грешки, които трябва да погледнете" }, @@ -6365,7 +6389,7 @@ "message": "Този потребител има достъп до Управлението на тайни (Бета)" }, "important": { - "message": "Important:" + "message": "Важно:" }, "viewAll": { "message": "Показване на всички" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Възникна грешка при опита за четене на файла за внасяне" + }, + "createSecret": { + "message": "Създаване на тайна" + }, + "createProject": { + "message": "Създаване на проект" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Сваляне на", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Клиент за команден ред за управление на тайни" + }, + "importSecrets": { + "message": "Внасяне на тайни" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "Завършено: $COMPLETED$/$TOTAL$", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Възстановяване на тайната" + }, + "restoreSecrets": { + "message": "Възстановяване на тайните" + }, + "restoreSecretPrompt": { + "message": "Наистина ли искате да възстановите тайната?" + }, + "restoreSecretsPrompt": { + "message": "Наистина ли искате да възстановите тайните?" + }, + "secretRestoredSuccessToast": { + "message": "Тайната е възстановена" + }, + "secretsRestoredSuccessToast": { + "message": "Тайните са възстановени" + }, + "selectionIsRequired": { + "message": "Изборът е задължителен." + }, + "secretsManagerSubscriptionDesc": { + "message": "Включете достъпа на организацията до Управлението на пароли, безплатно по време на периода на бета-версията. Потребителите могат да получат достъп до бета-версията в настройките за Членовете." + }, + "secretsManagerEnable": { + "message": "Включване на управлението на тайни (Бета)" + }, + "checkForBreaches": { + "message": "Проверяване в известните случаи на изтекли данни за тази парола" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Разпозната е слаба парола, която присъства в известен случай на изтекли данни. Използвайте силна и уникална парола, за да защитите данните си. Наистина ли искате да използвате тази парола?" + }, + "characterMinimum": { + "message": "Минимум $LENGTH$ знака", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Главната парола трябва да е дълга поне $LENGTH$ знака.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 6f7df16bcce..1e8d518b30c 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 00085729a97..536e1bc23ef 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 3f909783335..f9ec0789cca 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -697,7 +697,7 @@ "message": "Cal tornar a escriure la contrasenya mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "La contrasenya mestra ha de contenir almenys $VALUE$ caràcters.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Suprimeix els secrets" }, + "hardDeleteSecret": { + "message": "Suprimeix definitivament el secret" + }, + "hardDeleteSecrets": { + "message": "Suprimeix definitivament els secrets" + }, "secretProjectAssociationDescription": { "message": "Selecciona los proyectos a los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán verlo." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Per començar, afig un secret nou o importa secrets." }, + "secretsTrashNoItemsMessage": { + "message": "No hi ha secrets a la paperera." + }, "serviceAccountsNoItemsTitle": { "message": "Encara no hi ha res a mostrar" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets enviats a la paperera" }, + "hardDeleteSecretConfirmation": { + "message": "Esteu segur que voleu suprimir definitivament aquest secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Esteu segur que voleu suprimir definitivament aquests secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets suprimits definitivament" + }, "serviceAccountCreated": { "message": "Compte de servei creat" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "S'ha enviat el secret a la paperera" }, + "hardDeleteSuccessToast": { + "message": "Secret suprimit definitivament" + }, "searchProjects": { "message": "Cerca projectes" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Última comprovació" }, + "editDomain": { + "message": "Editar el domini" + }, "domainFormInvalid": { "message": "Hi ha errors de forma que necessiten la vostra atenció" }, @@ -6368,10 +6392,10 @@ "message": "Important:" }, "viewAll": { - "message": "View all" + "message": "Mostra-ho tot" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "S'estan mostrant $PORTION$ de $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "S'ha produït un error en intentar llegir el fitxer d'importació" + }, + "createSecret": { + "message": "Crea un secret" + }, + "createProject": { + "message": "Crea un projecte" + }, + "createServiceAccount": { + "message": "Crea un compte de servei" + }, + "downloadThe": { + "message": "Baixa el", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Administrador de secrets CLI" + }, + "importSecrets": { + "message": "Importa secrets" + }, + "getStarted": { + "message": "Comencem" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Completat", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restaura secret" + }, + "restoreSecrets": { + "message": "Restaura secrets" + }, + "restoreSecretPrompt": { + "message": "Esteu segur que voleu restaurar aquest secret?" + }, + "restoreSecretsPrompt": { + "message": "Esteu segur que voleu restaurar aquests secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restaurat" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restaurats" + }, + "selectionIsRequired": { + "message": "La selecció és necessària." + }, + "secretsManagerSubscriptionDesc": { + "message": "Activeu l’accés a l’organització al Gestor de secrets sense cap càrrec durant el programa beta. Els usuaris poden rebre accés a la beta en membres." + }, + "secretsManagerEnable": { + "message": "Habilita l'administrador de secrets Beta" + }, + "checkForBreaches": { + "message": "Comproveu les filtracions de dades conegudes per a aquesta contrasenya" + }, + "exposedMasterPassword": { + "message": "Contrasenya mestra exposada" + }, + "exposedMasterPasswordDesc": { + "message": "S'ha trobat la contrasenya en una filtració de dades. Utilitzeu una contrasenya única per protegir el vostre compte. Esteu segur que voleu utilitzar una contrasenya exposada?" + }, + "weakAndExposedMasterPassword": { + "message": "Contrasenya mestra exposada i poc segura" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Contrasenya feble identificada i trobada en una filtració de dades. Utilitzeu una contrasenya única i segura per protegir el vostre compte. Esteu segur que voleu utilitzar aquesta contrasenya?" + }, + "characterMinimum": { + "message": "$LENGTH$ caràcters mínim", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "La contrasenya mestra ha de tenir almenys $LENGTH$ caràcters.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 08c421e6586..eae6711e941 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 1b1d0a98346..81206993bcc 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -658,7 +658,7 @@ "message": "Hovedadgangskoden er den adgangskode, du bruger, når du tilgår din boks. Det er meget vigtigt, at hovedadgangskoden ikke glemmes, da der ikke er nogen måde, hvorpå den kan genoprettes." }, "masterPassImportant": { - "message": "Hovedadgangskoder kan ikke gendannes, hvis de glemmes!" + "message": "Hovedadgangskoder kan ikke gendannes, hvis du glemmer dem!" }, "masterPassHintDesc": { "message": "Et hovedadgangskodetip kan bidrage til at komme i tanke om adgangskoden, hvis den glemmes." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Slet hemmeligheder" }, + "hardDeleteSecret": { + "message": "Slet hemmelighed permanent" + }, + "hardDeleteSecrets": { + "message": "Slet hemmeligheder permanent" + }, "secretProjectAssociationDescription": { "message": "Vælg projekter, som hemmeligheden vil blive tilknyttet. Den vil kun kunne ses af organisationsbrugere med adgang til disse projekter." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Tilføj en ny hemmelighed eller importér hemmeligheder for at komme i gang." }, + "secretsTrashNoItemsMessage": { + "message": "Der er ingen hemmeligheder i papirkurven." + }, "serviceAccountsNoItemsTitle": { "message": "Intet at vise endnu" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Hemmelighed sendt til papirkurv" }, + "hardDeleteSecretConfirmation": { + "message": "Sikker på, at denne hemmelighed skal slettes permanent?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Sikker på, at disse hemmeligheder skal slettes permanent?" + }, + "hardDeletesSuccessToast": { + "message": "Hemmeligheder slettet permanent" + }, "serviceAccountCreated": { "message": "Tjenestekonto oprettet" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Hemmelighed sendt til papirkurv" }, + "hardDeleteSuccessToast": { + "message": "Hemmelighed slettet permanent" + }, "searchProjects": { "message": "Søg i projekter" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Senest tjekket" }, + "editDomain": { + "message": "Redigér domæne" + }, "domainFormInvalid": { "message": "Der fndes formularfejl, som kræver håndtering" }, @@ -6368,10 +6392,10 @@ "message": "Vigtigt:" }, "viewAll": { - "message": "View all" + "message": "Vis alle" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Viser $PORTION$ af $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "En fejl opstod under forsøget på at læse importfilen" + }, + "createSecret": { + "message": "Opret en hemmelighed" + }, + "createProject": { + "message": "Opret et projekt" + }, + "createServiceAccount": { + "message": "Opret en tjenestekonto" + }, + "downloadThe": { + "message": "Download", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Importér hemmeligheder" + }, + "getStarted": { + "message": "Komme i gang" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Færdig(e)", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Gendan hemmelighed" + }, + "restoreSecrets": { + "message": "Gendan hemmeligheder" + }, + "restoreSecretPrompt": { + "message": "Sikker på, at denne hemmelighed skal gendannes?" + }, + "restoreSecretsPrompt": { + "message": "Sikker på, at disse hemmeligheder skal gendannes?" + }, + "secretRestoredSuccessToast": { + "message": "Hemmelighed gendannet" + }, + "secretsRestoredSuccessToast": { + "message": "Hemmeligheder gendannet" + }, + "selectionIsRequired": { + "message": "Valg er obligatorisk." + }, + "secretsManagerSubscriptionDesc": { + "message": "Slå organisationsadgang til Secrets Manager til uden beregning under Beta-programmet. Brugere kan få adgang til Beta under Medlemmer." + }, + "secretsManagerEnable": { + "message": "Aktivér Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Tjek kendte datalæk for denne adgangskode" + }, + "exposedMasterPassword": { + "message": "Kompromitteret hovedadgangskode" + }, + "exposedMasterPasswordDesc": { + "message": "Adgangskode fundet i datalæk. Brug en unik adgangskode til kontobeskyttelse. Sikker på, at den kompromitterede adgangskode skal benyttes?" + }, + "weakAndExposedMasterPassword": { + "message": "Svag og kompromitteret hovedadgangskode" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Svag adgangskode identificeret og fundet i datalæk. Brug en unik adgangskode til kontobeskyttelse. Sikker på, at at denne adgangskode skal bruges?" + }, + "characterMinimum": { + "message": "Minimum $LENGTH$ tegn", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Hovedadgangskode skal udgøre minimum $LENGTH$ tegn.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 3d5c63a45a8..76145efa2f2 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -697,7 +697,7 @@ "message": "Erneute Eingabe des Master-Passworts ist erforderlich." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Das Master-Passwort muss mindestens $VALUE$ Zeichen lang sein.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1394,7 +1394,7 @@ "message": "Verwende die folgenden Optionen, um Zwei-Faktor-Authentifizierung über Duo zu erzwingen." }, "twoStepLoginOrganizationSsoDesc": { - "message": "Wenn SSO eingerichtet oder dies geplant ist, wird die Zwei-Faktor-Authentifizierung möglicherweise bereits über den Identity Provider erzwungen." + "message": "Wenn SSO eingerichtet oder dies geplant ist, wird die Zwei-Faktor-Authentifizierung möglicherweise bereits über den Identitätsanbieter erzwungen." }, "twoStepLoginRecoveryWarning": { "message": "Durch die Aktivierung der Zwei-Faktor-Authentifizierung könnten Sie sich dauerhaft aus Ihrem Bitwarden-Konto aussperren. Ein Wiederherstellungscode ermöglicht es Ihnen, auf Ihr Konto zuzugreifen, falls Sie Ihren normalen Zwei-Faktor-Anbieter nicht mehr verwenden können (z.B. wenn Sie Ihr Gerät verlieren). Der Bitwarden-Support kann Ihnen nicht helfen, wenn Sie den Zugang zu Ihrem Konto verlieren. Wir empfehlen Ihnen, den Wiederherstellungscode aufzuschreiben oder auszudrucken und an einem sicheren Ort aufzubewahren." @@ -2523,7 +2523,7 @@ "message": "Mitglied bearbeiten" }, "fieldOnTabRequiresAttention": { - "message": "Ein Feld auf der Registerkarte '$TAB$' erfordert deine Aufmerksamkeit.", + "message": "Ein Feld auf dem '$TAB$'-Tab erfordert deine Aufmerksamkeit.", "placeholders": { "tab": { "content": "$1", @@ -4457,7 +4457,7 @@ "message": "WebAuthn wird in diesem Browser nicht unterstützt." }, "webAuthnSuccess": { - "message": "WebAuthn erfolgreich verifiziert!
    Sie können diesen Tab nun schließen." + "message": "WebAuthn erfolgreich verifiziert! Du kannst diesen Tab nun schließen." }, "hintEqualsPassword": { "message": "Dein Passwort-Hinweis darf nicht identisch mit deinem Passwort sein." @@ -4798,7 +4798,7 @@ "message": "Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du dein Master-Passwort jetzt aktualisieren. Wenn Du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und eine erneute Anmeldung ist erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." }, "masterPasswordInvalidWarning": { - "message": "Ihr Master-Passwort erfüllt nicht die Anforderungen dieser Organisation. Um der Organisation beizutreten, müssen Sie Ihr Master-Passwort jetzt aktualisieren. Ein Fortfahren wird Ihre aktuelle Sitzung abmelden. Danach müssen Sie sich wieder anmelden. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." + "message": "Dein Master-Passwort entspricht nicht den Anforderungen der Richtlinie dieser Organisation. Um der Organisation beizutreten, musst du dein Master-Passwort jetzt aktualisieren. Ein Fortfahren wird deine aktuelle Sitzung abmelden. Danach musst du dich wieder anmelden. Aktive Sitzungen auf anderen Geräten können weiterhin bis zu einer Stunde aktiv bleiben." }, "maximumVaultTimeout": { "message": "Tresor-Timeout" @@ -5276,7 +5276,7 @@ "message": "Entfernt (Warte auf Synchronisation)" }, "requested": { - "message": "Beantragt" + "message": "Angefragt" }, "formErrorSummaryPlural": { "message": "$COUNT$ Felder oben müssen beachtet werden.", @@ -5327,13 +5327,13 @@ "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut einzuloggen." }, "exportingPersonalVaultTitle": { - "message": "Persönlichen Tresor exportieren" + "message": "Einzelnen Tresor exportieren" }, "exportingOrganizationVaultTitle": { "message": "Tresor der Organisation exportieren" }, "exportingPersonalVaultDescription": { - "message": "Nur die persönlichen Tresoreinträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", + "message": "Es werden nur einzelne Tresor-Einträge exportiert, die mit $EMAIL$ verbunden sind. Tresor-Einträge der Organisation werden nicht berücksichtigt. Es werden nur Informationen der Tresor-Einträge exportiert. Diese enthalten nicht den zugehörigen Passwortverlauf oder Anhänge.", "placeholders": { "email": { "content": "$1", @@ -5342,7 +5342,7 @@ } }, "exportingOrganizationVaultDescription": { - "message": "Nur der mit $ORGANIZATION$ verbundene Tresor der Organisation wird exportiert. Persönliche Tresoreinträge und Einträge anderer Organisationen werden nicht berücksichtigt.", + "message": "Nur der mit $ORGANIZATION$ verbundene Tresor der Organisation wird exportiert. Einzelne Tresor-Einträge und Einträge anderer Organisationen werden nicht berücksichtigt.", "placeholders": { "organization": { "content": "$1", @@ -5560,7 +5560,7 @@ "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "scimSettingsSaved": { - "message": "Alle SCIM Einstellungen wurden erfolgreich gespeichert", + "message": "SCIM Einstellungen gespeichert", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "inputRequired": { @@ -5651,7 +5651,7 @@ "message": "Avatar aktualisiert" }, "brightBlue": { - "message": "Leuchtendes Blau" + "message": "Hellblau" }, "green": { "message": "Grün" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Geheimnisse löschen" }, + "hardDeleteSecret": { + "message": "Geheimnis dauerhaft löschen" + }, + "hardDeleteSecrets": { + "message": "Geheimnisse dauerhaft löschen" + }, "secretProjectAssociationDescription": { "message": "Wähle Projekte aus, denen das Geheimnis zugeordnet werden soll. Nur Organisationsbenutzer mit Zugriff auf diese Projekte können das Geheimnis sehen." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Um loszulegen, füge ein neues Geheimnis hinzu oder importiere Geheimnisse." }, + "secretsTrashNoItemsMessage": { + "message": "Es gibt keine Geheimnisse im Papierkorb." + }, "serviceAccountsNoItemsTitle": { "message": "Hier gibt es noch nichts" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Geheimnisse in Papierkorb verschoben" }, + "hardDeleteSecretConfirmation": { + "message": "Bist du sicher, dass du dieses Geheimnis dauerhaft löschen möchtest?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Bist du sicher, dass du diese Geheimnisse dauerhaft löschen möchtest?" + }, + "hardDeletesSuccessToast": { + "message": "Geheimnisse dauerhaft gelöscht" + }, "serviceAccountCreated": { "message": "Dienstkonto erstellt" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Geheimnis in Papierkorb verschoben" }, + "hardDeleteSuccessToast": { + "message": "Geheimnis dauerhaft gelöscht" + }, "searchProjects": { "message": "Projekte durchsuchen" }, @@ -5978,7 +5999,7 @@ "message": "Mitglied" }, "update": { - "message": "Aktualisierung" + "message": "Aktualisieren" }, "plusNMore": { "message": "+ $QUANTITY$ mehr", @@ -6050,7 +6071,7 @@ "message": "Diese Gruppe darf auf alle Einträge zugreifen und diese ändern." }, "memberAccessAll": { - "message": "Dieses Mitglied darf auf alle Elemente zugreifen und diese ändern." + "message": "Dieses Mitglied darf auf alle Einträge zugreifen und diese ändern." }, "domainVerification": { "message": "Domain-Verifizierung" @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Zuletzt überprüft" }, + "editDomain": { + "message": "Domain bearbeiten" + }, "domainFormInvalid": { "message": "Es gibt Formularfehler, die deine Aufmerksamkeit benötigen" }, @@ -6365,7 +6389,7 @@ "message": "Dieser Benutzer kann auf die Secrets Manager Beta zugreifen" }, "important": { - "message": "Important:" + "message": "Wichtig:" }, "viewAll": { "message": "Alles anzeigen" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Beim Lesen der Importdatei ist ein Fehler aufgetreten" + }, + "createSecret": { + "message": "Ein Geheimnis erstellen" + }, + "createProject": { + "message": "Ein Projekt erstellen" + }, + "createServiceAccount": { + "message": "Ein Dienstkonto erstellen" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Geheimnisse importieren" + }, + "getStarted": { + "message": "Loslegen" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ abgeschlossen", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Geheimnis wiederherstellen" + }, + "restoreSecrets": { + "message": "Geheimnisse wiederherstellen" + }, + "restoreSecretPrompt": { + "message": "Bist du sicher, dass du dieses Geheimnis wiederherstellen möchtest?" + }, + "restoreSecretsPrompt": { + "message": "Bist du sicher, dass du diese Geheimnisse wiederherstellen möchtest?" + }, + "secretRestoredSuccessToast": { + "message": "Geheimnis wiederhergestellt" + }, + "secretsRestoredSuccessToast": { + "message": "Geheimnisse wiederhergestellt" + }, + "selectionIsRequired": { + "message": "Auswahl ist erforderlich." + }, + "secretsManagerSubscriptionDesc": { + "message": "Aktiviere den Organisationszugriff auf den Secrets Manager kostenlos während des Beta-Programms. Benutzer können in \"Mitglieder\" Zugriff auf die Beta erhalten." + }, + "secretsManagerEnable": { + "message": "Secrets Manager Beta aktivieren" + }, + "checkForBreaches": { + "message": "Bekannte Datendiebstähle auf dieses Passwort überprüfen" + }, + "exposedMasterPassword": { + "message": "Kompromittiertes Master-Passwort" + }, + "exposedMasterPasswordDesc": { + "message": "Passwort in einem Datendiebstahl gefunden. Verwende ein einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du ein kompromittiertes Passwort verwenden möchtest?" + }, + "weakAndExposedMasterPassword": { + "message": "Schwaches und kompromittiertes Master-Passwort" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Schwaches Passwort erkannt und in einem Datendiebstahl gefunden. Verwende ein starkes und einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du dieses Passwort verwenden möchtest?" + }, + "characterMinimum": { + "message": "Mindestens $LENGTH$ Zeichen", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Das Master-Passwort muss mindestens $LENGTH$ Zeichen lang sein.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 7f5d6003c9c..7d69008ca3d 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -658,7 +658,7 @@ "message": "Ο κύριος κωδικός είναι ο κωδικός που χρησιμοποιείτε για την πρόσβαση στο vault σας. Είναι πολύ σημαντικό να μην ξεχάσετε τον κύριο κωδικό. Δεν υπάρχει τρόπος να τον ανακτήσετε σε περίπτωση που τον ξεχάσετε." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "Η υπόδειξη του κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας, σε περίπτωση που τον ξεχάσετε." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index aca523051bf..57319add843 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organisation users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index ea5ca1831c2..480ddb063d4 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 286023fa2a3..fbb23399f0c 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 087b39d0516..acd6a536a2c 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Eliminar secretos" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Seleccione los proyectos con los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán ver el secreto." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Para empezar, añade un nuevo secreto o importa secretos." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nada que mostrar aún" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secretos enviados a la papelera" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Cuenta de servicio creada" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secreto enviado a la papelera" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Buscar proyectos" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Última vez revisado" }, + "editDomain": { + "message": "Editar dominio" + }, "domainFormInvalid": { "message": "Hay errores de formulario que necesitan su atención" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Ocurrió un error al intentar leer el archivo importado" + }, + "createSecret": { + "message": "Crear un secreto" + }, + "createProject": { + "message": "Crear un proyecto" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Descargar el", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Administrador de secretos CLI" + }, + "importSecrets": { + "message": "Importar secretos" + }, + "getStarted": { + "message": "Empezar" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Debe seleccionar una opción." + }, + "secretsManagerSubscriptionDesc": { + "message": "Activar el acceso de la organización al Administrador de Secretos sin coste alguno durante el programa Beta. Los usuarios pueden tener acceso a la Beta de los Miembros." + }, + "secretsManagerEnable": { + "message": "Habilitar Administrador Secrets Beta" + }, + "checkForBreaches": { + "message": "Comprobar filtración de datos conocidas para esta contraseña" + }, + "exposedMasterPassword": { + "message": "Contraseña maestra comprometida" + }, + "exposedMasterPasswordDesc": { + "message": "Contraseña encontrada en una filtración de datos. Utilice una contraseña única para proteger su cuenta. ¿Está seguro de que desea utilizar una contraseña comprometida?" + }, + "weakAndExposedMasterPassword": { + "message": "Contraseña maestra débil y comprometida" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Contraseña débil encontrada en una filtración de datos. Utilice una contraseña única para proteger su cuenta. ¿Está seguro de que desea utilizar una contraseña comprometida?" + }, + "characterMinimum": { + "message": "$LENGTH$ caracteres mínimo", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "La contraseña maestra debe tener al menos $LENGTH$ caracteres.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index ff0776d06fb..ae6d38382be 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 12861466ce5..d2772e1f662 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Ezabatu sekretuak" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Hasteko, sortu edo inportatu sekretu berri bat." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Sekretua zakarrontzira bidalita" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Sekretua zakarrontzira bidalia" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index d38d90ee2fb..5eb91217b22 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "حذف رازها" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "پروژه هایی را انتخاب کنید که راز با آن‌ها مرتبط باشد. فقط کاربران سازمانی که به این پروژه ها دسترسی دارند می‌توانند این راز را ببینند." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "برای شروع، یک راز جدید اضافه کنید یا رازها را درون ریزی کنید." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "هنوز چیزی برای نشان دادن موجود نیست" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "رازهای به زباله‌ها فرستاده شد" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "سرویس حساب ساخته شد" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "راز به سطل زباله فرستاده شد" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "جستجوی پروژه‌ها" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index de5d8bd0ce4..c52ba0c9362 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -697,7 +697,7 @@ "message": "Pääsalasanan uudelleensyöttö vaaditaan." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Pääsalasanan tulee sisältää vähintään $VALUE$ merkkiä.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -756,7 +756,7 @@ "message": "Ei näytettäviä kohteita." }, "noPermissionToViewAllCollectionItems": { - "message": "Sinulla ei ole kokoelman kaikkien kohteiden tarkastelun sallivaa käyttöoikeutta." + "message": "Sinulla ei ole kokoelman kaikkien kohteiden tarkastelun sallivia käyttöoikeuksia." }, "noCollectionsInList": { "message": "Ei näytettäviä kokoelmia." @@ -903,7 +903,7 @@ "message": "Valitse organisaatio, jolle haluat siirtää kohteet. Tämä siirtää kohteet organisaation omistukseen, etkä tämän jälkeen ole enää niiden suora omistaja." }, "collectionsDesc": { - "message": "Muokkaa kokoelmia, joihin tämä kohde on jaettu. Kohteen näkevät vain ne organisaation käyttäjät, joilla on käyttöoikeus näihin kokoelmiin." + "message": "Muokkaa kokoelmia, joihin tämä kohde on jaettu. Kohteen näkevät vain ne organisaation käyttäjät, joilla on käyttöoikeudet näihin kokoelmiin." }, "deleteSelectedItemsDesc": { "message": "$COUNT$ kohde(tta) siirretään roskakoriin.", @@ -1187,7 +1187,7 @@ "message": "Vaaravyöhyke" }, "dangerZoneDesc": { - "message": "Ole varovainen, näiden toimintojen peruminen ei ole mahdollista!" + "message": "Ole varovainen, nämä toiminnot eivät ole peruttavissa!" }, "deauthorizeSessions": { "message": "Mitätöi kaikki istunnot" @@ -1394,7 +1394,7 @@ "message": "Pakottaaksesi kaksivaiheisen kirjautumisen Duon välityksellä, käytä alla olevia valintoja." }, "twoStepLoginOrganizationSsoDesc": { - "message": "Jos olet määrittänyt SSO:n tai aiot määrittää sen, on kaksivaiheinen kirjautuminen saatettu jo pakottaa identiteettitoimittajasi kautta." + "message": "Jos olet määrittänyt kertakirjautumisen tai aiot määrittää sen, on kaksivaiheinen kirjautuminen saatettu jo pakottaa identiteettitoimittajasi kautta." }, "twoStepLoginRecoveryWarning": { "message": "Kaksivaiheisen kirjautumisen käyttöönotto voi lukita sinut ulos Bitwarden-tililtäsi pysyvästi. Palautuskoodi mahdollistaa pääsyn tilillesi myös silloin, kun et voi käyttää normaaleja kaksivaiheisen kirjautumisen todentajiasi (esim. kadotat todennuslaitteesi tai se varastetaan). Bitwardenin asiakaspalvelukaan ei voi auttaa sinua, jos menetät pääsyn tillesi. Suosittelemme, että kirjoitat palautuskoodin muistiin tai tulostat sen ja säilytät sitä turvallisessa paikassa (esim. kassakaapissa tai pankin tallelokerossa)." @@ -1413,7 +1413,7 @@ "message": "Käytössä" }, "restoreAccess": { - "message": "Palauta käyttöoikeus" + "message": "Palauta käyttöoikeudet" }, "premium": { "message": "Premium", @@ -1429,7 +1429,7 @@ "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, "youHavePremiumAccess": { - "message": "Sinulla on Premium-käyttöoikeus" + "message": "Sinulla on Premium-käyttöoikeudet" }, "alreadyPremiumFromOrg": { "message": "Premium-ominaisuudet ovat jo käytettävissäsi johtuen organisaatiosta, jonka jäsen olet." @@ -1441,7 +1441,7 @@ "message": "Poista käytöstä" }, "revokeAccess": { - "message": "Peru käyttöoikeus" + "message": "Mitätöi käyttöoikeudet" }, "twoStepLoginProviderEnabled": { "message": "Tämä kaksivaiheisen kirjautumisen todentaja on määritetty tilillesi." @@ -1471,7 +1471,7 @@ "message": "Näitä sovelluksia suositellaan, mutta myös muut todennussovellukset toimivat." }, "twoStepAuthenticatorScanCode": { - "message": "Skannaa tämä QR-koodi todennussovelluksellasi" + "message": "Lue tämä QR-koodi todennussovelluksellasi" }, "key": { "message": "Avain" @@ -1929,10 +1929,10 @@ "message": "Laajennukset" }, "premiumAccess": { - "message": "Premium-käyttöoikeus" + "message": "Premium-käyttöoikeudet" }, "premiumAccessDesc": { - "message": "Voit lisätä Premium-käyttöoikeuden kaikille organisaatiosi jäsenille hintaan $PRICE$/$INTERVAL$.", + "message": "Voit lisätä Premium-käyttöoikeudet organisaatiosi kaikille jäsenille hintaan $PRICE$/$INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -2026,7 +2026,7 @@ "message": "Odottaa irtisanomista" }, "subscriptionPendingCanceled": { - "message": "Tilaus on merkitty päättymään kuluvan laskutuskauden lopussa." + "message": "Tilaus on irtisanottu päättymään kuluvan laskutuskauden lopussa." }, "reinstateSubscription": { "message": "Palauta tilaus voimaan" @@ -2343,7 +2343,7 @@ "message": "Suoritus omassa palvelinympäristössä (valinnainen)" }, "usersGetPremium": { - "message": "Käyttäjät saavat Premium-ominaisuuksien käyttöoikeuden" + "message": "Käyttäjät saavat käyttöoikeudet Premium-ominaisuuksiin" }, "controlAccessWithGroups": { "message": "Hallinnoi käyttäjien oikeuksia ryhmillä" @@ -2475,10 +2475,10 @@ "message": "Haluatko varmasti poistaa käyttäjän?" }, "removeOrgUserConfirmation": { - "message": "Poisteltulla jäsenellä ei ole enää organisaation tietojen käyttöoikeutta, eikä poiston peruminen ole mahdollista. Jos jäsen halutaan palauttaa organisaatioon, hänet on kutsuttava ja määritettävä uudelleen." + "message": "Poisteltulla jäsenellä ei ole enää käyttöoikeuksia organisaation tietoihin, eikä poistoa ole mahdollista perua. Jos jäsen halutaan palauttaa organisaatioon, hänet on kutsuttava ja määritettävä uudelleen." }, "revokeUserConfirmation": { - "message": "Perutulla jäsenellä ei ole enää organisaation tietojen käyttöoikeutta. Käyttöoikeus voidaan palauttaa nopeasti Perutut-välilehdeltä." + "message": "Mitätöidyllä jäsenellä ei ole enää käyttöoikeutta organisaation tietoihin. Oikeudet voidaan palauttaa nopeasti Mitätöidyt-välilehdeltä." }, "removeUserConfirmationKeyConnector": { "message": "Varoitus! Käyttäjä tarvitsee salauksensa hallintaan Key Connectoria. Käyttäjän poisto organisaatiosta poistaa hänen tilinsä käytöstä pysyvästi. Toimenpide on pysyvä, eikä sen peruminen ole mahdollista. Haluatko jatkaa?" @@ -2493,13 +2493,13 @@ "message": "Sijoita kokoelma seuraavan alle:" }, "accessControl": { - "message": "Käyttöoikeuden laajuus" + "message": "Käyttöoikeuksien laajuus" }, "groupAccessAllItems": { "message": "Tällä ryhmällä on käyttö- ja muokkausoikeudet kaikkiin kohteisiin." }, "groupAccessSelectedCollections": { - "message": "Ryhmällä on vain valittujen kokoelmien käyttöoikeus." + "message": "Ryhmällä on käyttöoikeudet vain valittuihin kokoelmiin." }, "readOnly": { "message": "Vain luku" @@ -2550,7 +2550,7 @@ "message": "Käyttäjällä on käyttö- ja muokkausoikeus kaikkiin kohteisiin." }, "userAccessSelectedCollections": { - "message": "Käyttäjällä on vain valittujen kokoelmien käyttöoikeus." + "message": "Käyttäjällä on käyttöoikeudet vain valittuihin kokoelmiin." }, "search": { "message": "Etsi" @@ -2571,7 +2571,7 @@ "message": "Omistaja" }, "ownerDesc": { - "message": "Hallitse organisaatiotasi kokonaisvaltaisesti, laskutus ja tilaukset mukaan lukien" + "message": "Hallitse organisaatiotasi kokonaisvaltaisesti, laskutus ja tilaukset mukaan lukien." }, "clientOwnerDesc": { "message": "Tämän käyttäjän on oltava toimittajariippumaton. Jos toimittajan yhteys organisaatioon katkaistaan, säilyttää tämä käyttäjä organisaation omistajuuden." @@ -2580,19 +2580,19 @@ "message": "Ylläpitäjä" }, "adminDesc": { - "message": "Hallitse organisaation käyttöoikeuksia, kaikkia kokoelmia, jäseniä, raportointia ja suojausasetuksia" + "message": "Hallitse organisaation käyttöoikeuksia, kaikkia kokoelmia, jäseniä, raportointia ja suojausasetuksia." }, "user": { "message": "Käyttäjä" }, "userDesc": { - "message": "Käytä ja lisää määritettyjen kokoelmien kohteita" + "message": "Käytä ja lisää määritettyjen kokoelmien kohteita." }, "manager": { "message": "Valvoja" }, "managerDesc": { - "message": "Luo, poista ja hallitse määritettyjen kokoelmien käyttöoikeuksia" + "message": "Luo, poista ja hallitse määritettyjen kokoelmien käyttöoikeuksia." }, "all": { "message": "Kaikki" @@ -2862,7 +2862,7 @@ } }, "removeUserIdAccess": { - "message": "Poista jäsenen $ID$ käyttöoikeus", + "message": "Poista jäsenen $ID$ käyttöoikeudet", "placeholders": { "id": { "content": "$1", @@ -2871,7 +2871,7 @@ } }, "revokedUserId": { - "message": "Peruttiin käyttäjän $ID$ käyttöoikeus organisaatioon.", + "message": "Mitätöitiin organisaation käyttöoikeudet käyttäjältä $ID$.", "placeholders": { "id": { "content": "$1", @@ -2880,7 +2880,7 @@ } }, "restoredUserId": { - "message": "Palautettiin käyttäjän $ID$ käyttöoikeus organisaatioon.", + "message": "Palautettiin organisaation käyttöoikeudet käyttäjälle $ID$.", "placeholders": { "id": { "content": "$1", @@ -2889,7 +2889,7 @@ } }, "revokeUserId": { - "message": "Peru käyttäjän $ID$ käyttöoikeus", + "message": "Mitätöi käyttöoikeudet käyttäjältä $ID$", "placeholders": { "id": { "content": "$1", @@ -2961,7 +2961,7 @@ } }, "unlinkedSsoUser": { - "message": "Kertakirjautumisen (SSO) liitos poistettiin käyttäjältä $ID$.", + "message": "Kertakirjautumisen liitos poistettiin käyttäjältä $ID$.", "placeholders": { "id": { "content": "$1", @@ -3018,16 +3018,16 @@ "message": "Tapahtui virhe." }, "userAccess": { - "message": "Käyttäjien käyttöoikeudet" + "message": "Käyttäjän käyttöoikeudet" }, "userType": { "message": "Käyttäjän tyyppi" }, "groupAccess": { - "message": "Ryhmän käyttöoikeudet" + "message": "Ryhmien käyttöoikeudet" }, "groupAccessUserDesc": { - "message": "Myönnä jäsenelle kokoelmien käyttöoikeus lisäämällä heidät yhteen tai useampaan ryhmään." + "message": "Myönnä jäsenelle käyttöoikeudet kokoelmiin lisäämällä heidät yhteen tai useampaan ryhmään." }, "invitedUsers": { "message": "Käyttäjät kutsuttiin" @@ -3066,7 +3066,7 @@ "message": "Vahvista jäsenet" }, "usersNeedConfirmed": { - "message": "Sinulla on jäseniä, jotka ovat hyväksyneet kutsunsa, mutta heidän liittymisensä tulee vielä vahvistaa. Käyttäjillä ei ole organisaation käyttöoikeutta ennen vahvistusta." + "message": "Sinulla on jäseniä, jotka ovat hyväksyneet kutsunsa, mutta heidän liittymisensä tulee vielä vahvistaa. Käyttäjillä ei ole organisaation käyttöoikeuksia ennen vahvistusta." }, "startDate": { "message": "Aloituspäivä" @@ -3114,7 +3114,7 @@ "message": "Kutsu hyväksyttiin" }, "inviteAcceptedDesc": { - "message": "Saat organisaation käyttöoikeuden ylläpitäjän vahvistettua jäsentyytesi. Saat vahvistuksesta ilmoituksen sähköpostitse." + "message": "Saat organisaation käyttöoikeudet ylläpitäjän vahvistettua jäsentyytesi. Saat vahvistuksesta ilmoituksen sähköpostitse." }, "inviteAcceptFailed": { "message": "Kutsua ei voitu hyväksyä. Pyydä organisaation ylläpitäjää lähettämään uusi kutsu." @@ -3532,7 +3532,7 @@ "message": "Heikko pääsalasana" }, "weakMasterPasswordDesc": { - "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslauseketta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?" + "message": "Havaittiin heikko salasana. Suojaa tilisi vahvalla salasanalla. Haluatko varmasti käyttää heikkoa salasanaa?" }, "rotateAccountEncKey": { "message": "Uudista myös tilini salausavain" @@ -3588,7 +3588,7 @@ "message": "API-avaimen uudistus mitätöi edellisen avaimen. Voit uudistaa API-avaimen, jos uskot, ettei nykyisen avaimen käyttö ole enää turvallista." }, "apiKeyWarning": { - "message": "API-avaimellasi on täysi käyttöoikeus organisaatioon ja se tulee pitää turvassa." + "message": "API-avaimellasi on organisaation täydet käyttöoikeudet ja se tulee pitää turvassa." }, "userApiKeyDesc": { "message": "API-avaintasi voi käyttää tunnistautumiseen Bitwardenin komentokehotteessa (CLI)." @@ -3822,7 +3822,7 @@ "message": "Aseta pääsalasana" }, "ssoCompleteRegistration": { - "message": "Kirjautuaksesi sisään käyttäen kertakirjautumista (SSO), suojaa holvisi pääsalasanalla." + "message": "Kirjautuaksesi sisään käyttäen kertakirjautumista, suojaa holvisi pääsalasanalla." }, "identifier": { "message": "Tunniste" @@ -3831,10 +3831,10 @@ "message": "Organisaation tunniste" }, "ssoLogInWithOrgIdentifier": { - "message": "Kirjaudu organisaatiosi kertakirjautumisportaalista. Aloita syöttämällä organisaatiosi SSO-tunniste." + "message": "Kirjaudu organisaatiosi kertakirjautumisportaalista. Aloita syöttämällä organisaatiosi kertakirjautumistunniste." }, "enterpriseSingleSignOn": { - "message": "Yrityksen kertakirjautuminen (SSO)" + "message": "Yrityksen kertakirjautuminen" }, "ssoHandOff": { "message": "Voit nyt sulkea tämän välilehden ja jatkaa laajennuksessa." @@ -3843,31 +3843,31 @@ "message": "Kaikki Tiimeille-tilauksen ominaisuudet, sekä:" }, "includeSsoAuthentication": { - "message": "Kertakirjautumisen (SSO) todennus SAML 2.0 ja OpenID Connect -todentajilla" + "message": "Kertakirjautumisen SAML 2.0 ja OpenID Connect -todennus" }, "includeEnterprisePolicies": { "message": "Yrityskäytännöt" }, "ssoValidationFailed": { - "message": "SSO-vahvistus epäonnistui" + "message": "Kertakirjautumisen vahvistus epäonnistui" }, "ssoIdentifierRequired": { - "message": "Organisaation SSO-tunniste vaaditaan." + "message": "Organisaation kertakirjautumistunniste tarvitaan." }, "ssoIdentifier": { - "message": "SSO-tunniste" + "message": "Kertakirjautumistunniste" }, "ssoIdentifierHint": { - "message": "Ilmoita tämä tunniste jäsenillesi SSO-kirjautumista varten." + "message": "Ilmoita tämä tunniste jäsenillesi kertakirjautumista varten." }, "unlinkSso": { - "message": "Poista kertakirjautumisen (SSO) liitos" + "message": "Poista kertakirjautumisliitos" }, "unlinkSsoConfirmation": { - "message": "Haluatko varmasti poistaa organisaation kertakirjautumisen (SSO) liitoksen?" + "message": "Haluatko varmasti poistaa liitoksen organisaation kertakirjautumiseen?" }, "linkSso": { - "message": "Liitä kertakirjautumiseen (SSO)" + "message": "Liitä kertakirjautumiseen" }, "singleOrg": { "message": "Yksittäinen organisaatio" @@ -3882,10 +3882,10 @@ "message": "Organisaation jäsenet, jotka eivät ole omistajia tai ylläpitäjiä ja jotka ovat jo toisen organisaation jäseniä, poistetaan organisaatiostasi." }, "requireSso": { - "message": "Vaadi kertakirjautumisen (SSO) todennus" + "message": "Vaadi todennus kertakirjautumisella" }, "requireSsoPolicyDesc": { - "message": "Vaadi jäseniä kirjautumaan käyttäen yrityksen määrittämää kertakirjautumista (SSO)." + "message": "Vaadi jäseniä kirjautumaan käyttäen yrityksen määrittämää kertakirjautumistapaa." }, "prerequisite": { "message": "Edellytys" @@ -3973,7 +3973,7 @@ "message": "Poistettu käytöstä" }, "revoked": { - "message": "Perutut" + "message": "Mitätöidyt" }, "sendLink": { "message": "Send-linkki", @@ -4047,7 +4047,7 @@ "message": "Varmuuskäyttö" }, "emergencyAccessDesc": { - "message": "Myönnä ja hallinnoi luotettujen kontaktien varmuuskäyttöoikeuksia. Luotetut kontaktit voivat anoa oikeutta tilisi tarkasteluun tai hallintaan ongelmatilanteissa. Käy ohjesivullamme saadaksesi lisätietoja ja tarkempia tietoja siitä, miten Zero Knowledge -jako toimii." + "message": "Myönnä ja hallinnoi luotettujen käyttäjien varmuuskäyttöä. Luotetut käyttäjät voivat ongelmatilanteissa pyytä oikeutta tilisi tarkasteluun tai hallintaan. Käy ohjesivullamme saadaksesi lisätietoja ja tarkempia tietoja siitä, miten Zero Knowledge -jako toimii." }, "emergencyAccessOwnerWarning": { "message": "Olet yhden tai useamman organisaation omistaja. Jos myönnät varmuuskontaktille hallintaoikeuden, on heillä haltuunoton jälkeen samat oikeudet." @@ -4131,10 +4131,10 @@ "message": "Voit käyttää tämän käyttäjän varmuusvalintoja kun henkilöllisyytesi on vahvistettu. Saat vahvistuksesta ilmoituksen sähköpostitse." }, "requestAccess": { - "message": "Pyydä käyttöoikeutta" + "message": "Pyydä käyttöä" }, "requestAccessConfirmation": { - "message": "Haluatko varmasti anoa varmuuskäyttöä? Pääsy myönnetään $WAITTIME$ päivän kuluttua tai käyttäjän hyväksyessä käyttöoikeuden manuaalisesti.", + "message": "Haluatko varmasti pyytää varmuuskäyttöä? Käyttöoikeus myönnetään $WAITTIME$ päivän kuluttua tai käyttäjän hyväksyessä pyynnön manuaalisesti.", "placeholders": { "waittime": { "content": "$1", @@ -4263,15 +4263,15 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseLink": { - "message": "yritysominaisuus", + "message": "yritysominaisuus.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseEnd": { - "message": ". Ole tilauspäivityksestä yhteydessä asiakaspalveluumme", + "message": " Ole tilauspäivityksestä yhteydessä asiakaspalveluumme.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "Mukautettujen käyttöoikeuksien käyttöönottamiseksi organisaatiolla on oltava Yrityksille 2020 -tilaus." + "message": "Mukautetut käyttöoikeudet edellyttävät, että organisaatiolla on Yrityksille 2020 -tilaus." }, "permissions": { "message": "Käyttöoikeudet" @@ -4325,7 +4325,7 @@ "message": "Käytäntöjen hallinta" }, "manageSso": { - "message": "Kertakirjautumisen (SSO) hallinta" + "message": "Hallitse kertakirjautumista" }, "manageUsers": { "message": "Käyttäjien hallinta" @@ -4505,7 +4505,7 @@ } }, "eventResetSsoLink": { - "message": "Nollaa käyttäjän $ID$ SSO-linkki", + "message": "Poista käyttäjän $ID$ kertakirjaumisliitos", "placeholders": { "id": { "content": "$1", @@ -4514,7 +4514,7 @@ } }, "firstSsoLogin": { - "message": "$ID$ kirjautui ensimmäistä kertaa käyttäen SSO-kirjautumista", + "message": "$ID$ kirjautui ensimmäisen kerran kertakirjautumisen välityksellä", "placeholders": { "id": { "content": "$1", @@ -4604,10 +4604,10 @@ "message": "Haluatko varmasti poistaa seuraavat käyttäjät? Käsittely voi kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." }, "removeOrgUsersConfirmation": { - "message": "Poisteltuilla jäsenillä ei ole enää organisaation tietojen käyttöoikeutta, eikä poiston peruminen ole mahdollista. Jos jäsniä halutaan palauttaa organisaatioon, heidät on kutsuttava ja määritettävä uudelleen. Käsittely voi kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." + "message": "Poisteltuilla jäsenillä ei ole enää käyttöoikeuksia organisaation tietoihin, eikä poistoa ole mahdollista perua. Jos jäseniä halutaan palauttaa organisaatioon, heidät on kutsuttava ja määritettävä uudelleen. Käsittely voi kestää muutamia sekunteja, eikä sitä ole mahdollista keskeyttää tai perua." }, "revokeUsersWarning": { - "message": "Perutuilla jäsenillä ei ole enää organisaation tietojen käyttöoikeutta. Käyttöoikeudet voidaan palauttaa nopeasti Perutut-välilehdeltä. Käsittely voi kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." + "message": "Mitätöidyillä jäsenillä ei ole enää käyttöoikeuksia organisaation tietoihin. Oikeudet voidaan palauttaa nopeasti Mitätöidyt-välilehdeltä. Käsittely voi kestää muutamia sekunteja, ei sitä ole mahdollista keskeytttää tai perua." }, "theme": { "message": "Teema" @@ -4640,10 +4640,10 @@ "message": "Poisto onnistui." }, "bulkRevokedMessage": { - "message": "Organisaation käyttöoikeus peruttiin" + "message": "Organisaation käyttöoikeuksien mitätöinti onnistui" }, "bulkRestoredMessage": { - "message": "Organisaation käyttöoikeuden palautus onnistui" + "message": "Organisaation käyttöoikeuksien palautus onnistui" }, "bulkFilteredMessage": { "message": "Ohitettu, ei koske tätä toimintoa" @@ -4655,7 +4655,7 @@ "message": "Poista käyttäjiä" }, "revokeUsers": { - "message": "Peru käyttäjiä" + "message": "Mitätöi käyttäjiä" }, "restoreUsers": { "message": "Palauta käyttäjiä" @@ -4692,7 +4692,7 @@ "message": "Toimittajan ylläpitäjä" }, "providerAdminDesc": { - "message": "Korkeimman käyttöoikeuden käyttäjä, joka voi hallinnoida toimittajaasi kokonaisvaltaisesti sekä käyttää ja hallita asiakasorganisaatioita." + "message": "Korkeimmat käyttöoikeudet omaava käyttäjä, joka voi hallinnoida toimittajaasi kokonaisvaltaisesti sekä käyttää ja hallita asiakasorganisaatioita." }, "serviceUser": { "message": "Palvelun käyttäjä" @@ -4856,7 +4856,7 @@ "message": "Yksi tai useampi organisaatiokäytäntö estää yksityisen holvisi viennin." }, "selectType": { - "message": "Valitse SSO-tyyppi" + "message": "Valitse kertakirjautumisen tyyppi" }, "type": { "message": "Tyyppi" @@ -4967,7 +4967,7 @@ "message": "Allekirjoita todennuspyynnöt" }, "ssoSettingsSaved": { - "message": "Kertakirjautumisen (SSO) määritykset tallennettiin." + "message": "Kertakirjautumisen määritykset tallennettiin." }, "sponsoredFamilies": { "message": "Ilmainen Bitwarden Perheille" @@ -4982,7 +4982,7 @@ "message": "Bitwarden Perheille -tilaus sisältää" }, "sponsoredFamiliesPremiumAccess": { - "message": "Premium-käyttöoikeus 6 käyttäjälle" + "message": "Premium-käyttöoikeudet 6 käyttäjälle" }, "sponsoredFamiliesSharedCollections": { "message": "Jaetut kokoelmat perheen salaisuuksille" @@ -5039,7 +5039,7 @@ "message": "Lunastettu tili" }, "revokeAccount": { - "message": "Peru tili $NAME$", + "message": "Mitätöi tili $NAME$", "placeholders": { "name": { "content": "$1", @@ -5111,7 +5111,7 @@ "message": "Virheellinen todennuskoodi" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ käyttää kertakirjautumista (SSO) itse ylläpidetyllä avainpalvelimella. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", + "message": "$ORGANIZATION$ käyttää kertakirjautumista itse ylläpidetyllä avainpalvelimella. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", "placeholders": { "organization": { "content": "$1", @@ -5129,7 +5129,7 @@ "message": "Pääsalasana poistettiin" }, "allowSso": { - "message": "Salli SSO-todennus" + "message": "Salli todennus kertakirjautumisella" }, "allowSsoDesc": { "message": "Määrityksen jälkeen asetukset tallennetaan ja käyttäjät voivat tunnistautua käyttäen identiteettitoimittajansa tunnistautumistietoja." @@ -5139,7 +5139,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "\"Vaadi kertakirjautumisen (SSO) todennus\" -käytäntöä", + "message": "\"Vaadi todennus kertakirjautumisella\" -käytäntöä", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { @@ -5147,7 +5147,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "\"Vaadi kertakirjautumisen (SSO) todennus\" ja \"Yksittäinen organisaatio\" -käytännöt vaaditaan Key Connector -salauksenpurun määritykseen." + "message": "\"Vaadi todennus kertakirjautumisella\" ja \"Yksittäinen organisaatio\" -käytännöt vaaditaan Key Connector -salauksenpurun määritykseen." }, "memberDecryptionOption": { "message": "Jäsenen salauksenpurkuvalinnat" @@ -5159,16 +5159,16 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDesc": { - "message": "Liitä kertakirjautuminen (SSO) itse ylläpitämääsi salauksenpurun avainpalvelimeen. Tätä valintaa käyttämällä jäsenten ei tarvitse käyttää pääsalasanojaan holvin salauksen purkuun. Ole yhteydessä Bitwardenin asiakaspalveluun saadaksesi apua määritykseen." + "message": "Liitä kertakirjautuminen itse ylläpitämääsi salauksenpurun avainpalvelimeen. Tätä valintaa käyttämällä jäsenten ei tarvitse käyttää pääsalasanojaan holvin salauksen purkuun. Ole yhteydessä Bitwardenin asiakaspalveluun saadaksesi apua määritykseen." }, "keyConnectorPolicyRestriction": { - "message": "Kertakirjautuminen (SSO) Key Connector -salauksenpurulla on käytössä. Käytäntö vaikuttaa vain omistajiin ja ylläpitäjiin." + "message": "Kertakirjautuminen Key Connector -salauksenpurulla on käytössä. Käytäntö vaikuttaa vain omistajiin ja ylläpitäjiin." }, "enabledSso": { - "message": "SSO otettiin käyttöön" + "message": "Kertakirjautuminen otettiin käyttöön" }, "disabledSso": { - "message": "SSO poistettiin käytöstä" + "message": "Kertakirjautuminen poistettiin käytöstä" }, "enabledKeyConnector": { "message": "Key Connector otettiin käyttöön" @@ -5420,7 +5420,7 @@ "message": "Palvelu" }, "unknownCipher": { - "message": "Tuntematon kohde, jota varten joudut mahdollisesti pyytämään käyttöoikeuden." + "message": "Tuntematon kohde, jonka käyttöön joudut mahdollisesti pyytämään lupaa." }, "cannotSponsorSelf": { "message": "Et voi lunastaa aktiiviselle tilille. Syötä eri sähköpostiosoite." @@ -5730,8 +5730,14 @@ "deleteSecrets": { "message": "Poista salaisuudet" }, + "hardDeleteSecret": { + "message": "Poista salaisuus pysyvästi" + }, + "hardDeleteSecrets": { + "message": "Poista salaisuudet pysyvästi" + }, "secretProjectAssociationDescription": { - "message": "Valitse projektit, joihin salaisuus liitetään. Salaisuuden voivat nähdä vain ne organisaation käyttäjät, joilla on näiden projektien käyttöoikeus." + "message": "Valitse projektit, joihin salaisuus liitetään. Salaisuuden voivat nähdä vain ne organisaation käyttäjät, joilla on käyttöoikeudet näihin projekteihin." }, "selectProjects": { "message": "Valitse projektit" @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Aloita lisäämällä uusi salaisuus tai tuomalla niitä." }, + "secretsTrashNoItemsMessage": { + "message": "Roskakorissa ei ole salaisuuksia." + }, "serviceAccountsNoItemsTitle": { "message": "Mitään näytettävää ei vielä ole" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Salaisuudet siirrettiin roskakoriin" }, + "hardDeleteSecretConfirmation": { + "message": "Haluatko varmasti poistaa salaisuuden pysyvästi?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Haluatko varmasti poistaa salaisuudet pysyvästi?" + }, + "hardDeletesSuccessToast": { + "message": "Salaisuudet poistettiin pysyvästi" + }, "serviceAccountCreated": { "message": "Palvelutili luotiin" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Salaisuus siirrettiin roskakoriin" }, + "hardDeleteSuccessToast": { + "message": "Salaisuus poistettiin pysyvästi" + }, "searchProjects": { "message": "Etsi projekteista" }, @@ -5950,10 +5971,10 @@ "message": "Käyttötunniste luotiin ja kopioitiin leikepöydälle" }, "accessTokenPermissionsBetaNotification": { - "message": "Käyttöoikeuksien hallinta ei ole beta-vaiheessa käytettävissä." + "message": "Käyttöoikeushallinta ei ole käytettävissä beta-vaiheessa." }, "revokeAccessToken": { - "message": "Peru käyttötunniste" + "message": "Mitätöi käyttötunniste" }, "revokeAccessTokens": { "message": "Mitätöi käyttötunnisteet" @@ -5962,7 +5983,7 @@ "message": "Käyttötunnisteiden mitätöinti on pysyvää, eikä sitä ole mahdollista perua." }, "accessTokenRevoked": { - "message": "Käyttötunnisteet peruttiin", + "message": "Käyttötunnisteet mitätöitiin", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -5993,16 +6014,16 @@ "message": "Ryhmän tiedot" }, "editGroupMembersDesc": { - "message": "Myönnä jäsenille ryhmälle määritettyjen kokoelmien käyttöoikeus." + "message": "Myönnä jäsenille käyttöoikeudet ryhmälle määritettyihin kokoelmiin." }, "editGroupCollectionsDesc": { - "message": "Myönnä kokoelmien käyttöoikeus lisäämällä heidät tähän ryhmään." + "message": "Myönnä käyttöoikeudet kokoelmiin lisäämällä heidät tähän ryhmään." }, "accessAllCollectionsDesc": { - "message": "Myönnä käyttöoikeus kaikkiin nykyisiin ja tuleviin kokoelmiin." + "message": "Myönnä käyttöoikeudet kaikkiin nykyisiin ja tuleviin kokoelmiin" }, "accessAllCollectionsHelp": { - "message": "Jos valittu, korvataan kokoelmien kaikki muut käyttöoikeudet." + "message": "Jos valittu, korvataan kaikki muut kokoelmien käyttöoikeudet." }, "selectMembers": { "message": "Valitse jäsenet" @@ -6062,7 +6083,7 @@ "message": "Verkkotunnuksia ei ole" }, "noDomainsSubText": { - "message": "Oman verkkotunnuksen liittäminen mahdollistaa jäsenille kertakirjautumistunnisteen ohituksen kertakirjautumisen kautta kirjauduttaessa." + "message": "Liitetyn verkkotunnuksen avulla jäsenet voivat ohittaa kertakirjautumistunnisteen, kun he kirjautuvat kertakirjautumisen välityksellä." }, "verifyDomain": { "message": "Vahvista verkkotunnus" @@ -6142,11 +6163,14 @@ "lastChecked": { "message": "Edellinen tarkastus" }, + "editDomain": { + "message": "Muokkaa verkkotunnusta" + }, "domainFormInvalid": { "message": "Lomakkeessa havaittiin virheitä, jotka vaativat korjausta" }, "addedDomain": { - "message": "Lisättiin verkkotunnus $DOMAIN$", + "message": "Verkkotunnus $DOMAIN$ lisättiin", "placeholders": { "DOMAIN": { "content": "$1", @@ -6155,7 +6179,7 @@ } }, "removedDomain": { - "message": "Poistettiin verkkotunnus $DOMAIN$", + "message": "Verkkotunnus $DOMAIN$ poistettiin", "placeholders": { "DOMAIN": { "content": "$1", @@ -6164,7 +6188,7 @@ } }, "domainVerifiedEvent": { - "message": "Vahvistettiin verkkotunnus $DOMAIN$", + "message": "Verkkotunnus $DOMAIN$ vahvistettiin", "placeholders": { "DOMAIN": { "content": "$1", @@ -6173,7 +6197,7 @@ } }, "domainNotVerifiedEvent": { - "message": "Verkkotunnusta $DOMAIN$ ei vahvistettu", + "message": "Verkkotunnusta $DOMAIN$ ei ole vahvistettu", "placeholders": { "DOMAIN": { "content": "$1", @@ -6194,7 +6218,7 @@ "message": "Valitse ryhmät" }, "userPermissionOverrideHelper": { - "message": "Jäsenkohtaisesti määritetyt käyttöoikeudet korvaavat jäsenen ryhmän määrittämät oikeudet" + "message": "Jäsenkohtaisesti määritetyt käyttöoikeudet korvaavat kyseisen jäsenen ryhmän määrittämät oikeudet" }, "noMembersOrGroupsAdded": { "message": "Jäseniä tai ryhmiä ei ole lisätty" @@ -6266,7 +6290,7 @@ "message": "Organisaation salaisuus-tietojen vienti" }, "exportingOrganizationSecretDataDescription": { - "message": "Vain organisaatioon $ORGANIZATION$ liitetyt Salaisuushallinnan kohteet viedään. Muiden tuotteiden ja organisaatioiden kohteet eivät sisälly tähän.", + "message": "Vain organisaatioon $ORGANIZATION$ liitetyt Salaisuushallinnan tiedot viedään. Muiden tuotteiden ja muiden organisaatioiden kohteet eivät sisälly tähän.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6317,22 +6341,22 @@ "message": "Tallenna lisenssi" }, "projectPeopleDescription": { - "message": "Myönnä ryhmille tai henkilöille tämän projektin käyttöoikeus." + "message": "Myönnä ryhmille tai henkilöille käyttöoikeudet tähän projektiin." }, "projectPeopleSelectHint": { - "message": "Kirjoita tai valitse henkilöitä tai ryhmiä" + "message": "Syötä tai valitse henkilöt tai ryhmät" }, "projectServiceAccountsDescription": { - "message": "Myönnä palvelutileille tämän projektin käyttöoikeus." + "message": "Myönnä palvelutileille käyttöoikeudet tähän projektiin." }, "projectServiceAccountsSelectHint": { - "message": "Kirjoita tai valitse palvelutilit" + "message": "Syötä tai valitse palvelutilit" }, "projectEmptyPeopleAccessPolicies": { - "message": "Aloita yhteiskäyttö lisäämällä henkilöitä tai ryhmiä" + "message": "Aloita yhteistyö lisäämällä henkilöitä tai ryhmiä" }, "projectEmptyServiceAccountAccessPolicies": { - "message": "Lisää palvelutilejä myöntääksesi käyttöoikeuden" + "message": "Myönnä käyttöoikeuksia lisäämällä palvelutilejä" }, "canWrite": { "message": "Voi kirjoittaa" @@ -6359,13 +6383,13 @@ "message": "Salaisuushallinta Beta" }, "secretsManagerBetaDesc": { - "message": "Anna käyttäjien käyttää Salaisuuksienhallintaa sen Beta-ohjelman aikana veloituksetta." + "message": "Myönnä käyttäjille Salaisuushallinnan käyttöoikeudet veloituksetta sen beta-vaiheen ajan." }, "userAccessSecretsManager": { - "message": "Tämä käyttäjä voi käyttää Salaisuushallinnan Betaa" + "message": "Tämä käyttäjä voi käyttää Salaisuushallinnan betaa" }, "important": { - "message": "Important:" + "message": "Tärkeää:" }, "viewAll": { "message": "Näytä kaikki" @@ -6384,12 +6408,107 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Korjaa seuravat virheet ja yritä uudelleen." + "message": "Korjaa seuraavat virheet ja yritä uudelleen." }, "description": { "message": "Kuvaus" }, "errorReadingImportFile": { - "message": "Tuontitiedostoa luettaessa tapahtui virhe" + "message": "Tuontitiedostoa luettaessa tapahtui virhe." + }, + "createSecret": { + "message": "Luo salaisuus" + }, + "createProject": { + "message": "Luo projekti" + }, + "createServiceAccount": { + "message": "Luo palvelutili" + }, + "downloadThe": { + "message": "Lataa", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Salaisuushallinnan CLI" + }, + "importSecrets": { + "message": "Tuo salaisuuksia" + }, + "getStarted": { + "message": "Aloita" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ valmistunut", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Palauta salaisuus" + }, + "restoreSecrets": { + "message": "Palauta salaisuuksia" + }, + "restoreSecretPrompt": { + "message": "Haluatko varmasti palauttaa salaisuuden?" + }, + "restoreSecretsPrompt": { + "message": "Haluatko varmasti palauttaa salaisuudet?" + }, + "secretRestoredSuccessToast": { + "message": "Salaisuus palautettiin" + }, + "secretsRestoredSuccessToast": { + "message": "Salaisuudet palautettiin" + }, + "selectionIsRequired": { + "message": "Valinta vaaditaan." + }, + "secretsManagerSubscriptionDesc": { + "message": "Ota Salaisuushallinta käyttöön organisaatiossasi veloituksetta sen Beta-ohjelman ajan. Käyttäjäkohtaiset käyttöoikeudet voidaan myöntää jäsenhallinan kautta." + }, + "secretsManagerEnable": { + "message": "Ota Salaisuushallinta Beta käyttöön" + }, + "checkForBreaches": { + "message": "Tarkasta esiintyykö salasanaa tunnetuissa tietovuodoissa" + }, + "exposedMasterPassword": { + "message": "Paljastunut pääsalasana" + }, + "exposedMasterPasswordDesc": { + "message": "Salasana löytyi tietovuodosta. Sinun tulisi suojata tilisi ainutlaatuisella salasanalla. Haluatko varmasti käyttää paljastunutta salasanaa?" + }, + "weakAndExposedMasterPassword": { + "message": "Heikko ja paljastunut pääsalasana" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Havaittiin heikko ja tietovuodosta löytynyt salasana. Sinun tulisi suojata tilisi vahvalla ja ainutlaatuisella salasanalla. Haluatko varmasti käyttää tätä salasanaa?" + }, + "characterMinimum": { + "message": "Vähintään $LENGTH$ merkkiä", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Pääsalasanan tulee sisältää vähintään $LENGTH$ merkkiä.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 318b959c59e..d8c034c11c5 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -697,7 +697,7 @@ "message": "Kinakailangan ang ulitin ang master password." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ang master password ay dapat na hindi bababa sa $VALUE$ na mga character.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1256,7 +1256,7 @@ "message": "Matagumpay na na import ang data" }, "dataExportSuccess": { - "message": "Data successfully exported" + "message": "Matagumpay na nai-export ang data" }, "importWarning": { "message": "Nag-aangkat ka ng data sa $ORGANIZATION$. Ang iyong data ay maaaring ibahagi sa mga miyembro ng organisasyong ito. Gusto mo bang magpatuloy?", @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Tanggalin ang mga lihim" }, + "hardDeleteSecret": { + "message": "Permanenteng burahin ang lihim" + }, + "hardDeleteSecrets": { + "message": "Permanenteng burahin ang mga lihim" + }, "secretProjectAssociationDescription": { "message": "Pumili ng mga proyekto na ang lihim ay maiugnay. Tanging ang mga gumagamit ng organisasyon na may access sa mga proyektong ito ang makakakita ng lihim." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Upang makapagsimula, magdagdag ng isang bagong lihim o mga lihim ng pag import." }, + "secretsTrashNoItemsMessage": { + "message": "Walang mga lihim sa basurahan." + }, "serviceAccountsNoItemsTitle": { "message": "Wala pang maipapakita" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Mga lihim na ipinadala sa basurahan" }, + "hardDeleteSecretConfirmation": { + "message": "Sigurado ka bang gusto mong i-permanenteng burahin ang lihim na ito?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Sigurado ka bang gusto mong i-permanenteng burahin ang mga lihim na ito?" + }, + "hardDeletesSuccessToast": { + "message": "Lihim na permanenteng nabura" + }, "serviceAccountCreated": { "message": "Nilikha ang service account" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Lihim na ipinadala sa basurahan" }, + "hardDeleteSuccessToast": { + "message": "Lihim na permanenteng nabura" + }, "searchProjects": { "message": "Maghanap ng mga proyekto" }, @@ -5956,13 +5977,13 @@ "message": "Bawiin ang access token" }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Tanggalin ang access tokens" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "Ang pag-tanggal ng access tokens ay permanente at hindi mababawi." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Na-revoke ang mga access token", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -6053,61 +6074,61 @@ "message": "Maaaring ma-access at baguhin ng miyembrong ito ang lahat ng item." }, "domainVerification": { - "message": "Domain verification" + "message": "Pagpapatunay ng domain" }, "newDomain": { - "message": "New domain" + "message": "Bagong domain" }, "noDomains": { - "message": "No domains" + "message": "Walang domain" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "Ang pag-connect ng isang domain ay nagpapahintulot sa mga miyembro na laktawan ang field ng SSO identifier habang nag-Login with SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "Patunayan ang domain" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "Patunayin muli ang domain" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Kopyahin ang DNS TXT record" }, "dnsTxtRecord": { "message": "DNS TXT record" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "Kopyahin at i-paste ang TXT record sa iyong DNS Provider." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "Ang aking domain.com. Kinakailangan ng mga naiibang entry upang mapatunayan." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "Awtomatikong Pagpapatunay sa Domain" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Susubukan ng Bitwarden na patunayan ang domain 3 beses sa loob ng unang 72 oras. Kung hindi makapagpatunayan ang domain, suriin ang DNS record sa iyong host at patunayan ito nang mano-mano. Ang domain ay alisin sa iyong organisasyon sa loob ng 7 araw kung hindi ito mapatunayan" }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "Hindi wastong anyo ang ipinasok. Anyo: akingdomain.com. Kinakailangan ng mga hiwalay na entry upang ma-verify ang mga subdomain." }, "removeDomain": { - "message": "Remove domain" + "message": "Tanggalin ang domain" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "Alisin ang domain ay hindi mababalik. Sigurado ka bang gusto mong magpatuloy?" }, "domainRemoved": { - "message": "Domain removed" + "message": "Naisalis na ang domain" }, "domainSaved": { - "message": "Domain saved" + "message": "Naisapanatili ang domain" }, "domainVerified": { - "message": "Domain verified" + "message": "Nasuri ang Domain" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "Hindi mo maaaring mag-reklamo ng parehong domain nang dalawang beses." }, "domainNotAvailable": { "message": "May iba pang gumagamit ng $DOMAIN$. Gamitin ang ibang domain upang magpatuloy.", @@ -6142,11 +6163,14 @@ "lastChecked": { "message": "Huling pagsusuri" }, + "editDomain": { + "message": "Lumikha ng Domain" + }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "May mga error sa form na nangangailangan ng iyong pansin" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "Idinagdag ang domain $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -6155,7 +6179,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "Tinanggal ang domain $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -6164,7 +6188,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "$DOMAIN$ na-verify", "placeholders": { "DOMAIN": { "content": "$1", @@ -6173,7 +6197,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "$DOMAIN$ hindi na-verify", "placeholders": { "DOMAIN": { "content": "$1", @@ -6263,10 +6287,10 @@ "message": "I-export ang mga datos" }, "exportingOrganizationSecretDataTitle": { - "message": "Exporting Organization Secret Data" + "message": "Pag-eexport ng Sekretong Data ng Organisasyon" }, "exportingOrganizationSecretDataDescription": { - "message": "Only the Secrets Manager data associated with $ORGANIZATION$ will be exported. Items in other products or from other organizations will not be included.", + "message": "Tanging ang data ng Manager ng Mga Lihim na nauugnay sa $ORGANIZATION$ ang ma-export. Ang mga item sa iba pang mga produkto o mula sa iba pang mga organisasyon ay hindi kasama.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6275,16 +6299,16 @@ } }, "fileUpload": { - "message": "File upload" + "message": "Mag-upload ng File" }, "acceptedFormats": { - "message": "Accepted Formats:" + "message": "Tinatanggap na Mga Format:" }, "copyPasteImportContents": { - "message": "Copy & paste import contents:" + "message": "Kopyahin & i paste ang mga nilalaman ng import:" }, "or": { - "message": "or" + "message": "o" }, "licenseAndBillingManagement": { "message": "Pamamahala ng lisensya at pagsingil" @@ -6365,13 +6389,13 @@ "message": "Maaaring ma access ng gumagamit na ito ang Secrets Manager Beta" }, "important": { - "message": "Important:" + "message": "Mahalaga:" }, "viewAll": { - "message": "View all" + "message": "Tingnan ang lahat" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Ipinapakita ang $PORTION$ ng $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6384,12 +6408,107 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Lutasin ang mga error sa ibaba at subukang muli." }, "description": { - "message": "Description" + "message": "Paglalarawan" }, "errorReadingImportFile": { - "message": "An error occurred when trying to read the import file" + "message": "May nangyaring error kapag sinusubukang basahin ang import file" + }, + "createSecret": { + "message": "Lumikha ng lihim" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Lumikha ng account ng serbisyo" + }, + "downloadThe": { + "message": "I-download ang", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "I-import ang mga lihim" + }, + "getStarted": { + "message": "Magsimula" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Tapos na", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Ibalik ang lihim" + }, + "restoreSecrets": { + "message": "Ibalik ang mga lihim" + }, + "restoreSecretPrompt": { + "message": "Sigurado ka bang gusto mong ibalik ang lihim na ito?" + }, + "restoreSecretsPrompt": { + "message": "Sigurado ka bang gusto mong ibalik ang mga lihim na ito?" + }, + "secretRestoredSuccessToast": { + "message": "Lihim na naibalik" + }, + "secretsRestoredSuccessToast": { + "message": "Mga lihim na naibalik" + }, + "selectionIsRequired": { + "message": "Kinakailangan ang pagpili." + }, + "secretsManagerSubscriptionDesc": { + "message": "I-on ang access sa Organisasyon sa Secrets Manager nang walang bayad sa loob ng Beta program. Mga user ay maaaring granted access sa Beta sa Members." + }, + "secretsManagerEnable": { + "message": "Paganahin ang Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index e5c8875197d..47a76d96659 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -697,7 +697,7 @@ "message": "Une nouvelle saisie du mot de passe principal est nécessaire." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Le mot de passe principal doit comporter au moins $VALUE$ caractères.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -906,7 +906,7 @@ "message": "Modifier les collections avec lesquelles cet élément est partagé. Seuls les utilisateurs de l'organisation avec un accès à ces collections pourront voir cet élément." }, "deleteSelectedItemsDesc": { - "message": "Vous avez sélectionné $COUNT$ élément(s) à supprimer. Êtes-vous sûr de vouloir supprimer tous ces éléments ?", + "message": "$COUNT$ élément(s) va(vont) être envoyé(s) à la corbeille.", "placeholders": { "count": { "content": "$1", @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Supprimer les Secrets" }, + "hardDeleteSecret": { + "message": "Supprimer définitivement le secret" + }, + "hardDeleteSecrets": { + "message": "Supprimer définitivement les secrets" + }, "secretProjectAssociationDescription": { "message": "Sélectionnez les projets auxquels le secret sera associé. Seuls les utilisateurs de l'organisation ayant accès à ces projets pourront voir le secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Pour commencer, ajoutez un nouveau secret ou importez des secrets." }, + "secretsTrashNoItemsMessage": { + "message": "Il n'y a pas de secrets dans la corbeille." + }, "serviceAccountsNoItemsTitle": { "message": "Rien à afficher pour l'instant" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets envoyés à la corbeille" }, + "hardDeleteSecretConfirmation": { + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce secret ?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Êtes-vous sûr de vouloir supprimer définitivement ces secrets ?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets définitivement supprimés" + }, "serviceAccountCreated": { "message": "Compte de Service créé" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret envoyé à la corbeille" }, + "hardDeleteSuccessToast": { + "message": "Secret définitivement supprimé" + }, "searchProjects": { "message": "Rechercher des Projets" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Dernière vérification" }, + "editDomain": { + "message": "Éditer le domaine" + }, "domainFormInvalid": { "message": "Il y a des erreurs de formulaire qui nécessitent votre attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Une erreur est survenue lors de la lecture du fichier importé" + }, + "createSecret": { + "message": "Créer un secret" + }, + "createProject": { + "message": "Créer un projet" + }, + "createServiceAccount": { + "message": "Créer un compte de service" + }, + "downloadThe": { + "message": "Télécharger le", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "CLI du Gestionnaire de Secrets" + }, + "importSecrets": { + "message": "Importer des secrets" + }, + "getStarted": { + "message": "Commencer" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complété(s)", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restaurer le secret" + }, + "restoreSecrets": { + "message": "Restaurer les secrets" + }, + "restoreSecretPrompt": { + "message": "Êtes-vous sûr de vouloir restaurer ce secret ?" + }, + "restoreSecretsPrompt": { + "message": "Êtes-vous sûr de vouloir restaurer ces secrets ?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restauré" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restaurés" + }, + "selectionIsRequired": { + "message": "Une sélection est requise." + }, + "secretsManagerSubscriptionDesc": { + "message": "Activez l'accès de l'organisation au gestionnaire de secrets sans frais pendant le programme bêta. Les utilisateurs peuvent se voir accorder l'accès à la bêta dans Membres." + }, + "secretsManagerEnable": { + "message": "Activer le gestionnaire de secrets bêta" + }, + "checkForBreaches": { + "message": "Vérifier les brèches de données connues pour ce mot de passe" + }, + "exposedMasterPassword": { + "message": "Mot de passe principal exposé" + }, + "exposedMasterPasswordDesc": { + "message": "Mot de passe trouvé dans une brèche de données. Utilisez un mot de passe unique pour protéger votre compte. Êtes-vous sûr de vouloir utiliser un mot de passe exposé ?" + }, + "weakAndExposedMasterPassword": { + "message": "Mot de passe principal faible et exposé" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Mot de passe faible identifié et trouvé dans une brèche de données. Utilisez un mot de passe robuste et unique pour protéger votre compte. Êtes-vous sûr de vouloir utiliser ce mot de passe ?" + }, + "characterMinimum": { + "message": "$LENGTH$ caractère minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Le mot de passe principal doit comporter au moins $LENGTH$ caractères.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 22e6d7d1105..2b6758534d6 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index f61fd4890c2..51cbacba64e 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -658,7 +658,7 @@ "message": "הסיסמה הראשית היא הסיסמה שבאמצעותה תיגש לכספת שלך. חשוב מאוד שלא תשכח את הסיסמה הזו. אין שום דרך לשחזר אותה במקרה ושכחת אותה." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "ניתן להשתמש ברמז לסיסמה הראשית אם שכחת אותה." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 0351202ac26..3dfe45bb45e 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index c5ff3461b22..0b180423e7f 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 050bdfaac95..42b241dbced 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Titkos kódok törlése" }, + "hardDeleteSecret": { + "message": "A titkos kulcs végleges törlése" + }, + "hardDeleteSecrets": { + "message": "A titkos kulcsok végleges törlése" + }, "secretProjectAssociationDescription": { "message": "Válasszzuk ki azokat a projekteket, amelyekhez a titkos kód társítva lesz. Csak az ezekhez a projektekhez hozzáféréssel rendelkező szervezeti felhasználók láthatják a titkos kódot." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Az induláshoz adjunk hozzá egy új titkos kódot vagy importáljunk ilyeneket." }, + "secretsTrashNoItemsMessage": { + "message": "Nincs titkos kulcs a lomtárban." + }, "serviceAccountsNoItemsTitle": { "message": "Nincs megjeleníthető tartalom." }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "A titkos kód a lomtárba került." }, + "hardDeleteSecretConfirmation": { + "message": "Biztosan véglegesen törlésre kerüljön ez a titkos kulcs?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Biztosan véglegesen törlésre kerüljenek ezek a titkos kulcsok?" + }, + "hardDeletesSuccessToast": { + "message": "A titkos kulcsok véglegesen törlésre kerültek." + }, "serviceAccountCreated": { "message": "A szolgáltatás fiók létrejött." }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "A titkos kód a lomtárba került." }, + "hardDeleteSuccessToast": { + "message": "A titkos kulcs véglegesen törlésre került." + }, "searchProjects": { "message": "Projektek keresése" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Utoljára ellenőrizve" }, + "editDomain": { + "message": "Domain szerkesztése" + }, "domainFormInvalid": { "message": "Vannak űrlaphibák, amelyekre figyelmet kell fordítani." }, @@ -6365,7 +6389,7 @@ "message": "Ez a felhasználó hozzáférhet a Titkos kód kezelő béta verziójához." }, "important": { - "message": "Important:" + "message": "Fontos:" }, "viewAll": { "message": "Összes megtekintése" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Hiba történt az import fájl beolvasásának kísérletekor." + }, + "createSecret": { + "message": "Titkos kód létrehozása" + }, + "createProject": { + "message": "Projekt létrehozása" + }, + "createServiceAccount": { + "message": "Szolgáltatás fiók létrehozása" + }, + "downloadThe": { + "message": "Töltsük le:", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Titkos kódok importálása" + }, + "getStarted": { + "message": "Kezdés" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ kész", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Titkos kulcs visszaállítása" + }, + "restoreSecrets": { + "message": "Titkos kulcsok visszaállítása" + }, + "restoreSecretPrompt": { + "message": "Biztosan visszaállításra kerüljön ez a titkos kulcs?" + }, + "restoreSecretsPrompt": { + "message": "Biztosan visszaállításra kerüljenek ezek a titkos kulcsok?" + }, + "secretRestoredSuccessToast": { + "message": "A titkos kulcs visszaállításra került." + }, + "secretsRestoredSuccessToast": { + "message": "A titkos kulcsok visszaállításra kerültek." + }, + "selectionIsRequired": { + "message": "A kiválasztás szükséges." + }, + "secretsManagerSubscriptionDesc": { + "message": "A bétaprogram alatt díjmentesen engedélyezzük a szervezeti hozzáférést a Titkos kód kezelőhöz. A felhasználók hozzáférést kaphatnak a bétá verzióhoz a Tagok részben." + }, + "secretsManagerEnable": { + "message": "A Titkos kód kezelő engedélyezése" + }, + "checkForBreaches": { + "message": "Az ehhez a jelszóhoz tartozó ismert adatvédelmi incidensek ellenőrzése" + }, + "exposedMasterPassword": { + "message": "Kiszivárgott mesterjelszó" + }, + "exposedMasterPasswordDesc": { + "message": "A jelszó megtalálható egy adatvédelmi incidensben. A fiók védelméhez használjunk egyedi jelszót. Biztos, hogy kiszivárgott jelszót szeretnénk használni?" + }, + "weakAndExposedMasterPassword": { + "message": "Gyenge és kiszivárgott mesterjelszó" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Gyenge jelszó lett azonosítva és megtalálva egy adatvédelmi incidens során. A fók védelme érdekében használjunk erős és egyedi jelszót. Biztosan használni szeretnénk ezt a jelszót?" + }, + "characterMinimum": { + "message": "Legalább $LENGTH$ karakter", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "A mesterjelszónak legalább $LENGTH$ karakter hosszúnak kell lennie.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index ffbc0ba9581..339b1bc84f1 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index ed2950bcd1a..8f97ec9c79e 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Elimina segreti" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Seleziona i progetti a cui sarà associato il segreto. Solo gli utenti dell'organizzazione con accesso a questi progetti saranno in grado di vedere il segreto." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Per iniziare, aggiungi un nuovo segreto o importa segreti." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Ancora niente da mostrare" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Segreti inviati al cestino" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Account di servizio creato" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Segreti inviati al cestino" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Cerca Progetti" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Si è verificato un errore durante la lettura del file d'importazione" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 775ab88f9e6..7a9fea7a4b7 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "シークレットを削除" }, + "hardDeleteSecret": { + "message": "シークレットを完全に削除" + }, + "hardDeleteSecrets": { + "message": "シークレットを完全に削除" + }, "secretProjectAssociationDescription": { "message": "シークレットを関連付けるプロジェクトを選択します。これらのプロジェクトにアクセスできる組織ユーザーのみがシークレットを表示できます。" }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "まずは新しいシークレットの追加またはインポートをしてください。" }, + "secretsTrashNoItemsMessage": { + "message": "ゴミ箱にシークレットはありません。" + }, "serviceAccountsNoItemsTitle": { "message": "まだ表示するものはありません" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "シークレットをゴミ箱に送る" }, + "hardDeleteSecretConfirmation": { + "message": "このシークレットを完全に削除してもよろしいですか?" + }, + "hardDeleteSecretsConfirmation": { + "message": "このシークレットを完全に削除してもよろしいですか?" + }, + "hardDeletesSuccessToast": { + "message": "シークレットを完全に削除しました" + }, "serviceAccountCreated": { "message": "サービスアカウントを作成しました" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "シークレットをゴミ箱に送る" }, + "hardDeleteSuccessToast": { + "message": "シークレットを完全に削除しました" + }, "searchProjects": { "message": "プロジェクトを検索" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "最終確認日" }, + "editDomain": { + "message": "ドメインを編集" + }, "domainFormInvalid": { "message": "注意が必要なフォームエラーがあります" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "インポートファイルの読み込み中にエラーが発生しました" + }, + "createSecret": { + "message": "シークレットを作成" + }, + "createProject": { + "message": "プロジェクトを作成" + }, + "createServiceAccount": { + "message": "サービスアカウントを作成" + }, + "downloadThe": { + "message": "ダウンロード", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "シークレットマネージャー CLI" + }, + "importSecrets": { + "message": "シークレットをインポート" + }, + "getStarted": { + "message": "始める" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ 完了", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "シークレットを復元" + }, + "restoreSecrets": { + "message": "シークレットを復元" + }, + "restoreSecretPrompt": { + "message": "このシークレットを復元しますか?" + }, + "restoreSecretsPrompt": { + "message": "このシークレットを復元しますか?" + }, + "secretRestoredSuccessToast": { + "message": "シークレットを復元しました" + }, + "secretsRestoredSuccessToast": { + "message": "シークレットを復元しました" + }, + "selectionIsRequired": { + "message": "選択が必要です。" + }, + "secretsManagerSubscriptionDesc": { + "message": "ベータプログラム中はシークレットマネージャーへの組織アクセスを無償で有効にします。ユーザーはメンバーのベータ版へのアクセスを許可できます。" + }, + "secretsManagerEnable": { + "message": "ベータ版のシークレットマネージャーを有効化" + }, + "checkForBreaches": { + "message": "このパスワードの既知のデータ流出を確認" + }, + "exposedMasterPassword": { + "message": "流出したマスターパスワード" + }, + "exposedMasterPasswordDesc": { + "message": "入力したパスワードはデータ流出結果に含まれていました。アカウントを保護するためには一意のパスワードを使用してください。本当に流出済みのパスワードを使用しますか?" + }, + "weakAndExposedMasterPassword": { + "message": "脆弱で流出済みのマスターパスワード" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "入力されたパスワードは脆弱かつ流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" + }, + "characterMinimum": { + "message": "$LENGTH$ 文字以上", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "マスターパスワードは少なくとも $LENGTH$ 文字以上でなければなりません。", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 22e6d7d1105..2b6758534d6 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 22e6d7d1105..2b6758534d6 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 40ad180e630..1930f8eaf6d 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -658,7 +658,7 @@ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಬಳಸುವ ಪಾಸ್ವರ್ಡ್ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಆಗಿದೆ. ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆಯದಿರುವುದು ಬಹಳ ಮುಖ್ಯ. ನೀವು ಅದನ್ನು ಮರೆತ ಸಂದರ್ಭದಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಪಡೆಯಲು ಯಾವುದೇ ಮಾರ್ಗವಿಲ್ಲ." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆತರೆ ಅದನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಸುಳಿವು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 6d6ef89b28f..080062b207c 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 3a34251e54b..166e7b2b3eb 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Izdzēst noslēpumus" }, + "hardDeleteSecret": { + "message": "Neatgriezeniski izdzēst noslēpumu" + }, + "hardDeleteSecrets": { + "message": "Neatgriezeniski izdzēst noslēpumus" + }, "secretProjectAssociationDescription": { "message": "Atlasīt projektus, ar kuriem tiks saistīts noslēpums. Tikai apvienību lietotāji ar piekļuvi šiem projektiem varēs redzēt noslēpumu." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Lai sākut, ir jāpievieno jauns noslēpums vai jāievieto esoši." }, + "secretsTrashNoItemsMessage": { + "message": "Atkritnē nav noslēpumu." + }, "serviceAccountsNoItemsTitle": { "message": "Vēl nav nekā, ko parādīt" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Noslēpumi ir pārvietoti uz atkritni" }, + "hardDeleteSecretConfirmation": { + "message": "Vai tiešām neatgriezeniski izdzēst šo noslēpumu?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Vai tiešām neatgriezeniski izdzēst šos noslēpumus?" + }, + "hardDeletesSuccessToast": { + "message": "Noslēpumi ir neatgriezeniski izdzēsti" + }, "serviceAccountCreated": { "message": "Pakalpojumu konts ir izveidots" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Noslēpums ir pārvietots uz atkritni" }, + "hardDeleteSuccessToast": { + "message": "Noslēpums ir neatgriezeniski izdzēsts" + }, "searchProjects": { "message": "Meklēt projektus" }, @@ -5956,13 +5977,13 @@ "message": "Atsaukt piekļuves pilnvaru" }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Atsaukt piekļuves pilnvaras" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "Piekļuves pilnvaru atsaukšana ir paliekoša un neatgriezeniska." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Piekļuves pilnvaras ir atsauktas", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -6092,10 +6113,10 @@ "message": "Ievadītā vērtība ir nederīga. Piemēram: mansdomens.lv. Apakšdomēniem ir nepieciešams apstiprināt atsevišķus ierakstus." }, "removeDomain": { - "message": "Noņemt domeinu" + "message": "Noņemt domēnu" }, "removeDomainWarning": { - "message": "Domēna noņemšanu nevar atdarīt. Vai tiešām turpināt?" + "message": "Domēna noņemšanu nevar atsaukt. Vai tiešām turpināt?" }, "domainRemoved": { "message": "Domēns ir noņemts" @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Pēdējoreiz pārbaudīts" }, + "editDomain": { + "message": "Labot domēnu" + }, "domainFormInvalid": { "message": "Veidlapā ir kļūdas, kurām ir jāpievērš uzmanība" }, @@ -6365,13 +6389,13 @@ "message": "Šis lietotājs var piekļūt Noslēpumu pārvaldniekam Beta" }, "important": { - "message": "Important:" + "message": "Svarīgi:" }, "viewAll": { - "message": "View all" + "message": "Skatīt visu" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Rāda $PORTION$ no $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Atgadījās kļūda, kad tika mēģināts nolasīt ievietošanas datni" + }, + "createSecret": { + "message": "Izveidot noslēpumu" + }, + "createProject": { + "message": "Izveidot projektu" + }, + "createServiceAccount": { + "message": "Izveidot pakalpojumu kontu" + }, + "downloadThe": { + "message": "Lejupielādēt", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Noslēpumu pārvaldnieka komandrindas saskarne" + }, + "importSecrets": { + "message": "Ievietot noslēpumus" + }, + "getStarted": { + "message": "Aiziet!" + }, + "complete": { + "message": "Pabeigti $COMPLETED$/$TOTAL$", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Atjaunot noslēpumu" + }, + "restoreSecrets": { + "message": "Atjaunot noslēpumus" + }, + "restoreSecretPrompt": { + "message": "Vai tiešām atjaunot šo noslēpumu?" + }, + "restoreSecretsPrompt": { + "message": "Vai tiešām atjaunot šos noslēpumus?" + }, + "secretRestoredSuccessToast": { + "message": "Noslēpums ir atjaunots" + }, + "secretsRestoredSuccessToast": { + "message": "Noslēpumi ir atjaunoti" + }, + "selectionIsRequired": { + "message": "Nepieciešams veikt atlasi." + }, + "secretsManagerSubscriptionDesc": { + "message": "Ieslēgt apvienības piekļuvi Noslēpumu pārvaldniekam bez papildu maksas Beta programmas laikā. Lietotājiem Bet piekļuvi var nodrošināt sadaļā \"Dalībnieki\"." + }, + "secretsManagerEnable": { + "message": "Iespējot Noslēpumu pārvaldnieks Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index beb7fe01250..5cadcb0601f 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -658,7 +658,7 @@ "message": "നിങ്ങളുടെ വാൾട്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കുന്ന പാസ്‌വേഡാണ് പ്രാഥമിക പാസ്‌വേഡ്. പ്രാഥമിക പാസ്‌വേഡ് നിങ്ങൾ ഒരു കാരണവശാലും മറക്കരുത്. നിങ്ങൾ പാസ്‌വേഡ് മറന്നാൽ, വീണ്ടെടുക്കാൻ വേറെ ഒരു മാർഗ്ഗവുമില്ല." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "നിങ്ങളുടെ പാസ്‌വേഡ് മറന്നാൽ അത് ഓർമ്മിക്കാൻ ഒരു പ്രാഥമിക പാസ്‌വേഡ് സൂചന സഹായിക്കും." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index c9cc13c774b..c03b4690ffd 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Hemmelighet sendt til papirkurven" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Søk i prosjekter" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 22e6d7d1105..2b6758534d6 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 4f575bb184d..5724afede74 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -697,7 +697,7 @@ "message": "Type je hoofdwachtwoord opnieuw in." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Hoofdwachtwoord moet minstens $VALUE$ tekens lang zijn.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1357,7 +1357,7 @@ "message": "Personaliseren" }, "newCustomDomain": { - "message": "Nieuw gepersonaliseerd domein" + "message": "Nieuw aangepast domein" }, "newCustomDomainDesc": { "message": "Voer een lijst in met domeinen door komma's. Alleen basisdomeinen zijn toegestaan. Voer geen subdomeinen in. Gebruik bijvoorbeeld \"google.com\" in plaats van \"www.google.com\". Je kunt ook \"androidapp://package.name\" invoeren om een Android-app aan andere websitedomeinen te koppelen." @@ -3342,7 +3342,7 @@ } }, "subscriptionFamiliesPlan": { - "message": "Je kunt niet meer dan $COUNT$ gebruikers uitnodigen zonder je abonnement te upgraden. Neem contact op met Customer Support om te upgraden.", + "message": "U kunt niet meer dan $COUNT$ leden uitnodigen zonder uw abonnement te upgraden. Neem contact op met Customer Support om te upgraden.", "placeholders": { "count": { "content": "$1", @@ -3571,7 +3571,7 @@ "message": "Vingerafdrukzin" }, "dontAskFingerprintAgain": { - "message": "Niet meer vragen om de vingerafdrukzin te controleren", + "message": "Vraag nooit om de vingerafdrukzin te controleren voor uitgenodigde leden (niet aanbevolen)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "free": { @@ -4256,7 +4256,7 @@ "message": "Aangepast" }, "customDesc": { - "message": "Maakt een fijnmazige controle van gebruikersrechten voor geavanceerde configuraties mogelijk." + "message": "Verleen aangepaste rechten aan leden" }, "customDescNonEnterpriseStart": { "message": "Aangepaste rollen is een ", @@ -4271,7 +4271,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "Voor het inschakelen van aangepaste rechten moet de organisatie een Enterprise 2020-abonnement hebben." + "message": "Om aangepaste rechten in te schakelen moet de organisatie een Enterprise 2020 abonnement hebben." }, "permissions": { "message": "Rechten" @@ -4838,7 +4838,7 @@ "message": "Je kluis time-out is hoger dan het maximum van jouw organisatie." }, "vaultCustomTimeoutMinimum": { - "message": "De minimale instelbare time-out is 1 minuut." + "message": "Minimale aangepaste time-out is 1 minuut." }, "vaultTimeoutRangeError": { "message": "Kluis time-out ligt niet binnen het toegestane bereik." @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Geheimen verwijderen" }, + "hardDeleteSecret": { + "message": "Geheim definitief verwijderen" + }, + "hardDeleteSecrets": { + "message": "Geheimen definitief verwijderen" + }, "secretProjectAssociationDescription": { "message": "Kies projecten om het geheim aan te koppelen. Alleen gebruikers uit de organisatie met toegang tot deze projecten kunnen het geheim zien." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Om te starten, voeg een nieuw geheim toe of importeer een geheim." }, + "secretsTrashNoItemsMessage": { + "message": "Er bevinden zich geen geheimen in de prullenbak." + }, "serviceAccountsNoItemsTitle": { "message": "Geen inhoud beschikbaar" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Geheimen verplaatst naar prullenbak" }, + "hardDeleteSecretConfirmation": { + "message": "Weet je zeker dat je dit geheim permanent wilt verwijderen?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Weet je zeker dat je deze geheimen permanent wilt verwijderen?" + }, + "hardDeletesSuccessToast": { + "message": "Geheimen permanent verwijderd" + }, "serviceAccountCreated": { "message": "Service account aangemaakt" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Geheim verplaatst naar prullenbak" }, + "hardDeleteSuccessToast": { + "message": "Geheim permanent verwijderd" + }, "searchProjects": { "message": "Zoek projecten" }, @@ -6032,7 +6053,7 @@ "message": "Kan bewerken" }, "canEditExceptPass": { - "message": "Kan bekijken, behalve wachtwoorden" + "message": "Kan bewerken, behalve wachtwoorden" }, "noCollectionsAdded": { "message": "Geen collecties toegevoegd" @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Laatst gecontroleerd" }, + "editDomain": { + "message": "Domein bewerken" + }, "domainFormInvalid": { "message": "Er zijn formulierfouten die je aandacht vereisen" }, @@ -6365,13 +6389,13 @@ "message": "Deze gebruiker heeft toegang tot de Secrets Manager Bèta" }, "important": { - "message": "Important:" + "message": "Belangrijk:" }, "viewAll": { - "message": "View all" + "message": "Alles weergeven" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Toont $PORTION$ van $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Er is een fout opgetreden bij het lezen van het bronbestand" + }, + "createSecret": { + "message": "Geheim aanmaken" + }, + "createProject": { + "message": "Project aanmaken" + }, + "createServiceAccount": { + "message": "Service account aanmaken" + }, + "downloadThe": { + "message": "Download de", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Geheimen importeren" + }, + "getStarted": { + "message": "Aan de slag" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Compleet", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Geheim herstellen" + }, + "restoreSecrets": { + "message": "Geheimen herstellen" + }, + "restoreSecretPrompt": { + "message": "Weet je zeker dat je dit geheim wilt herstellen?" + }, + "restoreSecretsPrompt": { + "message": "Weet je zeker dat je deze geheimen wilt herstellen?" + }, + "secretRestoredSuccessToast": { + "message": "Geheim hersteld" + }, + "secretsRestoredSuccessToast": { + "message": "Geheimen hersteld" + }, + "selectionIsRequired": { + "message": "Selectie vereist." + }, + "secretsManagerSubscriptionDesc": { + "message": "Organisatietoegang tot de Secrets Manager inschakelen is gratis tijdens het bètaprogramma. Gebruikers kunnen toegang tot de Bèta krijgen in Leden." + }, + "secretsManagerEnable": { + "message": "Secrets Manager Bèta inschakelen" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 4a0b721005f..e5ae975b9e1 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -658,7 +658,7 @@ "message": "Hovudpassordet er passordet du brukar for å få tilgjenge til kvelvet ditt. Det er veldig viktig at du ikkje gløymer hovudpassordet ditt. Det er umogleg å få tilbake passordet om du so gløymer det." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "Eit hovudpassordvink kan hjelpa deg med å hugsa passordet ditt om du gløymer det." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 6f4de832392..c5fde27aab4 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -1384,7 +1384,7 @@ "message": "Zabezpiecz swoje konto poprzez wymóg wykonania dodatkowego kroku podczas logowania." }, "twoStepLoginOrganizationDescStart": { - "message": "Wymuszaj opcje logowania dwustopniowego Bitwarden dla członków za pomocą ", + "message": "Wymuszaj opcje logowania dwustopniowego Bitwarden dla użytkowników za pomocą ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { @@ -1426,7 +1426,7 @@ "message": "Konto Premium jest wymagane" }, "premiumRequiredDesc": { - "message": "Konto Premium jest wymagane, aby skorzystać z tej funkcji." + "message": "Członkostwo premium jest wymagane do korzystania z tej funkcji." }, "youHavePremiumAccess": { "message": "Posiadasz dostęp do funkcji konta Premium" @@ -1877,7 +1877,7 @@ "message": "Konto Premium zostało zaktualizowane." }, "premiumUpgradeUnlockFeatures": { - "message": "Zaktualizuj swoje konto do konta Premium i odblokuj dodatkowe funkcje." + "message": "Zaktualizuj swoje konto do członkostwa premium i odblokuj fajne, dodatkowe funkcje." }, "premiumSignUpStorage": { "message": "1 GB przestrzeni na zaszyfrowane załączniki." @@ -1932,7 +1932,7 @@ "message": "Konto Premium" }, "premiumAccessDesc": { - "message": "Możesz przyznać konta Premium wszystkim użytkownikom w Twojej organizacji za $PRICE$ /$INTERVAL$.", + "message": "Możesz przyznać dostęp premium wszystkim użytkownikom w Twojej organizacji za $PRICE$ /$INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -2185,7 +2185,7 @@ } }, "uploadLicenseFilePremium": { - "message": "Aby aktywować konto Premium, musisz przesłać plik licencyjny." + "message": "Aby zaktualizować swoje konto do wersji premium, musisz wgrać prawidłowy plik licencyjny." }, "uploadLicenseFileOrg": { "message": "Aby utworzyć organizację na własnym serwerze, musisz przesłać plik licencyjny." @@ -3063,7 +3063,7 @@ } }, "confirmUsers": { - "message": "Potwierdź użytkowników" + "message": "Zatwierdź użytkowników" }, "usersNeedConfirmed": { "message": "Posiadasz użytkowników, którzy zaakceptowali zaproszenie, ale muszą jeszcze zostać potwierdzeni. Użytkownicy nie będą posiadali dostępu do organizacji, dopóki nie zostaną potwierdzeni." @@ -5624,7 +5624,7 @@ "message": "Wł." }, "members": { - "message": "Członkowie" + "message": "Użytkownicy" }, "reporting": { "message": "Zgłaszanie" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Usuń sekrety" }, + "hardDeleteSecret": { + "message": "Trwale usuń sekret" + }, + "hardDeleteSecrets": { + "message": "Trwale usuń sekrety" + }, "secretProjectAssociationDescription": { "message": "Wybierz projekty, z którymi będzie skojarzony sekret. Tylko użytkownicy organizacji z dostępem do tych projektów będą mogli zobaczyć sekret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Aby rozpocząć, dodaj nowy sekret lub zaimportuj sekrety." }, + "secretsTrashNoItemsMessage": { + "message": "W koszu nie ma żadnych sekretów." + }, "serviceAccountsNoItemsTitle": { "message": "Nie ma nic do pokazania" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Sekrety zostały przeniesione do kosza" }, + "hardDeleteSecretConfirmation": { + "message": "Czy na pewno chcesz trwale usunąć ten sekret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Czy na pewno chcesz trwale usunąć te sekrety?" + }, + "hardDeletesSuccessToast": { + "message": "Sekrety zostały trwale usunięte" + }, "serviceAccountCreated": { "message": "Konto usługi zostało utworzone" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Sekret został przeniesiony do kosza" }, + "hardDeleteSuccessToast": { + "message": "Sekrety zostały trwale usunięty" + }, "searchProjects": { "message": "Szukaj w projektach" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Ostatnio sprawdzona" }, + "editDomain": { + "message": "Edytuj domenę" + }, "domainFormInvalid": { "message": "Istnieją błędy formularza, które wymagają Twojej uwagi" }, @@ -6356,13 +6380,13 @@ "message": "Kontynuowanie spowoduje wylogowanie z bieżącej sesji i konieczność ponownego zalogowania. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę. Zalecamy wyeksportowanie sejfu przed zmianą ustawień szyfrowania, aby zapobiec utracie danych." }, "secretsManagerBeta": { - "message": "Manager sekretów beta" + "message": "Menedżer sekretów beta" }, "secretsManagerBetaDesc": { - "message": "Włącz dostęp użytkownikom do Managera sekretów bez żadnych opłat podczas programu Beta." + "message": "Włącz dostęp użytkownikom do menedżera sekretów bez żadnych opłat podczas programu beta." }, "userAccessSecretsManager": { - "message": "Ten użytkownik może uzyskać dostęp do Managera sekretów Beta" + "message": "Ten użytkownik może uzyskać dostęp do menedżera sekretów beta" }, "important": { "message": "Ważne:" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Wystąpił błąd podczas próby odczytu pliku importu" + }, + "createSecret": { + "message": "Utwórz sekret" + }, + "createProject": { + "message": "Utwórz projekt" + }, + "createServiceAccount": { + "message": "Utwórz konto serwisowe" + }, + "downloadThe": { + "message": "Pobierz", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "CLI menedżera sekretów" + }, + "importSecrets": { + "message": "Importuj sekrety" + }, + "getStarted": { + "message": "Pierwsze kroki" + }, + "complete": { + "message": "Gotowe: $COMPLETED$/$TOTAL$", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Przywróć sekret" + }, + "restoreSecrets": { + "message": "Przywróć sekrety" + }, + "restoreSecretPrompt": { + "message": "Czy na pewno chcesz przywrócić ten sekret?" + }, + "restoreSecretsPrompt": { + "message": "Czy na pewno chcesz przywrócić te sekrety?" + }, + "secretRestoredSuccessToast": { + "message": "Sekret przywrócony" + }, + "secretsRestoredSuccessToast": { + "message": "Sekrety przywrócone" + }, + "selectionIsRequired": { + "message": "Wybór jest wymagany." + }, + "secretsManagerSubscriptionDesc": { + "message": "Włącz dostęp organizacji do menedżera sekretów bez żadnych opłat podczas programu beta. Użytkownicy mogą uzyskać dostęp do wersji beta w sekcji użytkownicy." + }, + "secretsManagerEnable": { + "message": "Włącz menedżer sekretów beta" + }, + "checkForBreaches": { + "message": "Sprawdź czy to hasło występowało w znanych wyciekach danych" + }, + "exposedMasterPassword": { + "message": "Ujawnione hasło główne" + }, + "exposedMasterPasswordDesc": { + "message": "Hasło ujawnione w wyniku naruszenia ochrony danych. Użyj unikalnego hasła, aby chronić swoje konto. Czy na pewno chcesz użyć ujawnionego hasła?" + }, + "weakAndExposedMasterPassword": { + "message": "Słabe i ujawnione hasło główne" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Słabe hasło ujawnione w wyniku naruszenia ochrony danych. Użyj silnego i unikalnego hasła, aby chronić swoje konto. Czy na pewno chcesz użyć tego hasła?" + }, + "characterMinimum": { + "message": "Minimum znaków: $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Hasło główne musi zawierać co najmniej $LENGTH$ znaki(-ów).", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 8784dffc051..d85433bb88f 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -281,35 +281,35 @@ "message": "Pesquisar Favoritos" }, "searchLogin": { - "message": "Search logins", + "message": "Buscar credenciais", "description": "Search Login type" }, "searchCard": { - "message": "Search cards", + "message": "Buscar cartões", "description": "Search Card type" }, "searchIdentity": { - "message": "Search identities", + "message": "Buscar identidades", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Search secure notes", + "message": "Buscar notas seguras", "description": "Search Secure Note type" }, "searchVault": { "message": "Pesquisar no Cofre" }, "searchMyVault": { - "message": "Search my vault" + "message": "Buscar no meu cofre" }, "searchOrganization": { - "message": "Search organization" + "message": "Buscar na organização" }, "searchMembers": { - "message": "Search members" + "message": "Buscar membros" }, "searchGroups": { - "message": "Search groups" + "message": "Buscar grupos" }, "allItems": { "message": "Todos os Itens" @@ -393,7 +393,7 @@ "message": "Selecionar" }, "newItem": { - "message": "New item" + "message": "Novo item" }, "addItem": { "message": "Adicionar Item" @@ -589,7 +589,7 @@ "message": "Editar info" }, "access": { - "message": "Access" + "message": "Acesso" }, "loggedOut": { "message": "Sessão encerrada" @@ -622,7 +622,7 @@ "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "Entrar com senha mestra" }, "createAccount": { "message": "Criar conta" @@ -697,7 +697,7 @@ "message": "A senha mestra é necessária." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -756,7 +756,7 @@ "message": "Não há itens para listar." }, "noPermissionToViewAllCollectionItems": { - "message": "You do not have permission to view all items in this collection." + "message": "Você não tem permissão para visualizar todos os itens desta coleção." }, "noCollectionsInList": { "message": "Não há coleções para listar." @@ -768,7 +768,7 @@ "message": "Não há usuários para listar." }, "noMembersInList": { - "message": "There are no members to list." + "message": "Não há membros para listar." }, "noEventsInList": { "message": "Não há eventos para listar." @@ -915,7 +915,7 @@ } }, "deleteSelectedCollectionsDesc": { - "message": "$COUNT$ collection(s) will be permanently deleted.", + "message": "$COUNT$ coleção(ões) serão excluídas permanentemente.", "placeholders": { "count": { "content": "$1", @@ -924,7 +924,7 @@ } }, "deleteSelectedConfirmation": { - "message": "Are you sure you want to continue?" + "message": "Tem certeza que deseja continuar?" }, "moveSelectedItemsDesc": { "message": "Escolha uma pasta para a qual você deseja mover os $COUNT$ itens selecionados.", @@ -1001,16 +1001,16 @@ "message": "Confirmar senha do arquivo" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "Use sua chave criptográfica da conta, derivada do nome de usuário e Senha Mestra da sua conta, para criptografar a exportação e restringir importação para apenas a conta atual do Bitwarden." }, "passwordProtectedOptionDescription": { "message": "Defina uma senha para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografar." }, "exportTypeHeading": { - "message": "Export type" + "message": "Tipo da exportação" }, "accountRestricted": { - "message": "Account restricted" + "message": "Conta restrita" }, "passwordProtected": { "message": "Protegido por Senha" @@ -1165,17 +1165,17 @@ } }, "kdfMemory": { - "message": "KDF memory (MB)", + "message": "Memória KDF (MB)", "description": "Memory refers to computer memory (RAM). MB is short for megabytes." }, "argon2Warning": { - "message": "Setting your KDF iterations, memory, and parallelism too high could result in poor performance when logging into (and unlocking) Bitwarden on slower or older devices. We recommend changing these individually in small increments and then test all of your devices." + "message": "Configurar as suas iterações KDF, memória e paralelismo muito altos pode resultar em baixo desempenho ao iniciar (e desbloquear) o Bitwarden em dispositivos mais lentos ou mais antigos. Recomendamos alterá-los individualmente em pequenos incrementos e, em seguida, testar todos os seus dispositivos." }, "kdfParallelism": { - "message": "KDF parallelism" + "message": "Paralelismo KDF" }, "argon2Desc": { - "message": "Higher KDF iterations, memory, and parallelism can help protect your master password from being brute forced by an attacker." + "message": "Mais iterações KDF, memória e paralelismo podem ajudar a proteger sua senha mestra de ser descoberta por força bruta por um invasor." }, "changeKdf": { "message": "Alterar KDF" @@ -1283,10 +1283,10 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Choose File" + "message": "Selecionar Arquivo" }, "noFileChosen": { - "message": "No file chosen" + "message": "Nenhum arquivo escolhido" }, "orCopyPasteFileContents": { "message": "ou copie/cole o conteúdo do arquivo de importação" @@ -1378,23 +1378,23 @@ "message": "Login em Duas Etapas" }, "twoStepLoginEnforcement": { - "message": "Two-step Login Enforcement" + "message": "Requerer Login em Duas Etapas" }, "twoStepLoginDesc": { "message": "Proteja a sua conta exigindo uma etapa adicional ao iniciar sessão." }, "twoStepLoginOrganizationDescStart": { - "message": "Enforce Bitwarden Two-step Login options for members by using the ", + "message": "Requerer Login em Duas Etapas no Bitwarden para membros usando o ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { - "message": "Two-step Login Policy" + "message": "Política de Login em Duas Etapas" }, "twoStepLoginOrganizationDuoDesc": { - "message": "To enforce Two-step Login through Duo, use the options below." + "message": "Para aplicar o Login em Duas Etapas pelo Duo, use as opções abaixo." }, "twoStepLoginOrganizationSsoDesc": { - "message": "If you have setup SSO or plan to, Two-step Login may already be enforced through your Identity Provider." + "message": "Se você tem SSO configurado ou planeja ter, o Login em Duas Etapas já pode ser requerido por meio do seu Provedor de Identidade." }, "twoStepLoginRecoveryWarning": { "message": "Ativar o login em duas etapas pode bloquear você permanentemente da sua conta no Bitwarden. Um código de recuperação permite que você acesse sua conta no caso de não poder mais usar seu provedor de login em duas etapas normalmente (por exemplo, você perde seu dispositivo). O suporte do Bitwarden não poderá ajudá-lo se você perder o acesso à sua conta. Recomendamos que você anote ou imprima o código de recuperação e mantenha-o em um local seguro." @@ -1644,7 +1644,7 @@ "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "Identify and close security gaps in your organization's accounts by clicking the reports below.", + "message": "Identifique e feche as brechas de segurança nas contas da sua organização clicando nos relatórios abaixo.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { @@ -1678,7 +1678,7 @@ "message": "Credenciais Sem 2FA Encontradas" }, "inactive2faFoundDesc": { - "message": "We found $COUNT$ website(s) in your vault that may not be configured with two-step login (according to 2fa.directory). To further protect these accounts, you should set up two-step login.", + "message": "Encontramos $COUNT$ site(s) no seu cofre que pode(m) não estar configurados com login em duas etapas (segundo o site 2fa.directory). Para proteger ainda mais essas contas, você deve configurar o login em duas etapas.", "placeholders": { "count": { "content": "$1", @@ -1696,7 +1696,7 @@ "message": "Relatório de Senhas Expostas" }, "exposedPasswordsReportDesc": { - "message": "Passwords exposed in a data breach are easy targets for attackers. Change these passwords to prevent potential break-ins." + "message": "As senhas expostas em um vazamento de dados são alvos fáceis para os atacantes. Altere estas senhas para evitar possíveis invasões." }, "exposedPasswordsFound": { "message": "Senhas Expostas Encontradas" @@ -1910,7 +1910,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "Go premium for just $PRICE$ /year, or get premium accounts for $FAMILYPLANUSERCOUNT$ users and unlimited family sharing with a ", + "message": "Seja premium por apenas $PRICE$ /ano, ou obtenha contas premium para $FAMILYPLANUSERCOUNT$ usuários e compartilhamento familiar ilimitado com um ", "placeholders": { "price": { "content": "$1", @@ -1923,7 +1923,7 @@ } }, "bitwardenFamiliesPlan": { - "message": "Bitwarden Families plan." + "message": "Bitwarden plano Família." }, "addons": { "message": "Complementos" @@ -2068,7 +2068,7 @@ "message": "Gerenciar Assinatura" }, "launchCloudSubscription": { - "message": "Launch Cloud Subscription" + "message": "Iniciar Assinatura na Nuvem" }, "storage": { "message": "Armazenamento" @@ -2463,7 +2463,7 @@ "message": "Você tem certeza que deseja excluir este grupo?" }, "deleteMultipleGroupsConfirmation": { - "message": "Are you sure you want to delete the following $QUANTITY$ group(s)?", + "message": "Você tem certeza que deseja excluir os seguintes $QUANTITY$ grupo(s)?", "placeholders": { "quantity": { "content": "$1", @@ -2490,7 +2490,7 @@ "message": "O ID externo pode ser usado como referência ou vincular esse recurso a um sistema externo, como um diretório de usuários." }, "nestCollectionUnder": { - "message": "Nest collection under" + "message": "Aninhar coleção em" }, "accessControl": { "message": "Controle de Acesso" @@ -2514,7 +2514,7 @@ "message": "Editar Coleção" }, "collectionInfo": { - "message": "Collection info" + "message": "Informações da coleção" }, "deleteCollectionConfirmation": { "message": "Você tem certeza que deseja excluir esta coleção?" @@ -2523,7 +2523,7 @@ "message": "Editar membro" }, "fieldOnTabRequiresAttention": { - "message": "A field on the '$TAB$' tab requires your attention.", + "message": "Um campo na aba '$TAB$' requer sua atenção.", "placeholders": { "tab": { "content": "$1", @@ -2724,7 +2724,7 @@ } }, "viewedCardNumberItemId": { - "message": "Viewed Card Number for item $ID$.", + "message": "Número do cartão visualizado para o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -2796,7 +2796,7 @@ } }, "deletedCollections": { - "message": "Deleted collections" + "message": "Coleções excluídas" }, "deletedCollectionId": { "message": "Coleção excluída $ID$.", @@ -2844,7 +2844,7 @@ } }, "deletedManyGroups": { - "message": "Deleted $QUANTITY$ group(s).", + "message": "$QUANTITY$ grupo(s) excluídos.", "placeholders": { "quantity": { "content": "$1", @@ -3156,7 +3156,7 @@ "message": "Minha Organização" }, "organizationInfo": { - "message": "Organization info" + "message": "Informações da organização" }, "deleteOrganization": { "message": "Excluir Organização" @@ -3855,10 +3855,10 @@ "message": "O Identificador da Organização é obrigatório." }, "ssoIdentifier": { - "message": "SSO identifier" + "message": "Identificador SSO" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO." + "message": "Forneça este ID aos seus membros para fazer login com SSO." }, "unlinkSso": { "message": "Desvincular SSO" @@ -4259,25 +4259,25 @@ "message": "Permite controle mais granular das permissões de usuário para configurações avançadas." }, "customDescNonEnterpriseStart": { - "message": "Custom roles is an ", + "message": "Papéis personalizados é um ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseLink": { - "message": "enterprise feature", + "message": "funcionalidade empresarial", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseEnd": { - "message": ". Contact our support team to upgrade your subscription", + "message": ". Contacte a nossa equipe de suporte para atualizar a sua assinatura", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "To enable custom permissions the organization must be on an Enterprise 2020 plan." + "message": "Para ativar as permissões personalizadas, a organização deve estar em um plano Enterprise 2020." }, "permissions": { "message": "Permissões" }, "permission": { - "message": "Permission" + "message": "Permissão" }, "managerPermissions": { "message": "Permissões de Gerente" @@ -4685,7 +4685,7 @@ "message": "Clientes" }, "client": { - "message": "Client", + "message": "Cliente", "description": "This is used as a table header to describe which client application created an event log." }, "providerAdmin": { @@ -5303,7 +5303,7 @@ "message": "obrigatório" }, "characterMaximum": { - "message": "$MAX$ character maximum", + "message": "máximo de $MAX$ caracteres", "placeholders": { "max": { "content": "$1", @@ -5579,7 +5579,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "A entrada não pode exceder $COUNT$ caracteres.", "placeholders": { "count": { "content": "$1", @@ -5588,7 +5588,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Os seguintes caracteres não são permitidos: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -5597,10 +5597,10 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 ou mais e-mails são inválidos" }, "tooManyEmails": { - "message": "You can only submit up to $COUNT$ emails at a time", + "message": "Você só pode enviar até $COUNT$ e-mails por vez", "placeholders": { "count": { "content": "$1", @@ -5624,10 +5624,10 @@ "message": "Ligado" }, "members": { - "message": "Members" + "message": "Membros" }, "reporting": { - "message": "Reporting" + "message": "Reportando" }, "cardBrandMir": { "message": "Mir" @@ -5636,52 +5636,52 @@ "message": "Número de usuários" }, "loggingInAs": { - "message": "Logging in as" + "message": "Entrando como" }, "notYou": { - "message": "Not you?" + "message": "Não é você?" }, "pickAnAvatarColor": { - "message": "Pick an avatar color" + "message": "Escolha uma cor de avatar" }, "customizeAvatar": { - "message": "Customize avatar" + "message": "Personalizar avatar" }, "avatarUpdated": { - "message": "Avatar updated" + "message": "Avatar atualizado" }, "brightBlue": { - "message": "Bright Blue" + "message": "Azul Claro" }, "green": { - "message": "Green" + "message": "Verde" }, "orange": { - "message": "Orange" + "message": "Laranja" }, "lavender": { - "message": "Lavender" + "message": "Lavanda" }, "yellow": { - "message": "Yellow" + "message": "Amarelo" }, "indigo": { - "message": "Indigo" + "message": "Índigo" }, "teal": { - "message": "Teal" + "message": "Turquesa" }, "salmon": { - "message": "Salmon" + "message": "Salmão" }, "pink": { - "message": "Pink" + "message": "Rosa" }, "customColor": { - "message": "Custom Color" + "message": "Cor personalizada" }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Selecione --" }, "multiSelectPlaceholder": { "message": "-- Digite para filtrar --" @@ -5696,165 +5696,183 @@ "message": "Limpar todos" }, "toggleCharacterCount": { - "message": "Toggle character count", + "message": "Alternar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "passwordCharacterCount": { - "message": "Password character count", + "message": "Contagem de caracteres da senha", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "hide": { - "message": "Hide" + "message": "Ocultar" }, "projects": { - "message": "Projects" + "message": "Projetos" }, "lastEdited": { - "message": "Last edited" + "message": "Última edição" }, "editSecret": { - "message": "Edit secret" + "message": "Editar segredo" }, "addSecret": { - "message": "Add secret" + "message": "Adicionar segredo" }, "copySecretName": { - "message": "Copy secret name" + "message": "Copiar nome do segredo" }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copiar valor do segredo" }, "deleteSecret": { - "message": "Delete secret" + "message": "Excluir segredo" }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Excluir segredos" + }, + "hardDeleteSecret": { + "message": "Excluir permanentemente o segredo" + }, + "hardDeleteSecrets": { + "message": "Excluir permanentemente os segredos" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Selecione os projetos aos quais o segredo será associado. Somente os usuários da organização com acesso a estes projetos poderão ver o segredo." }, "selectProjects": { - "message": "Select projects" + "message": "Selecionar projetos" }, "project": { - "message": "Project" + "message": "Projecto" }, "editProject": { - "message": "Edit project" + "message": "Editar projeto" }, "viewProject": { - "message": "View project" + "message": "Ver projeto" }, "deleteProject": { - "message": "Delete project" + "message": "Excluir projeto" }, "deleteProjects": { - "message": "Delete projects" + "message": "Excluir projetos" }, "secret": { - "message": "Secret" + "message": "Segredo" }, "serviceAccount": { - "message": "Service account" + "message": "Conta de serviço" }, "serviceAccounts": { - "message": "Service accounts" + "message": "Contas de Serviço" }, "secrets": { - "message": "Secrets" + "message": "Segredos" }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Par de Nome/Valor" }, "secretEdited": { - "message": "Secret edited" + "message": "Secreto editado" }, "secretCreated": { - "message": "Secret created" + "message": "Segredo criado" }, "newSecret": { - "message": "New secret" + "message": "Novo segredo" }, "newServiceAccount": { - "message": "New service account" + "message": "Nova conta de serviço" }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "Sem segredos para mostrar" }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "Para começar, adicione um novo segredo ou importe segredos." + }, + "secretsTrashNoItemsMessage": { + "message": "Não há segredos no lixo." }, "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" + "message": "Nada para mostrar ainda" }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Crie uma nova conta de serviço para começar a automatizar o acesso secreto." }, "searchSecrets": { - "message": "Search secrets" + "message": "Pesquisar segredos" }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Excluir contas de serviço" }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Excluir conta de serviço" }, "viewServiceAccount": { - "message": "View service account" + "message": "Ver conta de serviço" }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Pesquisar contas de serviço" }, "addProject": { - "message": "Add project" + "message": "Adicionar projeto" }, "projectEdited": { - "message": "Project edited" + "message": "Projeto editado" }, "projectSaved": { - "message": "Project saved" + "message": "Projeto salvo" }, "projectCreated": { - "message": "Project created" + "message": "Projeto criado" }, "projectName": { - "message": "Project name" + "message": "Nome do projeto" }, "newProject": { - "message": "New project" + "message": "Novo projeto" }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Excluir segredos pode afetar integrações existentes." }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Segredos enviados para lixeira" + }, + "hardDeleteSecretConfirmation": { + "message": "Tem certeza de que deseja excluir permanentemente este segredo?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Tem certeza que deseja excluir estes segredos permanentemente?" + }, + "hardDeletesSuccessToast": { + "message": "Segredos excluídos permanentemente" }, "serviceAccountCreated": { - "message": "Service account created" + "message": "Conta de serviço criada" }, "smAccess": { - "message": "Access" + "message": "Acesso" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Projeto, Segredo" }, "serviceAccountName": { - "message": "Service account name" + "message": "Nome da conta de serviço" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Digite ou selecione projetos ou segredos" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Digite para filtrar" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projetos excluídos" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "O projeto e todos os segredos associados foram excluídos" }, "deleteProjectDialogMessage": { - "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "message": "Excluir o projeto $PROJECT$ é permanente e irreversível.", "placeholders": { "project": { "content": "$1", @@ -5863,7 +5881,7 @@ } }, "deleteProjectInputLabel": { - "message": "Type \"$CONFIRM$\" to continue", + "message": "Digite \"$CONFIRM$\" para continuar", "placeholders": { "confirm": { "content": "$1", @@ -5872,7 +5890,7 @@ } }, "deleteProjectConfirmMessage": { - "message": "Delete $PROJECT$", + "message": "Excluir $PROJECT$", "placeholders": { "project": { "content": "$1", @@ -5881,7 +5899,7 @@ } }, "deleteProjectsConfirmMessage": { - "message": "Delete $COUNT$ Projects", + "message": "Excluir $COUNT$ Projetos", "placeholders": { "count": { "content": "$1", @@ -5890,49 +5908,52 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "A exclusão de projetos é permanente e irreversível." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "Nenhum projeto para exibir" }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Adicione um novo projeto para começar a organizar segredos." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmação necessária" }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "Os seguintes projetos não puderam ser excluídos:" }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Segredo enviado para lixeira" + }, + "hardDeleteSuccessToast": { + "message": "Segredo excluído permanentemente" }, "searchProjects": { - "message": "Search projects" + "message": "Pesquisar projetos" }, "accessTokens": { - "message": "Access tokens" + "message": "Tokens de acesso" }, "createAccessToken": { - "message": "Create access token" + "message": "Criar token de acesso" }, "expires": { - "message": "Expires" + "message": "Expira em" }, "canRead": { - "message": "Can read" + "message": "Pode ler" }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "Nenhum token de acesso para exibir" }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "Para começar, crie um token de acesso" }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Baixe ou copie antes de fechar." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expira em:" }, "accessTokenCallOutTitle": { "message": "Access tokens are not stored and cannot be retrieved" @@ -5981,7 +6002,7 @@ "message": "Update" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ mais", "placeholders": { "quantity": { "content": "$1", @@ -5990,10 +6011,10 @@ } }, "groupInfo": { - "message": "Group info" + "message": "Informações do grupo" }, "editGroupMembersDesc": { - "message": "Grant members access to the group's assigned collections." + "message": "Conceder acesso às coleções atribuídas ao grupo." }, "editGroupCollectionsDesc": { "message": "Grant access to collections by adding them to this group." @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6356,22 +6380,22 @@ "message": "Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, "secretsManagerBeta": { - "message": "Secrets Manager Beta" + "message": "Gerenciador de Segredos Beta" }, "secretsManagerBetaDesc": { - "message": "Enable user access to the Secrets Manager at no charge during the Beta program." + "message": "Permitir o acesso do usuário ao Gerenciador de Segredos sem custos durante o programa Beta." }, "userAccessSecretsManager": { - "message": "This user can access the Secrets Manager Beta" + "message": "Este usuário pode acessar o Gerenciador de Segredos Beta" }, "important": { - "message": "Important:" + "message": "Importante:" }, "viewAll": { - "message": "View all" + "message": "Visualizar tudo" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Mostrando $PORTION$ de $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Ocorreu um erro ao tentar ler o arquivo de importação" + }, + "createSecret": { + "message": "Crie um segredo" + }, + "createProject": { + "message": "Criar um projeto" + }, + "createServiceAccount": { + "message": "Criar conta de serviço" + }, + "downloadThe": { + "message": "Baixe o", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Gerenciador de Segredos CLI" + }, + "importSecrets": { + "message": "Importar segredos" + }, + "getStarted": { + "message": "Vamos começar" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Completos", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restaurar segredo" + }, + "restoreSecrets": { + "message": "Restaurar segredos" + }, + "restoreSecretPrompt": { + "message": "Tem certeza de que deseja restaurar este segredo?" + }, + "restoreSecretsPrompt": { + "message": "Tem certeza de que deseja restaurar estes segredos?" + }, + "secretRestoredSuccessToast": { + "message": "Segredo restaurado" + }, + "secretsRestoredSuccessToast": { + "message": "Segredos restaurados" + }, + "selectionIsRequired": { + "message": "Seleção é necessária." + }, + "secretsManagerSubscriptionDesc": { + "message": "Ative o acesso da organização ao Gerenciador de Segredos sem custos durante o programa Beta. Os usuários podem ter acesso ao Beta em Membros." + }, + "secretsManagerEnable": { + "message": "Habilitar Gerenciador de Segredos Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 043e445340a..eec500b1b84 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 386cd8528d6..bc21fad2ca1 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 84855977a41..41dbc1c30bc 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -697,7 +697,7 @@ "message": "Необходимо повторно ввести мастер-пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Мастер-пароль должен содержать не менее $VALUE$ символов.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Удалить секреты" }, + "hardDeleteSecret": { + "message": "Окончательно удалить секрет" + }, + "hardDeleteSecrets": { + "message": "Окончательно удалить секреты" + }, "secretProjectAssociationDescription": { "message": "Выберите проекты, с которыми будет связан секрет. Только пользователи организации, имеющие доступ к этим проектам, смогут увидеть секрет." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Чтобы начать, добавьте новый секрет или импортируйте их." }, + "secretsTrashNoItemsMessage": { + "message": "В корзине нет секретов." + }, "serviceAccountsNoItemsTitle": { "message": "Пока нечего показать" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Секреты отправлены в корзину" }, + "hardDeleteSecretConfirmation": { + "message": "Вы уверены, что хотите удалить этот секрет?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Вы уверены, что хотите удалить эти секреты?" + }, + "hardDeletesSuccessToast": { + "message": "Секреты удалены окончательно" + }, "serviceAccountCreated": { "message": "Сервисный аккаунт создан" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Секрет отправлен в корзину" }, + "hardDeleteSuccessToast": { + "message": "Секрет удален окончательно" + }, "searchProjects": { "message": "Поиск проектов" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Последняя проверка" }, + "editDomain": { + "message": "Редактировать домен" + }, "domainFormInvalid": { "message": "Имеются ошибки в форме, которые требуют вашего внимания" }, @@ -6365,7 +6389,7 @@ "message": "Этот пользователь может получить доступ к Менеджеру секретов Beta" }, "important": { - "message": "Important:" + "message": "Важно:" }, "viewAll": { "message": "Посмотреть все" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Произошла ошибка при попытке чтения импортируемого файла" + }, + "createSecret": { + "message": "Создать секрет" + }, + "createProject": { + "message": "Создать проект" + }, + "createServiceAccount": { + "message": "Создать сервисный аккаунт" + }, + "downloadThe": { + "message": "Скачать", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Менеджер секретов CLI" + }, + "importSecrets": { + "message": "Импорт секретов" + }, + "getStarted": { + "message": "Начать" + }, + "complete": { + "message": "Выполнено $COMPLETED$/$TOTAL$", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Восстановить секрет" + }, + "restoreSecrets": { + "message": "Восстановить секреты" + }, + "restoreSecretPrompt": { + "message": "Уверены, что хотите восстановить этот секрет?" + }, + "restoreSecretsPrompt": { + "message": "Уверены, что хотите восстановить эти секреты?" + }, + "secretRestoredSuccessToast": { + "message": "Секрет восстановлен" + }, + "secretsRestoredSuccessToast": { + "message": "Секреты восстановлены" + }, + "selectionIsRequired": { + "message": "Требуется выбор." + }, + "secretsManagerSubscriptionDesc": { + "message": "Включите доступ организации к Менеджеру секретов бесплатно во время программы бета-тестирования. Пользователям может быть предоставлен доступ к бета-версии в разделе Участники." + }, + "secretsManagerEnable": { + "message": "Менеджер секретов Бета" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 82f6a1e2e83..b387021ad56 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 9ef72d9bd7a..10766ac476f 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Natrvalo odstrániť položku" + }, + "hardDeleteSecrets": { + "message": "Natrvalo odstrániť položky" + }, "secretProjectAssociationDescription": { "message": "Vyberte projekty ku ktorým bude heslo patriť. Iba tí používatelia organizácie, ktorí majú prístup k zvoleným projektom budú môcť vidieť heslo." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "V koši nie sú žiadne položky." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Naozaj chcete natrvalo odstrániť túto položku?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Naozaj chcete tieto položky natrvalo odstrániť?" + }, + "hardDeletesSuccessToast": { + "message": "Položky natrvalo odstránené" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Položka natrvalo odstránená" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Posledná kontrola" }, + "editDomain": { + "message": "Upraviť doménu" + }, "domainFormInvalid": { "message": "Vo formulári sú chyby, ktoré vyžadujú vašu pozornosť" }, @@ -6365,7 +6389,7 @@ "message": "Tento používateľ má prístup k beta verzii Secrets Manager" }, "important": { - "message": "Important:" + "message": "Dôležité:" }, "viewAll": { "message": "Zobraziť všetko" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Pri pokuse o prečítanie súboru na import sa vyskytla chyba" + }, + "createSecret": { + "message": "Vytvoriť položku" + }, + "createProject": { + "message": "Vytvoriť nový projekt" + }, + "createServiceAccount": { + "message": "Vytvoriť služobné kontá" + }, + "downloadThe": { + "message": "Stiahnuť", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "CLI verzia Secrets Manager" + }, + "importSecrets": { + "message": "Importovať položky" + }, + "getStarted": { + "message": "Začať" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ hotovo", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Obnoviť položku" + }, + "restoreSecrets": { + "message": "Obnoviť položky" + }, + "restoreSecretPrompt": { + "message": "Naozaj chcete obnoviť túto položku?" + }, + "restoreSecretsPrompt": { + "message": "Naozaj chcete obnoviť tieto položky?" + }, + "secretRestoredSuccessToast": { + "message": "Položka obnovená" + }, + "secretsRestoredSuccessToast": { + "message": "Položky obnovené" + }, + "selectionIsRequired": { + "message": "Vyžaduje sa výber." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Skontrolovať známe úniky údajov pre toto heslo" + }, + "exposedMasterPassword": { + "message": "Odhalené hlavné heslo" + }, + "exposedMasterPasswordDesc": { + "message": "Heslo nájdené v uniknutých údajoch. Na ochranu svojho účtu používajte jedinečné heslo. Naozaj chcete používať odhalené heslo?" + }, + "weakAndExposedMasterPassword": { + "message": "Slabé a odhalené hlavné heslo" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Slabé heslo, ktoré bolo tiež nájdené uniknutých údajoch. Na ochranu svojho účtu používajte silné a jedinečné heslo. Naozaj chcete používať toto heslo?" + }, + "characterMinimum": { + "message": "Minimálny počet znakov $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Hlavné heslo musí mať aspoň $LENGTH$ znakov.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 79e0337f0ae..accbed21238 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index be3b110ff99..aa785e1c805 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Обрисати тајне" }, + "hardDeleteSecret": { + "message": "Трајно избрисати тајну" + }, + "hardDeleteSecrets": { + "message": "Трајно избрисати тајне" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "У отпад нема тајне." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Да ли сте сигурни да желите да трајно избришете ову тајну?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Да ли сте сигурни да желите да трајно избришете ове тајне?" + }, + "hardDeletesSuccessToast": { + "message": "Тајне трајно избрисане" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Тајна послана у отпад" }, + "hardDeleteSuccessToast": { + "message": "Тајна трајно избрисана" + }, "searchProjects": { "message": "Претражити пројекте" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Последња провера" }, + "editDomain": { + "message": "Уреди домен" + }, "domainFormInvalid": { "message": "Постоје грешке у формулару које захтевају вашу пажњу" }, @@ -6365,7 +6389,7 @@ "message": "Овај корисник може приступити Secrets Manager Beta" }, "important": { - "message": "Important:" + "message": "Важно:" }, "viewAll": { "message": "Прегледај све" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Дошло је до грешке у покушају читања датотеке за увоз" + }, + "createSecret": { + "message": "Креирати тајну" + }, + "createProject": { + "message": "Креирај пројекат" + }, + "createServiceAccount": { + "message": "Креирајте налог сервиса" + }, + "downloadThe": { + "message": "Преузети", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Увоз тајне" + }, + "getStarted": { + "message": "Почните" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ завршено", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Врати тајну" + }, + "restoreSecrets": { + "message": "Врати тајне" + }, + "restoreSecretPrompt": { + "message": "Да ли сте сигурни да желите да вратите ову тајну?" + }, + "restoreSecretsPrompt": { + "message": "Да ли сте сигурни да желите да вратите ове тајне?" + }, + "secretRestoredSuccessToast": { + "message": "Тајна враћена" + }, + "secretsRestoredSuccessToast": { + "message": "Тајне враћене" + }, + "selectionIsRequired": { + "message": "Потребно је да изаберете нешто." + }, + "secretsManagerSubscriptionDesc": { + "message": "Укључите приступ организације за Secrets Manager бесплатно током Бета програма. Корисницима се може одобрити приступ Бета у Члановима." + }, + "secretsManagerEnable": { + "message": "Омогућити Secrets Manager Бета" + }, + "checkForBreaches": { + "message": "Проверите познате упада података за ову лозинку" + }, + "exposedMasterPassword": { + "message": "Изложена главна лозинка" + }, + "exposedMasterPasswordDesc": { + "message": "Лозинка је пронађена у случају повреде података. Користите јединствену лозинку да бисте заштитили свој налог. Да ли сте сигурни да желите да користите откривену лозинку?" + }, + "weakAndExposedMasterPassword": { + "message": "Слаба и зложена главна лозинка" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Идентификована је слаба лозинка и пронађена у упаду података. Користите јаку и јединствену лозинку да заштитите свој налог. Да ли сте сигурни да желите да користите ову лозинку?" + }, + "characterMinimum": { + "message": "Минимум $LENGTH$ карактера", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Главна лозинка треба имати барем $LENGTH$ карактера.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 3227ae88278..cb11fc34fd7 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -658,7 +658,7 @@ "message": "Glavna šifra je šifra koju koristite kako biste pristupili svom trezoru. Veoma je važno da ne zaboravite svoju glavnu šifru. Ukoliko je zaboravite, ne postoji način da je dobijete nazad." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 761afb3fd42..9c41249bd4c 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 22e6d7d1105..2b6758534d6 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -658,7 +658,7 @@ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 35f472f475b..60e88b6d96c 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -658,7 +658,7 @@ "message": "รหัสผ่านหลัก คือ รหัสผ่านที่ใช้เข้าถึงตู้นิรภัยของคุณ สิ่งสำคัญมาก คือ คุณจะต้องไม่ลืมรหัสผ่านหลักโดยเด็ดขาด เพราะหากคุณลืมแล้วล่ะก็ จะไม่มีวิธีที่สามารถกู้รหัสผ่านของคุณได้เลย" }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintDesc": { "message": "คำใบ้เกี่ยวกับรหัสผ่านหลักสามารถช่วยให้คุณนึกรหัสผ่านหลักออกได้หากลืม" @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 7d5a444651c..6cfe164f04b 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Sırları Sil" }, + "hardDeleteSecret": { + "message": "Sırrı kalıcı olarak sil" + }, + "hardDeleteSecrets": { + "message": "Sırları kalıcı olarak sil" + }, "secretProjectAssociationDescription": { "message": "Sırrın ilişkilendirileceği projeleri seçin. Yalnızca bu projelere erişimi olan kuruluş kullanıcıları sırrı görebilir." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Başlamak için yeni bir gizli dizin ekleyin veya gizli dizinleri içe aktarın." }, + "secretsTrashNoItemsMessage": { + "message": "Çöpte sır yok." + }, "serviceAccountsNoItemsTitle": { "message": "Henüz gösterecek bir şey yok" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Çöpe atılan sırlar" }, + "hardDeleteSecretConfirmation": { + "message": "Bu sırrı kalıcı olarak silmek istediğinizden emin misiniz?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Bu sırları kalıcı olarak silmek istediğinizden emin misiniz?" + }, + "hardDeletesSuccessToast": { + "message": "Sırlar kalıcı olarak silindi" + }, "serviceAccountCreated": { "message": "Hizmet Hesabı Oluşturuldu" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Çöpe atılan sır" }, + "hardDeleteSuccessToast": { + "message": "Sır kalıcı olarak silindi" + }, "searchProjects": { "message": "Projeleri ara" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Son kontrol" }, + "editDomain": { + "message": "Alan adını düzenle" + }, "domainFormInvalid": { "message": "İlgilenmeniz gereken form hataları var" }, @@ -6365,7 +6389,7 @@ "message": "Bu kullanıcı Secrets Manager Beta'ya erişebilir" }, "important": { - "message": "Important:" + "message": "Önemli:" }, "viewAll": { "message": "Tümünü göster" @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "İçe aktarma dosyası okunurken bir hata oluştu" + }, + "createSecret": { + "message": "Bir sır oluştur" + }, + "createProject": { + "message": "Proje oluştur" + }, + "createServiceAccount": { + "message": "Bir hizmet hesabı oluşturun" + }, + "downloadThe": { + "message": "İndir", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Gizlilik Yöneticisi CLI" + }, + "importSecrets": { + "message": "Sırları içe aktar" + }, + "getStarted": { + "message": "Başla" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Tamamlandı", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Sırrı geri yükle" + }, + "restoreSecrets": { + "message": "Sırları geri yükle" + }, + "restoreSecretPrompt": { + "message": "Bu sırrı geri yüklemek istediğinizden emin misiniz?" + }, + "restoreSecretsPrompt": { + "message": "Bu sırları geri yüklemek istediğinizden emin misiniz?" + }, + "secretRestoredSuccessToast": { + "message": "Sır geri yüklendi" + }, + "secretsRestoredSuccessToast": { + "message": "Sırlar geri yüklendi" + }, + "selectionIsRequired": { + "message": "Seçim yapmanız gerekiyor." + }, + "secretsManagerSubscriptionDesc": { + "message": "Beta programı boyunca Secrets Manager'a kuruluş erişimini ücretsiz olarak etkinleştirebilirsiniz. Üyeler sayfası üzerinden kullanıcılara Beta'ya erişim izni verebilirsiniz." + }, + "secretsManagerEnable": { + "message": "Secrets Manager Beta'yı etkinleştir" + }, + "checkForBreaches": { + "message": "Bu parola için bilinen veri ihlallerini kontrol edin" + }, + "exposedMasterPassword": { + "message": "Açığa Çıkmış Ana Parola" + }, + "exposedMasterPasswordDesc": { + "message": "Bu parola bir veri ihlalinde tespit edildi. Hesabınızı korumak için aynı parolayı farklı yerlerde kullanmayın. Bu parolayı kullanmak istediğinizden emin misiniz?" + }, + "weakAndExposedMasterPassword": { + "message": "Zayıf ve Açığa Çıkmış Ana Parola" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Hem zayıf hem de veri ihlalinde yer alan bir tespit edildi. Hesabınızı korumak için güçlü bir parola seçin ve o parolayı başka yerlerde kullanmayın. Bu parolayı kullanmak istediğinizden emin misiniz?" + }, + "characterMinimum": { + "message": "En az $LENGTH$ karakter", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Ana parola en az $LENGTH$ karakter uzunluğunda olmalıdır.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 5b668b56310..67899e49e67 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -658,7 +658,7 @@ "message": "Головний пароль використовується для доступу до вашого сховища. Дуже важливо, щоб ви запам'ятали його. Якщо ви забудете головний пароль, його неможливо буде відновити." }, "masterPassImportant": { - "message": "Головний пароль неможливо відновити, якщо ви забудете його!" + "message": "Головний пароль неможливо відновити, якщо ви його втратите!" }, "masterPassHintDesc": { "message": "Якщо ви забудете головний пароль, підказка може допомогти вам згадати його." @@ -697,7 +697,7 @@ "message": "Необхідно повторно ввести головний пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Довжина головного пароля має бути принаймні $VALUE$ символів.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -3532,7 +3532,7 @@ "message": "Слабкий головний пароль" }, "weakMasterPasswordDesc": { - "message": "Обраний вами головний пароль є слабким. Для належного захисту свого облікового запису Bitwarden, вам слід використовувати надійний головний пароль (або парольну фразу). Ви впевнені, що хочете використати цей пароль?" + "message": "Виявлено слабкий пароль. Використовуйте надійний пароль для захисту свого облікового запису. Ви дійсно хочете використати слабкий пароль?" }, "rotateAccountEncKey": { "message": "Також оновити ключ шифрування мого облікового запису" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Видалити секрети" }, + "hardDeleteSecret": { + "message": "Остаточно видалити секрет" + }, + "hardDeleteSecrets": { + "message": "Остаточно видалити секрети" + }, "secretProjectAssociationDescription": { "message": "Оберіть проєкти, з якими буде пов'язано секретний ключ." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "Для початку додайте або імпортуйте секрети." }, + "secretsTrashNoItemsMessage": { + "message": "У смітнику немає секретів." + }, "serviceAccountsNoItemsTitle": { "message": "Наразі немає даних для показу" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Секрети переміщено до смітника" }, + "hardDeleteSecretConfirmation": { + "message": "Ви дійсно хочете остаточно видалити цей секрет?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Ви дійсно хочете остаточно видалити ці секрети?" + }, + "hardDeletesSuccessToast": { + "message": "Секрети остаточно видалено" + }, "serviceAccountCreated": { "message": "Службовий обліковий запис створено" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Секрет переміщено до смітника" }, + "hardDeleteSuccessToast": { + "message": "Секрет остаточно видалено" + }, "searchProjects": { "message": "Пошук проєктів" }, @@ -5956,13 +5977,13 @@ "message": "Відкликати токен доступу" }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Відкликати токени доступу" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "Відкликання токенів доступу – це остаточна та незворотна дія." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Токени доступу відкликано", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -6053,64 +6074,64 @@ "message": "Цей учасник має доступ і може редагувати всі елементи." }, "domainVerification": { - "message": "Domain verification" + "message": "Перевірка доменів" }, "newDomain": { - "message": "New domain" + "message": "Новий домен" }, "noDomains": { - "message": "No domains" + "message": "Немає доменів" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "Під'єднання домену дозволяє учасникам не використовувати поле ідентифікатора SSO під час входу з SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "Підтвердити домен" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "Повторно підтвердити домен" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Копіювати TXT-запис для DNS" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "TXT-запис для DNS" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "Скопіюйте і вставте TXT-запис у відповідне поле свого DNS-провайдера." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "Зразок: mydomain.com. Для піддоменів потрібно підтвердити окремі записи." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "Автоматичне підтвердження доменів" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Bitwarden намагатиметься підтвердити домен 3 рази впродовж 72 годин. Якщо не вдасться підтвердити домен, перевірте DNS-запис у вашого провайдера й підтвердьте його вручну. Якщо домен не буде підтверджено протягом 7 днів, його буде вилучено з вашої організації" }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "Неправильний формат введення. Правильний формат: mydomain.com. Для підтвердження піддоменів потрібно ввести окремі записи." }, "removeDomain": { - "message": "Remove domain" + "message": "Вилучити домен" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "Вилучення домену – це незворотна дія. Ви дійсно хочете продовжити?" }, "domainRemoved": { - "message": "Domain removed" + "message": "Домен вилучено" }, "domainSaved": { - "message": "Domain saved" + "message": "Домен збережено" }, "domainVerified": { - "message": "Domain verified" + "message": "Домен підтверджено" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "Не можна запитати той самий домен двічі." }, "domainNotAvailable": { - "message": "Someone else is using $DOMAIN$. Use a different domain to continue.", + "message": "Хтось вже використовує $DOMAIN$. Щоб продовжити, використайте інший домен.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6119,7 +6140,7 @@ } }, "domainNotVerified": { - "message": "$DOMAIN$ not verified. Check your DNS record.", + "message": "$DOMAIN$ не підтверджено. Перевірте свій DNS-запис.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6128,25 +6149,28 @@ } }, "domainStatusVerified": { - "message": "Verified" + "message": "Підтверджено" }, "domainStatusUnverified": { - "message": "Unverified" + "message": "Не підтверджено" }, "domainNameTh": { - "message": "Name" + "message": "Ім'я" }, "domainStatusTh": { - "message": "Status" + "message": "Стан" }, "lastChecked": { - "message": "Last checked" + "message": "Востаннє перевірено" + }, + "editDomain": { + "message": "Редагувати домен" }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "У формі є помилки, що потребують вашої уваги" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "Домен $DOMAIN$ додано", "placeholders": { "DOMAIN": { "content": "$1", @@ -6155,7 +6179,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "Домен $DOMAIN$ вилучено", "placeholders": { "DOMAIN": { "content": "$1", @@ -6164,7 +6188,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "Домен $DOMAIN$ підтверджено", "placeholders": { "DOMAIN": { "content": "$1", @@ -6173,7 +6197,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "Домен $DOMAIN$ не підтверджено", "placeholders": { "DOMAIN": { "content": "$1", @@ -6257,7 +6281,7 @@ } }, "server": { - "message": "Server" + "message": "Сервер" }, "exportData": { "message": "Експортувати дані" @@ -6365,13 +6389,13 @@ "message": "Цей користувач має доступ до бета-версії керування секретами" }, "important": { - "message": "Important:" + "message": "Важливо:" }, "viewAll": { - "message": "View all" + "message": "Переглянути все" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Показано $PORTION$ з $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Під час спроби прочитання імпортованого файлу сталася помилка" + }, + "createSecret": { + "message": "Створити секрет" + }, + "createProject": { + "message": "Створити проєкт" + }, + "createServiceAccount": { + "message": "Створити службовий обліковий запис" + }, + "downloadThe": { + "message": "Завантажити", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Керування секретами CLI" + }, + "importSecrets": { + "message": "Імпортувати секрети" + }, + "getStarted": { + "message": "Початок роботи" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ завершено", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Відновити секрет" + }, + "restoreSecrets": { + "message": "Відновити секрети" + }, + "restoreSecretPrompt": { + "message": "Ви дійсно хочете відновити цей секрет?" + }, + "restoreSecretsPrompt": { + "message": "Ви дійсно хочете відновити ці секрети?" + }, + "secretRestoredSuccessToast": { + "message": "Секрет відновлено" + }, + "secretsRestoredSuccessToast": { + "message": "Секрети відновлено" + }, + "selectionIsRequired": { + "message": "Потрібен вибір." + }, + "secretsManagerSubscriptionDesc": { + "message": "Увімкніть доступ організації до керування секретами безплатно упродовж періоду бета-тестування. Користувачам можна надати доступ в бета-версії в меню учасників." + }, + "secretsManagerEnable": { + "message": "Увімкнути керування секретами (бета-версія)" + }, + "checkForBreaches": { + "message": "Перевірити відомі витоки даних для цього пароля" + }, + "exposedMasterPassword": { + "message": "Головний пароль викрито" + }, + "exposedMasterPasswordDesc": { + "message": "Пароль знайдено у витоку даних. Використовуйте унікальний пароль для захисту свого облікового запису. Ви дійсно хочете використати викритий пароль?" + }, + "weakAndExposedMasterPassword": { + "message": "Слабкий і викритий головний пароль" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Виявлено слабкий пароль, який знайдено у витоку даних. Використовуйте надійний та унікальний пароль для захисту свого облікового запису. Ви дійсно хочете використати цей пароль?" + }, + "characterMinimum": { + "message": "Мінімум $LENGTH$ символів", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Довжина головного пароля має бути принаймні $LENGTH$ символів.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 6d576a13abf..c5facd286fa 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -3532,7 +3532,7 @@ "message": "Weak master password" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?" }, "rotateAccountEncKey": { "message": "Also rotate my account's encryption key" @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "Delete secrets" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "To get started, add a new secret or import secrets." }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "Nothing to show yet" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "Secrets sent to trash" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "Service account created" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "Secret sent to trash" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "Search projects" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Chỉnh sửa tên miền" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "Đã xảy ra lỗi khi cố đọc tập tin nhập" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Lựa chọn là bắt buộc." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 46a68cdc813..9e46f4ee3fb 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "删除机密" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "选择与机密相关联的项目。仅有权访问该项目的组织用户能查看该机密。" }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "要开始,请添加一个新的机密或导入机密。" }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "还没有要显示的内容" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "机密已发送到回收站" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "服务帐户已创建" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "机密已发送到回收站" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "搜索项目" }, @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "上次检查" }, + "editDomain": { + "message": "编辑域" + }, "domainFormInvalid": { "message": "表单错误需要您注意。" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "必须选择" + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "检查已知的数据泄露是否包含此密码" + }, + "exposedMasterPassword": { + "message": "已暴露的主密码" + }, + "exposedMasterPasswordDesc": { + "message": "一起数据泄露中存在该密码。使用独特的密码有助保护您的账户。确定要使用曾经暴露的密码吗?" + }, + "weakAndExposedMasterPassword": { + "message": "主密码弱且曾经暴露" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "密码太弱并出现在数据泄露。使用强悍且独特的密码有助保护您的账户。确定继续使用当前密码吗?" + }, + "characterMinimum": { + "message": "至少 $LENGTH$ 个字符", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "主密码长度最少为 $LENGTH$ 个字符。", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index bcb434076d2..232da65f3ff 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -5730,6 +5730,12 @@ "deleteSecrets": { "message": "刪除機密" }, + "hardDeleteSecret": { + "message": "Permanently delete secret" + }, + "hardDeleteSecrets": { + "message": "Permanently delete secrets" + }, "secretProjectAssociationDescription": { "message": "選擇與機密相關聯的項目。僅有權存取該項目的組織使用者能檢視該機密。" }, @@ -5784,6 +5790,9 @@ "secretsNoItemsMessage": { "message": "要開始,請加入一個新的機密或匯入機密。" }, + "secretsTrashNoItemsMessage": { + "message": "There are no secrets in the trash." + }, "serviceAccountsNoItemsTitle": { "message": "還沒有要顯示的內容" }, @@ -5829,6 +5838,15 @@ "softDeletesSuccessToast": { "message": "機密已移至垃圾桶" }, + "hardDeleteSecretConfirmation": { + "message": "Are you sure you want to permanently delete this secret?" + }, + "hardDeleteSecretsConfirmation": { + "message": "Are you sure you want to permanently delete these secrets?" + }, + "hardDeletesSuccessToast": { + "message": "Secrets permanently deleted" + }, "serviceAccountCreated": { "message": "服務帳號已建立" }, @@ -5907,6 +5925,9 @@ "softDeleteSuccessToast": { "message": "機密已移至垃圾桶" }, + "hardDeleteSuccessToast": { + "message": "Secret permanently deleted" + }, "searchProjects": { "message": "搜尋項目" }, @@ -6053,7 +6074,7 @@ "message": "此成員可存取及變更所有項目。" }, "domainVerification": { - "message": "Domain verification" + "message": "網域驗證" }, "newDomain": { "message": "New domain" @@ -6142,6 +6163,9 @@ "lastChecked": { "message": "Last checked" }, + "editDomain": { + "message": "Edit domain" + }, "domainFormInvalid": { "message": "There are form errors that need your attention" }, @@ -6391,5 +6415,100 @@ }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" + }, + "createSecret": { + "message": "Create a secret" + }, + "createProject": { + "message": "Create a project" + }, + "createServiceAccount": { + "message": "Create a service account" + }, + "downloadThe": { + "message": "Download the", + "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" + }, + "smCLI": { + "message": "Secrets Manager CLI" + }, + "importSecrets": { + "message": "Import secrets" + }, + "getStarted": { + "message": "Get started" + }, + "complete": { + "message": "$COMPLETED$/$TOTAL$ Complete", + "placeholders": { + "COMPLETED": { + "content": "$1", + "example": "1" + }, + "TOTAL": { + "content": "$2", + "example": "4" + } + } + }, + "restoreSecret": { + "message": "Restore secret" + }, + "restoreSecrets": { + "message": "Restore secrets" + }, + "restoreSecretPrompt": { + "message": "Are you sure you want to restore this secret?" + }, + "restoreSecretsPrompt": { + "message": "Are you sure you want to restore these secrets?" + }, + "secretRestoredSuccessToast": { + "message": "Secret restored" + }, + "secretsRestoredSuccessToast": { + "message": "Secrets restored" + }, + "selectionIsRequired": { + "message": "Selection is required." + }, + "secretsManagerSubscriptionDesc": { + "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + }, + "secretsManagerEnable": { + "message": "Enable Secrets Manager Beta" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "masterPasswordMinimumlength": { + "message": "Master password must be at least $LENGTH$ characters long.", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } } } From 76d6586ff8b292bab937966a6e975d91f12485ea Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 24 Feb 2023 16:44:01 +0100 Subject: [PATCH 074/232] Enable caching for prettier (#4837) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a68e19cfac..afe6d5b61f1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "lint": "eslint . --cache --cache-strategy content && prettier --check .", "lint:fix": "eslint . --cache --cache-strategy content --fix", "lint:clear": "rimraf .eslintcache", - "prettier": "prettier --write .", + "prettier": "prettier --cache --write .", "test": "jest", "test:watch": "jest --clearCache && jest --watch", "test:watch:all": "jest --watchAll", From a6430747091b2923e7830ed7b88c867ccd1d046c Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 24 Feb 2023 16:44:24 +0100 Subject: [PATCH 075/232] [SM-389] Event log for service account (#4679) --- .../src/app/common/base.events.component.ts | 1 + apps/web/src/app/core/event.service.ts | 22 ++++++++++++++++--- .../organizations/manage/events.component.ts | 10 +++++++++ apps/web/src/locales/en/messages.json | 18 +++++++++++---- .../secrets/secrets.component.html | 3 ++- .../secrets/secrets.component.ts | 7 +++++- .../shared/secrets-list.component.ts | 5 +++++ libs/common/src/enums/eventType.ts | 2 ++ .../src/models/response/event.response.ts | 4 ++++ libs/common/src/models/view/event.view.ts | 2 ++ 10 files changed, 65 insertions(+), 9 deletions(-) diff --git a/apps/web/src/app/common/base.events.component.ts b/apps/web/src/app/common/base.events.component.ts index 0a67a1caf07..c3bcb24caea 100644 --- a/apps/web/src/app/common/base.events.component.ts +++ b/apps/web/src/app/common/base.events.component.ts @@ -139,6 +139,7 @@ export abstract class BaseEventsComponent { type: r.type, installationId: r.installationId, systemUser: r.systemUser, + serviceAccountId: r.serviceAccountId, }); }) ); diff --git a/apps/web/src/app/core/event.service.ts b/apps/web/src/app/core/event.service.ts index 6cf0c052d5e..6650d7dcc71 100644 --- a/apps/web/src/app/core/event.service.ts +++ b/apps/web/src/app/core/event.service.ts @@ -36,7 +36,7 @@ export class EventService { } async getEventInfo(ev: EventResponse, options = new EventOptions()): Promise { - const appInfo = this.getAppInfo(ev.deviceType); + const appInfo = this.getAppInfo(ev); const { message, humanReadableMessage } = await this.getEventMessage(ev, options); return { message: message, @@ -410,6 +410,11 @@ export class EventService { case EventType.OrganizationDomain_NotVerified: msg = humanReadableMsg = this.i18nService.t("domainNotVerifiedEvent", ev.domainName); break; + // Secrets Manager + case EventType.Secret_Retrieved: + msg = this.i18nService.t("accessedSecret", this.formatSecretId(ev)); + humanReadableMsg = this.i18nService.t("accessedSecret", this.getShortId(ev.secretId)); + break; default: break; } @@ -419,8 +424,12 @@ export class EventService { }; } - private getAppInfo(deviceType: DeviceType): [string, string] { - switch (deviceType) { + private getAppInfo(ev: EventResponse): [string, string] { + if (ev.serviceAccountId) { + return ["bwi-globe", this.i18nService.t("sdk")]; + } + + switch (ev.deviceType) { case DeviceType.Android: return ["bwi-android", this.i18nService.t("mobile") + " - Android"]; case DeviceType.iOS: @@ -554,6 +563,13 @@ export class EventService { return a.outerHTML; } + formatSecretId(ev: EventResponse): string { + const shortId = this.getShortId(ev.secretId); + const a = this.makeAnchor(shortId); + a.setAttribute("href", "#/sm/" + ev.organizationId + "/secrets?search=" + shortId); + return a.outerHTML; + } + private makeAnchor(shortId: string) { const a = document.createElement("a"); a.title = this.i18nService.t("view"); diff --git a/apps/web/src/app/organizations/manage/events.component.ts b/apps/web/src/app/organizations/manage/events.component.ts index e1c0d46c827..69fbf0965ab 100644 --- a/apps/web/src/app/organizations/manage/events.component.ts +++ b/apps/web/src/app/organizations/manage/events.component.ts @@ -152,9 +152,19 @@ export class EventsComponent extends BaseEventsComponent implements OnInit, OnDe } } + if (r.serviceAccountId) { + return { + name: this.i18nService.t("serviceAccount") + " " + this.getShortId(r.serviceAccountId), + }; + } + return null; } + private getShortId(id: string) { + return id?.substring(0, 8); + } + ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 6562e4f5aac..b3ee19154fc 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6420,6 +6420,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6490,16 +6503,13 @@ }, "exposedMasterPasswordDesc": { "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" - }, + }, "weakAndExposedMasterPassword": { "message": "Weak and Exposed Master Password" }, "weakAndBreachedMasterPasswordDesc": { "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" }, - "important": { - "message": "Important:" - }, "characterMinimum": { "message": "$LENGTH$ character minimum", "placeholders": { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html index 724f31e5714..d706afa56e5 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html @@ -1,5 +1,5 @@ - + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts index 367416ea892..0ddf04a2757 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts @@ -22,7 +22,8 @@ import { SecretService } from "./secret.service"; templateUrl: "./secrets.component.html", }) export class SecretsComponent implements OnInit { - secrets$: Observable; + protected secrets$: Observable; + protected search: string; private organizationId: string; @@ -41,6 +42,10 @@ export class SecretsComponent implements OnInit { return await this.getSecrets(); }) ); + + if (this.route.snapshot.queryParams.search) { + this.search = this.route.snapshot.queryParams.search; + } } private async getSecrets(): Promise { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts index 63d6b9fe4b6..77e086bd5f8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts @@ -24,6 +24,11 @@ export class SecretsListComponent implements OnDestroy { } private _secrets: SecretListView[]; + @Input() + set search(search: string) { + this.dataSource.filter = search; + } + @Input() trash: boolean; @Output() editSecretEvent = new EventEmitter(); diff --git a/libs/common/src/enums/eventType.ts b/libs/common/src/enums/eventType.ts index 5caa4b29dfc..72cd73c39bc 100644 --- a/libs/common/src/enums/eventType.ts +++ b/libs/common/src/enums/eventType.ts @@ -78,4 +78,6 @@ export enum EventType { OrganizationDomain_Removed = 2001, OrganizationDomain_Verified = 2002, OrganizationDomain_NotVerified = 2003, + + Secret_Retrieved = 2100, } diff --git a/libs/common/src/models/response/event.response.ts b/libs/common/src/models/response/event.response.ts index 27fc223ab6d..bf2c3ac6177 100644 --- a/libs/common/src/models/response/event.response.ts +++ b/libs/common/src/models/response/event.response.ts @@ -23,6 +23,8 @@ export class EventResponse extends BaseResponse { installationId: string; systemUser: EventSystemUser; domainName: string; + secretId: string; + serviceAccountId: string; constructor(response: any) { super(response); @@ -44,5 +46,7 @@ export class EventResponse extends BaseResponse { this.installationId = this.getResponseProperty("InstallationId"); this.systemUser = this.getResponseProperty("SystemUser"); this.domainName = this.getResponseProperty("DomainName"); + this.secretId = this.getResponseProperty("SecretId"); + this.serviceAccountId = this.getResponseProperty("ServiceAccountId"); } } diff --git a/libs/common/src/models/view/event.view.ts b/libs/common/src/models/view/event.view.ts index 6b77c0b6286..288f21c81fe 100644 --- a/libs/common/src/models/view/event.view.ts +++ b/libs/common/src/models/view/event.view.ts @@ -14,6 +14,7 @@ export class EventView { type: EventType; installationId: string; systemUser: EventSystemUser; + serviceAccountId: string; constructor(data: Required) { this.message = data.message; @@ -28,5 +29,6 @@ export class EventView { this.type = data.type; this.installationId = data.installationId; this.systemUser = data.systemUser; + this.serviceAccountId = data.serviceAccountId; } } From 6df106ca4763be739ad7cd099358f5c55d1de549 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 24 Feb 2023 17:09:23 +0100 Subject: [PATCH 076/232] Add cache to lint-staged for prettier (#4862) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index afe6d5b61f1..639237e1993 100644 --- a/package.json +++ b/package.json @@ -203,7 +203,7 @@ "react": "^18.0.0" }, "lint-staged": { - "*": "prettier --ignore-unknown --write", + "*": "prettier --cache --ignore-unknown --write", "*.ts": "eslint --cache --cache-strategy content --fix" }, "engines": { From 731766145723daaa5c51af5021472dff638bf674 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 24 Feb 2023 17:14:58 +0100 Subject: [PATCH 077/232] Require typography module for header stories. (#4861) --- .../bit-web/src/app/secrets-manager/shared/header.stories.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts index 9a07786a646..43a4227077d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts @@ -15,6 +15,7 @@ import { MenuModule, NavigationModule, TabsModule, + TypographyModule, } from "@bitwarden/components"; import { InputModule } from "@bitwarden/components/src/input/input.module"; import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/app/tests/preloaded-english-i18n.module"; @@ -65,9 +66,10 @@ export default { IconModule, InputModule, MenuModule, + TabsModule, + TypographyModule, NavigationModule, PreloadedEnglishI18nModule, - TabsModule, ], declarations: [HeaderComponent, MockProductSwitcher], providers: [ From 84d211fb564b1861fadd0f12293bdb763aa44c54 Mon Sep 17 00:00:00 2001 From: Jake Fink Date: Fri, 24 Feb 2023 11:19:09 -0500 Subject: [PATCH 078/232] Fix broken Storybook: Change ng-template to ng-container for ngIf and rename icon directive (#4816) * remove added template for ngIf and rename icon directive * fix regression in product switcher * fix text color of bulk delete in org vault * use ng-container for *ngIf --- .../individual-vault/vault-items.component.html | 12 +++++++----- .../simple-configurable-dialog.component.html | 2 +- .../simple-dialog/simple-dialog.component.html | 6 +++--- .../dialog/simple-dialog/simple-dialog.component.ts | 2 +- .../dialog/simple-dialog/simple-dialog.stories.ts | 2 +- libs/components/src/menu/menu.component.html | 1 + 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/web/src/app/vault/individual-vault/vault-items.component.html b/apps/web/src/app/vault/individual-vault/vault-items.component.html index 39e8af4f1b8..45be454a33f 100644 --- a/apps/web/src/app/vault/individual-vault/vault-items.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-items.component.html @@ -62,11 +62,13 @@ {{ "restoreSelected" | i18n }} - diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.html b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.html index cc6ce75dcb2..dfc30d8c8fc 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.html +++ b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.html @@ -1,5 +1,5 @@ - + {{ title }} diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.component.html b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html index 89dccd4f904..4614dc96e53 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.component.html +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html @@ -3,9 +3,9 @@ @fadeIn >
    - - - + + + diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts index fa4e359bce0..912b0299f66 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts @@ -2,7 +2,7 @@ import { Component, ContentChild, Directive } from "@angular/core"; import { fadeIn } from "../animations"; -@Directive({ selector: "[bit-dialog-icon]" }) +@Directive({ selector: "[bitDialogIcon]" }) export class IconDirective {} @Component({ diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts index 307b21b4c22..17922607992 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts @@ -42,7 +42,7 @@ const TemplateWithIcon: Story = (args: SimpleDialogCompon props: args, template: ` - + Premium Subscription Available Message Content
    diff --git a/libs/components/src/menu/menu.component.html b/libs/components/src/menu/menu.component.html index f254fe5826c..d175a3fe3bc 100644 --- a/libs/components/src/menu/menu.component.html +++ b/libs/components/src/menu/menu.component.html @@ -5,6 +5,7 @@ [attr.role]="ariaRole" [attr.aria-label]="ariaLabel" cdkTrapFocus + [cdkTrapFocusAutoCapture]="ariaRole === 'dialog'" >
    From 8b5a223ad4ca0f89b6c9bcdbddef464d1755d2c0 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 24 Feb 2023 17:29:49 +0100 Subject: [PATCH 079/232] [SM-402] Truncate dialog headers (#4854) --- libs/components/src/dialog/dialog/dialog.component.html | 2 +- libs/components/src/dialog/dialog/dialog.stories.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/components/src/dialog/dialog/dialog.component.html b/libs/components/src/dialog/dialog/dialog.component.html index a1e1aa6f378..bea165c9a90 100644 --- a/libs/components/src/dialog/dialog/dialog.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -6,7 +6,7 @@
    -

    +

    +
    +

    + {{ "helpFeedback" | i18n }} +

    +
    + +
    +
    +
    + + + +
    +
    +
    diff --git a/apps/browser/src/popup/settings/help-and-feedback.component.ts b/apps/browser/src/popup/settings/help-and-feedback.component.ts new file mode 100644 index 00000000000..006f76f48bc --- /dev/null +++ b/apps/browser/src/popup/settings/help-and-feedback.component.ts @@ -0,0 +1,20 @@ +import { Component } from "@angular/core"; + +import { BrowserApi } from "../../browser/browserApi"; + +@Component({ + selector: "app-help-and-feedback", + templateUrl: "help-and-feedback.component.html", +}) +export class HelpAndFeedbackComponent { + launchHelp() { + BrowserApi.createNewTab("https://bitwarden.com/help/"); + } + launchContactForm() { + BrowserApi.createNewTab("https://bitwarden.com/contact/"); + } + + launchForums() { + BrowserApi.createNewTab("https://bitwarden.com/getinvolved/"); + } +} diff --git a/apps/browser/src/popup/settings/settings.component.html b/apps/browser/src/popup/settings/settings.component.html index d371acc450f..539e971b5f1 100644 --- a/apps/browser/src/popup/settings/settings.component.html +++ b/apps/browser/src/popup/settings/settings.component.html @@ -221,8 +221,7 @@ + + {{ "getMasterPasswordHint" | i18n }} +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + +
    + +
    +

    {{ "loggingInAs" | i18n }} {{ loggedEmail }}

    + {{ "notYou" | i18n }} +
    +

    - - -
    - - {{ "masterPass" | i18n }} - - - - {{ - "getMasterPasswordHint" | i18n - }} -
    - -
    - -
    - -
    - -
    - -
    - -
    - - - -
    - -
    -

    {{ "loggingInAs" | i18n }} {{ loggedEmail }}

    - {{ "notYou" | i18n }} -
    -
    diff --git a/libs/angular/src/auth/components/login.component.ts b/libs/angular/src/auth/components/login.component.ts index 88c0a356fa8..10ff0521870 100644 --- a/libs/angular/src/auth/components/login.component.ts +++ b/libs/angular/src/auth/components/login.component.ts @@ -238,7 +238,11 @@ export class LoginComponent extends CaptchaProtectedComponent implements OnInit toggleValidateEmail(value: boolean) { this.validatedEmail = value; - this.formGroup.controls.masterPassword.reset(); + if (!value) { + // Reset master password only when going from validated to not validated (not you btn press) + // so that autofill can work properly + this.formGroup.controls.masterPassword.reset(); + } } setFormValues() { From 84aa7fffd72aa555941d26abd9dafa071d3e1ce7 Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:43:06 -0600 Subject: [PATCH 082/232] [SM-474] Service Account - People Tab (#4689) * Init service layer changes * refactor service to inherit abstract * refactor access-selector component * update access selector in projects * add service accounts access selector * update i18n * fix delete action; use useExisting in providers * update static permissions * service account people should be readwrite on creation * use setter instead of observable input * remove warning callout * remove abstract service * truncate name in table * remove extra comments * use map instead of forEach * refactor view factories * update SA people copy * map list responses --------- Co-authored-by: William Martin --- apps/web/src/locales/en/messages.json | 3 + .../models/view/access-policy.view.ts | 23 ++ .../view/project-access-policies.view.ts | 11 - .../project/project-access.component.html | 23 -- .../project/project-access.component.ts | 54 --- .../project/project-people.component.html | 24 +- .../project/project-people.component.ts | 103 +++++- .../project-service-accounts.component.html | 24 +- .../project-service-accounts.component.ts | 78 ++++- .../projects/projects.module.ts | 2 - .../service-account-people.component.html | 15 + .../service-account-people.component.ts | 107 ++++++ .../service-accounts-routing.module.ts | 5 + .../service-accounts.module.ts | 2 + .../access-policies/access-policy.service.ts | 319 +++++++++++------ .../access-selector.component.html | 39 ++- .../access-selector.component.ts | 321 ++++++------------ .../responses/access-policy.response.ts | 26 ++ .../project-access-policies.response.ts | 15 +- ...rvice-accounts-access-policies.response.ts | 23 ++ 20 files changed, 760 insertions(+), 457 deletions(-) delete mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-access-policies.view.ts delete mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.html delete mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/service-accounts-access-policies.response.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index b3ee19154fc..b06e0144e16 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6362,6 +6362,9 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, "canWrite": { "message": "Can write" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts index 8af275e63f1..e4fc1fb9426 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts @@ -12,14 +12,37 @@ export class UserProjectAccessPolicyView extends BaseAccessPolicyView { grantedProjectId: string; } +export class UserServiceAccountAccessPolicyView extends BaseAccessPolicyView { + organizationUserId: string; + organizationUserName: string; + grantedServiceAccountId: string; +} + export class GroupProjectAccessPolicyView extends BaseAccessPolicyView { groupId: string; groupName: string; grantedProjectId: string; } +export class GroupServiceAccountAccessPolicyView extends BaseAccessPolicyView { + groupId: string; + groupName: string; + grantedServiceAccountId: string; +} + export class ServiceAccountProjectAccessPolicyView extends BaseAccessPolicyView { serviceAccountId: string; serviceAccountName: string; grantedProjectId: string; } + +export class ProjectAccessPoliciesView { + userAccessPolicies: UserProjectAccessPolicyView[]; + groupAccessPolicies: GroupProjectAccessPolicyView[]; + serviceAccountAccessPolicies: ServiceAccountProjectAccessPolicyView[]; +} + +export class ServiceAccountAccessPoliciesView { + userAccessPolicies: UserServiceAccountAccessPolicyView[]; + groupAccessPolicies: GroupServiceAccountAccessPolicyView[]; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-access-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-access-policies.view.ts deleted file mode 100644 index 5f05b595b63..00000000000 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-access-policies.view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - GroupProjectAccessPolicyView, - ServiceAccountProjectAccessPolicyView, - UserProjectAccessPolicyView, -} from "./access-policy.view"; - -export class ProjectAccessPoliciesView { - userAccessPolicies: UserProjectAccessPolicyView[]; - groupAccessPolicies: GroupProjectAccessPolicyView[]; - serviceAccountAccessPolicies: ServiceAccountProjectAccessPolicyView[]; -} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.html deleted file mode 100644 index 4ba5fed4020..00000000000 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.html +++ /dev/null @@ -1,23 +0,0 @@ - -
    -

    - {{ description }} -

    - - -
    -
    - - -
    - -
    -
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.ts deleted file mode 100644 index ffe51b8000a..00000000000 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-access.component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, Input, OnInit } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; -import { combineLatestWith, Observable, share, startWith, switchMap } from "rxjs"; - -import { PotentialGranteeView } from "../../models/view/potential-grantee.view"; -import { ProjectAccessPoliciesView } from "../../models/view/project-access-policies.view"; -import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; - -@Component({ - selector: "sm-project-access", - templateUrl: "./project-access.component.html", -}) -export class ProjectAccessComponent implements OnInit { - @Input() accessType: "projectPeople" | "projectServiceAccounts"; - @Input() description: string; - @Input() label: string; - @Input() hint: string; - @Input() columnTitle: string; - @Input() emptyMessage: string; - - protected projectAccessPolicies$: Observable; - protected potentialGrantees$: Observable; - - constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} - - ngOnInit(): void { - this.projectAccessPolicies$ = this.accessPolicyService.projectAccessPolicies$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(([_, params]) => { - return this.accessPolicyService.getProjectAccessPolicies( - params.organizationId, - params.projectId - ); - }), - share() - ); - - this.potentialGrantees$ = this.accessPolicyService.projectAccessPolicies$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(async ([_, params]) => { - if (this.accessType == "projectPeople") { - return await this.accessPolicyService.getPeoplePotentialGrantees(params.organizationId); - } else { - return await this.accessPolicyService.getServiceAccountsPotentialGrantees( - params.organizationId - ); - } - }), - share() - ); - } -} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html index f3a39f41540..124eafb8de0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html @@ -1,9 +1,15 @@ - - +
    +

    + {{ "projectPeopleDescription" | i18n }} +

    + + +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts index 34492727411..d1ee0e3ce10 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts @@ -1,7 +1,106 @@ -import { Component } from "@angular/core"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; + +import { SelectItemView } from "@bitwarden/components"; + +import { + GroupProjectAccessPolicyView, + ProjectAccessPoliciesView, + UserProjectAccessPolicyView, +} from "../../models/view/access-policy.view"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; +import { + AccessSelectorComponent, + AccessSelectorRowView, +} from "../../shared/access-policies/access-selector.component"; @Component({ selector: "sm-project-people", templateUrl: "./project-people.component.html", }) -export class ProjectPeopleComponent {} +export class ProjectPeopleComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + private organizationId: string; + private projectId: string; + + protected rows$: Observable = + this.accessPolicyService.projectAccessPolicyChanges$.pipe( + startWith(null), + switchMap(() => + this.accessPolicyService.getProjectAccessPolicies(this.organizationId, this.projectId) + ), + map((policies) => { + const rows: AccessSelectorRowView[] = []; + policies.userAccessPolicies.forEach((policy) => { + rows.push({ + type: "user", + name: policy.organizationUserName, + granteeId: policy.organizationUserId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.userIcon, + }); + }); + + policies.groupAccessPolicies.forEach((policy) => { + rows.push({ + type: "group", + name: policy.groupName, + granteeId: policy.groupId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.groupIcon, + }); + }); + return rows; + }) + ); + + protected handleCreateAccessPolicies(selected: SelectItemView[]) { + const projectAccessPoliciesView = new ProjectAccessPoliciesView(); + projectAccessPoliciesView.userAccessPolicies = selected + .filter((selection) => AccessSelectorComponent.getAccessItemType(selection) === "user") + .map((filtered) => { + const view = new UserProjectAccessPolicyView(); + view.grantedProjectId = this.projectId; + view.organizationUserId = filtered.id; + view.read = true; + view.write = false; + return view; + }); + + projectAccessPoliciesView.groupAccessPolicies = selected + .filter((selection) => AccessSelectorComponent.getAccessItemType(selection) === "group") + .map((filtered) => { + const view = new GroupProjectAccessPolicyView(); + view.grantedProjectId = this.projectId; + view.groupId = filtered.id; + view.read = true; + view.write = false; + return view; + }); + + return this.accessPolicyService.createProjectAccessPolicies( + this.organizationId, + this.projectId, + projectAccessPoliciesView + ); + } + + constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + + ngOnInit(): void { + this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { + this.organizationId = params.organizationId; + this.projectId = params.projectId; + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html index 3f82e6d8853..12bdd05316a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html @@ -1,9 +1,15 @@ - - +
    +

    + {{ "projectServiceAccountsDescription" | i18n }} +

    + + +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts index 194e5f2d224..e442ef4b168 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts @@ -1,7 +1,81 @@ -import { Component } from "@angular/core"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; + +import { SelectItemView } from "@bitwarden/components"; + +import { + ProjectAccessPoliciesView, + ServiceAccountProjectAccessPolicyView, +} from "../../models/view/access-policy.view"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; +import { + AccessSelectorComponent, + AccessSelectorRowView, +} from "../../shared/access-policies/access-selector.component"; @Component({ selector: "sm-project-service-accounts", templateUrl: "./project-service-accounts.component.html", }) -export class ProjectServiceAccountsComponent {} +export class ProjectServiceAccountsComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + private organizationId: string; + private projectId: string; + + protected rows$: Observable = + this.accessPolicyService.projectAccessPolicyChanges$.pipe( + startWith(null), + switchMap(() => + this.accessPolicyService.getProjectAccessPolicies(this.organizationId, this.projectId) + ), + map((policies) => + policies.serviceAccountAccessPolicies.map((policy) => ({ + type: "serviceAccount", + name: policy.serviceAccountName, + granteeId: policy.serviceAccountId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.serviceAccountIcon, + static: true, + })) + ) + ); + + protected handleCreateAccessPolicies(selected: SelectItemView[]) { + const projectAccessPoliciesView = new ProjectAccessPoliciesView(); + projectAccessPoliciesView.serviceAccountAccessPolicies = selected + .filter( + (selection) => AccessSelectorComponent.getAccessItemType(selection) === "serviceAccount" + ) + .map((filtered) => { + const view = new ServiceAccountProjectAccessPolicyView(); + view.grantedProjectId = this.projectId; + view.serviceAccountId = filtered.id; + view.read = true; + view.write = false; + return view; + }); + + return this.accessPolicyService.createProjectAccessPolicies( + this.organizationId, + this.projectId, + projectAccessPoliciesView + ); + } + + constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + + ngOnInit(): void { + this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { + this.organizationId = params.organizationId; + this.projectId = params.projectId; + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects.module.ts index fe06359e0cd..de224a4a4a1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects.module.ts @@ -6,7 +6,6 @@ import { SecretsManagerSharedModule } from "../shared/sm-shared.module"; import { ProjectDeleteDialogComponent } from "./dialog/project-delete-dialog.component"; import { ProjectDialogComponent } from "./dialog/project-dialog.component"; -import { ProjectAccessComponent } from "./project/project-access.component"; import { ProjectPeopleComponent } from "./project/project-people.component"; import { ProjectSecretsComponent } from "./project/project-secrets.component"; import { ProjectServiceAccountsComponent } from "./project/project-service-accounts.component"; @@ -18,7 +17,6 @@ import { ProjectsComponent } from "./projects/projects.component"; imports: [SecretsManagerSharedModule, ProjectsRoutingModule, BreadcrumbsModule], declarations: [ ProjectsComponent, - ProjectAccessComponent, ProjectDialogComponent, ProjectDeleteDialogComponent, ProjectPeopleComponent, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html new file mode 100644 index 00000000000..2eb41bce214 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html @@ -0,0 +1,15 @@ +
    +

    + {{ "serviceAccountPeopleDescription" | i18n }} +

    + + +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts new file mode 100644 index 00000000000..dbc957ebc5a --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts @@ -0,0 +1,107 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { combineLatestWith, map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; + +import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; + +import { + GroupServiceAccountAccessPolicyView, + ServiceAccountAccessPoliciesView, + UserServiceAccountAccessPolicyView, +} from "../../models/view/access-policy.view"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; +import { + AccessSelectorComponent, + AccessSelectorRowView, +} from "../../shared/access-policies/access-selector.component"; + +@Component({ + selector: "sm-service-account-people", + templateUrl: "./service-account-people.component.html", +}) +export class ServiceAccountPeopleComponent { + private destroy$ = new Subject(); + private serviceAccountId: string; + + protected rows$: Observable = + this.accessPolicyService.serviceAccountAccessPolicyChanges$.pipe( + startWith(null), + combineLatestWith(this.route.params), + switchMap(([_, params]) => + this.accessPolicyService.getServiceAccountAccessPolicies(params.serviceAccountId) + ), + map((policies) => { + const rows: AccessSelectorRowView[] = []; + policies.userAccessPolicies.forEach((policy) => { + rows.push({ + type: "user", + name: policy.organizationUserName, + granteeId: policy.organizationUserId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.userIcon, + static: true, + }); + }); + + policies.groupAccessPolicies.forEach((policy) => { + rows.push({ + type: "group", + name: policy.groupName, + granteeId: policy.groupId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.groupIcon, + static: true, + }); + }); + + return rows; + }) + ); + + protected handleCreateAccessPolicies(selected: SelectItemView[]) { + const serviceAccountAccessPoliciesView = new ServiceAccountAccessPoliciesView(); + serviceAccountAccessPoliciesView.userAccessPolicies = selected + .filter((selection) => AccessSelectorComponent.getAccessItemType(selection) === "user") + .map((filtered) => { + const view = new UserServiceAccountAccessPolicyView(); + view.grantedServiceAccountId = this.serviceAccountId; + view.organizationUserId = filtered.id; + view.read = true; + view.write = true; + return view; + }); + + serviceAccountAccessPoliciesView.groupAccessPolicies = selected + .filter((selection) => AccessSelectorComponent.getAccessItemType(selection) === "group") + .map((filtered) => { + const view = new GroupServiceAccountAccessPolicyView(); + view.grantedServiceAccountId = this.serviceAccountId; + view.groupId = filtered.id; + view.read = true; + view.write = true; + return view; + }); + + return this.accessPolicyService.createServiceAccountAccessPolicies( + this.serviceAccountId, + serviceAccountAccessPoliciesView + ); + } + + constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + + ngOnInit(): void { + this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { + this.serviceAccountId = params.serviceAccountId; + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts index 1db2110fecb..1fdca60605d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts @@ -2,6 +2,7 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; import { AccessTokenComponent } from "./access/access-tokens.component"; +import { ServiceAccountPeopleComponent } from "./people/service-account-people.component"; import { ServiceAccountComponent } from "./service-account.component"; import { ServiceAccountsComponent } from "./service-accounts.component"; @@ -23,6 +24,10 @@ const routes: Routes = [ path: "access", component: AccessTokenComponent, }, + { + path: "people", + component: ServiceAccountPeopleComponent, + }, ], }, ]; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts index c9a3ae721a9..e75bf2dc3fc 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts @@ -10,6 +10,7 @@ import { AccessTokenCreateDialogComponent } from "./access/dialogs/access-token- import { AccessTokenDialogComponent } from "./access/dialogs/access-token-dialog.component"; import { ExpirationOptionsComponent } from "./access/dialogs/expiration-options.component"; import { ServiceAccountDialogComponent } from "./dialog/service-account-dialog.component"; +import { ServiceAccountPeopleComponent } from "./people/service-account-people.component"; import { ServiceAccountComponent } from "./service-account.component"; import { ServiceAccountsListComponent } from "./service-accounts-list.component"; import { ServiceAccountsRoutingModule } from "./service-accounts-routing.module"; @@ -27,6 +28,7 @@ import { ServiceAccountsComponent } from "./service-accounts.component"; ServiceAccountDialogComponent, ServiceAccountsComponent, ServiceAccountsListComponent, + ServiceAccountPeopleComponent, ], providers: [], }) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index a9b7f876c2c..c63abc1b143 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -11,34 +11,51 @@ import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { BaseAccessPolicyView, GroupProjectAccessPolicyView, + GroupServiceAccountAccessPolicyView, + ProjectAccessPoliciesView, + ServiceAccountAccessPoliciesView, ServiceAccountProjectAccessPolicyView, UserProjectAccessPolicyView, + UserServiceAccountAccessPolicyView, } from "../../models/view/access-policy.view"; import { PotentialGranteeView } from "../../models/view/potential-grantee.view"; -import { ProjectAccessPoliciesView } from "../../models/view/project-access-policies.view"; +import { AccessPoliciesCreateRequest } from "../../shared/access-policies/models/requests/access-policies-create.request"; +import { ProjectAccessPoliciesResponse } from "../../shared/access-policies/models/responses/project-access-policies.response"; +import { ServiceAccountAccessPoliciesResponse } from "../../shared/access-policies/models/responses/service-accounts-access-policies.response"; -import { AccessPoliciesCreateRequest } from "./models/requests/access-policies-create.request"; import { AccessPolicyUpdateRequest } from "./models/requests/access-policy-update.request"; import { AccessPolicyRequest } from "./models/requests/access-policy.request"; import { + GroupServiceAccountAccessPolicyResponse, + UserServiceAccountAccessPolicyResponse, GroupProjectAccessPolicyResponse, ServiceAccountProjectAccessPolicyResponse, UserProjectAccessPolicyResponse, } from "./models/responses/access-policy.response"; import { PotentialGranteeResponse } from "./models/responses/potential-grantee.response"; -import { ProjectAccessPoliciesResponse } from "./models/responses/project-access-policies.response"; @Injectable({ providedIn: "root", }) export class AccessPolicyService { - protected _projectAccessPolicies = new Subject(); - projectAccessPolicies$ = this._projectAccessPolicies.asObservable(); + private _projectAccessPolicyChanges$ = new Subject(); + private _serviceAccountAccessPolicyChanges$ = new Subject(); + + /** + * Emits when a project access policy is created or deleted. + */ + readonly projectAccessPolicyChanges$ = this._projectAccessPolicyChanges$.asObservable(); + + /** + * Emits when a service account access policy is created or deleted. + */ + readonly serviceAccountAccessPolicyChanges$ = + this._serviceAccountAccessPolicyChanges$.asObservable(); constructor( private cryptoService: CryptoService, - private apiService: ApiService, - private encryptService: EncryptService + protected apiService: ApiService, + protected encryptService: EncryptService ) {} async getProjectAccessPolicies( @@ -57,46 +74,19 @@ export class AccessPolicyService { return await this.createProjectAccessPoliciesView(organizationId, results); } - async getPeoplePotentialGrantees(organizationId: string) { + async getServiceAccountAccessPolicies( + serviceAccountId: string + ): Promise { const r = await this.apiService.send( "GET", - "/organizations/" + organizationId + "/access-policies/people/potential-grantees", + "/service-accounts/" + serviceAccountId + "/access-policies", null, true, true ); - const results = new ListResponse(r, PotentialGranteeResponse); - return await this.createPotentialGranteeViews(organizationId, results.data); - } - async getServiceAccountsPotentialGrantees(organizationId: string) { - const r = await this.apiService.send( - "GET", - "/organizations/" + organizationId + "/access-policies/service-accounts/potential-grantees", - null, - true, - true - ); - const results = new ListResponse(r, PotentialGranteeResponse); - return await this.createPotentialGranteeViews(organizationId, results.data); - } - - async deleteAccessPolicy(accessPolicyId: string): Promise { - await this.apiService.send("DELETE", "/access-policies/" + accessPolicyId, null, true, false); - this._projectAccessPolicies.next(null); - } - - async updateAccessPolicy(baseAccessPolicyView: BaseAccessPolicyView): Promise { - const payload = new AccessPolicyUpdateRequest(); - payload.read = baseAccessPolicyView.read; - payload.write = baseAccessPolicyView.write; - await this.apiService.send( - "PUT", - "/access-policies/" + baseAccessPolicyView.id, - payload, - true, - true - ); + const results = new ServiceAccountAccessPoliciesResponse(r); + return await this.createServiceAccountAccessPoliciesView(results); } async createProjectAccessPolicies( @@ -114,12 +104,68 @@ export class AccessPolicyService { ); const results = new ProjectAccessPoliciesResponse(r); const view = await this.createProjectAccessPoliciesView(organizationId, results); - this._projectAccessPolicies.next(view); + this._projectAccessPolicyChanges$.next(view); return view; } - private async getOrganizationKey(organizationId: string): Promise { - return await this.cryptoService.getOrgKey(organizationId); + async createServiceAccountAccessPolicies( + serviceAccountId: string, + serviceAccountAccessPoliciesView: ServiceAccountAccessPoliciesView + ): Promise { + const request = this.getServiceAccountAccessPoliciesCreateRequest( + serviceAccountAccessPoliciesView + ); + const r = await this.apiService.send( + "POST", + "/service-accounts/" + serviceAccountId + "/access-policies", + request, + true, + true + ); + const results = new ServiceAccountAccessPoliciesResponse(r); + const view = await this.createServiceAccountAccessPoliciesView(results); + this._serviceAccountAccessPolicyChanges$.next(view); + return view; + } + + async deleteAccessPolicy(accessPolicyId: string): Promise { + await this.apiService.send("DELETE", "/access-policies/" + accessPolicyId, null, true, false); + this._projectAccessPolicyChanges$.next(null); + this._serviceAccountAccessPolicyChanges$.next(null); + } + + async updateAccessPolicy(baseAccessPolicyView: BaseAccessPolicyView): Promise { + const payload = new AccessPolicyUpdateRequest(); + payload.read = baseAccessPolicyView.read; + payload.write = baseAccessPolicyView.write; + await this.apiService.send( + "PUT", + "/access-policies/" + baseAccessPolicyView.id, + payload, + true, + true + ); + } + + private async createProjectAccessPoliciesView( + organizationId: string, + projectAccessPoliciesResponse: ProjectAccessPoliciesResponse + ): Promise { + const orgKey = await this.getOrganizationKey(organizationId); + const view = new ProjectAccessPoliciesView(); + + view.userAccessPolicies = projectAccessPoliciesResponse.userAccessPolicies.map((ap) => { + return this.createUserProjectAccessPolicyView(ap); + }); + view.groupAccessPolicies = projectAccessPoliciesResponse.groupAccessPolicies.map((ap) => { + return this.createGroupProjectAccessPolicyView(ap); + }); + view.serviceAccountAccessPolicies = await Promise.all( + projectAccessPoliciesResponse.serviceAccountAccessPolicies.map(async (ap) => { + return await this.createServiceAccountProjectAccessPolicyView(orgKey, ap); + }) + ); + return view; } private getAccessPoliciesCreateRequest( @@ -152,11 +198,137 @@ export class AccessPolicyService { return createRequest; } - private getAccessPolicyRequest( + private createUserProjectAccessPolicyView( + response: UserProjectAccessPolicyResponse + ): UserProjectAccessPolicyView { + return { + ...this.createBaseAccessPolicyView(response), + grantedProjectId: response.grantedProjectId, + organizationUserId: response.organizationUserId, + organizationUserName: response.organizationUserName, + }; + } + + private createGroupProjectAccessPolicyView( + response: GroupProjectAccessPolicyResponse + ): GroupProjectAccessPolicyView { + return { + ...this.createBaseAccessPolicyView(response), + grantedProjectId: response.grantedProjectId, + groupId: response.groupId, + groupName: response.groupName, + }; + } + + private async createServiceAccountProjectAccessPolicyView( + organizationKey: SymmetricCryptoKey, + response: ServiceAccountProjectAccessPolicyResponse + ): Promise { + return { + ...this.createBaseAccessPolicyView(response), + grantedProjectId: response.grantedProjectId, + serviceAccountId: response.serviceAccountId, + serviceAccountName: await this.encryptService.decryptToUtf8( + new EncString(response.serviceAccountName), + organizationKey + ), + }; + } + + private getServiceAccountAccessPoliciesCreateRequest( + serviceAccountAccessPoliciesView: ServiceAccountAccessPoliciesView + ): AccessPoliciesCreateRequest { + const createRequest = new AccessPoliciesCreateRequest(); + + if (serviceAccountAccessPoliciesView.userAccessPolicies?.length > 0) { + createRequest.userAccessPolicyRequests = + serviceAccountAccessPoliciesView.userAccessPolicies.map((ap) => { + return this.getAccessPolicyRequest(ap.organizationUserId, ap); + }); + } + + if (serviceAccountAccessPoliciesView.groupAccessPolicies?.length > 0) { + createRequest.groupAccessPolicyRequests = + serviceAccountAccessPoliciesView.groupAccessPolicies.map((ap) => { + return this.getAccessPolicyRequest(ap.groupId, ap); + }); + } + + return createRequest; + } + + private async createServiceAccountAccessPoliciesView( + serviceAccountAccessPoliciesResponse: ServiceAccountAccessPoliciesResponse + ): Promise { + const view = new ServiceAccountAccessPoliciesView(); + view.userAccessPolicies = serviceAccountAccessPoliciesResponse.userAccessPolicies.map((ap) => { + return this.createUserServiceAccountAccessPolicyView(ap); + }); + view.groupAccessPolicies = serviceAccountAccessPoliciesResponse.groupAccessPolicies.map( + (ap) => { + return this.createGroupServiceAccountAccessPolicyView(ap); + } + ); + return view; + } + + private createUserServiceAccountAccessPolicyView( + response: UserServiceAccountAccessPolicyResponse + ): UserServiceAccountAccessPolicyView { + return { + ...this.createBaseAccessPolicyView(response), + grantedServiceAccountId: response.grantedServiceAccountId, + organizationUserId: response.organizationUserId, + organizationUserName: response.organizationUserName, + }; + } + + private createGroupServiceAccountAccessPolicyView( + response: GroupServiceAccountAccessPolicyResponse + ): GroupServiceAccountAccessPolicyView { + return { + ...this.createBaseAccessPolicyView(response), + grantedServiceAccountId: response.grantedServiceAccountId, + groupId: response.groupId, + groupName: response.groupName, + }; + } + + async getPeoplePotentialGrantees(organizationId: string) { + const r = await this.apiService.send( + "GET", + "/organizations/" + organizationId + "/access-policies/people/potential-grantees", + null, + true, + true + ); + const results = new ListResponse(r, PotentialGranteeResponse); + return await this.createPotentialGranteeViews(organizationId, results.data); + } + + async getServiceAccountsPotentialGrantees(organizationId: string) { + const r = await this.apiService.send( + "GET", + "/organizations/" + organizationId + "/access-policies/service-accounts/potential-grantees", + null, + true, + true + ); + const results = new ListResponse(r, PotentialGranteeResponse); + return await this.createPotentialGranteeViews(organizationId, results.data); + } + + protected async getOrganizationKey(organizationId: string): Promise { + return await this.cryptoService.getOrgKey(organizationId); + } + + protected getAccessPolicyRequest( granteeId: string, view: | UserProjectAccessPolicyView + | UserServiceAccountAccessPolicyView | GroupProjectAccessPolicyView + | GroupServiceAccountAccessPolicyView | ServiceAccountProjectAccessPolicyView ) { const request = new AccessPolicyRequest(); @@ -166,65 +338,12 @@ export class AccessPolicyService { return request; } - private async createProjectAccessPoliciesView( - organizationId: string, - projectAccessPoliciesResponse: ProjectAccessPoliciesResponse - ): Promise { - const orgKey = await this.getOrganizationKey(organizationId); - const view = new ProjectAccessPoliciesView(); - - view.userAccessPolicies = projectAccessPoliciesResponse.userAccessPolicies.map((ap) => { - return this.createUserProjectAccessPolicyView(ap); - }); - view.groupAccessPolicies = projectAccessPoliciesResponse.groupAccessPolicies.map((ap) => { - return this.createGroupProjectAccessPolicyView(ap); - }); - view.serviceAccountAccessPolicies = await Promise.all( - projectAccessPoliciesResponse.serviceAccountAccessPolicies.map(async (ap) => { - return await this.createServiceAccountProjectAccessPolicyView(orgKey, ap); - }) - ); - return view; - } - - private createUserProjectAccessPolicyView( - response: UserProjectAccessPolicyResponse - ): UserProjectAccessPolicyView { - const view = this.createBaseAccessPolicyView(response); - view.grantedProjectId = response.grantedProjectId; - view.organizationUserId = response.organizationUserId; - view.organizationUserName = response.organizationUserName; - return view; - } - - private createGroupProjectAccessPolicyView( - response: GroupProjectAccessPolicyResponse - ): GroupProjectAccessPolicyView { - const view = this.createBaseAccessPolicyView(response); - view.grantedProjectId = response.grantedProjectId; - view.groupId = response.groupId; - view.groupName = response.groupName; - return view; - } - - private async createServiceAccountProjectAccessPolicyView( - organizationKey: SymmetricCryptoKey, - response: ServiceAccountProjectAccessPolicyResponse - ): Promise { - const view = this.createBaseAccessPolicyView(response); - view.grantedProjectId = response.grantedProjectId; - view.serviceAccountId = response.serviceAccountId; - view.serviceAccountName = await this.encryptService.decryptToUtf8( - new EncString(response.serviceAccountName), - organizationKey - ); - return view; - } - - private createBaseAccessPolicyView( + protected createBaseAccessPolicyView( response: | UserProjectAccessPolicyResponse + | UserServiceAccountAccessPolicyResponse | GroupProjectAccessPolicyResponse + | GroupServiceAccountAccessPolicyResponse | ServiceAccountProjectAccessPolicyResponse ) { return { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html index ff4af9387e0..68fc948659c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html @@ -4,7 +4,7 @@ {{ hint }} @@ -14,8 +14,8 @@ - - + + {{ columnTitle }} @@ -24,22 +24,22 @@ - + - {{ row.name }} - - - - - - - - @@ -51,6 +51,11 @@ + + {{ "canRead" | i18n }} + {{ "canWrite" | i18n }} + {{ "canReadWrite" | i18n }} + @@ -76,7 +81,7 @@ -
    +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts index 827b7a6a7a3..ba7803160f8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts @@ -1,146 +1,105 @@ -import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { FormControl, FormGroup, Validators } from "@angular/forms"; import { ActivatedRoute } from "@angular/router"; -import { - combineLatestWith, - distinctUntilChanged, - firstValueFrom, - map, - Observable, - Subject, - takeUntil, - tap, -} from "rxjs"; +import { combineLatest, firstValueFrom, Observable, share, Subject, switchMap, tap } from "rxjs"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; -import { - BaseAccessPolicyView, - GroupProjectAccessPolicyView, - ServiceAccountProjectAccessPolicyView, - UserProjectAccessPolicyView, -} from "../../models/view/access-policy.view"; -import { PotentialGranteeView } from "../../models/view/potential-grantee.view"; -import { ProjectAccessPoliciesView } from "../../models/view/project-access-policies.view"; +import { BaseAccessPolicyView } from "../../models/view/access-policy.view"; import { AccessPolicyService } from "./access-policy.service"; -type RowItemView = { +export type AccessSelectorRowView = { type: "user" | "group" | "serviceAccount"; name: string; - id: string; + granteeId: string; + accessPolicyId: string; read: boolean; write: boolean; icon: string; + static?: boolean; }; @Component({ selector: "sm-access-selector", templateUrl: "./access-selector.component.html", }) -export class AccessSelectorComponent implements OnInit, OnDestroy { +export class AccessSelectorComponent implements OnInit { + static readonly userIcon = "bwi-user"; + static readonly groupIcon = "bwi-family"; + static readonly serviceAccountIcon = "bwi-wrench"; + + @Output() onCreateAccessPolicies = new EventEmitter(); + @Input() label: string; @Input() hint: string; - @Input() tableType: "projectPeople" | "projectServiceAccounts"; @Input() columnTitle: string; @Input() emptyMessage: string; + @Input() granteeType: "people" | "serviceAccounts"; - private readonly userIcon = "bwi-user"; - private readonly groupIcon = "bwi-family"; - private readonly serviceAccountIcon = "bwi-wrench"; - - @Input() projectAccessPolicies$: Observable; - @Input() potentialGrantees$: Observable; - - private projectId: string; - private organizationId: string; - private destroy$: Subject = new Subject(); - - protected loading = true; - protected formGroup = new FormGroup({ - multiSelect: new FormControl([], [Validators.required]), - }); - - protected selectItemsView$: Observable; - protected rows$: Observable; - - constructor( - private route: ActivatedRoute, - private accessPolicyService: AccessPolicyService, - private validationService: ValidationService - ) {} - - async ngOnInit(): Promise { - this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params: any) => { - this.organizationId = params.organizationId; - this.projectId = params.projectId; - }); - - this.selectItemsView$ = this.projectAccessPolicies$.pipe( - distinctUntilChanged( - (prev, curr) => this.getAccessPoliciesCount(curr) === this.getAccessPoliciesCount(prev) - ), - combineLatestWith(this.potentialGrantees$), - map(([projectAccessPolicies, potentialGrantees]) => - this.createSelectView(projectAccessPolicies, potentialGrantees) - ), - tap(() => { - this.loading = false; - this.formGroup.enable(); - this.formGroup.reset(); - }) - ); - - this.rows$ = this.projectAccessPolicies$.pipe( - map((policies) => { - const rowData: RowItemView[] = []; - - if (this.tableType === "projectPeople") { - policies.userAccessPolicies.forEach((policy) => { - rowData.push({ - type: "user", - name: policy.organizationUserName, - id: policy.id, - read: policy.read, - write: policy.write, - icon: this.userIcon, - }); - }); - - policies.groupAccessPolicies.forEach((policy) => { - rowData.push({ - type: "group", - name: policy.groupName, - id: policy.id, - read: policy.read, - write: policy.write, - icon: this.groupIcon, - }); - }); - } - - if (this.tableType === "projectServiceAccounts") { - policies.serviceAccountAccessPolicies.forEach((policy) => { - rowData.push({ - type: "serviceAccount", - name: policy.serviceAccountName, - id: policy.id, - read: policy.read, - write: policy.write, - icon: this.serviceAccountIcon, - }); - }); - } - return rowData; - }) - ); + protected rows$ = new Subject(); + @Input() private set rows(value: AccessSelectorRowView[]) { + this.rows$.next(value); } - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); + private maxLength = 15; + protected formGroup = new FormGroup({ + multiSelect: new FormControl([], [Validators.required, Validators.maxLength(this.maxLength)]), + }); + protected loading = true; + + protected selectItems$: Observable = combineLatest([ + this.rows$, + this.route.params, + ]).pipe( + switchMap(([rows, params]) => + this.getPotentialGrantees(params.organizationId).then((grantees) => + grantees + .filter((g) => !rows.some((row) => row.granteeId === g.id)) + .map((granteeView) => { + let icon: string; + let listName = granteeView.name; + let labelName = granteeView.name; + if (granteeView.type === "user") { + icon = AccessSelectorComponent.userIcon; + if (Utils.isNullOrWhitespace(granteeView.name)) { + listName = granteeView.email; + labelName = granteeView.email; + } else { + listName = `${granteeView.name} (${granteeView.email})`; + } + } else if (granteeView.type === "group") { + icon = AccessSelectorComponent.groupIcon; + } else if (granteeView.type === "serviceAccount") { + icon = AccessSelectorComponent.serviceAccountIcon; + } + return { + icon: icon, + id: granteeView.id, + labelName: labelName, + listName: listName, + }; + }) + ) + ), + tap(() => { + this.loading = false; + this.formGroup.reset(); + this.formGroup.enable(); + }), + share() + ); + + constructor( + private accessPolicyService: AccessPolicyService, + private validationService: ValidationService, + private route: ActivatedRoute + ) {} + + ngOnInit(): void { + this.formGroup.disable(); } submit = async () => { @@ -148,120 +107,15 @@ export class AccessSelectorComponent implements OnInit, OnDestroy { if (this.formGroup.invalid) { return; } - this.loading = true; this.formGroup.disable(); + this.loading = true; - this.accessPolicyService.createProjectAccessPolicies( - this.organizationId, - this.projectId, - this.createProjectAccessPoliciesViewFromSelected() - ); + this.onCreateAccessPolicies.emit(this.formGroup.value.multiSelect); - return firstValueFrom(this.selectItemsView$); + return firstValueFrom(this.selectItems$); }; - private createSelectView = ( - projectAccessPolicies: ProjectAccessPoliciesView, - potentialGrantees: PotentialGranteeView[] - ): SelectItemView[] => { - const selectItemsView = potentialGrantees.map((granteeView) => { - let icon: string; - let listName = granteeView.name; - let labelName = granteeView.name; - if (granteeView.type === "user") { - icon = this.userIcon; - if (Utils.isNullOrWhitespace(granteeView.name)) { - listName = granteeView.email; - labelName = granteeView.email; - } else { - listName = `${granteeView.name} (${granteeView.email})`; - } - } else if (granteeView.type === "group") { - icon = this.groupIcon; - } else if (granteeView.type === "serviceAccount") { - icon = this.serviceAccountIcon; - } - return { - icon: icon, - id: granteeView.id, - labelName: labelName, - listName: listName, - }; - }); - return this.filterExistingAccessPolicies(selectItemsView, projectAccessPolicies); - }; - - private createProjectAccessPoliciesViewFromSelected(): ProjectAccessPoliciesView { - const projectAccessPoliciesView = new ProjectAccessPoliciesView(); - projectAccessPoliciesView.userAccessPolicies = this.formGroup.value.multiSelect - ?.filter((selection) => selection.icon === this.userIcon) - ?.map((filtered) => { - const view = new UserProjectAccessPolicyView(); - view.grantedProjectId = this.projectId; - view.organizationUserId = filtered.id; - view.read = true; - view.write = false; - return view; - }); - - projectAccessPoliciesView.groupAccessPolicies = this.formGroup.value.multiSelect - ?.filter((selection) => selection.icon === this.groupIcon) - ?.map((filtered) => { - const view = new GroupProjectAccessPolicyView(); - view.grantedProjectId = this.projectId; - view.groupId = filtered.id; - view.read = true; - view.write = false; - return view; - }); - - projectAccessPoliciesView.serviceAccountAccessPolicies = this.formGroup.value.multiSelect - ?.filter((selection) => selection.icon === this.serviceAccountIcon) - ?.map((filtered) => { - const view = new ServiceAccountProjectAccessPolicyView(); - view.grantedProjectId = this.projectId; - view.serviceAccountId = filtered.id; - view.read = true; - view.write = false; - return view; - }); - return projectAccessPoliciesView; - } - - private getAccessPoliciesCount(projectAccessPoliciesView: ProjectAccessPoliciesView) { - return ( - projectAccessPoliciesView.groupAccessPolicies.length + - projectAccessPoliciesView.serviceAccountAccessPolicies.length + - projectAccessPoliciesView.userAccessPolicies.length - ); - } - - private filterExistingAccessPolicies( - potentialGrantees: SelectItemView[], - projectAccessPolicies: ProjectAccessPoliciesView - ): SelectItemView[] { - return potentialGrantees - .filter( - (potentialGrantee) => - !projectAccessPolicies.serviceAccountAccessPolicies.some( - (ap) => ap.serviceAccountId === potentialGrantee.id - ) - ) - .filter( - (potentialGrantee) => - !projectAccessPolicies.userAccessPolicies.some( - (ap) => ap.organizationUserId === potentialGrantee.id - ) - ) - .filter( - (potentialGrantee) => - !projectAccessPolicies.groupAccessPolicies.some( - (ap) => ap.groupId === potentialGrantee.id - ) - ); - } - - async updateAccessPolicy(target: any, accessPolicyId: string): Promise { + async update(target: any, accessPolicyId: string): Promise { try { const accessPolicyView = new BaseAccessPolicyView(); accessPolicyView.id = accessPolicyId; @@ -286,6 +140,23 @@ export class AccessSelectorComponent implements OnInit, OnDestroy { this.loading = true; this.formGroup.disable(); await this.accessPolicyService.deleteAccessPolicy(accessPolicyId); - return firstValueFrom(this.selectItemsView$); + return firstValueFrom(this.selectItems$); }; + + private getPotentialGrantees(organizationId: string) { + return this.granteeType === "people" + ? this.accessPolicyService.getPeoplePotentialGrantees(organizationId) + : this.accessPolicyService.getServiceAccountsPotentialGrantees(organizationId); + } + + static getAccessItemType(item: SelectItemView) { + switch (item.icon) { + case AccessSelectorComponent.userIcon: + return "user"; + case AccessSelectorComponent.groupIcon: + return "group"; + case AccessSelectorComponent.serviceAccountIcon: + return "serviceAccount"; + } + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts index d784dafcdc8..967f1602d08 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts @@ -30,6 +30,19 @@ export class UserProjectAccessPolicyResponse extends BaseAccessPolicyResponse { } } +export class UserServiceAccountAccessPolicyResponse extends BaseAccessPolicyResponse { + organizationUserId: string; + organizationUserName: string; + grantedServiceAccountId: string; + + constructor(response: any) { + super(response); + this.organizationUserId = this.getResponseProperty("OrganizationUserId"); + this.organizationUserName = this.getResponseProperty("OrganizationUserName"); + this.grantedServiceAccountId = this.getResponseProperty("GrantedServiceAccountId"); + } +} + export class GroupProjectAccessPolicyResponse extends BaseAccessPolicyResponse { groupId: string; groupName: string; @@ -43,6 +56,19 @@ export class GroupProjectAccessPolicyResponse extends BaseAccessPolicyResponse { } } +export class GroupServiceAccountAccessPolicyResponse extends BaseAccessPolicyResponse { + groupId: string; + groupName: string; + grantedServiceAccountId: string; + + constructor(response: any) { + super(response); + this.groupId = this.getResponseProperty("GroupId"); + this.groupName = this.getResponseProperty("GroupName"); + this.grantedServiceAccountId = this.getResponseProperty("GrantedServiceAccountId"); + } +} + export class ServiceAccountProjectAccessPolicyResponse extends BaseAccessPolicyResponse { serviceAccountId: string; serviceAccountName: string; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/project-access-policies.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/project-access-policies.response.ts index 9429dbeb1b1..f041796e592 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/project-access-policies.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/project-access-policies.response.ts @@ -13,8 +13,17 @@ export class ProjectAccessPoliciesResponse extends BaseResponse { constructor(response: any) { super(response); - this.userAccessPolicies = this.getResponseProperty("UserAccessPolicies"); - this.groupAccessPolicies = this.getResponseProperty("GroupAccessPolicies"); - this.serviceAccountAccessPolicies = this.getResponseProperty("ServiceAccountAccessPolicies"); + const userAccessPolicies = this.getResponseProperty("UserAccessPolicies"); + this.userAccessPolicies = userAccessPolicies.map( + (k: any) => new UserProjectAccessPolicyResponse(k) + ); + const groupAccessPolicies = this.getResponseProperty("GroupAccessPolicies"); + this.groupAccessPolicies = groupAccessPolicies.map( + (k: any) => new GroupProjectAccessPolicyResponse(k) + ); + const serviceAccountAccessPolicies = this.getResponseProperty("ServiceAccountAccessPolicies"); + this.serviceAccountAccessPolicies = serviceAccountAccessPolicies.map( + (k: any) => new ServiceAccountProjectAccessPolicyResponse(k) + ); } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/service-accounts-access-policies.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/service-accounts-access-policies.response.ts new file mode 100644 index 00000000000..d2fc245bb86 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/service-accounts-access-policies.response.ts @@ -0,0 +1,23 @@ +import { BaseResponse } from "@bitwarden/common/models/response/base.response"; + +import { + GroupServiceAccountAccessPolicyResponse, + UserServiceAccountAccessPolicyResponse, +} from "./access-policy.response"; + +export class ServiceAccountAccessPoliciesResponse extends BaseResponse { + userAccessPolicies: UserServiceAccountAccessPolicyResponse[]; + groupAccessPolicies: GroupServiceAccountAccessPolicyResponse[]; + + constructor(response: any) { + super(response); + const userAccessPolicies = this.getResponseProperty("UserAccessPolicies"); + this.userAccessPolicies = userAccessPolicies.map( + (k: any) => new UserServiceAccountAccessPolicyResponse(k) + ); + const groupAccessPolicies = this.getResponseProperty("GroupAccessPolicies"); + this.groupAccessPolicies = groupAccessPolicies.map( + (k: any) => new GroupServiceAccountAccessPolicyResponse(k) + ); + } +} From 06a323772993a6fc702f131a715dbc498b1421ae Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Mon, 27 Feb 2023 13:19:24 -0500 Subject: [PATCH 083/232] Add workflow to apply needs-qa label (#4727) * Added new workflow * Fixed quotes. * Added step to job. * Added check for PR destination branch. * Changed criteria. * Added fork check for community PRs. * Removed space * Changed name. * Updated with more filters. * Changed to target approval for adding the label. * Lint * Refactored to use pull_request_target instead. * Fixed comment * pull_request_target isn't supported, so pull_request instead * Added comment about target branch. --- .../workflows/label-issue-pull-request.yml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/label-issue-pull-request.yml diff --git a/.github/workflows/label-issue-pull-request.yml b/.github/workflows/label-issue-pull-request.yml new file mode 100644 index 00000000000..01d626bb1dc --- /dev/null +++ b/.github/workflows/label-issue-pull-request.yml @@ -0,0 +1,23 @@ +# Runs creation of Pull Requests +# If the PR destination branch is master, add a needs-qa label +--- +name: Label Issue Pull Request + +on: + pull_request: + types: + - [opened, synchronize, edited] # Check when PR is opened, new pushes are made, or target branch is edited + paths-ignore: + - .github/workflows/** # We don't need QA on workflow changes + branches: + - 'master' # We only want to check when PRs target master + +jobs: + add-needs-qa-label: + runs-on: ubuntu-latest + steps: + - name: Add label to pull request + uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 + if: ${{ !github.event.pull_request.head.repo.fork }} + with: + add-labels: "needs-qa" From 3e03c95a1040f8b24585e1cc8cc7dc5191372d05 Mon Sep 17 00:00:00 2001 From: Robyn MacCallum Date: Mon, 27 Feb 2023 14:21:28 -0500 Subject: [PATCH 084/232] Add a11y check to PR template (#4882) --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fdd6b70a9a1..a2ff0baf25f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -30,3 +30,4 @@ - Please add **unit tests** where it makes sense to do so (encouraged but not required) - If this change requires a **documentation update** - notify the documentation team - If this change has particular **deployment requirements** - notify the DevOps team +- Ensure that all UI additions follow [WCAG AA requirements](https://contributing.bitwarden.com/contributing/accessibility/) From ff89d86d407977bb369b3597811af31e8e172ddb Mon Sep 17 00:00:00 2001 From: Will Martin Date: Mon, 27 Feb 2023 14:46:05 -0500 Subject: [PATCH 085/232] [SM-571] reenable route reuse on destroy (#4883) --- .../src/app/secrets-manager/overview/overview.component.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts index 2c092e7a618..fab91a1e30b 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts @@ -54,6 +54,7 @@ type Tasks = { }) export class OverviewComponent implements OnInit, OnDestroy { private destroy$: Subject = new Subject(); + private prevShouldReuseRoute: any; private tableSize = 10; private organizationId: string; protected organizationName: string; @@ -80,6 +81,7 @@ export class OverviewComponent implements OnInit, OnDestroy { * We want to remount the `sm-onboarding` component on route change. * The component only toggles its visibility on init and on user dismissal. */ + this.prevShouldReuseRoute = this.router.routeReuseStrategy.shouldReuseRoute; this.router.routeReuseStrategy.shouldReuseRoute = () => false; } @@ -133,6 +135,7 @@ export class OverviewComponent implements OnInit, OnDestroy { } ngOnDestroy(): void { + this.router.routeReuseStrategy.shouldReuseRoute = this.prevShouldReuseRoute; this.destroy$.next(); this.destroy$.complete(); } From c16082727252048b33ad8bb50adcf2a718be931b Mon Sep 17 00:00:00 2001 From: Jake Fink Date: Mon, 27 Feb 2023 16:31:55 -0500 Subject: [PATCH 086/232] [EC-859] update billing routes for owners of Managed orgs (#4611) * [EC-859] update billing routes for owners of Managed orgs * [EC-859] fix observable in billing tab * [EC-859] update observable name * [EC-859] update reporting and settings observables * [EC-859] add startsWith to reporting observable * [EC-859] async pipe once in settings * [EC-859] create get$ in org service * [EC-859] transition remaining components * [EC-859] add as org to template * [EC-859] add shareReplay to observable to prevent multicasting - future proof get$ on org service * [AC-859] fix missed org --- .../organization-billing-routing.module.ts | 5 +++ .../organization-billing-tab.component.html | 4 +-- .../organization-billing-tab.component.ts | 23 ++++++++++--- .../reporting/reporting.component.html | 10 +++--- .../reporting/reporting.component.ts | 34 +++++++------------ .../settings/settings.component.html | 18 +++++----- .../settings/settings.component.ts | 26 ++++---------- .../organization.service.abstraction.ts | 3 +- .../organization/organization.service.ts | 6 +++- 9 files changed, 66 insertions(+), 63 deletions(-) diff --git a/apps/web/src/app/organizations/billing/organization-billing-routing.module.ts b/apps/web/src/app/organizations/billing/organization-billing-routing.module.ts index b441e033398..e296175edae 100644 --- a/apps/web/src/app/organizations/billing/organization-billing-routing.module.ts +++ b/apps/web/src/app/organizations/billing/organization-billing-routing.module.ts @@ -2,6 +2,7 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; import { canAccessBillingTab } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/models/domain/organization"; import { WebPlatformUtilsService } from "../../core/web-platform-utils.service"; import { PaymentMethodComponent } from "../../settings/payment-method.component"; @@ -30,15 +31,19 @@ const routes: Routes = [ { path: "payment-method", component: PaymentMethodComponent, + canActivate: [OrganizationPermissionsGuard], data: { titleId: "paymentMethod", + organizationPermissions: (org: Organization) => org.canManageBilling, }, }, { path: "history", component: OrgBillingHistoryViewComponent, + canActivate: [OrganizationPermissionsGuard], data: { titleId: "billingHistory", + organizationPermissions: (org: Organization) => org.canManageBilling, }, }, ], diff --git a/apps/web/src/app/organizations/billing/organization-billing-tab.component.html b/apps/web/src/app/organizations/billing/organization-billing-tab.component.html index 7f755fccbb9..0c1e4303905 100644 --- a/apps/web/src/app/organizations/billing/organization-billing-tab.component.html +++ b/apps/web/src/app/organizations/billing/organization-billing-tab.component.html @@ -8,7 +8,7 @@ {{ "subscription" | i18n }} ; + + constructor( + private route: ActivatedRoute, + private organizationService: OrganizationService, + private platformUtilsService: PlatformUtilsService + ) {} + + ngOnInit() { + this.showPaymentAndHistory$ = this.route.params.pipe( + switchMap((params) => this.organizationService.get$(params.organizationId)), + map((org) => !this.platformUtilsService.isSelfHost() && org.canManageBilling) + ); } } diff --git a/apps/web/src/app/organizations/reporting/reporting.component.html b/apps/web/src/app/organizations/reporting/reporting.component.html index f7a3ae11a11..1e807b98dba 100644 --- a/apps/web/src/app/organizations/reporting/reporting.component.html +++ b/apps/web/src/app/organizations/reporting/reporting.component.html @@ -1,14 +1,14 @@
    -
    -
    +
    +
    {{ "reporting" | i18n }}
    {{ "eventLogs" | i18n }} @@ -16,14 +16,14 @@ routerLink="reports" class="list-group-item" routerLinkActive="active" - *ngIf="organization.canAccessReports" + *ngIf="org.canAccessReports" > {{ "reports" | i18n }}
    -
    +
    diff --git a/apps/web/src/app/organizations/reporting/reporting.component.ts b/apps/web/src/app/organizations/reporting/reporting.component.ts index 5e70e6a40e3..6b6f88b3427 100644 --- a/apps/web/src/app/organizations/reporting/reporting.component.ts +++ b/apps/web/src/app/organizations/reporting/reporting.component.ts @@ -1,6 +1,6 @@ -import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { concatMap, Subject, takeUntil } from "rxjs"; +import { map, Observable, shareReplay, startWith, switchMap } from "rxjs"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/models/domain/organization"; @@ -9,29 +9,21 @@ import { Organization } from "@bitwarden/common/models/domain/organization"; selector: "app-org-reporting", templateUrl: "reporting.component.html", }) -export class ReportingComponent implements OnInit, OnDestroy { - organization: Organization; - showLeftNav = true; - - private destroy$ = new Subject(); +export class ReportingComponent implements OnInit { + organization$: Observable; + showLeftNav$: Observable; constructor(private route: ActivatedRoute, private organizationService: OrganizationService) {} ngOnInit() { - this.route.params - .pipe( - concatMap(async (params) => { - this.organization = await this.organizationService.get(params.organizationId); - this.showLeftNav = - this.organization.canAccessEventLogs && this.organization.canAccessReports; - }), - takeUntil(this.destroy$) - ) - .subscribe(); - } + this.organization$ = this.route.params.pipe( + switchMap((params) => this.organizationService.get$(params.organizationId)), + shareReplay({ refCount: true, bufferSize: 1 }) + ); - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); + this.showLeftNav$ = this.organization$.pipe( + map((o) => o.canAccessEventLogs && o.canAccessReports), + startWith(true) + ); } } diff --git a/apps/web/src/app/organizations/settings/settings.component.html b/apps/web/src/app/organizations/settings/settings.component.html index 3fbbc3b42c1..146a7203430 100644 --- a/apps/web/src/app/organizations/settings/settings.component.html +++ b/apps/web/src/app/organizations/settings/settings.component.html @@ -3,12 +3,12 @@
    {{ "settings" | i18n }}
    -
    +
    {{ "organizationInfo" | i18n }} @@ -16,7 +16,7 @@ routerLink="policies" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canManagePolicies" + *ngIf="org.canManagePolicies" > {{ "policies" | i18n }} @@ -24,7 +24,7 @@ routerLink="two-factor" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.use2fa && organization?.isOwner" + *ngIf="org.use2fa && org.isOwner" > {{ "twoStepLogin" | i18n }} @@ -32,7 +32,7 @@ routerLink="tools/import" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canAccessImportExport" + *ngIf="org.canAccessImportExport" > {{ "importData" | i18n }} @@ -40,7 +40,7 @@ routerLink="tools/export" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canAccessImportExport" + *ngIf="org.canAccessImportExport" > {{ "exportVault" | i18n }} @@ -48,7 +48,7 @@ routerLink="domain-verification" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canManageDomainVerification" + *ngIf="org?.canManageDomainVerification" > {{ "domainVerification" | i18n }} @@ -56,7 +56,7 @@ routerLink="sso" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canManageSso" + *ngIf="org.canManageSso" > {{ "singleSignOn" | i18n }} @@ -64,7 +64,7 @@ routerLink="scim" class="list-group-item" routerLinkActive="active" - *ngIf="organization?.canManageScim" + *ngIf="org.canManageScim" > {{ "scim" | i18n }} diff --git a/apps/web/src/app/organizations/settings/settings.component.ts b/apps/web/src/app/organizations/settings/settings.component.ts index 9988e65dd7c..b6ab227490d 100644 --- a/apps/web/src/app/organizations/settings/settings.component.ts +++ b/apps/web/src/app/organizations/settings/settings.component.ts @@ -1,6 +1,6 @@ -import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { Subject, switchMap, takeUntil } from "rxjs"; +import { Observable, switchMap } from "rxjs"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/models/domain/organization"; @@ -9,26 +9,14 @@ import { Organization } from "@bitwarden/common/models/domain/organization"; selector: "app-org-settings", templateUrl: "settings.component.html", }) -export class SettingsComponent implements OnInit, OnDestroy { - organization: Organization; - - private destroy$ = new Subject(); +export class SettingsComponent implements OnInit { + organization$: Observable; constructor(private route: ActivatedRoute, private organizationService: OrganizationService) {} ngOnInit() { - this.route.params - .pipe( - switchMap(async (params) => await this.organizationService.get(params.organizationId)), - takeUntil(this.destroy$) - ) - .subscribe((organization) => { - this.organization = organization; - }); - } - - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); + this.organization$ = this.route.params.pipe( + switchMap((params) => this.organizationService.get$(params.organizationId)) + ); } } diff --git a/libs/common/src/abstractions/organization/organization.service.abstraction.ts b/libs/common/src/abstractions/organization/organization.service.abstraction.ts index ecaeeafab01..a00060c0c27 100644 --- a/libs/common/src/abstractions/organization/organization.service.abstraction.ts +++ b/libs/common/src/abstractions/organization/organization.service.abstraction.ts @@ -32,7 +32,7 @@ export function canAccessReportingTab(org: Organization): boolean { } export function canAccessBillingTab(org: Organization): boolean { - return org.canManageBilling; + return org.isOwner; } export function canAccessOrgAdmin(org: Organization): boolean { @@ -63,6 +63,7 @@ export function isNotProviderUser(org: Organization): boolean { export abstract class OrganizationService { organizations$: Observable; + get$: (id: string) => Observable; get: (id: string) => Organization; getByIdentifier: (identifier: string) => Organization; getAll: (userId?: string) => Promise; diff --git a/libs/common/src/services/organization/organization.service.ts b/libs/common/src/services/organization/organization.service.ts index b0d7791ec26..e2b7e50d4d7 100644 --- a/libs/common/src/services/organization/organization.service.ts +++ b/libs/common/src/services/organization/organization.service.ts @@ -1,4 +1,4 @@ -import { BehaviorSubject, concatMap } from "rxjs"; +import { BehaviorSubject, concatMap, map, Observable } from "rxjs"; import { InternalOrganizationService as InternalOrganizationServiceAbstraction } from "../../abstractions/organization/organization.service.abstraction"; import { StateService } from "../../abstractions/state.service"; @@ -26,6 +26,10 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti .subscribe(); } + get$(id: string): Observable { + return this.organizations$.pipe(map((orgs) => orgs.find((o) => o.id === id))); + } + async getAll(userId?: string): Promise { const organizationsMap = await this.stateService.getOrganizations({ userId: userId }); return Object.values(organizationsMap || {}).map((o) => new Organization(o)); From 6adcb35dd79f2b1f3e789c9cb906204422d80c17 Mon Sep 17 00:00:00 2001 From: Brandon Maharaj Date: Tue, 28 Feb 2023 02:04:41 -0500 Subject: [PATCH 087/232] fix: missing changes (#4832) --- .../members/components/reset-password.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/organizations/members/components/reset-password.component.ts b/apps/web/src/app/organizations/members/components/reset-password.component.ts index 10a9e74282a..a411377ddf3 100644 --- a/apps/web/src/app/organizations/members/components/reset-password.component.ts +++ b/apps/web/src/app/organizations/members/components/reset-password.component.ts @@ -109,7 +109,7 @@ export class ResetPasswordComponent implements OnInit, OnDestroy { return false; } - if (this.newPassword.length < 8) { + if (this.newPassword.length < Utils.minimumPasswordLength) { this.platformUtilsService.showToast( "error", this.i18nService.t("errorOccurred"), From 4e112573f5cae8b1b7a6ed7c57b143dab9e40e39 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Tue, 28 Feb 2023 09:29:04 -0500 Subject: [PATCH 088/232] [SM-520] add secret copy actions (#4887) --- .../overview/overview.component.html | 2 ++ .../overview/overview.component.ts | 25 ++++++++++++++++++- .../project/project-secrets.component.html | 2 ++ .../project/project-secrets.component.ts | 25 ++++++++++++++++++- .../secrets/secrets.component.html | 2 ++ .../secrets/secrets.component.ts | 25 ++++++++++++++++++- .../shared/secrets-list.component.html | 2 +- 7 files changed, 79 insertions(+), 4 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index 8f35776a60d..e5106b10c5c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -57,6 +57,8 @@ (deleteSecretsEvent)="openDeleteSecret($event)" (newSecretEvent)="openNewSecretDialog()" (editSecretEvent)="openEditSecret($event)" + (copySecretNameEvent)="copySecretName($event)" + (copySecretValueEvent)="copySecretValue($event)" [secrets]="view.latestSecrets" >
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts index fab91a1e30b..2995ec28f3c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts @@ -11,7 +11,9 @@ import { distinct, } from "rxjs"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { DialogService } from "@bitwarden/components"; import { ProjectListView } from "../models/view/project-list.view"; @@ -75,7 +77,9 @@ export class OverviewComponent implements OnInit, OnDestroy { private secretService: SecretService, private serviceAccountService: ServiceAccountService, private dialogService: DialogService, - private organizationService: OrganizationService + private organizationService: OrganizationService, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService ) { /** * We want to remount the `sm-onboarding` component on route change. @@ -222,4 +226,23 @@ export class OverviewComponent implements OnInit, OnDestroy { }, }); } + + copySecretName(name: string) { + this.platformUtilsService.copyToClipboard(name); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("name")) + ); + } + + async copySecretValue(id: string) { + const secret = await this.secretService.getBySecretId(id); + this.platformUtilsService.copyToClipboard(secret.value); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("value")) + ); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.html index 4d6963d9e87..4a1a430c116 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.html @@ -9,6 +9,8 @@ (deleteSecretsEvent)="openDeleteSecret($event)" (newSecretEvent)="openNewSecretDialog()" (editSecretEvent)="openEditSecret($event)" + (copySecretNameEvent)="copySecretName($event)" + (copySecretValueEvent)="copySecretValue($event)" [secrets]="secrets" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts index 1fa7774fa28..b2f92129315 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts @@ -2,6 +2,8 @@ import { Component } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { combineLatestWith, Observable, startWith, switchMap } from "rxjs"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { DialogService } from "@bitwarden/components"; import { SecretListView } from "../../models/view/secret-list.view"; @@ -29,7 +31,9 @@ export class ProjectSecretsComponent { constructor( private route: ActivatedRoute, private secretService: SecretService, - private dialogService: DialogService + private dialogService: DialogService, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService ) {} ngOnInit() { @@ -75,4 +79,23 @@ export class ProjectSecretsComponent { }, }); } + + copySecretName(name: string) { + this.platformUtilsService.copyToClipboard(name); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("name")) + ); + } + + async copySecretValue(id: string) { + const secret = await this.secretService.getBySecretId(id); + this.platformUtilsService.copyToClipboard(secret.value); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("value")) + ); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html index d706afa56e5..4f3a9d2c47f 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.html @@ -6,6 +6,8 @@ (deleteSecretsEvent)="openDeleteSecret($event)" (newSecretEvent)="openNewSecretDialog()" (editSecretEvent)="openEditSecret($event)" + (copySecretNameEvent)="copySecretName($event)" + (copySecretValueEvent)="copySecretValue($event)" [secrets]="secrets$ | async" [search]="search" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts index 0ddf04a2757..d5908262042 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts @@ -2,6 +2,8 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { combineLatestWith, Observable, startWith, switchMap } from "rxjs"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { DialogService } from "@bitwarden/components"; import { SecretListView } from "../models/view/secret-list.view"; @@ -30,7 +32,9 @@ export class SecretsComponent implements OnInit { constructor( private route: ActivatedRoute, private secretService: SecretService, - private dialogService: DialogService + private dialogService: DialogService, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService ) {} ngOnInit() { @@ -78,4 +82,23 @@ export class SecretsComponent implements OnInit { }, }); } + + copySecretName(name: string) { + this.platformUtilsService.copyToClipboard(name); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("name")) + ); + } + + async copySecretValue(id: string) { + const secret = await this.secretService.getBySecretId(id); + this.platformUtilsService.copyToClipboard(secret.value); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("value")) + ); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html index 96f5dff87fc..620bf270c82 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html @@ -97,7 +97,7 @@ {{ "editSecret" | i18n }} - From 6348269a1a39e4438636c263d5b69790c46fbe2b Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 28 Feb 2023 16:31:19 +0100 Subject: [PATCH 089/232] [SM-352] Projects tab for service accounts (#4858) * Init service layer changes * refactor service to inherit abstract * refactor access-selector component * update access selector in projects * add service accounts access selector * update i18n * fix delete action; use useExisting in providers * update static permissions * service account people should be readwrite on creation * use setter instead of observable input * remove warning callout * remove abstract service * truncate name in table * remove extra comments * Add projects access policy page * Add locale * use map instead of forEach * refactor view factories * update SA people copy * map list responses * Swap to using granted policies endpoints * Remove text-xl from icon --------- Co-authored-by: Thomas Avery Co-authored-by: William Martin Co-authored-by: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> --- apps/web/src/locales/en/messages.json | 8 +- .../models/view/access-policy.view.ts | 1 + .../project/project-people.component.ts | 4 +- .../project-service-accounts.component.ts | 2 +- .../service-account-people.component.ts | 4 +- .../service-account-projects.component.html | 15 +++ .../service-account-projects.component.ts | 78 +++++++++++++ .../service-account.component.html | 2 +- .../service-accounts-routing.module.ts | 7 +- .../service-accounts.module.ts | 5 +- .../access-policies/access-policy.service.ts | 107 +++++++++++++++++- .../access-selector.component.html | 4 +- .../access-selector.component.ts | 24 ++-- .../models/requests/granted-policy.request.ts | 5 + .../responses/access-policy.response.ts | 2 + 15 files changed, 249 insertions(+), 19 deletions(-) create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index b06e0144e16..dbbb02e93e2 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5864,7 +5864,7 @@ "message": "Service account name" }, "newSaSelectAccess":{ - "message": "Type or select projects or secrets" + "message": "Type or select projects" }, "newSaTypeToFilter":{ "message": "Type to filter" @@ -6365,6 +6365,12 @@ "serviceAccountPeopleDescription": { "message": "Grant groups or people access to this service account." }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" + }, "canWrite": { "message": "Can write" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts index e4fc1fb9426..0f93b549f3a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts @@ -34,6 +34,7 @@ export class ServiceAccountProjectAccessPolicyView extends BaseAccessPolicyView serviceAccountId: string; serviceAccountName: string; grantedProjectId: string; + grantedProjectName: string; } export class ProjectAccessPoliciesView { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts index d1ee0e3ce10..4a1ea9c7fdb 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts @@ -36,7 +36,7 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { rows.push({ type: "user", name: policy.organizationUserName, - granteeId: policy.organizationUserId, + id: policy.organizationUserId, accessPolicyId: policy.id, read: policy.read, write: policy.write, @@ -48,7 +48,7 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { rows.push({ type: "group", name: policy.groupName, - granteeId: policy.groupId, + id: policy.groupId, accessPolicyId: policy.id, read: policy.read, write: policy.write, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts index e442ef4b168..e46c3038b9d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts @@ -33,7 +33,7 @@ export class ProjectServiceAccountsComponent implements OnInit, OnDestroy { policies.serviceAccountAccessPolicies.map((policy) => ({ type: "serviceAccount", name: policy.serviceAccountName, - granteeId: policy.serviceAccountId, + id: policy.serviceAccountId, accessPolicyId: policy.id, read: policy.read, write: policy.write, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts index dbc957ebc5a..302bbd1f359 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts @@ -36,7 +36,7 @@ export class ServiceAccountPeopleComponent { rows.push({ type: "user", name: policy.organizationUserName, - granteeId: policy.organizationUserId, + id: policy.organizationUserId, accessPolicyId: policy.id, read: policy.read, write: policy.write, @@ -49,7 +49,7 @@ export class ServiceAccountPeopleComponent { rows.push({ type: "group", name: policy.groupName, - granteeId: policy.groupId, + id: policy.groupId, accessPolicyId: policy.id, read: policy.read, write: policy.write, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html new file mode 100644 index 00000000000..6ceb2dc5f87 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html @@ -0,0 +1,15 @@ +
    +

    + {{ "serviceAccountProjectsDescription" | i18n }} +

    + + +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts new file mode 100644 index 00000000000..c886523834a --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts @@ -0,0 +1,78 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { combineLatestWith, map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; + +import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; + +import { ServiceAccountProjectAccessPolicyView } from "../../models/view/access-policy.view"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; +import { + AccessSelectorComponent, + AccessSelectorRowView, +} from "../../shared/access-policies/access-selector.component"; + +@Component({ + selector: "sm-service-account-projects", + templateUrl: "./service-account-projects.component.html", +}) +export class ServiceAccountProjectsComponent { + private destroy$ = new Subject(); + private serviceAccountId: string; + private organizationId: string; + + protected rows$: Observable = + this.accessPolicyService.serviceAccountGrantedPolicyChanges$.pipe( + startWith(null), + combineLatestWith(this.route.params), + switchMap(([_, params]) => + this.accessPolicyService.getGrantedPolicies(params.serviceAccountId, params.organizationId) + ), + map((policies) => { + return policies.map((policy) => { + return { + type: "project", + name: policy.grantedProjectName, + id: policy.grantedProjectId, + accessPolicyId: policy.id, + read: policy.read, + write: policy.write, + icon: AccessSelectorComponent.projectIcon, + static: true, + } as AccessSelectorRowView; + }); + }) + ); + + protected handleCreateAccessPolicies(selected: SelectItemView[]) { + const serviceAccountProjectAccessPolicyView = selected + .filter((selection) => AccessSelectorComponent.getAccessItemType(selection) === "project") + .map((filtered) => { + const view = new ServiceAccountProjectAccessPolicyView(); + view.serviceAccountId = this.serviceAccountId; + view.grantedProjectId = filtered.id; + view.read = true; + view.write = false; + return view; + }); + + return this.accessPolicyService.createGrantedPolicies( + this.organizationId, + this.serviceAccountId, + serviceAccountProjectAccessPolicyView + ); + } + + constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + + ngOnInit(): void { + this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { + this.organizationId = params.organizationId; + this.serviceAccountId = params.serviceAccountId; + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html index 12a26bb6cc0..fcc01ca92ac 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html @@ -10,7 +10,7 @@ - {{ "secrets" | i18n }} + {{ "projects" | i18n }} {{ "people" | i18n }} {{ "accessTokens" | i18n }} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts index 1fdca60605d..11aa0fa8f30 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-routing.module.ts @@ -3,6 +3,7 @@ import { RouterModule, Routes } from "@angular/router"; import { AccessTokenComponent } from "./access/access-tokens.component"; import { ServiceAccountPeopleComponent } from "./people/service-account-people.component"; +import { ServiceAccountProjectsComponent } from "./projects/service-account-projects.component"; import { ServiceAccountComponent } from "./service-account.component"; import { ServiceAccountsComponent } from "./service-accounts.component"; @@ -18,7 +19,7 @@ const routes: Routes = [ { path: "", pathMatch: "full", - redirectTo: "access", + redirectTo: "projects", }, { path: "access", @@ -28,6 +29,10 @@ const routes: Routes = [ path: "people", component: ServiceAccountPeopleComponent, }, + { + path: "projects", + component: ServiceAccountProjectsComponent, + }, ], }, ]; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts index e75bf2dc3fc..0019cbc0319 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.module.ts @@ -11,6 +11,7 @@ import { AccessTokenDialogComponent } from "./access/dialogs/access-token-dialog import { ExpirationOptionsComponent } from "./access/dialogs/expiration-options.component"; import { ServiceAccountDialogComponent } from "./dialog/service-account-dialog.component"; import { ServiceAccountPeopleComponent } from "./people/service-account-people.component"; +import { ServiceAccountProjectsComponent } from "./projects/service-account-projects.component"; import { ServiceAccountComponent } from "./service-account.component"; import { ServiceAccountsListComponent } from "./service-accounts-list.component"; import { ServiceAccountsRoutingModule } from "./service-accounts-routing.module"; @@ -20,12 +21,14 @@ import { ServiceAccountsComponent } from "./service-accounts.component"; imports: [SecretsManagerSharedModule, ServiceAccountsRoutingModule, BreadcrumbsModule], declarations: [ AccessListComponent, - ExpirationOptionsComponent, AccessTokenComponent, AccessTokenCreateDialogComponent, AccessTokenDialogComponent, + ExpirationOptionsComponent, ServiceAccountComponent, ServiceAccountDialogComponent, + ServiceAccountPeopleComponent, + ServiceAccountProjectsComponent, ServiceAccountsComponent, ServiceAccountsListComponent, ServiceAccountPeopleComponent, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index c63abc1b143..79aee4a0e8c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -25,6 +25,7 @@ import { ServiceAccountAccessPoliciesResponse } from "../../shared/access-polici import { AccessPolicyUpdateRequest } from "./models/requests/access-policy-update.request"; import { AccessPolicyRequest } from "./models/requests/access-policy.request"; +import { GrantedPolicyRequest } from "./models/requests/granted-policy.request"; import { GroupServiceAccountAccessPolicyResponse, UserServiceAccountAccessPolicyResponse, @@ -40,6 +41,9 @@ import { PotentialGranteeResponse } from "./models/responses/potential-grantee.r export class AccessPolicyService { private _projectAccessPolicyChanges$ = new Subject(); private _serviceAccountAccessPolicyChanges$ = new Subject(); + private _serviceAccountGrantedPolicyChanges$ = new Subject< + ServiceAccountProjectAccessPolicyView[] + >(); /** * Emits when a project access policy is created or deleted. @@ -52,12 +56,56 @@ export class AccessPolicyService { readonly serviceAccountAccessPolicyChanges$ = this._serviceAccountAccessPolicyChanges$.asObservable(); + /** + * Emits when a service account granted policy is created or deleted. + */ + readonly serviceAccountGrantedPolicyChanges$ = + this._serviceAccountGrantedPolicyChanges$.asObservable(); + constructor( private cryptoService: CryptoService, protected apiService: ApiService, protected encryptService: EncryptService ) {} + async getGrantedPolicies( + serviceAccountId: string, + organizationId: string + ): Promise { + const r = await this.apiService.send( + "GET", + "/service-accounts/" + serviceAccountId + "/granted-policies", + null, + true, + true + ); + + const results = new ListResponse(r, ServiceAccountProjectAccessPolicyResponse); + return await this.createServiceAccountProjectAccessPolicyViews(results.data, organizationId); + } + + async createGrantedPolicies( + organizationId: string, + serviceAccountId: string, + policies: ServiceAccountProjectAccessPolicyView[] + ): Promise { + const request = this.getGrantedPoliciesCreateRequest(policies); + const r = await this.apiService.send( + "POST", + "/service-accounts/" + serviceAccountId + "/granted-policies", + request, + true, + true + ); + const results = new ListResponse(r, ServiceAccountProjectAccessPolicyResponse); + const views = await this.createServiceAccountProjectAccessPolicyViews( + results.data, + organizationId + ); + this._serviceAccountGrantedPolicyChanges$.next(views); + return views; + } + async getProjectAccessPolicies( organizationId: string, projectId: string @@ -132,6 +180,7 @@ export class AccessPolicyService { await this.apiService.send("DELETE", "/access-policies/" + accessPolicyId, null, true, false); this._projectAccessPolicyChanges$.next(null); this._serviceAccountAccessPolicyChanges$.next(null); + this._serviceAccountGrantedPolicyChanges$.next(null); } async updateAccessPolicy(baseAccessPolicyView: BaseAccessPolicyView): Promise { @@ -228,6 +277,10 @@ export class AccessPolicyService { ...this.createBaseAccessPolicyView(response), grantedProjectId: response.grantedProjectId, serviceAccountId: response.serviceAccountId, + grantedProjectName: await this.encryptService.decryptToUtf8( + new EncString(response.grantedProjectName), + organizationKey + ), serviceAccountName: await this.encryptService.decryptToUtf8( new EncString(response.serviceAccountName), organizationKey @@ -318,6 +371,18 @@ export class AccessPolicyService { return await this.createPotentialGranteeViews(organizationId, results.data); } + async getProjectsPotentialGrantees(organizationId: string) { + const r = await this.apiService.send( + "GET", + "/organizations/" + organizationId + "/access-policies/projects/potential-grantees", + null, + true, + true + ); + const results = new ListResponse(r, PotentialGranteeResponse); + return await this.createPotentialGranteeViews(organizationId, results.data); + } + protected async getOrganizationKey(organizationId: string): Promise { return await this.cryptoService.getOrgKey(organizationId); } @@ -367,7 +432,7 @@ export class AccessPolicyService { view.type = r.type; view.email = r.email; - if (r.type === "serviceAccount") { + if (r.type === "serviceAccount" || r.type === "project") { view.name = await this.encryptService.decryptToUtf8(new EncString(r.name), orgKey); } else { view.name = r.name; @@ -376,4 +441,44 @@ export class AccessPolicyService { }) ); } + + private getGrantedPoliciesCreateRequest( + policies: ServiceAccountProjectAccessPolicyView[] + ): GrantedPolicyRequest[] { + return policies.map((ap) => { + const request = new GrantedPolicyRequest(); + request.grantedId = ap.grantedProjectId; + request.read = ap.read; + request.write = ap.write; + return request; + }); + } + + private async createServiceAccountProjectAccessPolicyViews( + responses: ServiceAccountProjectAccessPolicyResponse[], + organizationId: string + ): Promise { + const orgKey = await this.getOrganizationKey(organizationId); + return await Promise.all( + responses.map(async (response: ServiceAccountProjectAccessPolicyResponse) => { + const view = new ServiceAccountProjectAccessPolicyView(); + view.id = response.id; + view.read = response.read; + view.write = response.write; + view.creationDate = response.creationDate; + view.revisionDate = response.revisionDate; + view.serviceAccountId = response.serviceAccountId; + view.grantedProjectId = response.grantedProjectId; + view.serviceAccountName = await this.encryptService.decryptToUtf8( + new EncString(response.serviceAccountName), + orgKey + ); + view.grantedProjectName = await this.encryptService.decryptToUtf8( + new EncString(response.grantedProjectName), + orgKey + ); + return view; + }) + ); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html index 68fc948659c..dd096f382a8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html @@ -63,8 +63,8 @@ bitIconButton="bwi-close" buttonType="main" size="default" - [attr.title]="'close' | i18n" - [attr.aria-label]="'close' | i18n" + [attr.title]="'remove' | i18n" + [attr.aria-label]="'remove' | i18n" [bitAction]="delete(row.accessPolicyId)" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts index ba7803160f8..7e79c4604d3 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts @@ -12,9 +12,9 @@ import { BaseAccessPolicyView } from "../../models/view/access-policy.view"; import { AccessPolicyService } from "./access-policy.service"; export type AccessSelectorRowView = { - type: "user" | "group" | "serviceAccount"; + type: "user" | "group" | "serviceAccount" | "project"; name: string; - granteeId: string; + id: string; accessPolicyId: string; read: boolean; write: boolean; @@ -30,6 +30,7 @@ export class AccessSelectorComponent implements OnInit { static readonly userIcon = "bwi-user"; static readonly groupIcon = "bwi-family"; static readonly serviceAccountIcon = "bwi-wrench"; + static readonly projectIcon = "bwi-collection"; @Output() onCreateAccessPolicies = new EventEmitter(); @@ -37,7 +38,7 @@ export class AccessSelectorComponent implements OnInit { @Input() hint: string; @Input() columnTitle: string; @Input() emptyMessage: string; - @Input() granteeType: "people" | "serviceAccounts"; + @Input() granteeType: "people" | "serviceAccounts" | "projects"; protected rows$ = new Subject(); @Input() private set rows(value: AccessSelectorRowView[]) { @@ -57,7 +58,7 @@ export class AccessSelectorComponent implements OnInit { switchMap(([rows, params]) => this.getPotentialGrantees(params.organizationId).then((grantees) => grantees - .filter((g) => !rows.some((row) => row.granteeId === g.id)) + .filter((g) => !rows.some((row) => row.id === g.id)) .map((granteeView) => { let icon: string; let listName = granteeView.name; @@ -74,6 +75,8 @@ export class AccessSelectorComponent implements OnInit { icon = AccessSelectorComponent.groupIcon; } else if (granteeView.type === "serviceAccount") { icon = AccessSelectorComponent.serviceAccountIcon; + } else if (granteeView.type === "project") { + icon = AccessSelectorComponent.projectIcon; } return { icon: icon, @@ -144,9 +147,14 @@ export class AccessSelectorComponent implements OnInit { }; private getPotentialGrantees(organizationId: string) { - return this.granteeType === "people" - ? this.accessPolicyService.getPeoplePotentialGrantees(organizationId) - : this.accessPolicyService.getServiceAccountsPotentialGrantees(organizationId); + switch (this.granteeType) { + case "people": + return this.accessPolicyService.getPeoplePotentialGrantees(organizationId); + case "serviceAccounts": + return this.accessPolicyService.getServiceAccountsPotentialGrantees(organizationId); + case "projects": + return this.accessPolicyService.getProjectsPotentialGrantees(organizationId); + } } static getAccessItemType(item: SelectItemView) { @@ -157,6 +165,8 @@ export class AccessSelectorComponent implements OnInit { return "group"; case AccessSelectorComponent.serviceAccountIcon: return "serviceAccount"; + case AccessSelectorComponent.projectIcon: + return "project"; } } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts new file mode 100644 index 00000000000..ddfca2bfb2b --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts @@ -0,0 +1,5 @@ +export class GrantedPolicyRequest { + grantedId: string; + read: boolean; + write: boolean; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts index 967f1602d08..58f574f4ad2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts @@ -73,11 +73,13 @@ export class ServiceAccountProjectAccessPolicyResponse extends BaseAccessPolicyR serviceAccountId: string; serviceAccountName: string; grantedProjectId: string; + grantedProjectName: string; constructor(response: any) { super(response); this.serviceAccountId = this.getResponseProperty("ServiceAccountId"); this.serviceAccountName = this.getResponseProperty("ServiceAccountName"); this.grantedProjectId = this.getResponseProperty("GrantedProjectId"); + this.grantedProjectName = this.getResponseProperty("GrantedProjectName"); } } From 1e7d83c0c8751de40d6952d991aacbdea727bf5c Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Tue, 28 Feb 2023 10:55:16 -0500 Subject: [PATCH 090/232] Fixed syntax on types (#4886) --- .github/workflows/label-issue-pull-request.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/label-issue-pull-request.yml b/.github/workflows/label-issue-pull-request.yml index 01d626bb1dc..1944cb2dae0 100644 --- a/.github/workflows/label-issue-pull-request.yml +++ b/.github/workflows/label-issue-pull-request.yml @@ -5,8 +5,7 @@ name: Label Issue Pull Request on: pull_request: - types: - - [opened, synchronize, edited] # Check when PR is opened, new pushes are made, or target branch is edited + types: [opened, synchronize, edited] # Check when PR is opened, new pushes are made, or target branch is edited paths-ignore: - .github/workflows/** # We don't need QA on workflow changes branches: From abbfb0696f7f1c719c3b8950c4b742bdac563e28 Mon Sep 17 00:00:00 2001 From: cd-bitwarden <106776772+cd-bitwarden@users.noreply.github.com> Date: Tue, 28 Feb 2023 18:15:39 -0500 Subject: [PATCH 091/232] removing Write only (#4884) --- apps/web/src/locales/en/messages.json | 3 --- .../shared/access-policies/access-selector.component.html | 3 --- .../shared/access-policies/access-selector.component.ts | 3 --- 3 files changed, 9 deletions(-) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index dbbb02e93e2..6897a8cb717 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6371,9 +6371,6 @@ "serviceAccountEmptyProjectAccesspolicies": { "message": "Add projects to grant access" }, - "canWrite": { - "message": "Can write" - }, "canReadWrite": { "message": "Can read, write" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html index dd096f382a8..cef0f582447 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html @@ -43,9 +43,6 @@ - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts index 7e79c4604d3..664e08c41e8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts @@ -125,9 +125,6 @@ export class AccessSelectorComponent implements OnInit { if (target.value === "canRead") { accessPolicyView.read = true; accessPolicyView.write = false; - } else if (target.value === "canWrite") { - accessPolicyView.read = false; - accessPolicyView.write = true; } else if (target.value === "canReadWrite") { accessPolicyView.read = true; accessPolicyView.write = true; From 667d3fccc288b96dd1e675a6da30b2d53879e86f Mon Sep 17 00:00:00 2001 From: Colton Hurst Date: Wed, 1 Mar 2023 09:39:32 -0500 Subject: [PATCH 092/232] SM-528: Fix SM Import / Export Error Messaging (#4833) * SM-528: Remove try catch to use default error handling * SM-528: Add admin check on import / export * SM-528: Hide settings nav section unless admin * SM-528: Refactor observable in navigation component * SM-528: Hide SM Trash from nav menu if not admin * SM-528: clean up navigation.component.ts --- .../layout/navigation.component.html | 9 +++++++-- .../layout/navigation.component.ts | 9 +++++++++ .../settings/porting/sm-export.component.ts | 16 ++++++--------- .../services/sm-porting-api.service.ts | 20 +++++++------------ .../settings/settings-routing.module.ts | 7 +++++++ 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html index 0ce398b131f..5ebf5cb9ca0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html @@ -10,8 +10,13 @@ [text]="'serviceAccounts' | i18n" route="service-accounts" > - - + + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts index 86ef7ce3b04..1d757c90ce2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts @@ -1,5 +1,8 @@ import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { map } from "rxjs"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { SecretsManagerLogo } from "./secrets-manager-logo"; @@ -9,7 +12,13 @@ import { SecretsManagerLogo } from "./secrets-manager-logo"; templateUrl: "./navigation.component.html", }) export class NavigationComponent { + protected isAdmin$ = this.route.params.pipe( + map((params) => this.organizationService.get(params.organizationId)?.isAdmin) + ); + protected readonly logo = SecretsManagerLogo; protected orgFilter = (org: Organization) => org.canAccessSecretsManager; + + constructor(private route: ActivatedRoute, private organizationService: OrganizationService) {} } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts index 6f98c17b9c8..684e63063d0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts @@ -76,17 +76,13 @@ export class SecretsManagerExportComponent implements OnInit, OnDestroy { }; private async doExport() { - try { - const exportData = await this.secretsManagerApiService.export( - this.orgId, - this.formGroup.get("format").value - ); + const exportData = await this.secretsManagerApiService.export( + this.orgId, + this.formGroup.get("format").value + ); - await this.downloadFile(exportData, this.formGroup.get("format").value); - this.platformUtilsService.showToast("success", null, this.i18nService.t("dataExportSuccess")); - } catch (e) { - this.logService.error(e); - } + await this.downloadFile(exportData, this.formGroup.get("format").value); + this.platformUtilsService.showToast("success", null, this.i18nService.t("dataExportSuccess")); } private async downloadFile(data: string, format: string) { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts index a2861a5ad16..6432796430c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts @@ -30,19 +30,13 @@ export class SecretsManagerPortingApiService { ) {} async export(organizationId: string, exportFormat = "json"): Promise { - let response = {}; - - try { - response = await this.apiService.send( - "GET", - "/sm/" + organizationId + "/export?format=" + exportFormat, - null, - true, - true - ); - } catch (error) { - return null; - } + const response = await this.apiService.send( + "GET", + "/sm/" + organizationId + "/export?format=" + exportFormat, + null, + true, + true + ); return JSON.stringify( await this.decryptExport(organizationId, new SecretsManagerExportResponse(response)), diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts index 6cd6249d335..325592beb33 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts @@ -1,6 +1,9 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; +import { Organization } from "@bitwarden/common/models/domain/organization"; +import { OrganizationPermissionsGuard } from "@bitwarden/web-vault/app/organizations/guards/org-permissions.guard"; + import { SecretsManagerExportComponent } from "./porting/sm-export.component"; import { SecretsManagerImportComponent } from "./porting/sm-import.component"; @@ -8,15 +11,19 @@ const routes: Routes = [ { path: "import", component: SecretsManagerImportComponent, + canActivate: [OrganizationPermissionsGuard], data: { titleId: "importData", + organizationPermissions: (org: Organization) => org.isAdmin, }, }, { path: "export", component: SecretsManagerExportComponent, + canActivate: [OrganizationPermissionsGuard], data: { titleId: "exportData", + organizationPermissions: (org: Organization) => org.isAdmin, }, }, ]; From 743f4f8c69ef7425dd63e0973b2ef3c20155cbe1 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Wed, 1 Mar 2023 11:48:39 -0500 Subject: [PATCH 093/232] [SM-529] fix directive typo (#4894) --- .../secrets-manager/settings/porting/sm-import.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html index 79743d72758..a22204cd183 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html @@ -36,7 +36,7 @@ > {{ "acceptedFormats" | i18n }} JSON - From ce6c975dd997ef3fd55faf4811fc77a2b24150c1 Mon Sep 17 00:00:00 2001 From: Maximilian Power Date: Wed, 1 Mar 2023 17:49:36 +0100 Subject: [PATCH 094/232] [SM-489] Added descriptions for all SM related strings (#4692) * added descriptions for all SM related strings * rm trailing comma * Updated descriptions based on feedback * Update messages.json * Update messages.json * Reorder prompts --------- Co-authored-by: maxkpower Co-authored-by: patrick-bitwarden Co-authored-by: Patrick <94560851+patrick-bitwarden@users.noreply.github.com> --- apps/web/src/locales/en/messages.json | 350 ++++++++++++++++---------- 1 file changed, 211 insertions(+), 139 deletions(-) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 6897a8cb717..7ce556cfbe3 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -410,7 +410,7 @@ "description": "for adding new items" }, "item": { - "message": "Item" + "message": "Item" }, "ex": { "message": "ex.", @@ -5677,12 +5677,9 @@ }, "pink": { "message": "Pink" - }, - "customColor": { + }, + "customColor": { "message": "Custom Color" - }, - "selectPlaceholder": { - "message": "-- Select --" }, "selectPlaceholder": { "message": "-- Select --" @@ -5710,29 +5707,37 @@ "hide": { "message": "Hide" }, - "projects":{ - "message": "Projects" + "projects": { + "message": "Projects", + "description": "Description for the Projects field." }, - "lastEdited":{ - "message": "Last edited" + "lastEdited": { + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, - "editSecret":{ - "message": "Edit secret" + "editSecret": { + "message": "Edit secret", + "description": "Action to modify an existing secret." }, - "addSecret":{ - "message": "Add secret" + "addSecret": { + "message": "Add secret", + "description": "Action to create a new secret." }, - "copySecretName":{ - "message": "Copy secret name" + "copySecretName": { + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, - "copySecretValue":{ - "message": "Copy secret value" + "copySecretValue": { + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, - "deleteSecret":{ - "message": "Delete secret" + "deleteSecret": { + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, - "deleteSecrets":{ - "message": "Delete secrets" + "deleteSecrets": { + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret":{ "message": "Permanently delete secret" @@ -5740,107 +5745,144 @@ "hardDeleteSecrets":{ "message": "Permanently delete secrets" }, - "secretProjectAssociationDescription" :{ - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "secretProjectAssociationDescription": { + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." }, - "project":{ - "message": "Project" + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, - "editProject":{ - "message": "Edit project" + "project": { + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, - "viewProject":{ - "message": "View project" + "editProject": { + "message": "Edit project", + "description": "The action to modify an existing project." }, - "deleteProject":{ - "message": "Delete project" + "viewProject": { + "message": "View project", + "description": "The action to view details of a project." }, - "deleteProjects":{ - "message": "Delete projects" + "deleteProject": { + "message": "Delete project", + "description": "The action to delete a project from the system." }, - "secret":{ - "message": "Secret" + "deleteProjects": { + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, - "serviceAccount":{ - "message": "Service account" + "secret": { + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, - "serviceAccounts":{ - "message": "Service accounts" + "serviceAccount": { + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, - "secrets":{ - "message":"Secrets" + "serviceAccounts": { + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, - "nameValuePair":{ - "message":"Name/Value pair" + "secrets": { + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, - "secretEdited":{ - "message":"Secret edited" + "nameValuePair": { + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, - "secretCreated":{ - "message":"Secret created" + "secretEdited": { + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, - "newSecret":{ - "message":"New secret" + "secretCreated": { + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, - "newServiceAccount":{ - "message":"New service account" + "newSecret": { + "message": "New secret", + "description": "Title for creating a new secret." }, - "secretsNoItemsTitle":{ - "message":"No secrets to show" + "newServiceAccount": { + "message": "New service account", + "description": "Title for creating a new service account." }, - "secretsNoItemsMessage":{ - "message": "To get started, add a new secret or import secrets." + "secretsNoItemsTitle": { + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." + }, + "secretsNoItemsMessage": { + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage":{ "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle":{ - "message":"Nothing to show yet" + "serviceAccountsNoItemsMessage": { + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." }, - "serviceAccountsNoItemsMessage":{ - "message": "Create a new service account to get started automating secret access." + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, - "searchSecrets":{ - "message":"Search secrets" + "searchSecrets": { + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, - "deleteServiceAccounts":{ - "message":"Delete service accounts" + "deleteServiceAccounts": { + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, - "deleteServiceAccount":{ - "message":"Delete service account" + "deleteServiceAccount": { + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, - "viewServiceAccount":{ - "message":"View service account" + "viewServiceAccount": { + "message": "View service account", + "description": "Action to view the details of a service account." }, - "searchServiceAccounts":{ - "message":"Search service accounts" + "searchServiceAccounts": { + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, - "addProject":{ - "message": "Add project" + "addProject": { + "message": "Add project", + "description": "Title for creating a new project." }, - "projectEdited":{ - "message":"Project edited" + "projectEdited": { + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, - "projectSaved":{ - "message":"Project saved" + "projectSaved": { + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, - "projectCreated":{ - "message":"Project created" + "projectCreated": { + "message": "Project created", + "description": "Notification for the successful creation of a project." }, - "projectName":{ - "message":"Project name" + "projectName": { + "message": "Project name", + "description": "Label for entering the name of a project." }, - "newProject":{ - "message":"New project" + "newProject": { + "message": "New project", + "description": "Title for creating a new project." }, - "softDeleteSecretWarning":{ - "message":"Deleting secrets can affect existing integrations." + "softDeleteSecretWarning": { + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, - "softDeletesSuccessToast":{ - "message":"Secrets sent to trash" + "softDeletesSuccessToast": { + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5851,32 +5893,41 @@ "hardDeletesSuccessToast":{ "message":"Secrets permanently deleted" }, - "serviceAccountCreated":{ - "message":"Service account created" + "smAccess": { + "message": "Access", + "description": "Title indicating what permissions a service account has" }, - "smAccess":{ - "message":"Access" + "projectCommaSecret": { + "message": "Project, Secret", + "description": "" }, - "projectCommaSecret":{ - "message":"Project, Secret" + "serviceAccountName": { + "message": "Service account name", + "description": "Label for the name of a service account" }, - "serviceAccountName":{ - "message": "Service account name" + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, - "newSaSelectAccess":{ - "message": "Type or select projects" + "newSaSelectAccess": { + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, - "newSaTypeToFilter":{ - "message": "Type to filter" + "newSaTypeToFilter": { + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, - "deleteProjectsToast":{ - "message": "Projects deleted" + "deleteProjectsToast": { + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, - "deleteProjectToast":{ - "message": "The project and all associated secrets have been deleted" + "deleteProjectToast": { + "message": "The project and all associated secrets have been deleted", + "description": "Notifies that a project and its secrets have been deleted" }, "deleteProjectDialogMessage": { - "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5885,7 +5936,8 @@ } }, "deleteProjectInputLabel": { - "message": "Type \"$CONFIRM$\" to continue", + "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5893,8 +5945,9 @@ } } }, - "deleteProjectConfirmMessage":{ - "message": "Delete $PROJECT$", + "deleteProjectConfirmMessage": { + "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5902,8 +5955,9 @@ } } }, - "deleteProjectsConfirmMessage":{ - "message": "Delete $COUNT$ Projects", + "deleteProjectsConfirmMessage": { + "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5911,74 +5965,92 @@ } } }, - "deleteProjectsDialogMessage":{ - "message": "Deleting projects is permanent and irreversible." + "deleteProjectsDialogMessage": { + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, - "projectsNoItemsTitle":{ - "message": "No projects to display" + "projectsNoItemsTitle": { + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, - "projectsNoItemsMessage":{ - "message": "Add a new project to get started organizing secrets." + "projectsNoItemsMessage": { + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, - "smConfirmationRequired":{ - "message": "Confirmation required" + "smConfirmationRequired": { + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, - "bulkDeleteProjectsErrorMessage":{ - "message": "The following projects could not be deleted:" + "bulkDeleteProjectsErrorMessage": { + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, - "softDeleteSuccessToast":{ - "message":"Secret sent to trash" + "softDeleteSuccessToast": { + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast":{ "message":"Secret permanently deleted" }, - "searchProjects":{ - "message":"Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" From bb361842565b67e831889b95a13d7c7886a0f54d Mon Sep 17 00:00:00 2001 From: Will Martin Date: Wed, 1 Mar 2023 14:41:56 -0500 Subject: [PATCH 095/232] [SM-552] make string sort in TableDataSource case insensitive (#4889) * make string sort case insensitive * use localeCompare --- .../components/src/table/table-data-source.ts | 10 +++++-- libs/components/src/table/table.stories.ts | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/libs/components/src/table/table-data-source.ts b/libs/components/src/table/table-data-source.ts index b7bb4d1644e..71e8b8318e3 100644 --- a/libs/components/src/table/table-data-source.ts +++ b/libs/components/src/table/table-data-source.ts @@ -132,7 +132,7 @@ export class TableDataSource extends DataSource { */ protected sortData(data: T[], sort: Sort): T[] { const column = sort.column; - const direction = sort.direction; + const directionModifier = sort.direction === "asc" ? 1 : -1; if (!column) { return data; } @@ -140,7 +140,7 @@ export class TableDataSource extends DataSource { return data.sort((a, b) => { // If a custom sort function is provided, use it instead of the default. if (sort.fn) { - return sort.fn(a, b) * (direction === "asc" ? 1 : -1); + return sort.fn(a, b) * directionModifier; } let valueA = this.sortingDataAccessor(a, column); @@ -161,6 +161,10 @@ export class TableDataSource extends DataSource { } } + if (typeof valueA === "string" && typeof valueB === "string") { + return valueA.localeCompare(valueB) * directionModifier; + } + // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if // one value exists while the other doesn't. In this case, existing value should come last. // This avoids inconsistent results when comparing values to undefined/null. @@ -179,7 +183,7 @@ export class TableDataSource extends DataSource { comparatorResult = -1; } - return comparatorResult * (direction === "asc" ? 1 : -1); + return comparatorResult * directionModifier; }); } diff --git a/libs/components/src/table/table.stories.ts b/libs/components/src/table/table.stories.ts index 76723f23d10..dbf421f4eee 100644 --- a/libs/components/src/table/table.stories.ts +++ b/libs/components/src/table/table.stories.ts @@ -168,3 +168,31 @@ const FilterableTemplate: Story = (args) => ({ }); export const Filterable = FilterableTemplate.bind({}); + +const data4 = new TableDataSource<{ name: string }>(); + +data4.data = [...Array(5).keys()].map((i) => ({ + name: i % 2 == 0 ? `name-${i}`.toUpperCase() : `name-${i}`.toLowerCase(), +})); + +const VariableCaseTemplate: Story = (args) => ({ + props: { + dataSource: data4, + }, + template: ` + + + + Name + + + + + {{ r.name }} + + + + `, +}); + +export const VariableCase = VariableCaseTemplate.bind({}); From fa1a779b637fdca536cb7394ba46f3331b3a4122 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Thu, 2 Mar 2023 09:14:29 -0500 Subject: [PATCH 096/232] [SM-582] update sm logo (#4896) * update logo * update layout stories * remove unused logo; optimize svg --- .../app/secrets-manager/layout/layout.stories.ts | 16 +++++++++++++--- .../layout/navigation.component.html | 4 ++-- .../layout/navigation.component.ts | 6 ++---- .../layout/secrets-manager-logo.ts | 4 +--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts index 419de00875f..5c35051d169 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts @@ -1,13 +1,22 @@ import { Component } from "@angular/core"; import { RouterModule } from "@angular/router"; import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { BehaviorSubject } from "rxjs"; -import { NavigationModule, IconModule } from "@bitwarden/components"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/models/domain/organization"; +import { IconModule } from "@bitwarden/components"; import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/app/tests/preloaded-english-i18n.module"; import { LayoutComponent } from "./layout.component"; +import { LayoutModule } from "./layout.module"; import { NavigationComponent } from "./navigation.component"; +class MockOrganizationService implements Partial { + private static _orgs = new BehaviorSubject([]); + organizations$ = MockOrganizationService._orgs; // eslint-disable-line rxjs/no-exposed-subjects +} + @Component({ selector: "story-content", template: `

    Content

    `, @@ -49,11 +58,12 @@ export default { ], { useHash: true } ), + LayoutModule, IconModule, - NavigationModule, PreloadedEnglishI18nModule, ], - declarations: [LayoutComponent, NavigationComponent, StoryContentComponent], + declarations: [StoryContentComponent], + providers: [{ provide: OrganizationService, useClass: MockOrganizationService }], }), ], } as Meta; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html index 5ebf5cb9ca0..3b058077b2a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html @@ -1,5 +1,5 @@ - - + + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts index 1d757c90ce2..cf8b74a2358 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts @@ -12,13 +12,11 @@ import { SecretsManagerLogo } from "./secrets-manager-logo"; templateUrl: "./navigation.component.html", }) export class NavigationComponent { + protected readonly logo = SecretsManagerLogo; + protected orgFilter = (org: Organization) => org.canAccessSecretsManager; protected isAdmin$ = this.route.params.pipe( map((params) => this.organizationService.get(params.organizationId)?.isAdmin) ); - protected readonly logo = SecretsManagerLogo; - - protected orgFilter = (org: Organization) => org.canAccessSecretsManager; - constructor(private route: ActivatedRoute, private organizationService: OrganizationService) {} } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/secrets-manager-logo.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/secrets-manager-logo.ts index 890daea9528..70f0f46540e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/secrets-manager-logo.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/secrets-manager-logo.ts @@ -1,7 +1,5 @@ import { svgIcon } from "@bitwarden/components"; export const SecretsManagerLogo = svgIcon` - - - + `; From 5cc73d41d96600b820172955e6aa7ebe2cdb47cf Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Thu, 2 Mar 2023 15:15:45 +0100 Subject: [PATCH 097/232] PS-2210: Disable Stripe's advanced fraud signals (#4424) --- apps/web/src/app/settings/payment.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/settings/payment.component.ts b/apps/web/src/app/settings/payment.component.ts index c96f369914d..73335dad0cf 100644 --- a/apps/web/src/app/settings/payment.component.ts +++ b/apps/web/src/app/settings/payment.component.ts @@ -49,7 +49,7 @@ export class PaymentComponent implements OnInit, OnDestroy { private themingService: AbstractThemingService ) { this.stripeScript = window.document.createElement("script"); - this.stripeScript.src = "https://js.stripe.com/v3/"; + this.stripeScript.src = "https://js.stripe.com/v3/?advancedFraudSignals=false"; this.stripeScript.async = true; this.stripeScript.onload = () => { this.stripe = (window as any).Stripe(process.env.STRIPE_KEY); From 5f05f736263fe7c28f94ad4102c3fa1c84028904 Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Thu, 2 Mar 2023 09:02:48 -0600 Subject: [PATCH 098/232] [SM-572] Hide Project's People and Service accounts tabs based on permission (#4885) * Hide tabs based on permission * Swap to a new endpoint * Swap to different server implementation * Swap to server's ProjectPermissionDetails * remove async * remove write access observable * Fix mac decrypt error --- .../models/view/project.view.ts | 5 ++++ .../models/responses/project.response.ts | 11 ++++++++ .../projects/project.service.ts | 28 ++++++++++++++----- .../projects/project/project.component.html | 6 ++-- .../projects/project/project.component.ts | 4 +-- .../access-policies/access-policy.service.ts | 10 ++++--- 6 files changed, 49 insertions(+), 15 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts index 4566e3becaa..0d8c55afeef 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts @@ -5,3 +5,8 @@ export class ProjectView { creationDate: string; revisionDate: string; } + +export class ProjectPermissionDetailsView extends ProjectView { + read: boolean; + write: boolean; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts index 7603a35600e..06fe62e6e1b 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts @@ -16,3 +16,14 @@ export class ProjectResponse extends BaseResponse { this.revisionDate = this.getResponseProperty("RevisionDate"); } } + +export class ProjectPermissionDetailsResponse extends ProjectResponse { + read: boolean; + write: boolean; + + constructor(response: any) { + super(response); + this.read = this.getResponseProperty("Read"); + this.write = this.getResponseProperty("Write"); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts index a56112a55fe..9484b9604c6 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts @@ -9,12 +9,15 @@ import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-cr import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { ProjectListView } from "../models/view/project-list.view"; -import { ProjectView } from "../models/view/project.view"; +import { ProjectPermissionDetailsView, ProjectView } from "../models/view/project.view"; import { BulkOperationStatus } from "../shared/dialogs/bulk-status-dialog.component"; import { ProjectRequest } from "./models/requests/project.request"; import { ProjectListItemResponse } from "./models/responses/project-list-item.response"; -import { ProjectResponse } from "./models/responses/project.response"; +import { + ProjectPermissionDetailsResponse, + ProjectResponse, +} from "./models/responses/project.response"; @Injectable({ providedIn: "root", @@ -29,10 +32,10 @@ export class ProjectService { private encryptService: EncryptService ) {} - async getByProjectId(projectId: string): Promise { + async getByProjectId(projectId: string): Promise { const r = await this.apiService.send("GET", "/projects/" + projectId, null, true, true); - const projectResponse = new ProjectResponse(r); - return await this.createProjectView(projectResponse); + const projectResponse = new ProjectPermissionDetailsResponse(r); + return await this.createProjectPermissionDetailsView(projectResponse); } async getProjects(organizationId: string): Promise { @@ -96,7 +99,9 @@ export class ProjectService { return request; } - private async createProjectView(projectResponse: ProjectResponse): Promise { + private async createProjectView( + projectResponse: ProjectResponse | ProjectPermissionDetailsResponse + ) { const orgKey = await this.getOrganizationKey(projectResponse.organizationId); const projectView = new ProjectView(); @@ -108,10 +113,19 @@ export class ProjectService { new EncString(projectResponse.name), orgKey ); - return projectView; } + private async createProjectPermissionDetailsView( + projectResponse: ProjectPermissionDetailsResponse + ): Promise { + return { + ...(await this.createProjectView(projectResponse)), + read: projectResponse.read, + write: projectResponse.write, + }; + } + private async createProjectsListView( organizationId: string, projects: ProjectListItemResponse[] diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html index f62767c1dfb..85443e577fa 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html @@ -4,8 +4,10 @@ {{ "secrets" | i18n }} - {{ "people" | i18n }} - {{ "serviceAccounts" | i18n }} + + {{ "people" | i18n }} + {{ "serviceAccounts" | i18n }} + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts index 393ea33d55e..9e7ea933cf4 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { Observable, switchMap } from "rxjs"; -import { ProjectView } from "../../models/view/project.view"; +import { ProjectPermissionDetailsView } from "../../models/view/project.view"; import { ProjectService } from "../project.service"; @Component({ @@ -10,7 +10,7 @@ import { ProjectService } from "../project.service"; templateUrl: "./project.component.html", }) export class ProjectComponent implements OnInit { - project$: Observable; + project$: Observable; constructor(private route: ActivatedRoute, private projectService: ProjectService) {} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index 79aee4a0e8c..c99161b8a1e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -277,10 +277,12 @@ export class AccessPolicyService { ...this.createBaseAccessPolicyView(response), grantedProjectId: response.grantedProjectId, serviceAccountId: response.serviceAccountId, - grantedProjectName: await this.encryptService.decryptToUtf8( - new EncString(response.grantedProjectName), - organizationKey - ), + grantedProjectName: response.grantedProjectName + ? await this.encryptService.decryptToUtf8( + new EncString(response.grantedProjectName), + organizationKey + ) + : null, serviceAccountName: await this.encryptService.decryptToUtf8( new EncString(response.serviceAccountName), organizationKey From f80e9cfafdbaeae35ec88b73c00d44214548f5c6 Mon Sep 17 00:00:00 2001 From: Colton Hurst Date: Thu, 2 Mar 2023 10:12:34 -0500 Subject: [PATCH 099/232] SM-534: Update delete project toast text (#4902) --- apps/web/src/locales/en/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 7ce556cfbe3..a6fe888ad1f 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5922,8 +5922,8 @@ "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted", - "description": "Notifies that a project and its secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", From 65bedf8d26a2143ff5e88fb8a23bfead30a3bef7 Mon Sep 17 00:00:00 2001 From: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Date: Thu, 2 Mar 2023 14:42:11 -0500 Subject: [PATCH 100/232] Use page header for 2FA setup comp on org settings page to match other org settings pages but use tabbed header class on user account settings > security > Two-step login tab. (#4890) --- .../app/organizations/settings/two-factor-setup.component.ts | 1 + apps/web/src/auth/settings/two-factor-setup.component.html | 2 +- apps/web/src/auth/settings/two-factor-setup.component.ts | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/organizations/settings/two-factor-setup.component.ts b/apps/web/src/app/organizations/settings/two-factor-setup.component.ts index fa9d25b8be9..97179ab7aa7 100644 --- a/apps/web/src/app/organizations/settings/two-factor-setup.component.ts +++ b/apps/web/src/app/organizations/settings/two-factor-setup.component.ts @@ -17,6 +17,7 @@ import { TwoFactorSetupComponent as BaseTwoFactorSetupComponent } from "../../.. }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent { + tabbedHeader = false; constructor( apiService: ApiService, modalService: ModalService, diff --git a/apps/web/src/auth/settings/two-factor-setup.component.html b/apps/web/src/auth/settings/two-factor-setup.component.html index 4073bab4c28..d61f62425e0 100644 --- a/apps/web/src/auth/settings/two-factor-setup.component.html +++ b/apps/web/src/auth/settings/two-factor-setup.component.html @@ -1,6 +1,6 @@ - diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts index 06e5761b3d0..3fb4bcb32e5 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts @@ -1,4 +1,4 @@ -import { AfterContentInit, Component, ContentChildren, Input, QueryList } from "@angular/core"; +import { Component, ContentChildren, EventEmitter, Input, Output, QueryList } from "@angular/core"; import { OnboardingTaskComponent } from "./onboarding-task.component"; @@ -6,17 +6,15 @@ import { OnboardingTaskComponent } from "./onboarding-task.component"; selector: "sm-onboarding", templateUrl: "./onboarding.component.html", }) -export class OnboardingComponent implements AfterContentInit { +export class OnboardingComponent { @ContentChildren(OnboardingTaskComponent) tasks: QueryList; @Input() title: string; + @Output() dismiss = new EventEmitter(); + protected open = true; protected visible = false; - ngAfterContentInit() { - this.visible = !this.isComplete; - } - protected get amountCompleted(): number { return this.tasks.filter((task) => task.completed).length; } @@ -32,8 +30,4 @@ export class OnboardingComponent implements AfterContentInit { protected toggle() { this.open = !this.open; } - - protected dismiss() { - this.visible = false; - } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index e5106b10c5c..a53ede221c0 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -3,7 +3,7 @@
    - + = new Subject(); - private prevShouldReuseRoute: any; private tableSize = 10; private organizationId: string; protected organizationName: string; protected userIsAdmin: boolean; + protected showOnboarding = false; protected view$: Observable<{ allProjects: ProjectListView[]; @@ -72,7 +73,6 @@ export class OverviewComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, - private router: Router, private projectService: ProjectService, private secretService: SecretService, private serviceAccountService: ServiceAccountService, @@ -80,19 +80,12 @@ export class OverviewComponent implements OnInit, OnDestroy { private organizationService: OrganizationService, private platformUtilsService: PlatformUtilsService, private i18nService: I18nService - ) { - /** - * We want to remount the `sm-onboarding` component on route change. - * The component only toggles its visibility on init and on user dismissal. - */ - this.prevShouldReuseRoute = this.router.routeReuseStrategy.shouldReuseRoute; - this.router.routeReuseStrategy.shouldReuseRoute = () => false; - } + ) {} ngOnInit() { const orgId$ = this.route.params.pipe( map((p) => p.organizationId), - distinct() + distinctUntilChanged() ); orgId$ @@ -136,10 +129,19 @@ export class OverviewComponent implements OnInit, OnDestroy { }; }) ); + + // Refresh onboarding status when orgId changes by fetching the first value from view$. + orgId$ + .pipe( + switchMap(() => this.view$.pipe(take(1))), + takeUntil(this.destroy$) + ) + .subscribe((view) => { + this.showOnboarding = Object.values(view.tasks).includes(false); + }); } ngOnDestroy(): void { - this.router.routeReuseStrategy.shouldReuseRoute = this.prevShouldReuseRoute; this.destroy$.next(); this.destroy$.complete(); } @@ -245,4 +247,8 @@ export class OverviewComponent implements OnInit, OnDestroy { this.i18nService.t("valueCopied", this.i18nService.t("value")) ); } + + protected hideOnboarding() { + this.showOnboarding = false; + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts index 21f8acb3d90..961c910ea59 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/sm-routing.module.ts @@ -1,6 +1,7 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; +import { AuthGuard } from "@bitwarden/angular/auth/guards/auth.guard"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { OrganizationPermissionsGuard } from "@bitwarden/web-vault/app/organizations/guards/org-permissions.guard"; import { buildFlaggedRoute } from "@bitwarden/web-vault/app/oss-routing.module"; @@ -19,7 +20,7 @@ const routes: Routes = [ buildFlaggedRoute("secretsManager", { path: ":organizationId", component: LayoutComponent, - canActivate: [OrganizationPermissionsGuard, SMGuard], + canActivate: [AuthGuard, OrganizationPermissionsGuard, SMGuard], data: { organizationPermissions: (org: Organization) => org.canAccessSecretsManager, }, From ae271b5c16483a6c466f2ce76bc48d2007f9fe94 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Fri, 3 Mar 2023 16:44:57 -0500 Subject: [PATCH 108/232] sort access select items (#4922) --- .../access-policies/access-selector.component.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts index 664e08c41e8..89784e81fc8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts @@ -1,7 +1,16 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { FormControl, FormGroup, Validators } from "@angular/forms"; import { ActivatedRoute } from "@angular/router"; -import { combineLatest, firstValueFrom, Observable, share, Subject, switchMap, tap } from "rxjs"; +import { + combineLatest, + firstValueFrom, + map, + Observable, + share, + Subject, + switchMap, + tap, +} from "rxjs"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { Utils } from "@bitwarden/common/misc/utils"; @@ -87,6 +96,7 @@ export class AccessSelectorComponent implements OnInit { }) ) ), + map((selectItems) => selectItems.sort((a, b) => a.listName.localeCompare(b.listName))), tap(() => { this.loading = false; this.formGroup.reset(); From ea6666780a5b1357ac81b1186da4ddcf39ca3c10 Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Mon, 6 Mar 2023 08:34:13 +0100 Subject: [PATCH 109/232] [EC-775] [Technical Dependency] Refactor Vault Filters to be routable (#4733) * [EC-775] feat: add compatibility layer from #4154 * [EC-775] fix: ciphers not reloading on filter change * [EC-775] feat: add support for cipher types * [EC-775] feat: implement organization switching * [EC-775] feat: remove invalid folder and collection checks Had to remove these becuase they were causing double navigations on each click. * [EC-775] fix: fix reverse data flow race condition vault-filter.component was pushing up old filter models which would sometimes overwrite new filter models that came from the routed filter service. * [EC-775] fix: No folder use-case not working * [EC-775] feat: make navigation behave like master * [EC-775] feat: add support for trash * [EC-775] chore: simplify findNode * [EC-775] feat: add support for org vault * [EC-775] feat: add support for orgId in path * [EC-775] feat: use proper treenode constructor * [EC-775] chore: remove unnecessary variable * [EC-775] docs: add docs to relevant classes * [EC-775] chore: use existing function for searching tree * [EC-775] fix: hide "new" button in trash view * [EC-775] feat: add explicit handling for `AllItems` * [EC-775] fix: prune folderId when changing organization * [EC-775] fix: properly use `undefined` instead of `null` * [EC-775] chore: simplify setters using ternary operator * [EC-775] feat: add static typing to `type` filter * [EC-775] feat: use new `All` variable for collections * [EC-775] feat: return `RouterLink` compatible link from `createRoute` * [EC-775] feat: add ordId path support to `createRoute` * [EC-775] fix: interpret params differently in org vault This is needed due to how defaults used to work when using `state-in-code`. We really want to get rid of this type of logic going forward. * [EC-775] doc: clarify `createRoute` * [EC-775] fix: better `type` typing * [EC-775] feat: remove support for path navigation It's better that we circle back to this type of navigationt when we're working on the VVR and have more knowledge about how this is supposed to work. * [EC-775] fix: refactor bridge service to improve readability Refactor follows feedback from PR review --- .../components/vault-filter.component.ts | 66 +------ .../abstractions/vault-filter.service.ts | 1 + .../routed-vault-filter-bridge.service.ts | 179 ++++++++++++++++++ .../services/routed-vault-filter.service.ts | 81 ++++++++ .../services/vault-filter.service.ts | 43 +++++ .../routed-vault-filter-bridge.model.ts | 168 ++++++++++++++++ .../models/routed-vault-filter.model.ts | 21 ++ .../individual-vault/vault-items.component.ts | 15 +- .../individual-vault/vault.component.html | 3 - .../vault/individual-vault/vault.component.ts | 20 +- .../vault-filter/vault-filter.component.ts | 25 +-- .../app/vault/org-vault/vault.component.html | 3 - .../app/vault/org-vault/vault.component.ts | 20 +- libs/common/src/misc/serviceUtils.ts | 10 +- 14 files changed, 537 insertions(+), 118 deletions(-) create mode 100644 apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts create mode 100644 apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter.service.ts create mode 100644 apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts create mode 100644 apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts index 1b9a6821d5b..a3e2cc8cdf6 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts @@ -1,14 +1,12 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; -import { firstValueFrom, Subject, switchMap, takeUntil } from "rxjs"; +import { firstValueFrom, Subject } from "rxjs"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; -import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; -import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { VaultFilterService } from "../services/abstractions/vault-filter.service"; import { @@ -34,7 +32,6 @@ import { OrganizationOptionsComponent } from "./organization-options.component"; export class VaultFilterComponent implements OnInit, OnDestroy { filters?: VaultFilterList; @Input() activeFilter: VaultFilter = new VaultFilter(); - @Output() activeFilterChanged = new EventEmitter(); @Output() onSearchTextChanged = new EventEmitter(); @Output() onAddFolder = new EventEmitter(); @Output() onEditFolder = new EventEmitter(); @@ -88,9 +85,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { protected policyService: PolicyService, protected i18nService: I18nService, protected platformUtilsService: PlatformUtilsService - ) { - this.loadSubscriptions(); - } + ) {} async ngOnInit(): Promise { this.filters = await this.buildAllFilters(); @@ -104,35 +99,11 @@ export class VaultFilterComponent implements OnInit, OnDestroy { this.destroy$.complete(); } - protected loadSubscriptions() { - this.vaultFilterService.filteredFolders$ - .pipe( - switchMap(async (folders) => { - this.removeInvalidFolderSelection(folders); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - - this.vaultFilterService.filteredCollections$ - .pipe( - switchMap(async (collections) => { - this.removeInvalidCollectionSelection(collections); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - } - searchTextChanged(t: string) { this.searchText = t; this.onSearchTextChanged.emit(t); } - protected applyVaultFilter(filter: VaultFilter) { - this.activeFilterChanged.emit(filter); - } - applyOrganizationFilter = async (orgNode: TreeNode): Promise => { if (!orgNode?.node.enabled) { this.platformUtilsService.showToast( @@ -143,34 +114,31 @@ export class VaultFilterComponent implements OnInit, OnDestroy { return; } const filter = this.activeFilter; - filter.resetOrganization(); - if (orgNode?.node.id !== "AllVaults") { + if (orgNode?.node.id === "AllVaults") { + filter.resetOrganization(); + } else { filter.selectedOrganizationNode = orgNode; } this.vaultFilterService.setOrganizationFilter(orgNode.node); await this.vaultFilterService.expandOrgFilter(); - this.applyVaultFilter(filter); }; applyTypeFilter = async (filterNode: TreeNode): Promise => { const filter = this.activeFilter; filter.resetFilter(); filter.selectedCipherTypeNode = filterNode; - this.applyVaultFilter(filter); }; applyFolderFilter = async (folderNode: TreeNode): Promise => { const filter = this.activeFilter; filter.resetFilter(); filter.selectedFolderNode = folderNode; - this.applyVaultFilter(filter); }; applyCollectionFilter = async (collectionNode: TreeNode): Promise => { const filter = this.activeFilter; filter.resetFilter(); filter.selectedCollectionNode = collectionNode; - this.applyVaultFilter(filter); }; addFolder = async (): Promise => { @@ -185,30 +153,6 @@ export class VaultFilterComponent implements OnInit, OnDestroy { return await firstValueFrom(this.filters?.typeFilter.data$); } - protected async removeInvalidFolderSelection(folders: FolderView[]) { - if (this.activeFilter.selectedFolderNode) { - if (!folders.some((f) => f.id === this.activeFilter.folderId)) { - const filter = this.activeFilter; - filter.resetFilter(); - filter.selectedCipherTypeNode = - (await this.getDefaultFilter()) as TreeNode; - this.applyVaultFilter(filter); - } - } - } - - protected async removeInvalidCollectionSelection(collections: CollectionView[]) { - if (this.activeFilter.selectedCollectionNode) { - if (!collections.some((f) => f.id === this.activeFilter.collectionId)) { - const filter = this.activeFilter; - filter.resetFilter(); - filter.selectedCipherTypeNode = - (await this.getDefaultFilter()) as TreeNode; - this.applyVaultFilter(filter); - } - } - } - async buildAllFilters(): Promise { const builderFilter = {} as VaultFilterList; builderFilter.organizationFilter = await this.addOrganizationFilter(); diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts index 7ae84244a82..3a454d08d5b 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts @@ -19,6 +19,7 @@ export abstract class VaultFilterService { organizationTree$: Observable>; folderTree$: Observable>; collectionTree$: Observable>; + cipherTypeTree$: Observable>; reloadCollections: () => Promise; getCollectionNodeFromTree: (id: string) => Promise>; setCollapsedFilterNodes: (collapsedFilterNodes: Set) => Promise; diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts new file mode 100644 index 00000000000..a532ecff780 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts @@ -0,0 +1,179 @@ +import { Injectable } from "@angular/core"; +import { Router } from "@angular/router"; +import { combineLatest, map, Observable } from "rxjs"; + +import { ServiceUtils } from "@bitwarden/common/misc/serviceUtils"; +import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; + +import { RoutedVaultFilterBridge } from "../shared/models/routed-vault-filter-bridge.model"; +import { + RoutedVaultFilterModel, + Unassigned, + All, +} from "../shared/models/routed-vault-filter.model"; +import { VaultFilter } from "../shared/models/vault-filter.model"; +import { + CipherTypeFilter, + CollectionFilter, + FolderFilter, + OrganizationFilter, +} from "../shared/models/vault-filter.type"; + +import { VaultFilterService } from "./abstractions/vault-filter.service"; +import { RoutedVaultFilterService } from "./routed-vault-filter.service"; + +/** + * This file is part of a layer that is used to temporary bridge between URL filtering and the old state-in-code method. + * This should be removed after we have refactored the {@link VaultItemsComponent} and introduced vertical navigation + * (which will refactor the {@link VaultFilterComponent}). + * + * This class listens to both the new {@link RoutedVaultFilterService} and the old {@link VaultFilterService}. + * When a new filter is emitted the service uses the ids to find the corresponding tree nodes needed for + * the old {@link VaultFilter} model. It then emits a bridge model that contains this information. + */ +@Injectable() +export class RoutedVaultFilterBridgeService { + readonly activeFilter$: Observable; + + constructor( + private router: Router, + private routedVaultFilterService: RoutedVaultFilterService, + legacyVaultFilterService: VaultFilterService + ) { + this.activeFilter$ = combineLatest([ + routedVaultFilterService.filter$, + legacyVaultFilterService.collectionTree$, + legacyVaultFilterService.folderTree$, + legacyVaultFilterService.organizationTree$, + legacyVaultFilterService.cipherTypeTree$, + ]).pipe( + map(([filter, collectionTree, folderTree, organizationTree, cipherTypeTree]) => { + const legacyFilter = isAdminConsole(filter) + ? createLegacyFilterForAdminConsole(filter, collectionTree, cipherTypeTree) + : createLegacyFilterForEndUser( + filter, + collectionTree, + folderTree, + organizationTree, + cipherTypeTree + ); + + return new RoutedVaultFilterBridge(filter, legacyFilter, this); + }) + ); + } + + navigate(filter: RoutedVaultFilterModel) { + const [commands, extras] = this.routedVaultFilterService.createRoute(filter); + this.router.navigate(commands, extras); + } +} + +/** + * Check if the filtering is being done as part of admin console. + * Admin console can be identified by checking if the `organizationId` + * is part of the path. + * + * @param filter Model to check if origin is admin console + * @returns true if filtering being done as part of admin console + */ +function isAdminConsole(filter: RoutedVaultFilterModel) { + return filter.organizationIdParamType === "path"; +} + +function createLegacyFilterForAdminConsole( + filter: RoutedVaultFilterModel, + collectionTree: TreeNode, + cipherTypeTree: TreeNode +): VaultFilter { + const legacyFilter = new VaultFilter(); + + if (filter.collectionId === undefined && filter.type === undefined) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject( + collectionTree, + "AllCollections" + ); + } else if (filter.collectionId !== undefined && filter.collectionId === Unassigned) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(collectionTree, null); + } else if (filter.collectionId !== undefined) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject( + collectionTree, + filter.collectionId + ); + } + + if (filter.collectionId === undefined && filter.type === All) { + legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject( + cipherTypeTree, + "AllItems" + ); + } else if (filter.type !== undefined && filter.type === "trash") { + legacyFilter.selectedCipherTypeNode = new TreeNode( + { id: "trash", name: "", type: "trash", icon: "" }, + null + ); + } else if (filter.type !== undefined && filter.type !== "trash") { + legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject( + cipherTypeTree, + filter.type + ); + } + + return legacyFilter; +} + +function createLegacyFilterForEndUser( + filter: RoutedVaultFilterModel, + collectionTree: TreeNode, + folderTree: TreeNode, + organizationTree: TreeNode, + cipherTypeTree: TreeNode +): VaultFilter { + const legacyFilter = new VaultFilter(); + + if (filter.collectionId !== undefined && filter.collectionId === Unassigned) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(collectionTree, null); + } else if (filter.collectionId !== undefined && filter.collectionId === All) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject( + collectionTree, + "AllCollections" + ); + } else if (filter.collectionId !== undefined) { + legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject( + collectionTree, + filter.collectionId + ); + } + + if (filter.folderId !== undefined && filter.folderId === Unassigned) { + legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, null); + } else if (filter.folderId !== undefined && filter.folderId !== Unassigned) { + legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, filter.folderId); + } + + if (filter.organizationId !== undefined) { + legacyFilter.selectedOrganizationNode = ServiceUtils.getTreeNodeObject( + organizationTree, + filter.organizationId + ); + } + + if (filter.type === undefined) { + legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject( + cipherTypeTree, + "AllItems" + ); + } else if (filter.type !== undefined && filter.type === "trash") { + legacyFilter.selectedCipherTypeNode = new TreeNode( + { id: "trash", name: "", type: "trash", icon: "" }, + null + ); + } else if (filter.type !== undefined && filter.type !== "trash") { + legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject( + cipherTypeTree, + filter.type + ); + } + + return legacyFilter; +} diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter.service.ts new file mode 100644 index 00000000000..26578605dc0 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter.service.ts @@ -0,0 +1,81 @@ +import { Injectable, OnDestroy } from "@angular/core"; +import { ActivatedRoute, NavigationExtras } from "@angular/router"; +import { combineLatest, map, Observable, Subject, takeUntil } from "rxjs"; + +import { + isRoutedVaultFilterItemType, + RoutedVaultFilterModel, +} from "../shared/models/routed-vault-filter.model"; + +/** + * This service is an abstraction layer on top of ActivatedRoute that + * encapsulates the logic of how filters are stored in the URL. + * + * The service builds and emits filter models based on URL params and + * also contains a method for generating routes to corresponding to those params. + */ +@Injectable() +export class RoutedVaultFilterService implements OnDestroy { + private onDestroy = new Subject(); + + /** + * Filter values extracted from the URL. + * To change the values use {@link RoutedVaultFilterService.createRoute}. + */ + filter$: Observable; + + constructor(activatedRoute: ActivatedRoute) { + this.filter$ = combineLatest([activatedRoute.paramMap, activatedRoute.queryParamMap]).pipe( + map(([params, queryParams]) => { + const unsafeType = queryParams.get("type"); + const type = isRoutedVaultFilterItemType(unsafeType) ? unsafeType : undefined; + + return { + collectionId: queryParams.get("collectionId") ?? undefined, + folderId: queryParams.get("folderId") ?? undefined, + organizationId: + params.get("organizationId") ?? queryParams.get("organizationId") ?? undefined, + organizationIdParamType: + params.get("organizationId") != undefined ? ("path" as const) : ("query" as const), + type, + }; + }), + takeUntil(this.onDestroy) + ); + } + + /** + * Create a route that can be used to modify filters with Router or RouterLink. + * This method is specifically built to leave other query parameters untouched, + * meaning that navigation will only affect filters and not e.g. `cipherId`. + * To subscribe to changes use {@link RoutedVaultFilterService.filter$}. + * + * Note: + * This method currently only supports changing filters that are stored + * in query parameters. This means that {@link RoutedVaultFilterModel.organizationId} + * will be ignored if {@link RoutedVaultFilterModel.organizationIdParamType} + * is set to `path`. + * + * @param filter Filter values that should be applied to the URL. + * @returns route that can be used with Router or RouterLink + */ + createRoute(filter: RoutedVaultFilterModel): [commands: any[], extras?: NavigationExtras] { + const commands: string[] = []; + const extras: NavigationExtras = { + queryParams: { + collectionId: filter.collectionId ?? null, + folderId: filter.folderId ?? null, + organizationId: + filter.organizationIdParamType === "path" ? null : filter.organizationId ?? null, + type: filter.type ?? null, + }, + queryParamsHandling: "merge", + }; + return [commands, extras]; + } + + ngOnDestroy(): void { + this.onDestroy.next(); + this.onDestroy.complete(); + } +} diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts index ef040f02ade..d07648a5314 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts @@ -22,6 +22,7 @@ import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { CollectionAdminView } from "../../../../organizations/core"; @@ -73,6 +74,8 @@ export class VaultFilterService implements VaultFilterServiceAbstraction { map((collections) => this.buildCollectionTree(collections)) ); + cipherTypeTree$: Observable> = this.buildCipherTypeTree(); + constructor( protected stateService: StateService, protected organizationService: OrganizationService, @@ -254,4 +257,44 @@ export class VaultFilterService implements VaultFilterServiceAbstraction { const head = new FolderView() as FolderFilter; return new TreeNode(head, null, "folders", "AllFolders"); } + + protected buildCipherTypeTree(): Observable> { + const allTypeFilters: CipherTypeFilter[] = [ + { + id: "favorites", + name: this.i18nService.t("favorites"), + type: "favorites", + icon: "bwi-star", + }, + { + id: "login", + name: this.i18nService.t("typeLogin"), + type: CipherType.Login, + icon: "bwi-globe", + }, + { + id: "card", + name: this.i18nService.t("typeCard"), + type: CipherType.Card, + icon: "bwi-credit-card", + }, + { + id: "identity", + name: this.i18nService.t("typeIdentity"), + type: CipherType.Identity, + icon: "bwi-id-card", + }, + { + id: "note", + name: this.i18nService.t("typeSecureNote"), + type: CipherType.SecureNote, + icon: "bwi-sticky-note", + }, + ]; + + return this.buildTypeTree( + { id: "AllItems", name: "allItems", type: "all", icon: "" }, + allTypeFilters + ); + } } diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts new file mode 100644 index 00000000000..c2a25b6751f --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts @@ -0,0 +1,168 @@ +import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; + +import { RoutedVaultFilterBridgeService } from "../../services/routed-vault-filter-bridge.service"; + +import { + All, + isRoutedVaultFilterItemType, + RoutedVaultFilterItemType, + RoutedVaultFilterModel, + Unassigned, +} from "./routed-vault-filter.model"; +import { VaultFilter, VaultFilterFunction } from "./vault-filter.model"; +import { + OrganizationFilter, + CipherTypeFilter, + FolderFilter, + CollectionFilter, + CipherStatus, +} from "./vault-filter.type"; + +/** + * This file is part of a layer that is used to temporary bridge between URL filtering and the old state-in-code method. + * This should be removed after we have refactored the {@link VaultItemsComponent} and introduced vertical navigation + * (which will refactor the {@link VaultFilterComponent}). + * + * This model supplies legacy code with the old state-in-code models saved as tree nodes. + * It can also receive requests to select a new tree node by using setters. + * However instead of just replacing the tree node models, it requests a URL navigation, + * thereby bridging between legacy and URL filtering. + */ +export class RoutedVaultFilterBridge implements VaultFilter { + constructor( + private routedFilter: RoutedVaultFilterModel, + private legacyFilter: VaultFilter, + private bridgeService: RoutedVaultFilterBridgeService + ) {} + get collectionBreadcrumbs(): TreeNode[] { + return this.legacyFilter.collectionBreadcrumbs; + } + get isCollectionSelected(): boolean { + return this.legacyFilter.isCollectionSelected; + } + get isUnassignedCollectionSelected(): boolean { + return this.legacyFilter.isUnassignedCollectionSelected; + } + get isMyVaultSelected(): boolean { + return this.legacyFilter.isMyVaultSelected; + } + get selectedOrganizationNode(): TreeNode { + return this.legacyFilter.selectedOrganizationNode; + } + set selectedOrganizationNode(value: TreeNode) { + this.bridgeService.navigate({ + ...this.routedFilter, + organizationId: value.node.id, + folderId: undefined, + collectionId: undefined, + }); + } + get selectedCipherTypeNode(): TreeNode { + return this.legacyFilter.selectedCipherTypeNode; + } + set selectedCipherTypeNode(value: TreeNode) { + let type: RoutedVaultFilterItemType | undefined; + + if (value?.node.id === "AllItems" && this.routedFilter.organizationIdParamType === "path") { + type = "all"; + } else if ( + value?.node.id === "AllItems" && + this.routedFilter.organizationIdParamType === "query" + ) { + type = undefined; + } else if (isRoutedVaultFilterItemType(value?.node.id)) { + type = value?.node.id; + } + + this.bridgeService.navigate({ + ...this.routedFilter, + type, + folderId: undefined, + collectionId: undefined, + }); + } + get selectedFolderNode(): TreeNode { + return this.legacyFilter.selectedFolderNode; + } + set selectedFolderNode(value: TreeNode) { + const folderId = value != null && value.node.id === null ? Unassigned : value?.node.id; + this.bridgeService.navigate({ + ...this.routedFilter, + folderId, + type: undefined, + collectionId: undefined, + }); + } + get selectedCollectionNode(): TreeNode { + return this.legacyFilter.selectedCollectionNode; + } + set selectedCollectionNode(value: TreeNode) { + let collectionId: string | undefined; + + if (value != null && value.node.id === null) { + collectionId = Unassigned; + } else if ( + value?.node.id === "AllCollections" && + this.routedFilter.organizationIdParamType === "path" + ) { + collectionId = undefined; + } else if ( + value?.node.id === "AllCollections" && + this.routedFilter.organizationIdParamType === "query" + ) { + collectionId = All; + } else { + collectionId = value?.node.id; + } + + this.bridgeService.navigate({ + ...this.routedFilter, + collectionId, + type: undefined, + folderId: undefined, + }); + } + get isFavorites(): boolean { + return this.legacyFilter.isFavorites; + } + get isDeleted(): boolean { + return this.legacyFilter.isDeleted; + } + get organizationId(): string { + return this.legacyFilter.organizationId; + } + get cipherType(): CipherType { + return this.legacyFilter.cipherType; + } + get cipherStatus(): CipherStatus { + return this.legacyFilter.cipherStatus; + } + get cipherTypeId(): string { + return this.legacyFilter.cipherTypeId; + } + get folderId(): string { + return this.legacyFilter.folderId; + } + get collectionId(): string { + return this.legacyFilter.collectionId; + } + resetFilter(): void { + this.bridgeService.navigate({ + ...this.routedFilter, + collectionId: undefined, + folderId: undefined, + organizationId: + this.routedFilter.organizationIdParamType === "path" + ? this.routedFilter.organizationId + : undefined, + type: undefined, + }); + } + resetOrganization(): void { + this.bridgeService.navigate({ ...this.routedFilter, organizationId: undefined }); + } + buildFilter(): VaultFilterFunction { + return this.legacyFilter.buildFilter(); + } +} diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts new file mode 100644 index 00000000000..63a4c4ef0f0 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts @@ -0,0 +1,21 @@ +export const Unassigned = "unassigned"; + +export const All = "all"; + +// TODO: Remove `All` when moving to vertical navigation. +const itemTypes = ["favorites", "login", "card", "identity", "note", "trash", All] as const; + +export type RoutedVaultFilterItemType = typeof itemTypes[number]; + +export function isRoutedVaultFilterItemType(value: unknown): value is RoutedVaultFilterItemType { + return itemTypes.includes(value as any); +} + +export interface RoutedVaultFilterModel { + collectionId?: string; + folderId?: string; + organizationId?: string; + type?: RoutedVaultFilterItemType; + + organizationIdParamType?: "path" | "query"; +} diff --git a/apps/web/src/app/vault/individual-vault/vault-items.component.ts b/apps/web/src/app/vault/individual-vault/vault-items.component.ts index 2df96f4c922..185b91e03ba 100644 --- a/apps/web/src/app/vault/individual-vault/vault-items.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-items.component.ts @@ -54,8 +54,6 @@ export type VaultItemRow = (CipherView | TreeNode) & { checked templateUrl: "vault-items.component.html", }) export class VaultItemsComponent extends BaseVaultItemsComponent implements OnDestroy { - @Input() showAddNew = true; - @Input() activeFilter: VaultFilter; @Output() activeFilterChanged = new EventEmitter(); @Output() onAttachmentsClicked = new EventEmitter(); @Output() onShareClicked = new EventEmitter(); @@ -63,6 +61,15 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnDe @Output() onCloneClicked = new EventEmitter(); @Output() onOrganzationBadgeClicked = new EventEmitter(); + private _activeFilter: VaultFilter; + @Input() get activeFilter(): VaultFilter { + return this._activeFilter; + } + set activeFilter(value: VaultFilter) { + this._activeFilter = value; + this.reload(this.activeFilter.buildFilter(), this.activeFilter.isDeleted); + } + cipherType = CipherType; actionPromise: Promise; userHasPremiumAccess = false; @@ -82,6 +89,10 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnDe protected pagedCollections: TreeNode[] = []; protected searchedCollections: TreeNode[] = []; + get showAddNew() { + return !this.activeFilter.isDeleted; + } + get collections(): TreeNode[] { return this.activeFilter?.selectedCollectionNode?.children ?? []; } diff --git a/apps/web/src/app/vault/individual-vault/vault.component.html b/apps/web/src/app/vault/individual-vault/vault.component.html index ceb82cfa38c..25f44118755 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.html +++ b/apps/web/src/app/vault/individual-vault/vault.component.html @@ -7,7 +7,6 @@ @@ -28,7 +26,6 @@ { + this.activeFilter = activeFilter; + }); } get isShowingCards() { @@ -187,16 +197,6 @@ export class VaultComponent implements OnInit, OnDestroy { this.destroy$.complete(); } - async applyVaultFilter(filter: VaultFilter) { - this.activeFilter = filter; - this.vaultItemsComponent.showAddNew = !this.activeFilter.isDeleted; - await this.vaultItemsComponent.reload( - this.activeFilter.buildFilter(), - this.activeFilter.isDeleted - ); - this.go(); - } - async applyOrganizationFilter(orgId: string) { if (orgId == null) { orgId = "MyVault"; diff --git a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts index 2dca1c967a0..fa8b6cff5ce 100644 --- a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts +++ b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts @@ -1,9 +1,8 @@ import { Component, Input, OnDestroy, OnInit } from "@angular/core"; -import { firstValueFrom, Subject, switchMap, takeUntil } from "rxjs"; +import { firstValueFrom, Subject } from "rxjs"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; -import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { VaultFilterComponent as BaseVaultFilterComponent } from "../../individual-vault/vault-filter/components/vault-filter.component"; //../../vault/vault-filter/components/vault-filter.component"; import { @@ -41,28 +40,6 @@ export class VaultFilterComponent extends BaseVaultFilterComponent implements On this.destroy$.complete(); } - protected loadSubscriptions() { - this.vaultFilterService.filteredCollections$ - .pipe( - switchMap(async (collections) => { - this.removeInvalidCollectionSelection(collections); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - } - - protected async removeInvalidCollectionSelection(collections: CollectionView[]) { - if (this.activeFilter.selectedCollectionNode) { - if (!collections.some((f) => f.id === this.activeFilter.collectionId)) { - this.activeFilter.resetFilter(); - this.activeFilter.selectedCollectionNode = - (await this.getDefaultFilter()) as TreeNode; - this.applyVaultFilter(this.activeFilter); - } - } - } - async buildAllFilters(): Promise { const builderFilter = {} as VaultFilterList; builderFilter.typeFilter = await this.addTypeFilter(["favorites"]); diff --git a/apps/web/src/app/vault/org-vault/vault.component.html b/apps/web/src/app/vault/org-vault/vault.component.html index f24d2a4c516..9f6671a8e4d 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.html +++ b/apps/web/src/app/vault/org-vault/vault.component.html @@ -10,7 +10,6 @@ #vaultFilter [organization]="organization" [activeFilter]="activeFilter" - (activeFilterChanged)="applyVaultFilter($event)" (onSearchTextChanged)="filterSearchText($event)" >
    @@ -20,7 +19,6 @@
    { + this.activeFilter = activeFilter; + }); } ngOnDestroy() { @@ -147,16 +157,6 @@ export class VaultComponent implements OnInit, OnDestroy { this.destroy$.complete(); } - async applyVaultFilter(filter: VaultFilter) { - this.activeFilter = filter; - this.vaultItemsComponent.showAddNew = !this.activeFilter.isDeleted; - await this.vaultItemsComponent.reload( - this.activeFilter.buildFilter(), - this.activeFilter.isDeleted - ); - this.go(); - } - async refreshItems() { this.vaultItemsComponent.actionPromise = this.vaultItemsComponent.refresh(); await this.vaultItemsComponent.actionPromise; diff --git a/libs/common/src/misc/serviceUtils.ts b/libs/common/src/misc/serviceUtils.ts index ac85cf0853a..eb035a77ba3 100644 --- a/libs/common/src/misc/serviceUtils.ts +++ b/libs/common/src/misc/serviceUtils.ts @@ -70,14 +70,14 @@ export class ServiceUtils { /** * Searches a tree for a node with a matching `id` - * @param {TreeNode} nodeTree - A single TreeNode branch that will be searched + * @param {TreeNode} nodeTree - A single TreeNode branch that will be searched * @param {string} id - The id of the node to be found - * @returns {TreeNode} The node with a matching `id` + * @returns {TreeNode} The node with a matching `id` */ - static getTreeNodeObject( - nodeTree: TreeNode, + static getTreeNodeObject( + nodeTree: TreeNode, id: string - ): TreeNode { + ): TreeNode { if (nodeTree.node.id === id) { return nodeTree; } From f674ce62f0904fd278d99ab6d3fddfe110defee1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:31:25 +0100 Subject: [PATCH 110/232] Autosync the updated translations (#4918) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 9 +++ apps/browser/src/_locales/az/messages.json | 13 +++- apps/browser/src/_locales/be/messages.json | 11 +++- apps/browser/src/_locales/bg/messages.json | 9 +++ apps/browser/src/_locales/bn/messages.json | 9 +++ apps/browser/src/_locales/bs/messages.json | 9 +++ apps/browser/src/_locales/ca/messages.json | 11 +++- apps/browser/src/_locales/cs/messages.json | 9 +++ apps/browser/src/_locales/da/messages.json | 9 +++ apps/browser/src/_locales/de/messages.json | 63 +++++++++++-------- apps/browser/src/_locales/el/messages.json | 13 +++- apps/browser/src/_locales/en_GB/messages.json | 9 +++ apps/browser/src/_locales/en_IN/messages.json | 9 +++ apps/browser/src/_locales/es/messages.json | 9 +++ apps/browser/src/_locales/et/messages.json | 9 +++ apps/browser/src/_locales/eu/messages.json | 9 +++ apps/browser/src/_locales/fa/messages.json | 29 ++++++--- apps/browser/src/_locales/fi/messages.json | 11 +++- apps/browser/src/_locales/fil/messages.json | 9 +++ apps/browser/src/_locales/fr/messages.json | 9 +++ apps/browser/src/_locales/gl/messages.json | 9 +++ apps/browser/src/_locales/he/messages.json | 9 +++ apps/browser/src/_locales/hi/messages.json | 9 +++ apps/browser/src/_locales/hr/messages.json | 9 +++ apps/browser/src/_locales/hu/messages.json | 13 +++- apps/browser/src/_locales/id/messages.json | 9 +++ apps/browser/src/_locales/it/messages.json | 25 +++++--- apps/browser/src/_locales/ja/messages.json | 11 +++- apps/browser/src/_locales/ka/messages.json | 9 +++ apps/browser/src/_locales/km/messages.json | 9 +++ apps/browser/src/_locales/kn/messages.json | 9 +++ apps/browser/src/_locales/ko/messages.json | 9 +++ apps/browser/src/_locales/lt/messages.json | 9 +++ apps/browser/src/_locales/lv/messages.json | 25 +++++--- apps/browser/src/_locales/ml/messages.json | 9 +++ apps/browser/src/_locales/nb/messages.json | 9 +++ apps/browser/src/_locales/ne/messages.json | 9 +++ apps/browser/src/_locales/nl/messages.json | 13 +++- apps/browser/src/_locales/nn/messages.json | 9 +++ apps/browser/src/_locales/pl/messages.json | 11 +++- apps/browser/src/_locales/pt_BR/messages.json | 9 +++ apps/browser/src/_locales/pt_PT/messages.json | 9 +++ apps/browser/src/_locales/ro/messages.json | 9 +++ apps/browser/src/_locales/ru/messages.json | 11 +++- apps/browser/src/_locales/si/messages.json | 9 +++ apps/browser/src/_locales/sk/messages.json | 9 +++ apps/browser/src/_locales/sl/messages.json | 11 +++- apps/browser/src/_locales/sr/messages.json | 9 +++ apps/browser/src/_locales/sv/messages.json | 9 +++ apps/browser/src/_locales/te/messages.json | 9 +++ apps/browser/src/_locales/th/messages.json | 9 +++ apps/browser/src/_locales/tr/messages.json | 15 ++++- apps/browser/src/_locales/uk/messages.json | 9 +++ apps/browser/src/_locales/vi/messages.json | 9 +++ apps/browser/src/_locales/zh_CN/messages.json | 21 +++++-- apps/browser/src/_locales/zh_TW/messages.json | 35 +++++++---- apps/browser/store/locales/de/copy.resx | 8 +-- 57 files changed, 598 insertions(+), 94 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 734c18f86f6..ec5ec2185b8 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "المساعدة والتعليقات" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "المزامنة" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index dad4a0600ab..c61d66cd8e4 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Kömək və əks əlaqə" }, + "helpCenter": { + "message": "Bitwarden Kömək mərkəzi" + }, + "communityForums": { + "message": "Bitwarden cəmiyyət forumlarını kəşf et" + }, + "contactSupport": { + "message": "Bitwarden dəstəyi ilə əlaqə saxla" + }, "sync": { "message": "Eyniləşdirmə" }, @@ -430,7 +439,7 @@ "message": "Ana parolun yenidən yazılması lazımdır." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ana parol ən azı $VALUE$ simvol uzunluğunda olmalıdır.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2115,7 +2124,7 @@ "message": "Avto-doldurma necə edilir" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Bu səhifədən bir element seçin və ya qısayol istifadə edin: $COMMAND$. Həmçinin səhifə yüklənəndə avto-doldurmanı sınaya bilərsiniz.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 89ce61b37a3..0cd0903bcd7 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Даведка і зваротная сувязь" }, + "helpCenter": { + "message": "Даведачны цэнтр Bitwarden" + }, + "communityForums": { + "message": "Наведайце форумы супольнасці Bitwarden" + }, + "contactSupport": { + "message": "Звярніцеся ў службу падтрымкі Bitwarden" + }, "sync": { "message": "Сінхранізаваць" }, @@ -2115,7 +2124,7 @@ "message": "Як аўтазапоўніць" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Выберыце элемент на гэтай старонцы або скарыстайцеся спалучэннем клавіш: $COMMAND$. Вы таксама можаце паспрабаваць аўтазапаўненне пры загрузцы старонкі.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 830c35d8f82..1d99f544588 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Помощ и обратна връзка" }, + "helpCenter": { + "message": "Помощен център на Битуорден" + }, + "communityForums": { + "message": "Разгледайте обществения форум на Битуорден" + }, + "contactSupport": { + "message": "Свържете се с поддръжката на Битуорден" + }, "sync": { "message": "Синхронизиране" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 133a8510111..e89f86c5882 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "সহায়তা এবং প্রতিক্রিয়া" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "সিঙ্ক" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 736ed372d4c..d3223d0b692 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 2d4017f98a6..21691caedd5 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Ajuda i comentaris" }, + "helpCenter": { + "message": "Centre d'ajuda de Bitwarden" + }, + "communityForums": { + "message": "Explora els fòrums de la comunitat de Bitwarden" + }, + "contactSupport": { + "message": "Contacta amb l'assistència de Bitwarden" + }, "sync": { "message": "Sincronització" }, @@ -2115,7 +2124,7 @@ "message": "Com emplenar automàticament" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Seleccioneu un element d'aquesta pàgina o utilitzeu la drecera: $COMMAND$. També podeu provar l'emplenament automàtic en carregar la pàgina.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index daa3923fd30..8306bd3eaaa 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Nápověda a zpětná vazba" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Synchronizace" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 38f8b4bec47..f06a4ce1268 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Hjælp & feedback" }, + "helpCenter": { + "message": "Bitwarden Hjælpecenter" + }, + "communityForums": { + "message": "Tjek Bitwardens fællesskabsfora ud" + }, + "contactSupport": { + "message": "Kontakt Bitwarden-support" + }, "sync": { "message": "Synkronisér" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 075079e04cc..8c77dcd2b14 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -20,7 +20,7 @@ "message": "Anmelden" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise Single-Sign-On" }, "cancel": { "message": "Abbrechen" @@ -113,7 +113,7 @@ "message": "Zugangsdaten hinzufügen" }, "addItem": { - "message": "Neuer Eintrag" + "message": "Eintrag hinzufügen" }, "passwordHint": { "message": "Passwort-Hinweis" @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Hilfe & Feedback" }, + "helpCenter": { + "message": "Bitwarden Hilfezentrum" + }, + "communityForums": { + "message": "Bitwarden Community-Forum erkunden" + }, + "contactSupport": { + "message": "Bitwarden Kundendienst kontaktieren" + }, "sync": { "message": "Synchronisierung" }, @@ -282,7 +291,7 @@ "message": "Keine Einträge zum Anzeigen vorhanden." }, "itemInformation": { - "message": "Anmeldedaten Information" + "message": "Eintrags-Information" }, "username": { "message": "Nutzername" @@ -342,7 +351,7 @@ "message": "Identität verifizieren" }, "yourVaultIsLocked": { - "message": "Ihr Tresor ist gesperrt. Bestätigen Sie Ihre Identität um fortzufahren." + "message": "Dein Tresor ist gesperrt. Überprüfe deine Identität, um fortzufahren." }, "unlock": { "message": "Entsperren" @@ -498,10 +507,10 @@ "message": "Du kannst dein Master-Passwort im Bitwarden.com Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?" }, "twoStepLoginConfirmation": { - "message": "Mit der Zwei-Faktor-Authentifizierung wird dein Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, eine SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Seite jetzt öffnen?" + "message": "Mit der Zwei-Faktor-Authentifizierung wird dein Konto zusätzlich abgesichert, da jede Anmeldung mit einem anderen Gerät wie einem Sicherheitsschlüssel, einer Authentifizierungs-App, einer SMS, einem Anruf oder einer E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Webseite jetzt öffnen?" }, "editedFolder": { - "message": "Ordner bearbeitet" + "message": "Ordner gespeichert" }, "deleteFolderConfirmation": { "message": "Soll dieser Ordner wirklich gelöscht werden?" @@ -578,10 +587,10 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Danach fragen Zugangsdaten hinzuzufügen" + "message": "Nach dem Hinzufügen von Zugangsdaten fragen" }, "addLoginNotificationDesc": { - "message": "Wenn ein Eintrag nicht in deinem Tresor gefunden wurde, danach fragen." + "message": "Nach dem Hinzufügen eines Eintrags fragen, wenn dieser nicht in deinem Tresor gefunden wurde." }, "showCardsCurrentTab": { "message": "Karten auf Tab Seite anzeigen" @@ -880,13 +889,13 @@ "message": "Anmeldung nicht verfügbar" }, "noTwoStepProviders": { - "message": "Für dieses Konto wurde eine Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Browser unterstützt." + "message": "Für dieses Konto ist eine Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Browser unterstützt." }, "noTwoStepProviders2": { "message": "Bitte benutze einen unterstützten Browser (z.B. Chrome) und / oder füge zusätzliche Anbieter hinzu, die von mehr Browsern unterstützt werden (wie eine Authentifizierungs-App)." }, "twoStepOptions": { - "message": "Optionen für Zwei-Faktor Authentifizierung" + "message": "Optionen für Zwei-Faktor-Authentifizierung" }, "recoveryCodeDesc": { "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren." @@ -919,7 +928,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Benutze einen WebAuthn-kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen." + "message": "Benutze einen beliebigen WebAuthn kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen." }, "emailTitle": { "message": "E-Mail" @@ -952,7 +961,7 @@ "message": "URL des Identitätsservers" }, "notificationsUrl": { - "message": "URL des Benachrichtigungsserver" + "message": "URL des Benachrichtigungsservers" }, "iconsUrl": { "message": "URL des Icons-Servers" @@ -964,10 +973,10 @@ "message": "Auto-Ausfüllen beim Laden einer Seite aktivieren" }, "enableAutoFillOnPageLoadDesc": { - "message": "Wenn eine Zugangsmaske erkannt wird, automatisch Zugangsdaten einfügen während die Webseite lädt." + "message": "Wenn eine Anmeldemaske erkannt wird, die Zugangsdaten automatisch ausfüllen während die Webseite lädt." }, "experimentalFeature": { - "message": "Kompromittierte oder nicht vertrauenswürdige Webseiten können das automatische Ausfüllen beim Laden einer Seiten ausnutzen." + "message": "Kompromittierte oder nicht vertrauenswürdige Webseiten können das automatische Ausfüllen beim Laden der Seite ausnutzen." }, "learnMoreAboutAutofill": { "message": "Erfahre mehr über automatisches Ausfüllen" @@ -976,7 +985,7 @@ "message": "Standard Auto-Ausfüllen Einstellung für Login-Einträge" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Nachdem du das automatische Ausfüllen beim Laden der Seite aktiviert hast, kannst du die Funktion für einzelne Login-Einträge aktivieren oder deaktivieren. Dies ist die Standardeinstellung für Zugangsdaten-Einträge, die nicht separat konfiguriert wurden." + "message": "Du kannst das automatische Ausfüllen beim Laden der Seite für einzelne Zugangsdaten-Einträge in der Bearbeiten-Ansicht des Eintrags deaktivieren." }, "itemAutoFillOnPageLoad": { "message": "Automatisches Ausfüllen beim Laden der Seite (wenn in Optionen aktiviert)" @@ -1294,7 +1303,7 @@ "message": "Umschaltoptionen" }, "toggleCurrentUris": { - "message": "Aktuelle URIs ändern", + "message": "Aktuelle URIs umschalten", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1519,7 +1528,7 @@ "message": "Desktop-Sync-Überprüfung" }, "desktopIntegrationVerificationText": { - "message": "Bitte verifiziere, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: " + "message": "Bitte überprüfe, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: " }, "desktopIntegrationDisabledTitle": { "message": "Browser-Einbindung ist nicht aktiviert" @@ -1555,7 +1564,7 @@ "message": "Biometrie ist nicht aktiviert" }, "biometricsNotEnabledDesc": { - "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert ist." + "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert wird." }, "biometricsNotSupportedTitle": { "message": "Biometrie wird nicht unterstützt" @@ -1870,7 +1879,7 @@ "message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen." }, "vaultExportDisabled": { - "message": "Tresor-Export deaktiviert" + "message": "Tresor-Export nicht verfügbar" }, "personalVaultExportPolicyInEffect": { "message": "Eine oder mehrere Unternehmensrichtlinien hindern dich daran, deinen persönlichen Tresor zu exportieren." @@ -1909,10 +1918,10 @@ "message": "Zeichenzählung ein-/ausschalten" }, "sessionTimeout": { - "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut einzuloggen." + "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut anzumelden." }, "exportingPersonalVaultTitle": { - "message": "Einzelnen Tresor exportieren" + "message": "Persönlichen Tresor exportieren" }, "exportingPersonalVaultDescription": { "message": "Nur die einzelnen Tresor-Einträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresor-Einträge der Organisation werden nicht berücksichtigt.", @@ -1933,10 +1942,10 @@ "message": "Benutzernamen generieren" }, "usernameType": { - "message": "Benutzernamentyp" + "message": "Benutzernamenstyp" }, "plusAddressedEmail": { - "message": "Mit Plus adressierte E-Mail", + "message": "Mit Plus adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -2034,7 +2043,7 @@ } }, "lastSeenOn": { - "message": "zuletzt am $DATE$ gesehen", + "message": "zuletzt gesehen am: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2046,7 +2055,7 @@ "message": "Mit Master-Passwort anmelden" }, "loggingInAs": { - "message": "Einloggen als" + "message": "Anmelden als" }, "notYou": { "message": "Nicht du?" @@ -2079,7 +2088,7 @@ "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, "logInInitiated": { - "message": "Anmeldung initiiert" + "message": "Anmeldung eingeleitet" }, "exposedMasterPassword": { "message": "Kompromittiertes Master-Passwort" @@ -2112,7 +2121,7 @@ } }, "howToAutofill": { - "message": "So funktioniert Auto-Ausfüllen" + "message": "So funktioniert automatisches Ausfüllen" }, "autofillSelectInfo": { "message": "Wähle einen Eintrag von dieser Seite aus oder verwende das Tastaturkürzel: $COMMAND$. Du kannst es auch mit dem automatischen Ausfüllen beim Laden der Seite versuchen.", diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index c40216d83fc..f20ba2ec407 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Βοήθεια & Σχόλια" }, + "helpCenter": { + "message": "Κέντρο βοήθειας Bitwarden" + }, + "communityForums": { + "message": "Εξερευνήστε τα φόρουμ της κοινότητας του Bitwarden" + }, + "contactSupport": { + "message": "Επικοινωνία με την υποστήριξη Bitwarden" + }, "sync": { "message": "Συγχρονισμός" }, @@ -430,7 +439,7 @@ "message": "Απαιτείται ξανά ο κύριος κωδικός πρόσβασης." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον $VALUE$ χαρακτήρες.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2115,7 +2124,7 @@ "message": "Πώς να συμπληρώσετε αυτόματα" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Επιλέξτε ένα αντικείμενο από αυτή τη σελίδα ή χρησιμοποιήστε τη συντόμευση: $COMMAND$. Μπορείτε επίσης να δοκιμάσετε την αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 23fd86f1266..5d07831071b 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help centre" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index a3df85ce384..fb8780413e6 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index b515c605435..7ebef281217 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Ayuda y comentarios" }, + "helpCenter": { + "message": "Centro de ayuda de Bitwarden" + }, + "communityForums": { + "message": "Explorar los foros de la comunidad Bitwarden" + }, + "contactSupport": { + "message": "Contactar al soporte de Bitwarden" + }, "sync": { "message": "Sincronizar" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index bae9cbbabe4..0efab37844f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Abi ja tagasiside" }, + "helpCenter": { + "message": "Bitwardeni abikeskus" + }, + "communityForums": { + "message": "Ava Bitwardeni foorum" + }, + "contactSupport": { + "message": "Võta Bitwardeniga ühendust" + }, "sync": { "message": "Sünkroniseeri" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 934d4234db7..f5ee3bccf34 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Laguntza eta iritziak" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinkronizatu" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index dfd18625c85..00ff12fd4c8 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "کمک و بازخورد" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "همگام‌سازی" }, @@ -430,7 +439,7 @@ "message": "نوشتن مجدد کلمه عبور اصلی ضروری است." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "طول کلمه عبور اصلی باید حداقل $VALUE$ کاراکتر باشد.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2112,10 +2121,10 @@ } }, "howToAutofill": { - "message": "How to auto-fill" + "message": "نحوه پر کردن خودکار" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "یک مورد را از این صفحه انتخاب کنید یا از میانبر استفاده کنید: $COMMAND$. همچنین می‌توانید پر کردن خودکار را در بارگذاری صفحه امتحان کنید.", "placeholders": { "command": { "content": "$1", @@ -2124,22 +2133,22 @@ } }, "autofillSelectInfoNoCommand": { - "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." + "message": "یک مورد را از این صفحه انتخاب کنید یا یک میانبر در تنظیمات تنظیم کنید. همچنین می‌توانید پر کردن خودکار را در بارگذاری صفحه امتحان کنید." }, "gotIt": { - "message": "Got it" + "message": "متوجه شدم" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "تنظیمات پر کردن خودکار" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "میانبر صفحه کلید پر کردن خودکار" }, "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "message": "میانبر پر کردن خودکار تنظیم نشده است. این را در تنظیمات مرورگر تغییر دهید." }, "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "message": "میانبر پر کردن خودکار: $COMMAND$ است. این را در تنظیمات مرورگر تغییر دهید.", "placeholders": { "command": { "content": "$1", @@ -2148,7 +2157,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "میانبر پر کردن خودکار پیش‌فرض: $COMMAND$.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 0a3450e1fe8..94d44ba4c00 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Tuki ja palaute" }, + "helpCenter": { + "message": "Bitwardenin tukikeskus" + }, + "communityForums": { + "message": "Tutustu Bitwardenin yhteisöön" + }, + "contactSupport": { + "message": "Ota yhteyttä Bitwardenin tukeen" + }, "sync": { "message": "Synkronointi" }, @@ -2100,7 +2109,7 @@ "message": "Tärkeää:" }, "masterPasswordHint": { - "message": "Pääsalasanan palautus ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index d8fd63c41bd..7f015174f66 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Tulong at Mga Feedback" }, + "helpCenter": { + "message": "Bitwarden Tulong sentro" + }, + "communityForums": { + "message": "I-eksplorang Bitwarden komunidad na mga forum" + }, + "contactSupport": { + "message": "Kontakin ang Bitwarden suporta" + }, "sync": { "message": "Ikintal" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 491a124c0aa..5ab9b646f6b 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Aide et commentaires" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Synchroniser" }, diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index aa171074f5f..d2feca9ba9a 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index c45285c26a5..15e7ea5c141 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "עזרה ומשוב" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "סנכרן" }, diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index d6669814de6..c3333fbe83d 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & Feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "सिंक" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index dcd6837d37f..fc17ceefb52 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Pomoć i povratne informacije" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinkronizacija" }, diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 3121a837acf..5a28afef27b 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Súgó és visszajelzés" }, + "helpCenter": { + "message": "Bitwardsn Segítségközpont" + }, + "communityForums": { + "message": "Bitwarden közösségi fórum felfedezése" + }, + "contactSupport": { + "message": "Kapcsolatfelvétel a Bitwarden támogatással" + }, "sync": { "message": "Szinkronizálás" }, @@ -430,7 +439,7 @@ "message": "A mesterjelszó ismételt megadása kötelező." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A mesterjelszónak legalább $VALUE$ karakter hosszúnak kell lennie.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2115,7 +2124,7 @@ "message": "Az automatikus kitöltés működése" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Válasszunk ki egy elemet erről az oldalról vagy használjuk a billentyűparancsot: $COMMAND$. Kipróbálhatjuk az automatikus kitöltést is az oldal betöltésekor.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index e7fef9228b2..9a7505768c8 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Bantuan & Umpan Balik" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinkronisasi" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index d7b3141409e..c7eb53356f1 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Aiuto e segnalazioni" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sincronizza" }, @@ -2112,7 +2121,7 @@ } }, "howToAutofill": { - "message": "How to auto-fill" + "message": "Come utilizzare l'autocompletamento" }, "autofillSelectInfo": { "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", @@ -2124,22 +2133,22 @@ } }, "autofillSelectInfoNoCommand": { - "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." + "message": "Seleziona un elemento da questa pagina o imposta una scorciatoia nelle impostazioni. Puoi anche provare il completamento automatico al caricamento della pagina." }, "gotIt": { - "message": "Got it" + "message": "Capito" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Impostazioni di autocompletamento" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Scorciatoia da tastiera per l'autocompletamento" }, "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "message": "La scorciatoia per l'autocompletamento non è stata impostata. Impostala nelle impostazioni del browser." }, "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "message": "La scorciatoia per l'autocompletamento è: $COMMAND$. Cambiala nelle impostazioni del browser.", "placeholders": { "command": { "content": "$1", @@ -2148,7 +2157,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Scorciatoia per l'autocompletamento di default: $COMMAND$.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 02b7fd4e841..3980789e302 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "ヘルプ&フィードバック" }, + "helpCenter": { + "message": "Bitwarden ヘルプセンター" + }, + "communityForums": { + "message": "Bitwarden コミュニティフォーラムを探索" + }, + "contactSupport": { + "message": "Bitwarden サポートへの問い合わせ" + }, "sync": { "message": "同期" }, @@ -2115,7 +2124,7 @@ "message": "自動入力する方法" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "このページからアイテムを選択するか、ショートカット: $COMMAND$を使用します。ページの読み込み時に自動入力を試すこともできます。", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 73399132bc1..4bc15e5d277 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "დახმარება & გამოხმაურება" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "სინქრონიზაცია" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index aa171074f5f..d2feca9ba9a 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 770c4ee4ebd..3036c9b133e 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "ಸಹಾಯ ಪ್ರತಿಕ್ರಿಯೆ\n" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "ಸಿಂಕ್" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index d9295151bb0..315bc22cf21 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "도움말 및 의견" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "동기화" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 1b0c165b20c..527d0f192a8 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Pagalba ir atsiliepimai" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinchronizuoti" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index bf2d46fe40e..b4289b360e3 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Palīdzība un atsauksmes" }, + "helpCenter": { + "message": "Bitwarden palīdzības centrs" + }, + "communityForums": { + "message": "Izpētīt Bitwarden kopienas forumus" + }, + "contactSupport": { + "message": "Sazināties ar Bitwarden atbalstu" + }, "sync": { "message": "Sinhronizēt" }, @@ -430,7 +439,7 @@ "message": "Ir nepieciešama galvenās paroles atkārtota ievadīšana." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Galvenajai parolei ir jābūt vismaz $VALUE$ rakstzīmes garai.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -781,7 +790,7 @@ "message": "Tādas papildu divpakāpju pieteikšanās iespējas kā YubiKey, FIDO U2F un Duo." }, "ppremiumSignUpReports": { - "message": "Paroļu higiēnas, kontu veselības un datu pārkāpumu pārskati, lai uzturētu glabātavu drošu." + "message": "Paroļu higiēnas, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu." }, "ppremiumSignUpTotp": { "message": "TOTP apstiprinājuma koda (2FA) veidotājs glabātavas pieteikšanās vienumiem." @@ -1249,7 +1258,7 @@ "message": "Pārbaudīt, vai parole ir bijusi nopludināta." }, "passwordExposed": { - "message": "Šī parole datu pārkāpumos ir atklāta $VALUE$ reizi(es). To vajag mainīt.", + "message": "Šī parole datu noplūdēs ir atklāta $VALUE$ reizi(es). To vajadzētu nomainīt.", "placeholders": { "value": { "content": "$1", @@ -1258,7 +1267,7 @@ } }, "passwordSafe": { - "message": "Šī parole netika atrasta nevienā no zināmajiem datu pārkāpumiem. Tai vajadzētu būt droši izmantojamai." + "message": "Šī parole netika atrasta nevienā zināmā datu noplūdē. Tai vajadzētu būt droši izmantojamai." }, "baseDomain": { "message": "Pamata domēns", @@ -2085,16 +2094,16 @@ "message": "Noplūdusi galvenā parole" }, "exposedMasterPasswordDesc": { - "message": "Parole ir atrasta datu noplūdē. Jāizmanto spēcīga parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" + "message": "Parole atrasta datu noplūdē. Jāizmanto neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" }, "weakAndExposedMasterPassword": { "message": "Vāja un noplūdusi galvenā parole" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" + "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga un neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" }, "checkForBreaches": { - "message": "Pārbaudīt šo paroli pret zināmām datu noplūdēm" + "message": "Meklēt šo paroli zināmās datu noplūdēs" }, "important": { "message": "Svarīgi:" @@ -2115,7 +2124,7 @@ "message": "Kā automātiski aizpildīt" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Jāatlasa šīs lapas vienums vai jāizmanto īsceļš: $COMMAND$. Ir iespējams arī mēģināt automātiski aizpildīt pēc lapas ielādes.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 7f1e10f5ff0..ec920d1662c 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "സഹായവും അഭിപ്രായവും" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "സമന്വയിപ്പിക്കുക" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 30041c45df9..fef1af90aca 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Hjelp og tilbakemelding" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Synkroniser" }, diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index aa171074f5f..d2feca9ba9a 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 77334a741e1..fa437934d1a 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & reacties" }, + "helpCenter": { + "message": "Bitwarden Hulpcentrum" + }, + "communityForums": { + "message": "Ontdek Bitwarden community-forums" + }, + "contactSupport": { + "message": "Contacteer Bitwarden support" + }, "sync": { "message": "Synchroniseren" }, @@ -430,7 +439,7 @@ "message": "Type je hoofdwachtwoord opnieuw in." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Hoofdwachtwoord moet minstens $VALUE$ tekens lang zijn.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -2115,7 +2124,7 @@ "message": "Hoe automatisch aanvullen" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Kies een item van deze pagina of gebruik de snelkoppeling: $COMMAND$. Je kunt ook automatisch invullen bij het laden van een pagina proberen.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index aa171074f5f..d2feca9ba9a 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index fad47f34151..4ddb39fe6c9 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Pomoc i opinie" }, + "helpCenter": { + "message": "Centrum pomocy Bitwarden" + }, + "communityForums": { + "message": "Przeglądaj fora społeczności Bitwarden" + }, + "contactSupport": { + "message": "Skontaktuj się z pomocą techniczną Bitwarden" + }, "sync": { "message": "Synchronizacja" }, @@ -2115,7 +2124,7 @@ "message": "Jak autouzupełniać" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Wybierz element z tej strony lub użyj skrótu: $COMMAND$. Możesz również spróbować autouzupełniania przy wczytywaniu strony.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 6d37c251892..91eab60a11f 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Ajuda & Feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sincronizar" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index ed9aec52342..a0503b0862a 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Ajuda e feedback" }, + "helpCenter": { + "message": "Centrro de ajuda do Bitwarden" + }, + "communityForums": { + "message": "Explorar os fóruns da comunidade do Bitwarden" + }, + "contactSupport": { + "message": "Contactar o suporte do Bitwarden" + }, "sync": { "message": "Sincronizar" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 69a5e8eaeb5..38957b4cb70 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Ajutor și feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sincronizare" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index c0b49ce151c..a3eff30972b 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Помощь и обратная связь" }, + "helpCenter": { + "message": "Справочный центр Bitwarden" + }, + "communityForums": { + "message": "Посетите форумы сообщества Bitwarden" + }, + "contactSupport": { + "message": "Свяжитесь со службой поддержки Bitwarden" + }, "sync": { "message": "Синхронизация" }, @@ -1818,7 +1827,7 @@ "message": "Подтверждение мастер-пароля" }, "passwordConfirmationDesc": { - "message": "Это действие защищено. Для продолжения введите свой мастер-пароль, чтобы подтвердить свою личность." + "message": "Это действие защищено. Чтобы продолжить, введите ваш мастер-пароль для подтверждения личности." }, "emailVerificationRequired": { "message": "Требуется подтверждение электронной почты" diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 884427abe89..c0d5f4c1651 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "උදව් සහ ප්රතිපෝෂණ" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "සමමුහූර්තනය" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 1aebb5cba7c..e8b7097dace 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Pomoc a spätná väzba" }, + "helpCenter": { + "message": "Centrum pomoci Bitwarden" + }, + "communityForums": { + "message": "Prehliadať komunitné fóra Bitwardenu" + }, + "contactSupport": { + "message": "Kontaktovať podporu Bitwardenu" + }, "sync": { "message": "Synchronizácia" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index fa9e1b000d3..2bea4bac375 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Pomoč in povratne informacije" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinhronizacija" }, @@ -2064,7 +2073,7 @@ "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Fraza prstnega odtisa" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 3d6bfaa234d..fa88a0cdce9 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Помоћ и подршка" }, + "helpCenter": { + "message": "Bitwarden помоћни центар" + }, + "communityForums": { + "message": "Претражити форуми заједнице Bitwarden-а" + }, + "contactSupport": { + "message": "Контактирајте подршку Bitwarden-а" + }, "sync": { "message": "Синхронизација" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index cf68a86b850..ecff73a9c89 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Hjälp & Feedback" }, + "helpCenter": { + "message": "Bitwarden Hjälpcenter" + }, + "communityForums": { + "message": "Utforska Bitwardens communityforum" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Synkronisera" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index aa171074f5f..d2feca9ba9a 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index bc38703c90b..faa20d14e87 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Help & Feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "ซิงค์" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 58bb32e1165..ce2d21b8144 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Yardım ve geribildirim" }, + "helpCenter": { + "message": "Bitwarden yardım merkezi" + }, + "communityForums": { + "message": "Bitwarden forumlarını keşfedin" + }, + "contactSupport": { + "message": "Bitwarden destek ekibiyle iletişime geçin" + }, "sync": { "message": "Eşitle" }, @@ -430,7 +439,7 @@ "message": "Ana parolayı yeniden yazmalısınız." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Ana parola en az $VALUE$ karakter uzunluğunda olmalıdır.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -967,7 +976,7 @@ "message": "Sayfa yüklendiğinde giriş formu tespit edilirse otomatik olarak formu doldur." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Ele geçirilmiş veya güvenilmeyen web siteleri sayfa yüklenirken otomatik doldurmayı suistimal edebilir." }, "learnMoreAboutAutofill": { "message": "Otomatik doldurma hakkında bilgi alın" @@ -2115,7 +2124,7 @@ "message": "Otomatik doldurma nasıl yapılır?" }, "autofillSelectInfo": { - "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", + "message": "Bu sayfadan bir kayıt seçin veya $COMMAND$ kısayolunu kullanın. Sayfa yüklenirken otomatik doldurmayı da deneyebilirsiniz.", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index f71dce8ff71..863ad14da14 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Допомога і зворотний зв'язок" }, + "helpCenter": { + "message": "Центр допомоги Bitwarden" + }, + "communityForums": { + "message": "Форуми спільноти Bitwarden" + }, + "contactSupport": { + "message": "Звернутися в службу підтримки Bitwarden" + }, "sync": { "message": "Синхронізація" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index ce9c7b84405..05d52d180e1 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "Trợ giúp & phản hồi" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Đồng bộ" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index a59ed8aeddb..a323abd57c9 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "帮助与反馈" }, + "helpCenter": { + "message": "Bitwarden 帮助中心" + }, + "communityForums": { + "message": "探索 Bitwarden 社区论坛" + }, + "contactSupport": { + "message": "联系 Bitwarden 支持" + }, "sync": { "message": "同步" }, @@ -2064,7 +2073,7 @@ "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "指纹短语" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." @@ -2073,13 +2082,13 @@ "message": "重新发送通知" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "查看所有登录选项" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "通知已发送到您的设备。" }, "logInInitiated": { - "message": "Log in initiated" + "message": "登录已发起" }, "exposedMasterPassword": { "message": "暴露的主密码" @@ -2133,7 +2142,7 @@ "message": "自动填充设置" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "自动填充键盘快捷键" }, "autofillShortcutNotSet": { "message": "The auto-fill shortcut is not set. Change this in the browser's settings." @@ -2148,7 +2157,7 @@ } }, "autofillShortcutTextSafari": { - "message": "默认自动填充快捷键: $COMMAND$", + "message": "默认自动填充快捷键:$COMMAND$", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index aeb877cac90..0d07545bd51 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -195,6 +195,15 @@ "helpFeedback": { "message": "協助與意見反應" }, + "helpCenter": { + "message": "Bitwarden 說明中心" + }, + "communityForums": { + "message": "瀏覽 Bitwarden 社群論壇" + }, + "contactSupport": { + "message": "連絡 Bitwarden 客戶支援" + }, "sync": { "message": "同步" }, @@ -430,7 +439,7 @@ "message": "必須再次輸入主密碼。" }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "主密碼需要至少 $VALUE$ 個字元。", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -970,7 +979,7 @@ "message": "Compromised or untrusted websites can exploit auto-fill on page load." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "進一步瞭解「自動填入」功能" }, "defaultAutoFillOnPageLoad": { "message": "登入項目的預設自動填入設定" @@ -2058,28 +2067,28 @@ "message": "記住電子郵件地址" }, "loginWithDevice": { - "message": "Log in with device" + "message": "使用裝置登入" }, "loginWithDeviceEnabledInfo": { "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "指紋短語" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." }, "resendNotification": { - "message": "Resend notification" + "message": "重新傳送通知" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "檢視所有登入選項" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "已傳送通知至您的裝置。" }, "logInInitiated": { - "message": "Log in initiated" + "message": "登入已起始" }, "exposedMasterPassword": { "message": "已暴露的主密碼" @@ -2112,7 +2121,7 @@ } }, "howToAutofill": { - "message": "How to auto-fill" + "message": "如何自動填入" }, "autofillSelectInfo": { "message": "Select an item from this page or use the shortcut: $COMMAND$. You can also try auto-fill on page load.", @@ -2127,13 +2136,13 @@ "message": "Select an item from this page or set a shortcut in settings. You can also try auto-fill on page load." }, "gotIt": { - "message": "Got it" + "message": "我知道了" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "自動填入設定" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "自動填入鍵盤快速鍵" }, "autofillShortcutNotSet": { "message": "The auto-fill shortcut is not set. Change this in the browser's settings." @@ -2148,7 +2157,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "預設自動填入快速鍵:$COMMAND$", "placeholders": { "command": { "content": "$1", diff --git a/apps/browser/store/locales/de/copy.resx b/apps/browser/store/locales/de/copy.resx index 93b0cd99c29..026999c3107 100644 --- a/apps/browser/store/locales/de/copy.resx +++ b/apps/browser/store/locales/de/copy.resx @@ -126,9 +126,9 @@ Bitwarden, Inc. ist die Muttergesellschaft von 8bit Solutions LLC. -NAMED BEST PASSWORD MANAGER DY THE VERGE, U.S. NEWS & WORLD REPORT, CNET UND MORE. +AUSGEZEICHNET ALS BESTER PASSWORTMANAGER VON THE VERGE, U.S. NEWS & WORLD REPORT, CNET UND ANDEREN. -Verwalte, speichere, sichere und teile unbegrenzte Passwörter von überall auf unbegrenzten Geräten. Bitwarden liefert Open-Source-Passwort-Management-Lösungen für jedermann, sei es zu Hause, am Arbeitsplatz oder unterwegs. +Verwalte, speichere, sichere und teile unbegrenzte Passwörter von überall auf unbegrenzten Geräten. Bitwarden liefert Open-Source-Passwort-Management-Lösungen für alle, sei es zu Hause, am Arbeitsplatz oder unterwegs. Generiere starke, einzigartige und zufällige Passwörter basierend auf Sicherheitsanforderungen für jede Website, die du häufig besuchst. @@ -145,10 +145,10 @@ Integrierter Passwortgenerator Generiere starke, einzigartige und zufällige Passwörter basierend auf Sicherheitsanforderungen für jede Website, die du häufig besuchst. Globale Übersetzungen -Bitwarden Übersetzungen existieren in 40 Sprachen und wachsen dank unserer globalen Gemeinschaft. +Bitwarden Übersetzungen existieren in 40 Sprachen und wachsen dank unserer globalen Community. Plattformübergreifende Anwendungen -Sichere und teile vertrauliche Daten in deinem Bitwarden Vault von jedem Browser, jedem mobilen Gerät oder Desktop-Betriebssystem und mehr. +Sichere und teile vertrauliche Daten in deinem Bitwarden Tresor von jedem Browser, jedem mobilen Gerät oder Desktop-Betriebssystem und mehr. From 6784c883f0a73c2647b23494ba69fc3b22041778 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:32:42 +0100 Subject: [PATCH 111/232] Autosync the updated translations (#4917) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/be/messages.json | 2 +- apps/desktop/src/locales/de/messages.json | 114 +++++++++---------- apps/desktop/src/locales/fa/messages.json | 2 +- apps/desktop/src/locales/fi/messages.json | 2 +- apps/desktop/src/locales/fr/messages.json | 6 +- apps/desktop/src/locales/lv/messages.json | 12 +- apps/desktop/src/locales/nb/messages.json | 22 ++-- apps/desktop/src/locales/ru/messages.json | 2 +- apps/desktop/src/locales/zh_CN/messages.json | 2 +- 9 files changed, 82 insertions(+), 82 deletions(-) diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index d5032c38071..c739283d516 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -542,7 +542,7 @@ "message": "Неабходна паўторна ўвесці асноўны пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Асноўны пароль павінен змяшчаць прынамсі $VALUE$ сімвалаў.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 623708d29e7..c6ccb20de1e 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -455,7 +455,7 @@ "description": "Search item type" }, "newAttachment": { - "message": "Anhang hinzufügen" + "message": "Neuen Anhang hinzufügen" }, "deletedAttachment": { "message": "Anhang gelöscht" @@ -464,7 +464,7 @@ "message": "Bist du sicher, dass du diesen Anhang löschen möchtest?" }, "attachmentSaved": { - "message": "Der Anhang wurde gespeichert." + "message": "Anhang gespeichert" }, "file": { "message": "Datei" @@ -630,7 +630,7 @@ "message": "Stecke deinen Sicherheitsschlüssel in einen USB-Anschluss deines Computers. Falls er einen Knopf hat, drücke diesen." }, "recoveryCodeDesc": { - "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutzen Sie Ihren Wiederherstellungscode, um alle Zwei-Faktor Anbieter in Ihrem Konto zu deaktivieren." + "message": "Zugang zu allen Zwei-Faktor-Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor-Anbieter in deinem Konto zu deaktivieren." }, "recoveryCodeTitle": { "message": "Wiederherstellungscode" @@ -660,7 +660,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Benutze einen WebAuthn-kompatiblen Sicherheitsschlüssel um auf dein Konto zuzugreifen." + "message": "Benutze einen beliebigen WebAuthn kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen." }, "emailTitle": { "message": "E-Mail" @@ -669,10 +669,10 @@ "message": "Bestätigungscodes werden dir per E-Mail zugesandt." }, "loginUnavailable": { - "message": "Login nicht verfügbar" + "message": "Anmeldung nicht verfügbar" }, "noTwoStepProviders": { - "message": "Dieses Konto hat eine aktive Zwei-Faktor-Authentifizierung, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Gerät unterstützt." + "message": "Für dieses Konto ist eine aktive Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Gerät unterstützt." }, "noTwoStepProviders2": { "message": "Bitte wähle zusätzliche Dienste, die über mehrere Geräte funktionieren (zum Beispiel eine Authentifizierungs-App)." @@ -696,22 +696,22 @@ "message": "Server-URL" }, "apiUrl": { - "message": "API-Server-URL" + "message": "API Server-URL" }, "webVaultUrl": { - "message": "Web-Tresor-Server-URL" + "message": "URL des Web-Tresor-Servers" }, "identityUrl": { - "message": "Identitätsserver-URL" + "message": "URL des Identitätsservers" }, "notificationsUrl": { - "message": "Benachrichtigungsserver-URL" + "message": "URL des Benachrichtigungsservers" }, "iconsUrl": { - "message": "Icons-Server-URL" + "message": "URL des Icons-Servers" }, "environmentSaved": { - "message": "Die URLs der Umgebung wurden gespeichert." + "message": "URLs der Umgebung gespeichert" }, "ok": { "message": "Ok" @@ -744,13 +744,13 @@ "message": "Abmelden" }, "addNewLogin": { - "message": "Login hinzufügen" + "message": "Neue Zugangsdaten" }, "addNewItem": { - "message": "Neuen Eintrag hinzufügen" + "message": "Neuer Eintrag" }, "addNewFolder": { - "message": "Neuen Ordner hinzufügen" + "message": "Neuer Ordner" }, "view": { "message": "Ansicht" @@ -783,7 +783,7 @@ "message": "Folge uns" }, "syncVault": { - "message": "Tresor jetzt synchronisieren" + "message": "Tresor synchronisieren" }, "changeMasterPass": { "message": "Master-Passwort ändern" @@ -792,7 +792,7 @@ "message": "Du kannst dein Master-Passwort im bitwarden.com-Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?" }, "fingerprintPhrase": { - "message": "Prüfschlüssel", + "message": "Fingerabdruck-Phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { @@ -803,7 +803,7 @@ "message": "Web-Tresor öffnen" }, "getMobileApp": { - "message": "Mobile App laden" + "message": "Mobile App installieren" }, "getBrowserExtension": { "message": "Browser-Erweiterung installieren" @@ -837,7 +837,7 @@ "message": "Ungültiges Master-Passwort" }, "twoStepLoginConfirmation": { - "message": "Mit Zwei-Faktor-Authentifizierung wird dein Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Zwei-Faktor-Authentifizierung kann im bitwarden.com-Web-Tresor aktiviert werden. Möchtest du die Seite jetzt öffnen?" + "message": "Mit der Zwei-Faktor-Authentifizierung wird dein Konto zusätzlich abgesichert, da jede Anmeldung mit einem anderen Gerät wie einem Sicherheitsschlüssel, einer Authentifizierungs-App, einer SMS, einem Anruf oder einer E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Webseite jetzt öffnen?" }, "twoStepLogin": { "message": "Zwei-Faktor-Authentifizierung" @@ -926,7 +926,7 @@ "message": "Bei minimiertem Fenster stattdessen ein Symbol in der Menüleiste anzeigen." }, "enableCloseToTray": { - "message": "In den Infobereich minimieren" + "message": "In die Taskleiste minimieren" }, "enableCloseToTrayDesc": { "message": "Zeige ein Symbol in der Taskleiste, wenn das Fenster geschlossen wird." @@ -938,7 +938,7 @@ "message": "Beim Schließen des Fensters stattdessen ein Symbol in der Menüleiste anzeigen." }, "enableTray": { - "message": "Taskleisten-Symbol einschalten" + "message": "Taskleisten-Symbol anzeigen" }, "enableTrayDesc": { "message": "Dauerhaft ein Symbol in der Taskleiste anzeigen." @@ -968,10 +968,10 @@ "message": "Das Bitwarden-Symbol im Dock anzeigen, auch wenn es in die Menüleiste minimiert wird." }, "confirmTrayTitle": { - "message": "Tray deaktivieren bestätigen" + "message": "In Taskleiste minimieren bestätigen" }, "confirmTrayDesc": { - "message": "Deaktivieren dieser Einstellung wird auch alle anderen Tray-bezogenen Einstellungen deaktivieren." + "message": "Durch Deaktivieren dieser Einstellung werden auch alle anderen Taskleisten-bezogenen Einstellungen deaktiviert." }, "language": { "message": "Sprache" @@ -998,7 +998,7 @@ "description": "Copy to clipboard" }, "checkForUpdates": { - "message": "Auf Updates prüfen …" + "message": "Nach Aktualisierungen suchen…" }, "version": { "message": "Version $VERSION_NUM$", @@ -1010,7 +1010,7 @@ } }, "restartToUpdate": { - "message": "Neu starten, um zu updaten" + "message": "Neu starten, um zu aktualisieren" }, "restartToUpdateDesc": { "message": "Version $VERSION_NUM$ steht zur Installation bereit. Du musst Bitwarden neustarten, um die Installation abzuschließen. Möchtest du jetzt neustarten und updaten?", @@ -1037,13 +1037,13 @@ "message": "Derzeit gibt es keine Updates. Du verwendest die neueste Version." }, "updateError": { - "message": "Update-Fehler" + "message": "Aktualisierungsfehler" }, "unknown": { "message": "Unbekannt" }, "copyUsername": { - "message": "Benutzerrname kopieren" + "message": "Benutzernamen kopieren" }, "copyNumber": { "message": "Nummer kopieren", @@ -1069,7 +1069,7 @@ "message": "Du hast derzeit keine Premium-Mitgliedschaft." }, "premiumSignUpAndGet": { - "message": "Werde Premium-Mitglied und erhalte dafür:" + "message": "Melde dich für eine Premium-Mitgliedschaft an und erhalte dafür:" }, "premiumSignUpStorage": { "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." @@ -1114,7 +1114,7 @@ "message": "Aktualisierung abgeschlossen" }, "passwordHistory": { - "message": "Kennwort-Historie" + "message": "Passwortverlauf" }, "clear": { "message": "Leeren", @@ -1147,7 +1147,7 @@ "message": "Verkleinern" }, "resetZoom": { - "message": "Zoom zurücksetzen" + "message": "Originalgröße" }, "toggleFullScreen": { "message": "Vollbildmodus umschalten" @@ -1266,7 +1266,7 @@ "description": "Text for a button that toggles the visibility of the window. Shows the window when it is hidden or hides the window if it is currently open." }, "hideToTray": { - "message": "Nur in der Taskleiste anzeigen" + "message": "In Taskleiste verstecken" }, "alwaysOnTop": { "message": "Immer im Vordergrund", @@ -1414,7 +1414,7 @@ "message": "Unten fortfahren, um dein Konto und alle Tresor-Daten zu löschen." }, "deleteAccountWarning": { - "message": "Die Kontolöschung ist permanent. Sie kann nicht rückgängig gemacht werden." + "message": "Die Kontolöschung ist dauerhaft. Sie kann nicht rückgängig gemacht werden." }, "accountDeleted": { "message": "Konto gelöscht" @@ -1438,7 +1438,7 @@ "message": "Du musst mindestens eine Sammlung auswählen." }, "premiumUpdated": { - "message": "Du hast ein Upgrade auf Premium durchgeführt." + "message": "Du hast ein Premium-Abo aktiviert." }, "restore": { "message": "Wiederherstellen" @@ -1472,10 +1472,10 @@ "message": "Aktion bei Tresor-Timeout" }, "vaultTimeoutActionLockDesc": { - "message": "Ein gesperrter Tresor erfordert die erneute Eingabe des Master-Passworts, um abermals darauf zugreifen zu können." + "message": "Um wieder auf deinen Tresor zugreifen zu können, ist dein Master-Passwort oder eine andere Entsperr-Methode erforderlich." }, "vaultTimeoutActionLogOutDesc": { - "message": "Ein ausgeloggter Tresor erfordert eine Neu-Authentifizierung, um erneut darauf zugreifen zu können." + "message": "Um wieder auf deinen Tresor zugreifen zu können, ist eine erneute Authentifizierung erforderlich." }, "lock": { "message": "Sperren", @@ -1516,7 +1516,7 @@ "message": "Timeout-Aktion bestätigen" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise Single-Sign-On" }, "setMasterPassword": { "message": "Master-Passwort festlegen" @@ -1579,10 +1579,10 @@ "message": "Die Nutzungsbedingungen und Datenschutzerklärung wurden nicht akzeptiert." }, "enableBrowserIntegration": { - "message": "Browser-Integration aktivieren" + "message": "Browser-Einbindung aktivieren" }, "enableBrowserIntegrationDesc": { - "message": "Die Browser-Integration wird für Biometrie im Browser verwendet." + "message": "Die Browser-Einbindung wird für Biometrie im Browser verwendet." }, "enableDuckDuckGoBrowserIntegration": { "message": "DuckDuckGo Browser-Einbindung erlauben" @@ -1594,19 +1594,19 @@ "message": "Browser-Einbindung wird nicht unterstützt" }, "browserIntegrationMasOnlyDesc": { - "message": "Leider wird die Browser-Integration derzeit nur in der Mac App Store Version unterstützt." + "message": "Leider wird die Browsers-Einbindung derzeit nur in der Mac App Store Version unterstützt." }, "browserIntegrationWindowsStoreDesc": { - "message": "Leider wird die Browser-Integration derzeit nicht in der Windows Store Version unterstützt." + "message": "Leider wird die Browser-Einbindung derzeit nicht in der Microsoft Store Version unterstützt." }, "browserIntegrationLinuxDesc": { "message": "Leider wird die Browser-Einbindung derzeit nicht in der Linux Version unterstützt." }, "enableBrowserIntegrationFingerprint": { - "message": "Überprüfung für Browser-Integration verlangen" + "message": "Überprüfung für Browser-Einbindung verlangen" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Eine zusätzliche Sicherheitsebene aktivieren, indem eine Prüfschlüssel-Validierung verlangt wird, wenn eine Verbindung zwischen deiner Desktop-Anwendung und dem Browser aufgebaut wird. Nach Aktivierung ist bei jedem Verbindungsaufbau ein Benutzer-Eingriff erforderlich." + "message": "Eine zusätzliche Sicherheitsebene hinzufügen, indem eine Fingerabdruck-Phrasen-Validierung verlangt wird, wenn eine Verbindung zwischen deiner Desktop-Anwendung und dem Browser aufgebaut wird. Nach Aktivierung ist bei jedem Verbindungsaufbau ein Benutzer-Eingriff und Verifizierung erforderlich." }, "approve": { "message": "Genehmigen" @@ -1630,13 +1630,13 @@ "message": "Möchtest du diese Anfrage genehmigen?" }, "verifyNativeMessagingConnectionWarning": { - "message": "Wenn du diese Anfrage nicht initiiert hast, genehmige sie nicht." + "message": "Wenn du diese Anfrage nicht veranlasst hast, genehmige sie nicht." }, "biometricsNotEnabledTitle": { "message": "Biometrie ist nicht aktiviert" }, "biometricsNotEnabledDesc": { - "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert ist." + "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert wird." }, "personalOwnershipSubmitError": { "message": "Aufgrund einer Unternehmensrichtlinie darfst du keine Einträge in deinem persönlichen Tresor speichern. Ändere die Eigentümer-Option in eine Organisation und wähle aus den verfügbaren Sammlungen." @@ -1725,7 +1725,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send bearbeitet", + "message": "Send gespeichert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { @@ -1740,7 +1740,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Send erstellen", + "message": "Neues Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -1776,7 +1776,7 @@ "message": "Den Link zum Teilen dieses Sends beim Speichern in meine Zwischenablage kopieren." }, "sendDisabled": { - "message": "Send deaktiviert", + "message": "Send gelöscht", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1881,7 +1881,7 @@ "message": "Master-Passwort entfernen" }, "removedMasterPassword": { - "message": "Master-Passwort entfernt." + "message": "Master-Passwort entfernt" }, "convertOrganizationEncryptionDesc": { "message": "$ORGANIZATION$ verwendet SSO mit einem selbst gehosteten Schlüsselserver. Ein Master-Passwort ist nicht mehr erforderlich, damit sich Mitglieder dieser Organisation anmelden können.", @@ -1917,7 +1917,7 @@ "message": "App-Einstellungen (Alle Konten)" }, "accountSwitcherLimitReached": { - "message": "Kontolimit erreicht. Abmelden von einem Konto, um ein anderes hinzuzufügen." + "message": "Kontolimit erreicht. Von einem Konto abmelden, um ein anderes hinzuzufügen." }, "settingsTitle": { "message": "App-Einstellungen für $EMAIL$", @@ -1941,7 +1941,7 @@ "message": "Persönlichen Tresor exportieren" }, "exportingPersonalVaultDescription": { - "message": "Nur die persönlichen Tresoreinträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", + "message": "Nur die persönlichen Tresor-Einträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresor-Einträge der Organisation werden nicht berücksichtigt.", "placeholders": { "email": { "content": "$1", @@ -1959,7 +1959,7 @@ "message": "Generator" }, "whatWouldYouLikeToGenerate": { - "message": "Was möchtest du erzeugen?" + "message": "Was möchtest du generieren?" }, "passwordType": { "message": "Passworttyp" @@ -1968,13 +1968,13 @@ "message": "Benutzername neu generieren" }, "generateUsername": { - "message": "Benutzernamen erzeugen" + "message": "Benutzernamen generieren" }, "usernameType": { "message": "Benutzernamentyp" }, "plusAddressedEmail": { - "message": "Mit Plus adressierte E-Mail", + "message": "Mit Plus adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -2033,7 +2033,7 @@ "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." }, "neverLockWarning": { - "message": "Bist du sicher, dass du die Option \"Nie\" verwenden möchten? Durch das Setzen der Sperroptionen zu \"Nie\" wird der Verschlüsselungsschlüssel deines Tresors auf deinem Gerät gespeichert. Wenn du diese Option verwendest, solltest du sicherstellen, dass dein Gerät ausreichend geschützt ist." + "message": "Bist du sicher, dass du die Option \"Nie\" verwenden möchtest? Durch das Setzen der Sperroptionen zu \"Nie\" wird der Verschlüsselungscode deines Tresors auf deinem Gerät gespeichert. Wenn du diese Option verwendest, solltest du sicherstellen, dass dein Gerät ausreichend geschützt ist." }, "cardBrandMir": { "message": "Mir" @@ -2045,7 +2045,7 @@ "message": "Mit Master-Passwort anmelden" }, "loggingInAs": { - "message": "Einloggen als" + "message": "Anmelden als" }, "rememberEmail": { "message": "E-Mail-Adresse merken" @@ -2069,7 +2069,7 @@ "message": "Mit einem anderen Gerät anmelden" }, "logInInitiated": { - "message": "Anmeldung initiiert" + "message": "Anmeldung eingeleitet" }, "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." @@ -2106,7 +2106,7 @@ } }, "deviceType": { - "message": "Geräte-Typ" + "message": "Gerätetyp" }, "ipAddress": { "message": "IP-Adresse" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 832b4c89bc5..fa3aa3d6b34 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -542,7 +542,7 @@ "message": "نوشتن مجدد کلمه عبور اصلی ضروری است." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "طول کلمه عبور اصلی باید حداقل $VALUE$ کاراکتر باشد.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 66e0dc7400f..18708bc3e66 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2191,7 +2191,7 @@ "message": "Tärkeää:" }, "masterPasswordHint": { - "message": "Pääsalasanan palautus ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index d497bcf3645..6469b365930 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -392,7 +392,7 @@ "message": "Re-générer un mot de passe" }, "copyPassword": { - "message": "Copier mot de passe" + "message": "Copier le mot de passe" }, "copyUri": { "message": "Copier l'URI" @@ -491,7 +491,7 @@ "message": "Dossier supprimé" }, "loginOrCreateNewAccount": { - "message": "Identifiez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." + "message": "Connectez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." }, "createAccount": { "message": "Créer un compte" @@ -1043,7 +1043,7 @@ "message": "Inconnu" }, "copyUsername": { - "message": "Copier nom d'utilisateur" + "message": "Copier le nom d'utilisateur" }, "copyNumber": { "message": "Copier le numéro", diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 30ffdc2919f..2e13d75ecfe 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -542,7 +542,7 @@ "message": "Ir nepieciešama galvenās paroles atkārtota ievadīšana." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Galvenajai parolei ir jābūt vismaz $VALUE$ rakstzīmes garai.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1078,7 +1078,7 @@ "message": "Tādas papildu divpakāpju pieteikšanās iespējas kā YubiKey, FIDO U2F un Duo." }, "premiumSignUpReports": { - "message": "Paroles higiēnas, konta stāvokļa un datu pārkāpumu pārskati, lai jūsu glabātuve būtu drošībā." + "message": "Paroļu higiēnas, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu." }, "premiumSignUpTotp": { "message": "TOTP apstiprinājuma koda (2FA) veidotājs glabātavas pieteikšanās vienumiem." @@ -1207,7 +1207,7 @@ "message": "Pārbaudīt, vai parole ir bijusi nopludināta." }, "passwordExposed": { - "message": "Šī parole datu pārkāpumos ir atklāta $VALUE$ reizi(es). To vajag mainīt.", + "message": "Šī parole datu noplūdēs ir atklāta $VALUE$ reizi(es). To vajadzētu nomainīt.", "placeholders": { "value": { "content": "$1", @@ -1216,7 +1216,7 @@ } }, "passwordSafe": { - "message": "Šī parole netika atrasta nevienā no zināmajiem datu pārkāpumiem. Tai vajadzētu būt droši izmantojamai." + "message": "Šī parole netika atrasta nevienā zināmā datu noplūdē. Tai vajadzētu būt droši izmantojamai." }, "baseDomain": { "message": "Pamata domēns", @@ -2176,7 +2176,7 @@ "message": "Noplūdusi galvenā parole" }, "exposedMasterPasswordDesc": { - "message": "Parole atrasta datu noplūdē. Jāizmanto neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot atklātu paroli?" + "message": "Parole atrasta datu noplūdē. Jāizmanto neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" }, "weakAndExposedMasterPassword": { "message": "Vāja un noplūdusi galvenā parole" @@ -2185,7 +2185,7 @@ "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga un neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" }, "checkForBreaches": { - "message": "Pārbaudīt šo paroli pret zināmiem datu pārkāpumiem" + "message": "Meklēt šo paroli zināmās datu noplūdēs" }, "important": { "message": "Svarīgi:" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index c4ad665a406..a3d7b99e2e3 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -1790,10 +1790,10 @@ "message": "Deaktivert" }, "removePassword": { - "message": "Remove password" + "message": "Fjern passord" }, "removedPassword": { - "message": "Password removed" + "message": "Passord fjernet" }, "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" @@ -2109,19 +2109,19 @@ "message": "Device Type" }, "ipAddress": { - "message": "IP Address" + "message": "IP-adresse" }, "time": { - "message": "Time" + "message": "Tid" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Bekreft innlogging" }, "denyLogIn": { - "message": "Deny login" + "message": "Avslå innlogging" }, "approveLoginRequests": { - "message": "Approve login requests" + "message": "Godkjenn innloggingsforespørsler" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2143,7 +2143,7 @@ "message": "Just now" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Forespurt for $MINUTES$ minutter siden", "placeholders": { "minutes": { "content": "$1", @@ -2152,10 +2152,10 @@ } }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Innloggingsforespørselen er allerede utløpt." }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Denne forespørselen er ikke lenger gyldig." }, "approveLoginRequestDesc": { "message": "Use this device to approve login requests made from other devices." @@ -2188,7 +2188,7 @@ "message": "Check known data breaches for this password" }, "important": { - "message": "Important:" + "message": "Viktig:" }, "masterPasswordHint": { "message": "Your master password cannot be recovered if you forget it!" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index a409a0e0c0b..9dd2cf573e7 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -1829,7 +1829,7 @@ "message": "Подтверждение мастер-пароля" }, "passwordConfirmationDesc": { - "message": "Это действие защищено. Для продолжения введите свой мастер-пароль, чтобы подтвердить свою личность." + "message": "Это действие защищено. Чтобы продолжить, введите ваш мастер-пароль для подтверждения личности." }, "updatedMasterPassword": { "message": "Мастер-пароль обновлен" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index c4c485de778..ece162c97f0 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -542,7 +542,7 @@ "message": "必须填写确认主密码。" }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "主密码至少需要 $VALUE$ 个字符。", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { From f717c3d619a955c870fe006d8c3823693c72594a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 12:47:52 +0100 Subject: [PATCH 112/232] Autosync the updated translations (#4916) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 258 +++++++--- apps/web/src/locales/ar/messages.json | 382 ++++++++------ apps/web/src/locales/az/messages.json | 272 ++++++---- apps/web/src/locales/be/messages.json | 438 +++++++++------- apps/web/src/locales/bg/messages.json | 258 +++++++--- apps/web/src/locales/bn/messages.json | 258 +++++++--- apps/web/src/locales/bs/messages.json | 258 +++++++--- apps/web/src/locales/ca/messages.json | 258 +++++++--- apps/web/src/locales/cs/messages.json | 258 +++++++--- apps/web/src/locales/da/messages.json | 258 +++++++--- apps/web/src/locales/de/messages.json | 346 ++++++++----- apps/web/src/locales/el/messages.json | 258 +++++++--- apps/web/src/locales/en_GB/messages.json | 258 +++++++--- apps/web/src/locales/en_IN/messages.json | 258 +++++++--- apps/web/src/locales/eo/messages.json | 258 +++++++--- apps/web/src/locales/es/messages.json | 258 +++++++--- apps/web/src/locales/et/messages.json | 258 +++++++--- apps/web/src/locales/eu/messages.json | 258 +++++++--- apps/web/src/locales/fa/messages.json | 262 ++++++---- apps/web/src/locales/fi/messages.json | 264 ++++++---- apps/web/src/locales/fil/messages.json | 608 +++++++++++++---------- apps/web/src/locales/fr/messages.json | 262 ++++++---- apps/web/src/locales/gl/messages.json | 258 +++++++--- apps/web/src/locales/he/messages.json | 258 +++++++--- apps/web/src/locales/hi/messages.json | 258 +++++++--- apps/web/src/locales/hr/messages.json | 258 +++++++--- apps/web/src/locales/hu/messages.json | 282 +++++++---- apps/web/src/locales/id/messages.json | 258 +++++++--- apps/web/src/locales/it/messages.json | 396 +++++++++------ apps/web/src/locales/ja/messages.json | 272 ++++++---- apps/web/src/locales/ka/messages.json | 258 +++++++--- apps/web/src/locales/km/messages.json | 258 +++++++--- apps/web/src/locales/kn/messages.json | 258 +++++++--- apps/web/src/locales/ko/messages.json | 258 +++++++--- apps/web/src/locales/lv/messages.json | 300 +++++++---- apps/web/src/locales/ml/messages.json | 258 +++++++--- apps/web/src/locales/nb/messages.json | 258 +++++++--- apps/web/src/locales/ne/messages.json | 258 +++++++--- apps/web/src/locales/nl/messages.json | 258 +++++++--- apps/web/src/locales/nn/messages.json | 258 +++++++--- apps/web/src/locales/pl/messages.json | 262 ++++++---- apps/web/src/locales/pt_BR/messages.json | 258 +++++++--- apps/web/src/locales/pt_PT/messages.json | 258 +++++++--- apps/web/src/locales/ro/messages.json | 258 +++++++--- apps/web/src/locales/ru/messages.json | 278 +++++++---- apps/web/src/locales/si/messages.json | 258 +++++++--- apps/web/src/locales/sk/messages.json | 258 +++++++--- apps/web/src/locales/sl/messages.json | 258 +++++++--- apps/web/src/locales/sr/messages.json | 258 +++++++--- apps/web/src/locales/sr_CS/messages.json | 258 +++++++--- apps/web/src/locales/sv/messages.json | 260 ++++++---- apps/web/src/locales/te/messages.json | 258 +++++++--- apps/web/src/locales/th/messages.json | 258 +++++++--- apps/web/src/locales/tr/messages.json | 258 +++++++--- apps/web/src/locales/uk/messages.json | 258 +++++++--- apps/web/src/locales/vi/messages.json | 258 +++++++--- apps/web/src/locales/zh_CN/messages.json | 264 ++++++---- apps/web/src/locales/zh_TW/messages.json | 258 +++++++--- 58 files changed, 10718 insertions(+), 5266 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 04b7fbbd20d..670f499d566 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Werk lisensie by" }, - "updatedLicense": { - "message": "Lisensie bygewerk" - }, "manageSubscription": { "message": "Bestuur intekening" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 62d51cdc336..506a9d61bc0 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -134,7 +134,7 @@ "message": "الآنسة" }, "mx": { - "message": "ماكس" + "message": "محايد" }, "dr": { "message": "د" @@ -306,10 +306,10 @@ "message": "Search organization" }, "searchMembers": { - "message": "Search members" + "message": "البحث في الأعضاء" }, "searchGroups": { - "message": "Search groups" + "message": "البحث عن فِرَق" }, "allItems": { "message": "جميع العناصر" @@ -351,13 +351,13 @@ "message": "المجموعات" }, "firstName": { - "message": "الاسم الأول" + "message": "الاسم" }, "middleName": { - "message": "الاسم الأوسط" + "message": "الاسم الثاني" }, "lastName": { - "message": "الاسم الأخير" + "message": "اللقب" }, "fullName": { "message": "الاسم الكامل" @@ -393,7 +393,7 @@ "message": "اختر" }, "newItem": { - "message": "New item" + "message": "عنصر جديد" }, "addItem": { "message": "إضافة عنصر" @@ -405,11 +405,11 @@ "message": "عرض العنصر" }, "new": { - "message": "New", + "message": "جديد", "description": "for adding new items" }, "item": { - "message": "Item" + "message": "عنصر" }, "ex": { "message": "مثال.", @@ -480,7 +480,7 @@ "message": "Filter" }, "moveSelectedToOrg": { - "message": "نقل العناصر المختارة إلى مؤسسة" + "message": "نقل العناصر المختارة إلى منظمة" }, "deleteSelected": { "message": "حذف العناصر المختارة" @@ -559,7 +559,7 @@ "message": "حذف المرفق" }, "deleteItemConfirmation": { - "message": "هل تريد فعلًا أن تحذف؟" + "message": "هل تريد فعلًا أن تحذف هذا العنصر وترسله إلى سلة المهملات؟" }, "deletedItem": { "message": "تم حذف العنصر" @@ -989,7 +989,7 @@ "message": "This password will be used to export and import this file" }, "confirmMasterPassword": { - "message": "Confirm master password" + "message": "تأكيد كلمة المرور الرئيسية" }, "confirmFormat": { "message": "تأكيد التنسيق" @@ -1007,7 +1007,7 @@ "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "exportTypeHeading": { - "message": "Export type" + "message": "نوع التصدير" }, "accountRestricted": { "message": "Account restricted" @@ -1064,7 +1064,7 @@ "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of words" + "message": "عدد الكلمات" }, "wordSeparator": { "message": "Word separator" @@ -1074,7 +1074,7 @@ "description": "Make the first letter of a word uppercase." }, "includeNumber": { - "message": "Include number" + "message": "بما في ذلك الأرقام" }, "passwordHistory": { "message": "سجل كلمات المرور" @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -2215,7 +2212,7 @@ "message": "اختر خِطَّة اشتراكك" }, "users": { - "message": "Users" + "message": "المستخدمون" }, "userSeats": { "message": "User seats" @@ -2436,31 +2433,31 @@ "message": "Event logs" }, "people": { - "message": "People" + "message": "الأشخاص" }, "policies": { - "message": "Policies" + "message": "السياسات" }, "singleSignOn": { - "message": "Single sign-on" + "message": "استيثاق أحادي" }, "editPolicy": { - "message": "Edit policy" + "message": "تعديل السياسة" }, "groups": { - "message": "Groups" + "message": "الفِرَق" }, "newGroup": { - "message": "New group" + "message": "فريق جديد" }, "addGroup": { - "message": "Add group" + "message": "إضافة فريق" }, "editGroup": { - "message": "Edit group" + "message": "تعديل الفريق" }, "deleteGroupConfirmation": { - "message": "Are you sure you want to delete this group?" + "message": "هل أنت متيقِّن من أنك تريد حذف هذا الفريق؟" }, "deleteMultipleGroupsConfirmation": { "message": "Are you sure you want to delete the following $QUANTITY$ group(s)?", @@ -2583,13 +2580,13 @@ "message": "Manage organization access, all collections, members, reporting, and security settings" }, "user": { - "message": "User" + "message": "مستخدِم" }, "userDesc": { "message": "Access and add items to assigned collections" }, "manager": { - "message": "Manager" + "message": "مدير" }, "managerDesc": { "message": "Create, delete, and manage access in assigned collections" @@ -2598,7 +2595,7 @@ "message": "All" }, "refresh": { - "message": "Refresh" + "message": "إنعاش" }, "timestamp": { "message": "Timestamp" @@ -3156,7 +3153,7 @@ "message": "منظمتي" }, "organizationInfo": { - "message": "Organization info" + "message": "معلومات عن المنظمة" }, "deleteOrganization": { "message": "Delete organization" @@ -3414,7 +3411,7 @@ "message": "Subscription" }, "loading": { - "message": "Loading" + "message": "جارٍ التحميل" }, "upgrade": { "message": "Upgrade" @@ -3444,7 +3441,7 @@ "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { - "message": "Terms of Service" + "message": "شروط الخدمة" }, "privacyPolicy": { "message": "Privacy Policy" @@ -4152,10 +4149,10 @@ } }, "approve": { - "message": "Approve" + "message": "مصادقة" }, "reject": { - "message": "Reject" + "message": "رفض" }, "approveAccessConfirmation": { "message": "Are you sure you want to approve emergency access? This will allow $USER$ to $ACTION$ your account.", @@ -4319,19 +4316,19 @@ "message": "Delete assigned collections" }, "manageGroups": { - "message": "Manage groups" + "message": "إدارة الفِرَق" }, "managePolicies": { - "message": "Manage policies" + "message": "إدارة السياسات" }, "manageSso": { - "message": "Manage SSO" + "message": "إدارة SSO" }, "manageUsers": { - "message": "Manage users" + "message": "إدارة المستخدمين" }, "manageResetPassword": { - "message": "Manage password reset" + "message": "إدارة إعادة تعيين كلمة المرور" }, "disableRequiredError": { "message": "You must manually turn the $POLICYNAME$ policy before this policy can be turned off.", @@ -4396,7 +4393,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, **see** how it works, or try it now.'" }, "sendVaultCardHowItWorks": { - "message": "how it works", + "message": "كيف يعمل", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see **how it works**, or try it now.'" }, "sendVaultCardOr": { @@ -4404,7 +4401,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'" }, "sendVaultCardTryItNow": { - "message": "try it now", + "message": "جربه الآن", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, or **try it now**.'" }, "sendAccessTaglineOr": { @@ -4416,7 +4413,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or **sign up** to try it today.'" }, "sendAccessTaglineTryToday": { - "message": "to try it today.", + "message": "لتجربته اليوم.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendCreatorIdentifier": { @@ -4813,10 +4810,10 @@ "message": "Invalid maximum vault timeout." }, "hours": { - "message": "Hours" + "message": "ساعات" }, "minutes": { - "message": "Minutes" + "message": "دقائق" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", @@ -5198,7 +5195,7 @@ "message": "Sponsoring organization" }, "keyConnectorTest": { - "message": "Test" + "message": "اختبار" }, "keyConnectorTestSuccess": { "message": "Success! Key Connector reached." @@ -5243,7 +5240,7 @@ "message": "Rotating the billing sync token will invalidate the previous token." }, "selfHostingTitle": { - "message": "Self-hosting" + "message": "استضافة ذاتية" }, "selfHostingEnterpriseOrganizationSectionCopy": { "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." @@ -5479,7 +5476,7 @@ "message": "Generate an email alias with an external forwarding service." }, "hostname": { - "message": "Hostname", + "message": "اسم المضيف", "description": "Part of a URL." }, "apiAccessToken": { @@ -5624,7 +5621,7 @@ "message": "On" }, "members": { - "message": "Members" + "message": "الأعضاء" }, "reporting": { "message": "Reporting" @@ -5642,46 +5639,46 @@ "message": "ليس حسابك؟" }, "pickAnAvatarColor": { - "message": "Pick an avatar color" + "message": "اختر لون الصورة الرمزية" }, "customizeAvatar": { - "message": "Customize avatar" + "message": "تخصيص الصورة الرمزية" }, "avatarUpdated": { - "message": "Avatar updated" + "message": "تم تحديث الصورة الرمزية" }, "brightBlue": { - "message": "Bright Blue" + "message": "أزرق فاتح" }, "green": { - "message": "Green" + "message": "أخضر" }, "orange": { - "message": "Orange" + "message": "برتقالي" }, "lavender": { - "message": "Lavender" + "message": "أرجواني" }, "yellow": { - "message": "Yellow" + "message": "أصفر" }, "indigo": { - "message": "Indigo" + "message": "نيلي" }, "teal": { - "message": "Teal" + "message": "أزرق مخضر" }, "salmon": { "message": "Salmon" }, "pink": { - "message": "Pink" + "message": "وردي" }, "customColor": { - "message": "Custom Color" + "message": "لون مخصص" }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- اختيار --" }, "multiSelectPlaceholder": { "message": "-- Type to filter --" @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "المشروعات", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "المشروع", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6389,7 +6467,7 @@ "message": "This user can access the Secrets Manager Beta" }, "important": { - "message": "Important:" + "message": "هام:" }, "viewAll": { "message": "View all" @@ -6411,11 +6489,24 @@ "message": "Resolve the errors below and try again." }, "description": { - "message": "Description" + "message": "الوصف" }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 0def0324473..c0598bcbbae 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Lisenziyanı güncəllə" }, - "updatedLicense": { - "message": "Lisenziyanı güncəlləndi" - }, "manageSubscription": { "message": "Abunəliyi idarə et" }, @@ -5707,28 +5704,36 @@ "message": "Gizlət" }, "projects": { - "message": "Layihələr" + "message": "Layihələr", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Son düzəliş" + "message": "Son düzəliş", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "\"Sirr\"ə düzəliş et" + "message": "\"Sirr\"ə düzəliş et", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Sirr əlavə et" + "message": "Sirr əlavə et", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Sirr adını kopyala" + "message": "Sirr adını kopyala", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Sirr dəyərini kopyala" + "message": "Sirr dəyərini kopyala", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Sirri sil" + "message": "Sirri sil", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "\"Sirr\"ləri sil" + "message": "\"Sirr\"ləri sil", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Sirri birdəfəlik sil" @@ -5737,106 +5742,143 @@ "message": "Sirləri birdəfəlik sil" }, "secretProjectAssociationDescription": { - "message": "Sirrin əlaqələndiriləcəyi layihələri seçin. Yalnız bu layihələrə müraciəti olan təşkilat istifadəçiləri sirri görə biləcək." + "message": "Sirrin əlaqələndiriləcəyi layihələri seçin. Yalnız bu layihələrə müraciəti olan təşkilat istifadəçiləri sirri görə biləcək.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Layihələri seçin" + "message": "Layihələri seçin", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Layihə axtar", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Layihə" + "message": "Layihə", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Layihəyə düzəliş et" + "message": "Layihəyə düzəliş et", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Layihəyə bax" + "message": "Layihəyə bax", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Layihəni sil" + "message": "Layihəni sil", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Layihələri sil" + "message": "Layihələri sil", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Sirr" + "message": "Sirr", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Servis hesabı" + "message": "Servis hesabı", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Servis hesabları" + "message": "Servis hesabları", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "\"Sirr\"lər" + "message": "\"Sirr\"lər", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Ad/Dəyər cütü" + "message": "Ad/Dəyər cütü", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "\"Sirr\"ə düzəliş edildi" + "message": "\"Sirr\"ə düzəliş edildi", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Sirr yaradıldı" + "message": "Sirr yaradıldı", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Yeni Sirr" + "message": "Yeni Sirr", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Yeni Servis hesabı" + "message": "Yeni Servis hesabı", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Göstəriləcək sirr yoxdur" + "message": "Göstəriləcək sirr yoxdur", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Başlamaq üçün yeni bir sirr əlavə edin və ya daxilə köçürün." + "message": "Başlamaq üçün yeni bir sirr əlavə edin və ya daxilə köçürün.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Tullantı qutusunda heç bir sirr yoxdur." }, - "serviceAccountsNoItemsTitle": { - "message": "Göstəriləcək heç nə yoxdur" - }, "serviceAccountsNoItemsMessage": { - "message": "\"Sirr\" müraciətini avtomatlaşdırmağa başlamaq üçün yeni bir Servis hesabı yaradın." + "message": "\"Sirr\" müraciətini avtomatlaşdırmağa başlamaq üçün yeni bir Servis hesabı yaradın.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Göstəriləcək heç nə yoxdur", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "\"Sirr\"ləri axtar" + "message": "\"Sirr\"ləri axtar", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Servis hesablarını sil" + "message": "Servis hesablarını sil", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Servis hesabını sil" + "message": "Servis hesabını sil", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Servis hesabına bax" + "message": "Servis hesabına bax", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Servis hesablarına bax" + "message": "Servis hesablarına bax", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Layihə əlavə et" + "message": "Layihə əlavə et", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Layihəyə düzəliş edildi" + "message": "Layihəyə düzəliş edildi", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Layihə saxlanıldı" + "message": "Layihə saxlanıldı", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Layihə yaradıldı" + "message": "Layihə yaradıldı", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Layihə adı" + "message": "Layihə adı", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Yeni layihə" + "message": "Yeni layihə", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "\"Sirr\"ləri silmək, mövcud inteqrasiyalara təsir edə bilər." + "message": "\"Sirr\"ləri silmək, mövcud inteqrasiyalara təsir edə bilər.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "\"Sirr\"lər tullantı qutusuna göndərildi" + "message": "\"Sirr\"lər tullantı qutusuna göndərildi", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Bu sirri birdəfəlik silmək istədiyinizə əminsiniz?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Sirlər birdəfəlik silindi" }, - "serviceAccountCreated": { - "message": "Servis hesabı yaradıldı" - }, "smAccess": { - "message": "Müraciət" + "message": "Müraciət", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Layihə, Sirr" + "message": "Layihə, Sirr", + "description": "" }, "serviceAccountName": { - "message": "Servis hesab adı" + "message": "Servis hesab adı", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Servis hesabı yaradıldı", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Layihələri və ya \"Sirr\"ləri yazın və ya seçin" + "message": "Layihələri və ya \"Sirr\"ləri yazın və ya seçin", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Filtrləmək üçün yazın" + "message": "Filtrləmək üçün yazın", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Layihələr silindi" + "message": "Layihələr silindi", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Layihə və əlaqələndirilmiş bütün \"sirr\"ləri silindi" + "message": "Layihə və əlaqələndirilmiş bütün \"sirr\"ləri silindi", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "$PROJECT$ layihəsinin silinməsi daimi və geri qaytarıla bilməyən prosesdir.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Davam etmək üçün \"$CONFIRM$\" yazın", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ sil", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ layihəni sil", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Layihələrin silinməsi daimi və geri qaytarıla bilməyən prosesdir." + "message": "Layihələrin silinməsi daimi və geri qaytarıla bilməyən prosesdir.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Görüntülənəcək heç bir layihə yoxdur" + "message": "Görüntülənəcək heç bir layihə yoxdur", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "\"Sirr\"ləri təşkil etməyə başlamaq üçün yeni bir layihə əlavə edin." + "message": "\"Sirr\"ləri təşkil etməyə başlamaq üçün yeni bir layihə əlavə edin.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Təsdiq tələb olunur" + "message": "Təsdiq tələb olunur", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Aşağıdakı layihələr silinə bilmədi:" + "message": "Aşağıdakı layihələr silinə bilmədi:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Sirr tullantı qutusuna göndərildi" + "message": "Sirr tullantı qutusuna göndərildi", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Sirr birdəfəlik silindi" }, - "searchProjects": { - "message": "Layihə axtar" - }, "accessTokens": { - "message": "Müraciət tokenləri" + "message": "Müraciət tokenləri", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Müraciət tokeni yarat" + "message": "Müraciət tokeni yarat", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Müddəti bitir" + "message": "Müddəti bitir", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Oxuna bilər" + "message": "Oxuna bilər", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Göstəriləcək heç bir müraciət tokeni yoxdur" + "message": "Göstəriləcək heç bir müraciət tokeni yoxdur", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Başlamaq üçün bir müraciət tokeni yarat" + "message": "Başlamaq üçün bir müraciət tokeni yarat", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Bağlamazdan əvvəl endir və ya kopyala." + "message": "Bağlamazdan əvvəl endir və ya kopyala.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Bitmə vaxtı:" + "message": "Bitmə vaxtı:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Müraciət tokenləri saxlanılmadı və alına bilmir" + "message": "Müraciət tokenləri saxlanılmadı və alına bilmir", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Tokeni kopyala" + "message": "Tokeni kopyala", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Müraciət tokeni" + "message": "Müraciət tokeni", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Bitmə vaxtı tələb olunur" + "message": "Bitmə vaxtı tələb olunur", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Müraciət tokeni yaradıldı və lövhəyə kopyalandı" + "message": "Müraciət tokeni yaradıldı və lövhəyə kopyalandı", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Beta üçün icazələrin idarə edilməsi əlçatmazdır." + "message": "Beta üçün icazələrin idarə edilməsi əlçatmazdır.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Müraciət tokenini ləğv et" + "message": "Müraciət tokenini ləğv et", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Müraciət tokenlərini ləğv et" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Müraciət icazəsi veriləcək xidmət hesablarını əlavə edin" }, - "canWrite": { - "message": "Yaza bilər" + "serviceAccountPeopleDescription": { + "message": "Qrup və ya insanların bu xidmət hesabına müraciətinə icazə verin." + }, + "serviceAccountProjectsDescription": { + "message": "Bu xidmət hesabına layihələr təyin edin. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Müraciət icazəsi vermək üçün layihə əlavə edin" }, "canReadWrite": { "message": "Oxuya, yaza bilər" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Daxilə köçürmə faylını oxumağa çalışarkən xəta baş verdi" }, + "accessedSecret": { + "message": "$SECRET_ID$ sirrinə müraciət edildi.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Bir sirr yarat" }, @@ -6479,22 +6570,22 @@ "message": "\"Secrets Manager Beta\"nı fəallaşdır" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Bu parol üçün bilinən məlumat pozuntularını yoxlayın" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "İfşa olunmuş ana parol" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Parol, məlumat pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Zəif və ifşa olunmuş ana parol" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Minimum $LENGTH$ simvol", "placeholders": { "length": { "content": "$1", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Ana parol ən azı $LENGTH$ simvol uzunluğunda olmalıdır.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Rədd et" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index c024bde213e..2041495c1fa 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -697,7 +697,7 @@ "message": "Неабходна паўторна ўвесці асноўны пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Асноўны пароль павінен змяшчаць прынамсі $VALUE$ сімвалаў.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1256,7 +1256,7 @@ "message": "Даныя былі паспяхова імпартаваны ў ваша сховішча." }, "dataExportSuccess": { - "message": "Data successfully exported" + "message": "Дадзеныя паспяхова экспартаваныя" }, "importWarning": { "message": "Вы імпартуеце даныя ў $ORGANIZATION$. Вашы даныя могуць быць абагулены з удзельнікамі арганізацыі. Вы сапраўды хочаце працягнуць?", @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Абнавіць ліцэнзію" }, - "updatedLicense": { - "message": "Ліцэнзія абноўлена" - }, "manageSubscription": { "message": "Кіраванне падпіскай" }, @@ -3723,25 +3720,25 @@ "message": "Пошук у сметніцы" }, "permanentlyDelete": { - "message": "Выдаліць назаўсёды" + "message": "Выдаліць незваротна" }, "permanentlyDeleteSelected": { - "message": "Назаўсёды выдаліць выбраныя" + "message": "Незваротна выдаліць выбраныя" }, "permanentlyDeleteItem": { - "message": "Назаўсёды выдаліць элементы" + "message": "Незваротна выдаліць элементы" }, "permanentlyDeleteItemConfirmation": { - "message": "Вы сапраўды хочаце назаўсёды выдаліць гэты элемент?" + "message": "Вы сапраўды хочаце незваротна выдаліць гэты элемент?" }, "permanentlyDeletedItem": { - "message": "Элемент выдалены назаўсёды" + "message": "Элемент выдалены незваротна" }, "permanentlyDeletedItems": { - "message": "Элементы выдалены назаўсёды" + "message": "Элементы выдалены незваротна" }, "permanentlyDeleteSelectedItemsDesc": { - "message": "Вы выбралі наступную колькасць элементаў для выдалення: $COUNT$ шт. Вы сапраўды хочаце назаўсёды выдаліць іх?", + "message": "Вы выбралі наступную колькасць элементаў для выдалення: $COUNT$ шт. Вы сапраўды хочаце незваротна выдаліць іх?", "placeholders": { "count": { "content": "$1", @@ -3750,7 +3747,7 @@ } }, "permanentlyDeletedItemId": { - "message": "Элемент $ID$ выдалены назаўсёды.", + "message": "Элемент $ID$ выдалены незваротна", "placeholders": { "id": { "content": "$1", @@ -5707,172 +5704,226 @@ "message": "Схаваць" }, "projects": { - "message": "Праекты" + "message": "Праекты", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Апошні рэдагаваны" + "message": "Апошні рэдагаваны", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Рэдагаваць сакрэт" + "message": "Рэдагаваць сакрэт", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Дадаць сакрэт" + "message": "Дадаць сакрэт", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Капіяваць назву сакрэта" + "message": "Капіяваць назву сакрэта", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Капіяваць значэнне сакрэту" + "message": "Капіяваць значэнне сакрэту", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Выдаліць сакрэт" + "message": "Выдаліць сакрэт", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Выдаліць сакрэты" + "message": "Выдаліць сакрэты", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Permanently delete secret" + "message": "Незваротна выдаліць сакрэт" }, "hardDeleteSecrets": { - "message": "Permanently delete secrets" + "message": "Незваротна выдаліць сакрэты" }, "secretProjectAssociationDescription": { - "message": "Выберыце праекты з якімі будзе звязаны сакрэт. Толькі карыстальнікі арганізацыі з доступам да гэтых праектаў змогуць бачыць сакрэт." + "message": "Выберыце праекты з якімі будзе звязаны сакрэт. Толькі карыстальнікі арганізацыі з доступам да гэтых праектаў змогуць бачыць сакрэт.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Выберыце праекты" + "message": "Выберыце праекты", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Шукаць праекты", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Праект" + "message": "Праект", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Рэдагаваць праект" + "message": "Рэдагаваць праект", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Прагледзець праект" + "message": "Прагледзець праект", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Выдаліць праект" + "message": "Выдаліць праект", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Выдаліць праекты" + "message": "Выдаліць праекты", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Сакрэт" + "message": "Сакрэт", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Сэрвісны ўліковы запіс" + "message": "Сэрвісны ўліковы запіс", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Сэрвісныя ўліковыя запісы" + "message": "Сэрвісныя ўліковыя запісы", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Сакрэты" + "message": "Сакрэты", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Парная назва/значэнне" + "message": "Парная назва/значэнне", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Сакрэт адрэдагаваны" + "message": "Сакрэт адрэдагаваны", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Сакрэт створаны" + "message": "Сакрэт створаны", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Новы сакрэт" + "message": "Новы сакрэт", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Новы сэрвісны ўліковы запіс" + "message": "Новы сэрвісны ўліковы запіс", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Няма сакрэтаў для паказу" + "message": "Няма сакрэтаў для паказу", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Каб пачаць, дадайце новы сакрэт або імпартуйце сакрэты." + "message": "Каб пачаць, дадайце новы сакрэт або імпартуйце сакрэты.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { - "message": "There are no secrets in the trash." - }, - "serviceAccountsNoItemsTitle": { - "message": "Адсутнічаюць элементы для паказу" + "message": "Сметніца не змяшчае сакрэты." }, "serviceAccountsNoItemsMessage": { - "message": "Стварыць новы сэрвісны ўліковы запіс, каб пачаць аўтаматызацыю доступу да сакрэту." + "message": "Стварыць новы сэрвісны ўліковы запіс, каб пачаць аўтаматызацыю доступу да сакрэту.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Адсутнічаюць элементы для паказу", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Пошук сакрэтаў" + "message": "Пошук сакрэтаў", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Выдаліць сэрвісныя ўліковыя запісы" + "message": "Выдаліць сэрвісныя ўліковыя запісы", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Выдаліць сэрвісны ўліковы запіс" + "message": "Выдаліць сэрвісны ўліковы запіс", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Паглядзець сэрвісны ўліковы запіс" + "message": "Паглядзець сэрвісны ўліковы запіс", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Пошук сэрвісных уліковых запісаў" + "message": "Пошук сэрвісных уліковых запісаў", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Дадаць праект" + "message": "Дадаць праект", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Праект адрэдагаваны" + "message": "Праект адрэдагаваны", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Праект захаваны" + "message": "Праект захаваны", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Праект створаны" + "message": "Праект створаны", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Назва праекта" + "message": "Назва праекта", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Новы праект" + "message": "Новы праект", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Выдаленне сакрэтаў можа паўплываць на існуючыя інтэграцыі." + "message": "Выдаленне сакрэтаў можа паўплываць на існуючыя інтэграцыі.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Сакрэты адпраўлены ў сметніцу" + "message": "Сакрэты адпраўлены ў сметніцу", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { - "message": "Are you sure you want to permanently delete this secret?" + "message": "Вы сапраўды хочаце незваротна выдаліць гэты сакрэт?" }, "hardDeleteSecretsConfirmation": { - "message": "Are you sure you want to permanently delete these secrets?" + "message": "Вы сапраўды хочаце незваротна выдаліць гэтыя сакрэты?" }, "hardDeletesSuccessToast": { - "message": "Secrets permanently deleted" - }, - "serviceAccountCreated": { - "message": "Сэрвісныя ўліковыя запісы створаны" + "message": "Сакрэты незваротна выдалены" }, "smAccess": { - "message": "Доступ" + "message": "Доступ", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Праект, сакрэт" + "message": "Праект, сакрэт", + "description": "" }, "serviceAccountName": { - "message": "Назва сэрвіснага ўліковага запісу" + "message": "Назва сэрвіснага ўліковага запісу", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Сэрвісныя ўліковыя запісы створаны", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Увядзіце або выберыце праекты (сакрэты)" + "message": "Увядзіце або выберыце праекты (сакрэты)", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Увядзіце, каб адфільтраваць" + "message": "Увядзіце, каб адфільтраваць", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Праекты выдалены" + "message": "Праекты выдалены", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Праект і ўсе звязаныя сакрэты былі выдалены" + "message": "Праект і ўсе звязаныя сакрэты былі выдалены", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Выдаленне праекта $PROJECT$ з'яўляецца незваротным дзеяннем і яго нельга будзе адрабіць.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Увядзіце \"$CONFIRM$\", каб працягнуць", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Выдаліць $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Выдаліць $COUNT$ праекты(-аў)", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,82 +5962,100 @@ } }, "deleteProjectsDialogMessage": { - "message": "Выдаленне праектаў з'яўляецца незваротным дзеяннем і яго нельга будзе адрабіць." + "message": "Выдаленне праектаў з'яўляецца незваротным дзеяннем і яго нельга будзе адрабіць.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Няма праектаў для адлюстравання" + "message": "Няма праектаў для адлюстравання", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Дадаць новы праект, каб пачаць арганізоўваць сакрэты." + "message": "Дадаць новы праект, каб пачаць арганізоўваць сакрэты.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Патрабуецца пацверджанне" + "message": "Патрабуецца пацверджанне", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Немагчыма выдаліць наступныя праекты:" + "message": "Немагчыма выдаліць наступныя праекты:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Сакрэт адпраўлены ў сметніцу" + "message": "Сакрэт адпраўлены ў сметніцу", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { - "message": "Secret permanently deleted" - }, - "searchProjects": { - "message": "Шукаць праекты" + "message": "Сакрэты незваротна выдалены" }, "accessTokens": { - "message": "Токены доступу" + "message": "Токены доступу", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Стварыць токены доступу" + "message": "Стварыць токены доступу", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Заканчваецца" + "message": "Заканчваецца", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Можна прачытаць" + "message": "Можна прачытаць", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Няма токенаў доступу для паказу" + "message": "Няма токенаў доступу для паказу", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Каб пачаць, стварыце токен доступу" + "message": "Каб пачаць, стварыце токен доступу", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Спампуйце або скапіюйце перад закрыццём." + "message": "Спампуйце або скапіюйце перад закрыццём.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Заканчваецца:" + "message": "Заканчваецца:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Токены доступу не захоўваюцца і не могуць быць атрыманы" + "message": "Токены доступу не захоўваюцца і не могуць быць атрыманы", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Капіяваць токен" + "message": "Капіяваць токен", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Доступ да токена" + "message": "Доступ да токена", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Патрабуецца дата заканчэння" + "message": "Патрабуецца дата заканчэння", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Доступ да токена створаны і скапіяваны ў буфер абмену" + "message": "Доступ да токена створаны і скапіяваны ў буфер абмену", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Кіраванне дазволамі недаступна для бэта-версіі." + "message": "Кіраванне дазволамі недаступна для бэта-версіі.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Адклікаць токен доступу" + "message": "Адклікаць токен доступу", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Адклікаць токены доступу" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "Адкліканне токенаў доступу - гэта канчатковая і незваротнае дзеянне." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Токены доступу адкліканы", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -6074,64 +6146,64 @@ "message": "Гэты ўдзельнік можа атрымліваць доступ і змяняць усе элементы." }, "domainVerification": { - "message": "Domain verification" + "message": "Праверка дамена" }, "newDomain": { - "message": "New domain" + "message": "Новы дамен" }, "noDomains": { - "message": "No domains" + "message": "Няма даменаў" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "Падлучэнне дамена дазваляе ўдзельнікам прапускаць поле з ідэнтыфікатара SSO падчас аўтарызацыі праз SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "Праверыць дамен" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "Паўторна праверыць дамен" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Капіяваць запіс DNS TXT" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "Запіс DNS TXT" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "Капіяваць і ўставіць запіс TXT у поле вашага пастаўшчыка паслуг DNS." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "Прыклад: mydomain.com. Для праверкі паддаменаў неабходны асобныя запісы." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "Аўтаматычная праверка дамена" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Bitwarden паспрабуе праверыць дамен 3 разы на працягу першых 72 гадзін. Калі гэта не атрымліваецца зрабіць, праверце запіс DNS і выканайце дадзеную аперацыю ўручную. Дамен будзе выдалены з вашай арганізацыі праз 7 дзён, калі яго праверка не будзе завершана" }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "Няправільны фармат уводу. Слушны фармат: mydomain.com. Для праверкі паддаменаў неабходны асобныя запісы." }, "removeDomain": { - "message": "Remove domain" + "message": "Выдаліць дамен" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "Аперацыю выдалення дамена нельга будзе адрабіць. Вы сапраўды хочаце працягнуць?" }, "domainRemoved": { - "message": "Domain removed" + "message": "Дамен выдалены" }, "domainSaved": { - "message": "Domain saved" + "message": "Дамен захаваны" }, "domainVerified": { - "message": "Domain verified" + "message": "Дамен правераны" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "Нельга атрымаць адзін і той жа дамен двойчы." }, "domainNotAvailable": { - "message": "Someone else is using $DOMAIN$. Use a different domain to continue.", + "message": "Нехта ўжо выкарыстоўвае $DOMAIN$. Для працягу, выберыце іншы дамен.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6140,7 +6212,7 @@ } }, "domainNotVerified": { - "message": "$DOMAIN$ not verified. Check your DNS record.", + "message": "$DOMAIN$ не правераны. Праверце ваш запіс DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6149,28 +6221,28 @@ } }, "domainStatusVerified": { - "message": "Verified" + "message": "Правераны" }, "domainStatusUnverified": { - "message": "Unverified" + "message": "Неправераны" }, "domainNameTh": { - "message": "Name" + "message": "Назва" }, "domainStatusTh": { - "message": "Status" + "message": "Статус" }, "lastChecked": { - "message": "Last checked" + "message": "Апошняя праверка" }, "editDomain": { - "message": "Edit domain" + "message": "Рэдагаваць дамен" }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "У форме ёсць памылкі, якія патрабуюць вашай увагі" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "Дамен $DOMAIN$ дададзены", "placeholders": { "DOMAIN": { "content": "$1", @@ -6179,7 +6251,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "Дамен $DOMAIN$ выдалены", "placeholders": { "DOMAIN": { "content": "$1", @@ -6188,7 +6260,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "Дамен $DOMAIN$ правераны", "placeholders": { "DOMAIN": { "content": "$1", @@ -6197,7 +6269,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "Дамен $DOMAIN$ неправераны", "placeholders": { "DOMAIN": { "content": "$1", @@ -6281,16 +6353,16 @@ } }, "server": { - "message": "Server" + "message": "Сервер" }, "exportData": { - "message": "Export data" + "message": "Экспартаванне даных" }, "exportingOrganizationSecretDataTitle": { - "message": "Exporting Organization Secret Data" + "message": "Экспартаванне сакрэтных даных арганізацыі" }, "exportingOrganizationSecretDataDescription": { - "message": "Only the Secrets Manager data associated with $ORGANIZATION$ will be exported. Items in other products or from other organizations will not be included.", + "message": "Будуць экспартаваны даныя толькі менеджара сакрэтаў, якія звязаны з арганізацыяй $ORGANIZATION$. Элементы іншых прадуктаў або іншыя арганізацыі не будуць уключаны.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6299,16 +6371,16 @@ } }, "fileUpload": { - "message": "File upload" + "message": "Файл запампаваны" }, "acceptedFormats": { - "message": "Accepted Formats:" + "message": "Прынятыя фарматы:" }, "copyPasteImportContents": { - "message": "Copy & paste import contents:" + "message": "Скапіюйце і ўстаўце змесціва імпартавання:" }, "or": { - "message": "or" + "message": "або" }, "licenseAndBillingManagement": { "message": "Кіраванне ліцэнзіямі і плацяжамі" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Дадаць сэрвісныя ўліковы запісы для надання доступу" }, - "canWrite": { - "message": "Можа запісваць" + "serviceAccountPeopleDescription": { + "message": "Даць групам або людзям доступ да гэтых сэрвісных уліковых запісаў." + }, + "serviceAccountProjectsDescription": { + "message": "Прызначыць праект гэтым сэрвісным уліковым запісам. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Дадаць праект, каб даць доступ" }, "canReadWrite": { "message": "Можа чытаць і запісваць" @@ -6389,13 +6467,13 @@ "message": "Гэты карыстальнік можа атрымаць доступ да Менеджара сакрэтаў у рэжыме бэта-тэсціравання" }, "important": { - "message": "Important:" + "message": "Важна:" }, "viewAll": { - "message": "View all" + "message": "Паглядзець усе" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Паказана $PORTION$ з $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6408,38 +6486,51 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Выпраўце памылкі ніжэй і паспрабуйце яшчэ раз." }, "description": { - "message": "Description" + "message": "Апісанне" }, "errorReadingImportFile": { - "message": "An error occurred when trying to read the import file" + "message": "Адбылася памылка падчас спробы прачытаць імпартаваны файл" + }, + "accessedSecret": { + "message": "Атрыманы доступ да сакрэту $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" }, "createSecret": { - "message": "Create a secret" + "message": "Стварыць сакрэт" }, "createProject": { - "message": "Create a project" + "message": "Стварыць праект" }, "createServiceAccount": { - "message": "Create a service account" + "message": "Стварыць сэрвісны ўліковы запіс" }, "downloadThe": { - "message": "Download the", + "message": "Спампаваць", "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" }, "smCLI": { - "message": "Secrets Manager CLI" + "message": "Менеджар сакрэтаў CLI" }, "importSecrets": { - "message": "Import secrets" + "message": "Імпартаванне сакрэтаў" }, "getStarted": { - "message": "Get started" + "message": "Пачатак працы" }, "complete": { - "message": "$COMPLETED$/$TOTAL$ Complete", + "message": "Завершана $COMPLETED$/$TOTAL$", "placeholders": { "COMPLETED": { "content": "$1", @@ -6452,49 +6543,49 @@ } }, "restoreSecret": { - "message": "Restore secret" + "message": "Аднавіць сакрэт" }, "restoreSecrets": { - "message": "Restore secrets" + "message": "Аднавіць сакрэты" }, "restoreSecretPrompt": { - "message": "Are you sure you want to restore this secret?" + "message": "Вы сапраўды хочаце аднавіць гэты сакрэт?" }, "restoreSecretsPrompt": { - "message": "Are you sure you want to restore these secrets?" + "message": "Вы сапраўды хочаце аднавіць гэтыя сакрэты?" }, "secretRestoredSuccessToast": { - "message": "Secret restored" + "message": "Сакрэт адноўлены" }, "secretsRestoredSuccessToast": { - "message": "Secrets restored" + "message": "Сакрэты адноўлены" }, "selectionIsRequired": { - "message": "Selection is required." + "message": "Неабходна выбраць." }, "secretsManagerSubscriptionDesc": { - "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + "message": "Падчас праграмы бэта-тэсціравання плата за ўключэнне доступу арганізацыі да менеджара сакрэтаў спаганяцца не будзе. Карыстальнікі могуць даваць доступ да бэта-версіі ў раздзеле з удзельнікамі." }, "secretsManagerEnable": { - "message": "Enable Secrets Manager Beta" + "message": "Уключыць кіраванне сакрэтамі (бэта-версія)" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Праверыць у вядомых уцечках даных для гэтага пароля" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Скампраметаваны асноўны пароль" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Пароль знойдзены ва ўцечках даных. Выкарыстоўвайце ўнікальныя паролі для абароны свайго ўліковага запісу. Вы сапраўды хочаце выкарыстоўваць скампраметаваны пароль?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Ненадзейны і скампраметаваны асноўны пароль" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Вызначаны ненадзейны пароль, які знойдзены ва ўцечках даных. Выкарыстоўвайце надзейныя і ўнікальныя паролі для абароны свайго ўліковага запісу. Вы сапраўды хочаце выкарыстоўваць гэты пароль?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Мінімальная колькасць сімвалаў: $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Асноўны пароль павінен змяшчаць прынамсі $LENGTH$ сімвалаў.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Адхіліць" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index f469ed16749..37a9419f7a2 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Обновяване на лиценз" }, - "updatedLicense": { - "message": "Лицензът е обновен" - }, "manageSubscription": { "message": "Управление на абонамента" }, @@ -5707,28 +5704,36 @@ "message": "Скриване" }, "projects": { - "message": "Проекти" + "message": "Проекти", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Последна редакция" + "message": "Последна редакция", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Редактиране на тайната" + "message": "Редактиране на тайната", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Добавяне на тайна" + "message": "Добавяне на тайна", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Копиране на името на тайната" + "message": "Копиране на името на тайната", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Копиране на стойността на тайната" + "message": "Копиране на стойността на тайната", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Изтриване на тайната" + "message": "Изтриване на тайната", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Изтриване на тайните" + "message": "Изтриване на тайните", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Окончателно изтриване на тайната" @@ -5737,106 +5742,143 @@ "message": "Окончателно изтриване на тайните" }, "secretProjectAssociationDescription": { - "message": "Изберете проектите, с които ще бъде свързана тази тайна. Само потребителите в организацията, които имат достъп до тези проекти, ще могат да виждат тайната." + "message": "Изберете проектите, с които ще бъде свързана тази тайна. Само потребителите в организацията, които имат достъп до тези проекти, ще могат да виждат тайната.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Изберете проекти" + "message": "Изберете проекти", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Проект" + "message": "Проект", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Редактиране на проекта" + "message": "Редактиране на проекта", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Преглед на проекта" + "message": "Преглед на проекта", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Изтриване на проекта" + "message": "Изтриване на проекта", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Изтриване на проектите" + "message": "Изтриване на проектите", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Тайна" + "message": "Тайна", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Тайни" + "message": "Тайни", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Двойка име/стойност" + "message": "Двойка име/стойност", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Тайната е редактирана" + "message": "Тайната е редактирана", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Тайната е създадена" + "message": "Тайната е създадена", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Нова тайна" + "message": "Нова тайна", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Няма тайни за показване" + "message": "Няма тайни за показване", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "За да започнете, добавете нова тайна или внесете тайни." + "message": "За да започнете, добавете нова тайна или внесете тайни.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Няма тайни в кошчето." }, - "serviceAccountsNoItemsTitle": { - "message": "Все още няма нищо за показване" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Все още няма нищо за показване", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Търсене в тайните" + "message": "Търсене в тайните", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Добавяне на проект" + "message": "Добавяне на проект", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Проектът е редактиран" + "message": "Проектът е редактиран", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Проектът е запазен" + "message": "Проектът е запазен", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Проектът е създаден" + "message": "Проектът е създаден", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Име на проекта" + "message": "Име на проекта", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Нов проект" + "message": "Нов проект", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Изтриването на тайни може да засегне съществуващите интеграции." + "message": "Изтриването на тайни може да засегне съществуващите интеграции.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Тайните са преместени в кошчето" + "message": "Тайните са преместени в кошчето", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Наистина ли искате да изтриете тайната окончателно?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Тайните са изтрити окончателно" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Достъп" + "message": "Достъп", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Проект, тайна" + "message": "Проект, тайна", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Пишете тук или изберете проекти или тайни" + "message": "Пишете тук или изберете проекти или тайни", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Пишете тук за филтриране" + "message": "Пишете тук за филтриране", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Проектите са изтрити" + "message": "Проектите са изтрити", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Проектът и всички свързани с него тайни са изтрити" + "message": "Проектът и всички свързани с него тайни са изтрити", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Изтриването на проекта $PROJECT$ е окончателно и необратимо.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Напишете „$CONFIRM$“, за да продължите", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Изтриване на $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Изтриване на $COUNT$ проекта", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Изтриването на проекти е окончателно и необратимо." + "message": "Изтриването на проекти е окончателно и необратимо.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Няма проекти за показване" + "message": "Няма проекти за показване", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Добавете нов проект, за да започнете да организирате тайните си." + "message": "Добавете нов проект, за да започнете да организирате тайните си.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Изисква се потвърждение" + "message": "Изисква се потвърждение", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Следните проекти не могат да бъдат изтрити:" + "message": "Следните проекти не могат да бъдат изтрити:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Тайната е изтрита окончателно" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Идентификатори за достъп" + "message": "Идентификатори за достъп", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Създаване на идентификатор за достъп" + "message": "Създаване на идентификатор за достъп", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Изтича" + "message": "Изтича", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Няма идентификатори за достъп за показване" + "message": "Няма идентификатори за достъп за показване", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "За да започнете, създайте идентификатор за достъп" + "message": "За да започнете, създайте идентификатор за достъп", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Свалете или копирайте преди затваряне." + "message": "Свалете или копирайте преди затваряне.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Изтича на:" + "message": "Изтича на:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Идентификаторите за достъп не се съхраняват никъде и не могат да бъдат видени повторно" + "message": "Идентификаторите за достъп не се съхраняват никъде и не могат да бъдат видени повторно", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Копиране на идентификатора" + "message": "Копиране на идентификатора", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Идентификатор за достъп" + "message": "Идентификатор за достъп", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Идентификаторът за достъп е създаден и копиран в буфера" + "message": "Идентификаторът за достъп е създаден и копиран в буфера", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Управлението на разрешенията не е възможно в бета-версията." + "message": "Управлението на разрешенията не е възможно в бета-версията.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Анулиране на идентификатора за достъп" + "message": "Анулиране на идентификатора за достъп", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Анулиране на идентификаторите за достъп" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Може да пише" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Добавете проекти към които да е разрешен достъпът" }, "canReadWrite": { "message": "Може да чете и пише" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Възникна грешка при опита за четене на файла за внасяне" }, + "accessedSecret": { + "message": "Достъпена е тайната $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Създаване на тайна" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 1e8d518b30c..1876ad64990 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 536e1bc23ef..fd7e3b87f6c 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index f9ec0789cca..eadbb04dfea 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Actualitza la llicència" }, - "updatedLicense": { - "message": "Llicència actualitzada" - }, "manageSubscription": { "message": "Administra la subscripció" }, @@ -5707,28 +5704,36 @@ "message": "Amaga" }, "projects": { - "message": "Projectes" + "message": "Projectes", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Última edició" + "message": "Última edició", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edita secret" + "message": "Edita secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Afig secret" + "message": "Afig secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copia el nom del secret" + "message": "Copia el nom del secret", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copia el valor del secret" + "message": "Copia el valor del secret", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Suprimeix el secret" + "message": "Suprimeix el secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Suprimeix els secrets" + "message": "Suprimeix els secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Suprimeix definitivament el secret" @@ -5737,106 +5742,143 @@ "message": "Suprimeix definitivament els secrets" }, "secretProjectAssociationDescription": { - "message": "Selecciona los proyectos a los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán verlo." + "message": "Selecciona los proyectos a los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán verlo.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Selecciona projectes" + "message": "Selecciona projectes", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Cerca projectes", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projecte" + "message": "Projecte", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edita el projecte" + "message": "Edita el projecte", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Veure el projecte" + "message": "Veure el projecte", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Suprimeix el projecte" + "message": "Suprimeix el projecte", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Suprimeix els projectes" + "message": "Suprimeix els projectes", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Compte del servei" + "message": "Compte del servei", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Comptes del servei" + "message": "Comptes del servei", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Nom/Parell de valors" + "message": "Nom/Parell de valors", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "S'ha editat el secret" + "message": "S'ha editat el secret", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "S'ha creat el secret" + "message": "S'ha creat el secret", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Secret nou" + "message": "Secret nou", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Compte nou del servei" + "message": "Compte nou del servei", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No hi ha cap secret per mostrar" + "message": "No hi ha cap secret per mostrar", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Per començar, afig un secret nou o importa secrets." + "message": "Per començar, afig un secret nou o importa secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "No hi ha secrets a la paperera." }, - "serviceAccountsNoItemsTitle": { - "message": "Encara no hi ha res a mostrar" - }, "serviceAccountsNoItemsMessage": { - "message": "Crea un compte de servei nou per començar a automatitzar l'accés secret." + "message": "Crea un compte de servei nou per començar a automatitzar l'accés secret.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Encara no hi ha res a mostrar", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Cerca secrets" + "message": "Cerca secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Suprimeix els comptes de servei" + "message": "Suprimeix els comptes de servei", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Suprimeix el compte de servei" + "message": "Suprimeix el compte de servei", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Veure el compte de servei" + "message": "Veure el compte de servei", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Cerca els comptes de servei" + "message": "Cerca els comptes de servei", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Afig un projecte" + "message": "Afig un projecte", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projecte editat" + "message": "Projecte editat", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projecte guardat" + "message": "Projecte guardat", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projecte creat" + "message": "Projecte creat", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nom del Projecte" + "message": "Nom del Projecte", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Projecte nou" + "message": "Projecte nou", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "La supressió de secrets pot afectar les integracions existents." + "message": "La supressió de secrets pot afectar les integracions existents.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets enviats a la paperera" + "message": "Secrets enviats a la paperera", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Esteu segur que voleu suprimir definitivament aquest secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets suprimits definitivament" }, - "serviceAccountCreated": { - "message": "Compte de servei creat" - }, "smAccess": { - "message": "Accés" + "message": "Accés", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projecte, secret" + "message": "Projecte, secret", + "description": "" }, "serviceAccountName": { - "message": "Nom del compte de servei" + "message": "Nom del compte de servei", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Compte de servei creat", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Escriu o selecciona projectes o secrets" + "message": "Escriu o selecciona projectes o secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Escriu per a filtrar" + "message": "Escriu per a filtrar", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projectes suprimits" + "message": "Projectes suprimits", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "El projecte i tots els secrets associats s'han suprimit" + "message": "El projecte i tots els secrets associats s'han suprimit", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "La supressió de $PROJECT$ és permanent i irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Escriu \"$CONFIRM$\" per continuar", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Suprimeix $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Suprimeix $COUNT$ projectes", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "La supressió de projectes és permanent i irreversible." + "message": "La supressió de projectes és permanent i irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No hi ha cap projecte per mostrar" + "message": "No hi ha cap projecte per mostrar", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Afig un projecte nou per començar a organitzar secrets." + "message": "Afig un projecte nou per començar a organitzar secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Cal confirmació" + "message": "Cal confirmació", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Els següents projectes no es poden eliminar:" + "message": "Els següents projectes no es poden eliminar:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "S'ha enviat el secret a la paperera" + "message": "S'ha enviat el secret a la paperera", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret suprimit definitivament" }, - "searchProjects": { - "message": "Cerca projectes" - }, "accessTokens": { - "message": "Tokens d'accès" + "message": "Tokens d'accès", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Crea un token d'accés" + "message": "Crea un token d'accés", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Caduca" + "message": "Caduca", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Es pot llegir" + "message": "Es pot llegir", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No hi ha tokens d'accés per mostrar" + "message": "No hi ha tokens d'accés per mostrar", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Per començar, crea un token d'accés" + "message": "Per començar, crea un token d'accés", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Baixa o copia abans de tancar." + "message": "Baixa o copia abans de tancar.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Caduca el:" + "message": "Caduca el:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Els tokens d'accés no s'emmagatzemen i no es poden recuperar" + "message": "Els tokens d'accés no s'emmagatzemen i no es poden recuperar", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copia el token" + "message": "Copia el token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Token d'accés" + "message": "Token d'accés", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "La data de caducitat és obligatòria" + "message": "La data de caducitat és obligatòria", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Token d'accés creat i copiat al porta-retalls" + "message": "Token d'accés creat i copiat al porta-retalls", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "La gestió de permisos no està disponible per a la versió beta." + "message": "La gestió de permisos no està disponible per a la versió beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoca el token d'accés" + "message": "Revoca el token d'accés", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoca tokens d'accés" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Afig comptes de servei per concedir accés" }, - "canWrite": { - "message": "Es pot escriure" + "serviceAccountPeopleDescription": { + "message": "Concediu accés a aquest compte de servei a grups o persones." + }, + "serviceAccountProjectsDescription": { + "message": "Assigna projectes a aquest compte de servei. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Afig projectes per concedir accés" }, "canReadWrite": { "message": "Es pot llegir, escriure" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "S'ha produït un error en intentar llegir el fitxer d'importació" }, + "accessedSecret": { + "message": "S'ha accedit al secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Crea un secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Descarta" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index eae6711e941..299e511474f 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Aktualizovat licenci" }, - "updatedLicense": { - "message": "Licence byla aktualizována" - }, "manageSubscription": { "message": "Správa předplatného" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 81206993bcc..a893c3497a4 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Opdatér licens" }, - "updatedLicense": { - "message": "Opdaterede licens" - }, "manageSubscription": { "message": "Håndtér abonnement" }, @@ -5707,28 +5704,36 @@ "message": "Skjul" }, "projects": { - "message": "Projekter" + "message": "Projekter", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Senest redigeret" + "message": "Senest redigeret", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Redigér hemmelighed" + "message": "Redigér hemmelighed", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Tilføj hemmelighed" + "message": "Tilføj hemmelighed", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopiér hemmeligheds navn" + "message": "Kopiér hemmeligheds navn", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Kopér hemmelig værdi" + "message": "Kopér hemmelig værdi", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Slet hemmelighed" + "message": "Slet hemmelighed", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Slet hemmeligheder" + "message": "Slet hemmeligheder", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Slet hemmelighed permanent" @@ -5737,106 +5742,143 @@ "message": "Slet hemmeligheder permanent" }, "secretProjectAssociationDescription": { - "message": "Vælg projekter, som hemmeligheden vil blive tilknyttet. Den vil kun kunne ses af organisationsbrugere med adgang til disse projekter." + "message": "Vælg projekter, som hemmeligheden vil blive tilknyttet. Den vil kun kunne ses af organisationsbrugere med adgang til disse projekter.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Vælg projekter" + "message": "Vælg projekter", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Søg i projekter", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekt" + "message": "Projekt", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Redigér projekt" + "message": "Redigér projekt", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Vis projekt" + "message": "Vis projekt", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Slet projekt" + "message": "Slet projekt", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Slet projekter" + "message": "Slet projekter", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Hemmelighed" + "message": "Hemmelighed", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Tjenestekonto" + "message": "Tjenestekonto", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Tjenestekonti" + "message": "Tjenestekonti", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Hemmelighed" + "message": "Hemmelighed", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Navn/værdipar" + "message": "Navn/værdipar", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Hemmelighed redigeret" + "message": "Hemmelighed redigeret", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Hemmelighed oprettet" + "message": "Hemmelighed oprettet", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Ny hemmelighed" + "message": "Ny hemmelighed", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Ny tjenestekonto" + "message": "Ny tjenestekonto", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Ingen hemmeligheder at vise" + "message": "Ingen hemmeligheder at vise", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Tilføj en ny hemmelighed eller importér hemmeligheder for at komme i gang." + "message": "Tilføj en ny hemmelighed eller importér hemmeligheder for at komme i gang.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Der er ingen hemmeligheder i papirkurven." }, - "serviceAccountsNoItemsTitle": { - "message": "Intet at vise endnu" - }, "serviceAccountsNoItemsMessage": { - "message": "Opret en ny tjenestekonto for at komme i gang med at automatisere hemmelig adgang." + "message": "Opret en ny tjenestekonto for at komme i gang med at automatisere hemmelig adgang.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Intet at vise endnu", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Find hemmeligheder" + "message": "Find hemmeligheder", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Slet tjenestekonti" + "message": "Slet tjenestekonti", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Slet tjenestekonto" + "message": "Slet tjenestekonto", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Vis tjenestekonto" + "message": "Vis tjenestekonto", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Find tjenestekonti" + "message": "Find tjenestekonti", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Tilføj projekt" + "message": "Tilføj projekt", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projekt redigeret" + "message": "Projekt redigeret", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projekt gemt" + "message": "Projekt gemt", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projekt oprettet" + "message": "Projekt oprettet", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projektnavn" + "message": "Projektnavn", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nyt projekt" + "message": "Nyt projekt", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Sletning af hemmeligheder kan påvirke eksisterende integrationer." + "message": "Sletning af hemmeligheder kan påvirke eksisterende integrationer.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Hemmelighed sendt til papirkurv" + "message": "Hemmelighed sendt til papirkurv", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Sikker på, at denne hemmelighed skal slettes permanent?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Hemmeligheder slettet permanent" }, - "serviceAccountCreated": { - "message": "Tjenestekonto oprettet" - }, "smAccess": { - "message": "Adgang" + "message": "Adgang", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekt, Hemmelighed" + "message": "Projekt, Hemmelighed", + "description": "" }, "serviceAccountName": { - "message": "Tjenestekontonavn" + "message": "Tjenestekontonavn", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Tjenestekonto oprettet", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Angiv/vælg projekter eller hemmeligheder" + "message": "Angiv/vælg projekter eller hemmeligheder", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Angiv for at filtrere" + "message": "Angiv for at filtrere", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projekter slettet" + "message": "Projekter slettet", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Projektet og alle tilknyttede hemmeligheder er slettet" + "message": "Projektet og alle tilknyttede hemmeligheder er slettet", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Sletning af projektet $PROJECT$ er permanent og irreversibelt.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Angiv \"$CONFIRM$\" for at fortsætte", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Slet $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Slet $COUNT$ projekter", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Sletning af projekter er permanent og irreversibelt." + "message": "Sletning af projekter er permanent og irreversibelt.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Ingen projekter at vise" + "message": "Ingen projekter at vise", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Tilføj et nyt projekt for at komme i gang med at organisere hemmeligheder." + "message": "Tilføj et nyt projekt for at komme i gang med at organisere hemmeligheder.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Bekræftelse kræves" + "message": "Bekræftelse kræves", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Flg. projekter kunne ikke slettes:" + "message": "Flg. projekter kunne ikke slettes:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Hemmelighed sendt til papirkurv" + "message": "Hemmelighed sendt til papirkurv", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Hemmelighed slettet permanent" }, - "searchProjects": { - "message": "Søg i projekter" - }, "accessTokens": { - "message": "Adgangstokener" + "message": "Adgangstokener", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Opret adgangstoken" + "message": "Opret adgangstoken", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Udløber" + "message": "Udløber", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Læserettighed" + "message": "Læserettighed", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Ingen adgangstokener at vise" + "message": "Ingen adgangstokener at vise", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Opret et adgangstoken for at komme i gang" + "message": "Opret et adgangstoken for at komme i gang", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download eller kopiér før lukning." + "message": "Download eller kopiér før lukning.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Udløber:" + "message": "Udløber:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Adgangstokener er ikke gemt og kan ikke hentes" + "message": "Adgangstokener er ikke gemt og kan ikke hentes", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopiér token" + "message": "Kopiér token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Adgangstoken" + "message": "Adgangstoken", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Udløbsdato er obligatorisk" + "message": "Udløbsdato er obligatorisk", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Adgangstoken oprettet og kopieret til udklipsholder" + "message": "Adgangstoken oprettet og kopieret til udklipsholder", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Tilladelseshåndtering er utilgængelig i beta." + "message": "Tilladelseshåndtering er utilgængelig i beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Ophæv adgangstoken" + "message": "Ophæv adgangstoken", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Tilføj tjenestekonti for at tildele adgang" }, - "canWrite": { - "message": "Skriverettighed" + "serviceAccountPeopleDescription": { + "message": "Tildel grupper eller personer adgang til denne tjenestekonto." + }, + "serviceAccountProjectsDescription": { + "message": "Tildel projekter til denne tjenestekonto. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Tilføj projekter for at give adgang" }, "canReadWrite": { "message": "Læse- og skriverettighed" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "En fejl opstod under forsøget på at læse importfilen" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Opret en hemmelighed" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Afvis" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 76145efa2f2..e80f01c6228 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -574,7 +574,7 @@ "message": "Sind Sie sicher, dass Sie das aktuelle Passwort überschreiben möchten?" }, "editedFolder": { - "message": "Ordner bearbeitet" + "message": "Ordner gespeichert" }, "addedFolder": { "message": "Ordner hinzugefügt" @@ -619,7 +619,7 @@ "message": "Mit Gerät anmelden" }, "loginWithDeviceEnabledInfo": { - "message": "Mit Gerät anmelden muss in den Einstellungen der Bitwarden Mobile App aktiviert sein. Brauchst du eine andere Möglichkeit?" + "message": "Mit Gerät anmelden muss in den Einstellungen der Bitwarden App eingerichtet werden. Benötigst du eine andere Option?" }, "loginWithMasterPassword": { "message": "Mit Master-Passwort anmelden" @@ -631,13 +631,13 @@ "message": "Neu hier?" }, "startTrial": { - "message": "Probephase starten" + "message": "Testversion starten" }, "logIn": { "message": "Anmelden" }, "logInInitiated": { - "message": "Anmeldung initiiert" + "message": "Anmeldung eingeleitet" }, "submit": { "message": "Absenden" @@ -658,7 +658,7 @@ "message": "Das Master-Passwort wird verwendet, um den Tresor zu öffnen. Es ist sehr wichtig, dass Sie das Passwort nicht vergessen, da es keine Möglichkeit gibt es zurückzusetzen." }, "masterPassImportant": { - "message": "Master-Passwörter können nicht wiederhergestellt werden, wenn du sie vergisst!" + "message": "Dein Master-Passwort kann nicht wiederhergestellt werden, wenn du es vergisst!" }, "masterPassHintDesc": { "message": "Ein Master-Passwort-Hinweis kann Ihnen helfen, sich an das Passwort zu erinnern, wenn Sie es vergessen haben sollten." @@ -713,7 +713,7 @@ "message": "Ihr neues Konto wurde erstellt! Sie können sich jetzt anmelden." }, "trialAccountCreated": { - "message": "Konto wurde erfolgreich erstellt." + "message": "Konto erfolgreich erstellt." }, "masterPassSent": { "message": "Wir haben Ihnen eine E-Mail mit dem Master-Passwort-Hinweis zu gesendet." @@ -1004,7 +1004,7 @@ "message": "Verwende den Verschlüsselungscode deines Kontos, abgeleitet vom Benutzernamen und Master-Passwort, um den Export zu verschlüsseln und den Import auf das aktuelle Bitwarden-Konto zu beschränken." }, "passwordProtectedOptionDescription": { - "message": "Lege ein Passwort fest, um den Export zu verschlüsseln und ihn in ein beliebiges Bitwarden-Konto zu importieren, wobei das Passwort zum Entschlüsseln genutzt wird." + "message": "Lege ein Dateipasswort fest, um den Export zu verschlüsseln und importiere ihn in ein beliebiges Bitwarden-Konto, wobei das Passwort zum Entschlüsseln genutzt wird." }, "exportTypeHeading": { "message": "Exporttyp" @@ -1311,7 +1311,7 @@ "message": "Passe den Web-Tresor deinen Bedürfnissen an." }, "preferencesUpdated": { - "message": "Einstellungen aktualisiert" + "message": "Einstellungen gespeichert" }, "language": { "message": "Sprache" @@ -1320,7 +1320,7 @@ "message": "Ändern Sie die Sprache für den Web-Tresor." }, "enableFavicon": { - "message": "Zeige Webseiten-Icons" + "message": "Webseiten-Icons anzeigen" }, "faviconDesc": { "message": "Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen." @@ -1384,14 +1384,14 @@ "message": "Sichern Sie Ihr Konto mit Zwei-Faktor-Authentifizierung." }, "twoStepLoginOrganizationDescStart": { - "message": "Erzwinge Zwei-Faktor-Authentifizierung in Bitwarden für Mitglieder durch Verwendung der ", + "message": "Erzwinge eine Zwei-Faktor-Authentifizierung in Bitwarden für Mitglieder durch Verwendung der ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { "message": "Richtlinie für Zwei-Faktor-Authentifizierung" }, "twoStepLoginOrganizationDuoDesc": { - "message": "Verwende die folgenden Optionen, um Zwei-Faktor-Authentifizierung über Duo zu erzwingen." + "message": "Verwende die folgenden Optionen, um eine Zwei-Faktor-Authentifizierung über Duo zu erzwingen." }, "twoStepLoginOrganizationSsoDesc": { "message": "Wenn SSO eingerichtet oder dies geplant ist, wird die Zwei-Faktor-Authentifizierung möglicherweise bereits über den Identitätsanbieter erzwungen." @@ -1839,7 +1839,7 @@ "message": "Rechnung" }, "billingPlanLabel": { - "message": "Abrechnungsplan" + "message": "Rechnungsplan" }, "paymentType": { "message": "Zahlungsart" @@ -1874,7 +1874,7 @@ "description": "Another way of saying \"Get a Premium membership\"" }, "premiumUpdated": { - "message": "Sie haben ein Premium-Abo aktiviert." + "message": "Du hast ein Premium-Abo aktiviert." }, "premiumUpgradeUnlockFeatures": { "message": "Mache ein Upgrade deines Kontos auf eine Premium-Mitgliedschaft, um zusätzliche, großartige Funktionen freizuschalten." @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Lizenz aktualisieren" }, - "updatedLicense": { - "message": "Aktualisierte Lizenz" - }, "manageSubscription": { "message": "Abo verwalten" }, @@ -2475,7 +2472,7 @@ "message": "Sind Sie sich sicher, dass Sie diesen Benutzer löschen wollen?" }, "removeOrgUserConfirmation": { - "message": "Wenn ein Mitglied entfernt wurde, hat es keinen Zugriff mehr auf die Organisationsdaten und diese Aktion ist unumkehrbar. Um das Mitglied wieder zur Organisation hinzuzufügen, muss es erneut eingeladen und eingebunden werden." + "message": "Wenn ein Mitglied entfernt wurde, hat es keinen Zugriff mehr auf die Organisationsdaten und diese Aktion ist unwiderruflich. Um das Mitglied wieder zur Organisation hinzuzufügen, muss es erneut eingeladen und eingebunden werden." }, "revokeUserConfirmation": { "message": "Wenn ein Mitglied widerrufen wurde, hat es keinen Zugriff mehr auf Organisationsdaten. Um den Mitgliederzugriff schnell wiederherzustellen, gehe zum Widerrufen-Tab." @@ -3171,7 +3168,7 @@ } }, "deletingOrganizationActiveUserAccountsWarning": { - "message": "Die Benutzerkonten bleiben nach dem Löschen aktiv, sind aber nicht mehr mit dieser Organisation verknüpft." + "message": "Die Benutzerkonten bleiben nach dem Löschen aktiv, werden aber nicht mehr mit dieser Organisation verknüpft." }, "deletingOrganizationIsPermanentWarning": { "message": "Das Löschen von $ORGANIZATION$ ist dauerhaft und unwiderruflich.", @@ -3706,10 +3703,10 @@ "message": "Aktion bei Tresor-Timeout" }, "vaultTimeoutActionLockDesc": { - "message": "Ein gesperrter Tresor erfordert die Eingabe des Master-Passworts, um erneut darauf zugreifen zu können." + "message": "Um wieder auf deinen Tresor zugreifen zu können, ist dein Master-Passwort oder eine andere Entsperr-Methode erforderlich." }, "vaultTimeoutActionLogOutDesc": { - "message": "Ein ausgeloggter Tresor erfordert eine Neu-Authentifizierung, um erneut darauf zugreifen zu können." + "message": "Um wieder auf deinen Tresor zugreifen zu können, ist eine erneute Authentifizierung erforderlich." }, "lock": { "message": "Sperren", @@ -3834,7 +3831,7 @@ "message": "Über den Single Sign-on Ihrer Organisation anmelden. Bitte geben Sie Ihre Organisationskennung an, um zu beginnen." }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise Single-Sign-On" }, "ssoHandOff": { "message": "Sie können diesen Tab nun schließen und in der Erweiterung fortfahren." @@ -3885,7 +3882,7 @@ "message": "Single Sign-On Authentifizierung" }, "requireSsoPolicyDesc": { - "message": "Benutzer müssen sich per Enterprise Single Sign-On anmelden." + "message": "Mitglieder müssen sich per Enterprise Single-Sign-On anmelden." }, "prerequisite": { "message": "Voraussetzung" @@ -4604,7 +4601,7 @@ "message": "Bist du sicher, dass du die folgenden Benutzer entfernen möchtest? Der Prozess kann einige Sekunden dauern und kann nicht unterbrochen oder abgebrochen werden." }, "removeOrgUsersConfirmation": { - "message": "Wenn Mitglieder entfernt werden, haben sie keinen Zugriff mehr auf Organisationsdaten und diese Aktion ist unumkehrbar. Um das Mitglied wieder zur Organisation hinzuzufügen, muss es erneut eingeladen und eingebunden werden. Der Prozess kann einige Sekunden dauern und kann nicht unterbrochen oder abgebrochen werden." + "message": "Wenn Mitglieder entfernt werden, haben sie keinen Zugriff mehr auf Organisationsdaten und diese Aktion ist unwideruflich. Um das Mitglied wieder zur Organisation hinzuzufügen, muss es erneut eingeladen und eingebunden werden. Der Prozess kann einige Sekunden dauern und kann nicht unterbrochen oder abgebrochen werden." }, "revokeUsersWarning": { "message": "Wenn Mitglieder widerrufen werden, haben sie keinen Zugriff mehr auf Organisationsdaten. Um den Mitgliederzugriff schnell wiederherzustellen, gehe zum Widerrufen-Tab. Der Prozess kann einige Sekunden dauern und kann nicht unterbrochen oder abgebrochen werden." @@ -4640,7 +4637,7 @@ "message": "Erfolgreich entfernt" }, "bulkRevokedMessage": { - "message": "Zugriff auf die Organisation erfolgreich zurückgezogen" + "message": "Zugriff auf die Organisation erfolgreich widerrufen" }, "bulkRestoredMessage": { "message": "Zugriff auf die Organisation erfolgreich wiederhergestellt" @@ -5222,7 +5219,7 @@ "message": "Kopiere dieses Token und füge es in die Rechnungssynchronisations-Einstellungen deiner selbst gehosteten Organisation ein." }, "billingSyncCanAccess": { - "message": "Dein Rechnungssynchronisations-Token kann auf die Abonnement-Einstellungen dieser Organisation zugreifen und diese bearbeiten." + "message": "Dein Rechnungssynchronisations-Token kann auf die Abo-Einstellungen dieser Organisation zugreifen und diese bearbeiten." }, "manageBillingSync": { "message": "Rechnungssynchronisation verwalten" @@ -5240,7 +5237,7 @@ "message": "Wenn du fortfährt, musst du die Rechnungssynchronisation auf deinem selbst gehosteten Server neu einrichten." }, "rotateBillingSyncTokenTitle": { - "message": "Durch Erneuerung des Rechnungssynchroniserungs-Token wird der vorherige Token ungültig." + "message": "Durch Erneuerung des Rechnungssynchronisierungs-Tokens wird der vorherige Token ungültig." }, "selfHostingTitle": { "message": "Selbst gehostet" @@ -5252,7 +5249,7 @@ "message": "Token erneuert" }, "billingSyncDesc": { - "message": "Die Rechnungssynchronisation bietet ein kostenloses Familien-Abo für Mitglieder und erweiterte Abrechnungsmöglichkeiten, indem du dein selbst gehostetes Bitwarden mit dem Bitwarden Cloud-Server verbindest." + "message": "Die Rechnungssynchronisation schaltet Patenschaften für Familien und eine automatische Lizenz-Synchronisation auf deinem Server frei. Nach der Aktualisierung des Bitwarden Cloud-Servers, wähle Lizenz synchronisieren aus, um die Änderungen anzuwenden." }, "billingSyncKeyDesc": { "message": "Um dieses Formular auszufüllen, ist ein Rechnungssynchronisations-Token aus den Abo-Einstellungen deiner Cloud-Organisation erforderlich." @@ -5267,13 +5264,13 @@ "message": "Inaktiv" }, "sentAwaitingSync": { - "message": "Gesendet (Warte auf Synchronisation)" + "message": "Gesendet (warte auf Synchronisierung)" }, "sent": { "message": "Gesendet" }, "requestRemoved": { - "message": "Entfernt (Warte auf Synchronisation)" + "message": "Entfernt (warte auf Synchronisierung)" }, "requested": { "message": "Angefragt" @@ -5324,10 +5321,10 @@ "message": "Mehrere mit einem Komma trennen." }, "sessionTimeout": { - "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut einzuloggen." + "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut anzumelden." }, "exportingPersonalVaultTitle": { - "message": "Einzelnen Tresor exportieren" + "message": "Persönlichen Tresor exportieren" }, "exportingOrganizationVaultTitle": { "message": "Tresor der Organisation exportieren" @@ -5351,7 +5348,7 @@ } }, "accessDenied": { - "message": "Zugriff verweigert. Du hast keine Berechtigung, um diese Seite anzuzeigen." + "message": "Zugriff verweigert. Du hast keine Berechtigung, diese Seite anzuzeigen." }, "masterPassword": { "message": "Master-Passwort" @@ -5394,20 +5391,20 @@ "message": "Benutzernamen generieren" }, "usernameType": { - "message": "Benutzernamentyp" + "message": "Benutzernamenstyp" }, "plusAddressedEmail": { - "message": "Mit Plus adressierte E-Mail", + "message": "Mit Plus adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Verwende die Unteradressierungsmöglichkeiten deines E-Mail-Providers." }, "catchallEmail": { - "message": "Catch-all-E-Mail-Adresse" + "message": "Catch-All E-Mail-Adresse" }, "catchallEmailDesc": { - "message": "Verwenden Sie den konfigurierten Catch-All-Posteingang Ihrer Domain." + "message": "Verwenden den konfigurierten Catch-All-Posteingang deiner Domain." }, "random": { "message": "Zufällig", @@ -5420,7 +5417,7 @@ "message": "Dienst" }, "unknownCipher": { - "message": "Unbekannter Eintrag, du musst dich möglicherweise mit einem anderen Konto anmelden, um auf diesen Eintrag zuzugreifen." + "message": "Unbekannter Eintrag. Du musst möglicherweise eine Berechtigung anfordern, um auf diesen Eintrag zuzugreifen." }, "cannotSponsorSelf": { "message": "Du kannst nicht für das aktive Konto einlösen. Gebe eine andere E-Mail ein." @@ -5492,13 +5489,13 @@ "message": "Aktiviere Geräteverifizierung" }, "deviceVerificationDesc": { - "message": "Falls aktiviert, werden Verifizierungscodes an deine E-Mail-Adresse gesendet, wenn du dich von einem unbekannten Gerät einloggst" + "message": "Verifizierungscodes werden an deine E-Mail-Adresse gesendet, wenn du dich von einem unbekannten Gerät einloggst" }, "updatedDeviceVerification": { "message": "Aktualisierte Geräteverifizierung" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Bist du sicher, dass du die Geräteverifizierung aktivieren möchtest? Der Verifizierungsscode wird an folgende E-Mails versendet: $EMAIL$", + "message": "Bist du sicher, dass du die Geräteverifizierung aktivieren möchtest? Die Verifizierungsscodes werden an folgende E-Mail-Adresse versendet: $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -5533,7 +5530,7 @@ "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKey": { - "message": "Den SCIM-API-Schlüssel erneuern", + "message": "Den SCIM API-Schlüssel erneuern", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKeyWarning": { @@ -5552,7 +5549,7 @@ "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimUrl": { - "message": "SCIM-URL", + "message": "SCIM URL", "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimApiKeyRotated": { @@ -5636,7 +5633,7 @@ "message": "Anzahl der Benutzer" }, "loggingInAs": { - "message": "Einloggen als" + "message": "Anmelden als" }, "notYou": { "message": "Nicht du?" @@ -5684,7 +5681,7 @@ "message": "-- Auswählen --" }, "multiSelectPlaceholder": { - "message": "-- Typ zum Filtern --" + "message": "-- Schreiben zum Filtern --" }, "multiSelectLoading": { "message": "Optionen werden abgerufen..." @@ -5707,28 +5704,36 @@ "message": "Ausblenden" }, "projects": { - "message": "Projekte" + "message": "Projekte", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Zuletzt bearbeitet" + "message": "Zuletzt bearbeitet", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Geheimnis bearbeiten" + "message": "Geheimnis bearbeiten", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Geheimnis hinzufügen" + "message": "Geheimnis hinzufügen", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Geheimnamen kopieren" + "message": "Geheimnamen kopieren", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Geheimen Wert kopieren" + "message": "Geheimen Wert kopieren", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Geheimnis löschen" + "message": "Geheimnis löschen", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Geheimnisse löschen" + "message": "Geheimnisse löschen", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Geheimnis dauerhaft löschen" @@ -5737,106 +5742,143 @@ "message": "Geheimnisse dauerhaft löschen" }, "secretProjectAssociationDescription": { - "message": "Wähle Projekte aus, denen das Geheimnis zugeordnet werden soll. Nur Organisationsbenutzer mit Zugriff auf diese Projekte können das Geheimnis sehen." + "message": "Wähle Projekte aus, denen das Geheimnis zugeordnet werden soll. Nur Organisationsbenutzer mit Zugriff auf diese Projekte können das Geheimnis sehen.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Projekte auswählen" + "message": "Projekte auswählen", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Projekte suchen", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekt" + "message": "Projekt", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Projekt bearbeiten" + "message": "Projekt bearbeiten", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Projekt anzeigen" + "message": "Projekt anzeigen", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Projekt löschen" + "message": "Projekt löschen", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Projekte löschen" + "message": "Projekte löschen", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Geheimnis" + "message": "Geheimnis", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Dienstkonto" + "message": "Dienstkonto", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Dienstkonten" + "message": "Dienstkonten", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Geheimnisse" + "message": "Geheimnisse", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Wert-Paar" + "message": "Name/Wert-Paar", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Geheimnis bearbeitet" + "message": "Geheimnis bearbeitet", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Geheimnis erstellt" + "message": "Geheimnis erstellt", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Neues Geheimnis" + "message": "Neues Geheimnis", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Neues Dienstkonto" + "message": "Neues Dienstkonto", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Keine Geheimnisse zum Anzeigen" + "message": "Keine Geheimnisse zum Anzeigen", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Um loszulegen, füge ein neues Geheimnis hinzu oder importiere Geheimnisse." + "message": "Um loszulegen, füge ein neues Geheimnis hinzu oder importiere Geheimnisse.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Es gibt keine Geheimnisse im Papierkorb." }, - "serviceAccountsNoItemsTitle": { - "message": "Hier gibt es noch nichts" - }, "serviceAccountsNoItemsMessage": { - "message": "Erstelle ein neues Dienstkonto, um mit der Automation für Zugriffe auf Geheimnisse zu beginnen." + "message": "Erstelle ein neues Dienstkonto, um mit der Automation für Zugriffe auf Geheimnisse zu beginnen.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Hier gibt es noch nichts", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Geheimnisse durchsuchen" + "message": "Geheimnisse durchsuchen", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Dienstkonten löschen" + "message": "Dienstkonten löschen", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Dienstkonto löschen" + "message": "Dienstkonto löschen", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Dienstkonto anzeigen" + "message": "Dienstkonto anzeigen", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Dienstkonten durchsuchen" + "message": "Dienstkonten suchen", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Projekt hinzufügen" + "message": "Projekt hinzufügen", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projekt bearbeitet" + "message": "Projekt bearbeitet", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projekt gespeichert" + "message": "Projekt gespeichert", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projekt erstellt" + "message": "Projekt erstellt", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projektname" + "message": "Projektname", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Neues Projekt" + "message": "Neues Projekt", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Das Löschen von Geheimnissen kann bestehende Integrationen beeinflussen." + "message": "Das Löschen von Geheimnissen kann bestehende Integrationen beeinflussen.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Geheimnisse in Papierkorb verschoben" + "message": "Geheimnisse in Papierkorb verschoben", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Bist du sicher, dass du dieses Geheimnis dauerhaft löschen möchtest?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Geheimnisse dauerhaft gelöscht" }, - "serviceAccountCreated": { - "message": "Dienstkonto erstellt" - }, "smAccess": { - "message": "Zugriff" + "message": "Zugriff", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekt, Geheimnis" + "message": "Projekt, Geheimnis", + "description": "" }, "serviceAccountName": { - "message": "Name des Dienstkontos" + "message": "Name des Dienstkontos", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Dienstkonto erstellt", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Projektnamen oder Geheimnisse eingeben oder auswählen" + "message": "Projektnamen oder Geheimnisse eingeben oder auswählen", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Schreiben, um zu filtern" + "message": "Schreiben, um zu filtern", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projekte gelöscht" + "message": "Projekte gelöscht", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Das Projekt und alle zugehörigen Geheimnisse wurden gelöscht" + "message": "Das Projekt und alle zugehörigen Geheimnisse wurden gelöscht", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Das Löschen des Projekts $PROJECT$ ist dauerhaft und unwiderruflich.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Gebe \"$CONFIRM$\" ein, um fortzufahren", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ löschen", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ Projekte löschen", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Das Löschen von Projekten ist dauerhaft und unwiderruflich." + "message": "Das Löschen von Projekten ist dauerhaft und unwiderruflich.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Keine Projekte zum Anzeigen" + "message": "Keine Projekte zum Anzeigen", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Füge ein neues Projekt hinzu, um mit der Organisation von Geheimnissen zu beginnen." + "message": "Füge ein neues Projekt hinzu, um mit der Organisation von Geheimnissen zu beginnen.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Bestätigung erforderlich" + "message": "Bestätigung erforderlich", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Die folgenden Projekte konnten nicht gelöscht werden:" + "message": "Die folgenden Projekte konnten nicht gelöscht werden:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Geheimnis in Papierkorb verschoben" + "message": "Geheimnis in Papierkorb verschoben", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Geheimnis dauerhaft gelöscht" }, - "searchProjects": { - "message": "Projekte durchsuchen" - }, "accessTokens": { - "message": "Zugriffstokens" + "message": "Zugriffstokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Zugriffstoken erstellen" + "message": "Zugriffstoken erstellen", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Läuft ab" + "message": "Läuft ab", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Kann lesen" + "message": "Kann lesen", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Keine Zugriffstoken zum Anzeigen" + "message": "Keine Zugriffstoken zum Anzeigen", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Um loszulegen, erstelle ein Zugriffstoken" + "message": "Um loszulegen, erstelle ein Zugriffstoken", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Vor dem Schließen herunterladen oder kopieren." + "message": "Vor dem Schließen herunterladen oder kopieren.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Läuft ab am:" + "message": "Läuft ab am:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Zugriffstoken sind nicht gespeichert und können nicht abgerufen werden" + "message": "Zugriffstoken sind nicht gespeichert und können nicht abgerufen werden", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Token kopieren" + "message": "Token kopieren", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Zugriffstoken" + "message": "Zugriffstoken", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Ablaufdatum erforderlich" + "message": "Ablaufdatum erforderlich", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Zugriffstoken erstellt und in Zwischenablage kopiert" + "message": "Zugriffstoken erstellt und in Zwischenablage kopiert", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Die Berechtigungsverwaltung ist in der Beta nicht verfügbar." + "message": "Die Berechtigungsverwaltung ist in der Beta nicht verfügbar.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Zugriffstoken widerrufen" + "message": "Zugriffstoken widerrufen", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Zugriffstokens widerrufen" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Dienstkonten hinzufügen, um Zugriff zu gewähren" }, - "canWrite": { - "message": "Kann schreiben" + "serviceAccountPeopleDescription": { + "message": "Gruppen oder Personen Zugriff auf dieses Dienstkonto gewähren." + }, + "serviceAccountProjectsDescription": { + "message": "Diesem Dienstkonto Projekte zuweisen. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Projekte hinzufügen, um Zugriff zu gewähren" }, "canReadWrite": { "message": "Kann lesen, schreiben" @@ -6416,17 +6494,30 @@ "errorReadingImportFile": { "message": "Beim Lesen der Importdatei ist ein Fehler aufgetreten" }, + "accessedSecret": { + "message": "Auf Geheimnis $SECRET_ID$ zugegriffen.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { - "message": "Ein Geheimnis erstellen" + "message": "Geheimnis erstellen" }, "createProject": { - "message": "Ein Projekt erstellen" + "message": "Projekt erstellen" }, "createServiceAccount": { - "message": "Ein Dienstkonto erstellen" + "message": "Dienstkonto erstellen" }, "downloadThe": { - "message": "Download the", + "message": "Download von", "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" }, "smCLI": { @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 7d69008ca3d..5ca32c59273 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Ενημέρωση Άδειας" }, - "updatedLicense": { - "message": "Η άδεια ενημερώθηκε" - }, "manageSubscription": { "message": "Διαχείριση Συνδρομής" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 57319add843..607e2a70033 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update licence" }, - "updatedLicense": { - "message": "Updated licence" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organisation users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organisation users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "The project and all associated secrets have been deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organising secrets." + "message": "Add a new project to get started organising secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 480ddb063d4..f9ba553c516 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update licence" }, - "updatedLicense": { - "message": "Updated licence" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index fbb23399f0c..b11180e5419 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Ĝisdatigi Permesilon" }, - "updatedLicense": { - "message": "Ĝisdatigita permesilo" - }, "manageSubscription": { "message": "Administri Abonon" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index acd6a536a2c..f00953961f8 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Actualizar licencia" }, - "updatedLicense": { - "message": "Licencia actualizada" - }, "manageSubscription": { "message": "Administrar suscripción" }, @@ -5707,28 +5704,36 @@ "message": "Ocultar" }, "projects": { - "message": "Proyectos" + "message": "Proyectos", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Última modificación" + "message": "Última modificación", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Editar secreto" + "message": "Editar secreto", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Añadir secreto" + "message": "Añadir secreto", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copiar nombre del secreto" + "message": "Copiar nombre del secreto", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copiar valor del secreto" + "message": "Copiar valor del secreto", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Eliminar secreto" + "message": "Eliminar secreto", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Eliminar secretos" + "message": "Eliminar secretos", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Seleccione los proyectos con los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán ver el secreto." + "message": "Seleccione los proyectos con los que se asociará el secreto. Sólo los usuarios de la organización con acceso a estos proyectos podrán ver el secreto.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Seleccionar proyectos" + "message": "Seleccionar proyectos", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Buscar proyectos", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Proyecto" + "message": "Proyecto", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Editar proyecto" + "message": "Editar proyecto", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Ver proyecto" + "message": "Ver proyecto", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Eliminar proyecto" + "message": "Eliminar proyecto", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Eliminar proyectos" + "message": "Eliminar proyectos", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secreto" + "message": "Secreto", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Cuenta de servicio" + "message": "Cuenta de servicio", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Cuentas de servicio" + "message": "Cuentas de servicio", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secretos" + "message": "Secretos", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Par de Nombre/Valor" + "message": "Par de Nombre/Valor", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secreto editado" + "message": "Secreto editado", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secreto creado" + "message": "Secreto creado", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Nuevo secreto" + "message": "Nuevo secreto", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nueva cuenta de servicio" + "message": "Nueva cuenta de servicio", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No hay secretos que mostrar" + "message": "No hay secretos que mostrar", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Para empezar, añade un nuevo secreto o importa secretos." + "message": "Para empezar, añade un nuevo secreto o importa secretos.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nada que mostrar aún" - }, "serviceAccountsNoItemsMessage": { - "message": "Crear una nueva cuenta de servicio para comenzar a automatizar el acceso secreto." + "message": "Crear una nueva cuenta de servicio para comenzar a automatizar el acceso secreto.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nada que mostrar aún", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Buscar secretos" + "message": "Buscar secretos", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Eliminar cuentas de servicio" + "message": "Eliminar cuentas de servicio", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Eliminar cuenta de servicio" + "message": "Eliminar cuenta de servicio", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Ver cuenta de servicio" + "message": "Ver cuenta de servicio", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Buscar cuentas de servicio" + "message": "Buscar cuentas de servicio", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Añadir proyecto" + "message": "Añadir proyecto", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Proyecto editado" + "message": "Proyecto editado", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Proyecto guardado" + "message": "Proyecto guardado", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Proyecto creado" + "message": "Proyecto creado", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nombre del proyecto" + "message": "Nombre del proyecto", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nuevo proyecto" + "message": "Nuevo proyecto", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Eliminar secretos puede afectar a las integraciones existentes." + "message": "Eliminar secretos puede afectar a las integraciones existentes.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secretos enviados a la papelera" + "message": "Secretos enviados a la papelera", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Cuenta de servicio creada" - }, "smAccess": { - "message": "Acceso" + "message": "Acceso", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Proyecto, secreto" + "message": "Proyecto, secreto", + "description": "" }, "serviceAccountName": { - "message": "Nombre de la cuenta de servicio" + "message": "Nombre de la cuenta de servicio", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Cuenta de servicio creada", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Escriba o seleccione proyectos o secretos" + "message": "Escriba o seleccione proyectos o secretos", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Escriba para filtrar" + "message": "Escriba para filtrar", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Proyectos eliminados" + "message": "Proyectos eliminados", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "El proyecto y todos los secretos asociados han sido eliminados" + "message": "El proyecto y todos los secretos asociados han sido eliminados", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "La eliminación del proyecto $PROJECT$ es permanente e irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Escribe \"$CONFIRM$\" para continuar", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Eliminar $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Eliminar $COUNT$ proyectos", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "La eliminación de proyectos es permanente e irreversible." + "message": "La eliminación de proyectos es permanente e irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No hay proyectos para mostrar" + "message": "No hay proyectos para mostrar", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Añade un nuevo proyecto para empezar a organizar secretos." + "message": "Añade un nuevo proyecto para empezar a organizar secretos.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmación necesaria" + "message": "Confirmación necesaria", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "No se han podido eliminar los siguientes proyectos:" + "message": "No se han podido eliminar los siguientes proyectos:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secreto enviado a la papelera" + "message": "Secreto enviado a la papelera", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Buscar proyectos" - }, "accessTokens": { - "message": "Tokens de acceso" + "message": "Tokens de acceso", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Crear un token de acceso" + "message": "Crear un token de acceso", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Caduca" + "message": "Caduca", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Puede leer" + "message": "Puede leer", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No hay tokens de acceso para mostrar" + "message": "No hay tokens de acceso para mostrar", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Para empezar, crea un token de acceso" + "message": "Para empezar, crea un token de acceso", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Descargar o copiar antes de cerrar." + "message": "Descargar o copiar antes de cerrar.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Caduca el:" + "message": "Caduca el:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Los tokens de acceso no están almacenados y no pueden ser recuperados" + "message": "Los tokens de acceso no están almacenados y no pueden ser recuperados", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copiar token" + "message": "Copiar token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Token de acceso" + "message": "Token de acceso", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Fecha de vencimiento requerida" + "message": "Fecha de vencimiento requerida", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Token de acceso creado y copiado al portapapeles" + "message": "Token de acceso creado y copiado al portapapeles", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "La administración de permisos no está disponible para la versión beta." + "message": "La administración de permisos no está disponible para la versión beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revocar token de acceso" + "message": "Revocar token de acceso", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revocar tokens de acceso" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Añadir cuentas de servicio para conceder acceso" }, - "canWrite": { - "message": "Puede escribir" + "serviceAccountPeopleDescription": { + "message": "Conceder a grupos o personas acceso a esta cuenta de servicio." + }, + "serviceAccountProjectsDescription": { + "message": "Asignar proyectos a esta cuenta de servicio. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Puede leer, escribir" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Ocurrió un error al intentar leer el archivo importado" }, + "accessedSecret": { + "message": "Acceso secreto $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Crear un secreto" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index ae6d38382be..5aa0220106c 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Uuenda litsentsi" }, - "updatedLicense": { - "message": "Litsents on uuendatud" - }, "manageSubscription": { "message": "Tellimuse haldamine" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Loobu" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index d2772e1f662..714fd2301cc 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Lizentzia eguneratu" }, - "updatedLicense": { - "message": "Lizentzia eguneratua" - }, "manageSubscription": { "message": "Harpidetza kudeatu" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Proiektuak" + "message": "Proiektuak", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Azken edizioa" + "message": "Azken edizioa", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Editatu sekretua" + "message": "Editatu sekretua", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Gehitu sekretua" + "message": "Gehitu sekretua", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopiatu sekretuaren izena" + "message": "Kopiatu sekretuaren izena", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Kopiatu sekretuaren balioa" + "message": "Kopiatu sekretuaren balioa", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Ezabatu sekretua" + "message": "Ezabatu sekretua", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Ezabatu sekretuak" + "message": "Ezabatu sekretuak", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Sekretua" + "message": "Sekretua", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Sekretuak" + "message": "Sekretuak", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Sekretua editatua" + "message": "Sekretua editatua", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Sekretua sortua" + "message": "Sekretua sortua", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Sekretu berria" + "message": "Sekretu berria", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Ez dago erakusteko sekreturik" + "message": "Ez dago erakusteko sekreturik", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Hasteko, sortu edo inportatu sekretu berri bat." + "message": "Hasteko, sortu edo inportatu sekretu berri bat.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Zerbitzu-kontu berri bat sortu, sarbide sekretua automatizatzen hasteko." + "message": "Zerbitzu-kontu berri bat sortu, sarbide sekretua automatizatzen hasteko.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Bilatu sekretuak" + "message": "Bilatu sekretuak", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Sekretuak ezabatzeak uneko integrazioei eragin ahal die." + "message": "Sekretuak ezabatzeak uneko integrazioei eragin ahal die.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Sekretua zakarrontzira bidalita" + "message": "Sekretua zakarrontzira bidalita", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Proiektua, sekretua" + "message": "Proiektua, sekretua", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Idatzi edo aukeratu proiektu edo sekretuak" + "message": "Idatzi edo aukeratu proiektu edo sekretuak", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Proiektua eta honi lotutako sekretu guztiak ezabatu dira" + "message": "Proiektua eta honi lotutako sekretu guztiak ezabatu dira", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Gehitu proiektu berria sekretuak antolatzen hasteko." + "message": "Gehitu proiektu berria sekretuak antolatzen hasteko.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Sekretua zakarrontzira bidalia" + "message": "Sekretua zakarrontzira bidalia", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 5eb91217b22..8848e23e04c 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -697,7 +697,7 @@ "message": "نوشتن مجدد کلمه عبور اصلی ضروری است." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "طول کلمه عبور اصلی باید حداقل $VALUE$ کاراکتر باشد.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1256,7 +1256,7 @@ "message": "داده‌ها با موفقیت درون ریزی شد" }, "dataExportSuccess": { - "message": "Data successfully exported" + "message": "داده‌ها با موفقیت برون ریزی شد" }, "importWarning": { "message": "شما در حال درون ریزی داده به $ORGANIZATION$ هستید. داده‌های شما ممکن است با اعضای این سازمان به اشتراک گذاشته شود. آیا می‌خواهید ادامه دهید؟", @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "به‌روزرسانی مجوز" }, - "updatedLicense": { - "message": "مجوز به‌روزرسانی شد" - }, "manageSubscription": { "message": "مدیریت اشتراک" }, @@ -5707,28 +5704,36 @@ "message": "پنهان‌سازی" }, "projects": { - "message": "پروژه ها" + "message": "پروژه ها", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "آخرین ویرایش" + "message": "آخرین ویرایش", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "راز را ویرایش کنید" + "message": "راز را ویرایش کنید", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "افزودن راز" + "message": "افزودن راز", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "کپی نام مخفی" + "message": "کپی نام مخفی", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "کپی مقدار مخفی" + "message": "کپی مقدار مخفی", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "حذف راز" + "message": "حذف راز", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "حذف رازها" + "message": "حذف رازها", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "پروژه هایی را انتخاب کنید که راز با آن‌ها مرتبط باشد. فقط کاربران سازمانی که به این پروژه ها دسترسی دارند می‌توانند این راز را ببینند." + "message": "پروژه هایی را انتخاب کنید که راز با آن‌ها مرتبط باشد. فقط کاربران سازمانی که به این پروژه ها دسترسی دارند می‌توانند این راز را ببینند.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "انتخاب پروژه‌ها" + "message": "انتخاب پروژه‌ها", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "جستجوی پروژه‌ها", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "پروژه" + "message": "پروژه", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "ویرایش پروژه" + "message": "ویرایش پروژه", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "مشاهده پروژه" + "message": "مشاهده پروژه", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "حذف پروژه" + "message": "حذف پروژه", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "حذف پروژه ها" + "message": "حذف پروژه ها", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "راز" + "message": "راز", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "حساب سرویس" + "message": "حساب سرویس", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "حساب‌های خدمات" + "message": "حساب‌های خدمات", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "رازها" + "message": "رازها", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "جفت نام/مقدار" + "message": "جفت نام/مقدار", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "راز ویرایش شد" + "message": "راز ویرایش شد", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "راز ایجاد شد" + "message": "راز ایجاد شد", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "راز جدید" + "message": "راز جدید", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "حساب سرویس جدید" + "message": "حساب سرویس جدید", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "رازی برای نمایش نیست" + "message": "رازی برای نمایش نیست", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "برای شروع، یک راز جدید اضافه کنید یا رازها را درون ریزی کنید." + "message": "برای شروع، یک راز جدید اضافه کنید یا رازها را درون ریزی کنید.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "هنوز چیزی برای نشان دادن موجود نیست" - }, "serviceAccountsNoItemsMessage": { - "message": "برای شروع خودکارسازی دسترسی مخفی، یک حساب سرویس جدید ایجاد کنید." + "message": "برای شروع خودکارسازی دسترسی مخفی، یک حساب سرویس جدید ایجاد کنید.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "هنوز چیزی برای نشان دادن موجود نیست", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "جستجوی رازها" + "message": "جستجوی رازها", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "حساب‌های سرویس را حذف کنید" + "message": "حساب‌های سرویس را حذف کنید", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "حساب سرویس را حذف کنید" + "message": "حساب سرویس را حذف کنید", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "حساب سرویس را ببینید" + "message": "حساب سرویس را ببینید", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "جستجوی حساب‌های سرویس" + "message": "جستجوی حساب‌های سرویس", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "افزودن پروژه" + "message": "افزودن پروژه", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "پروژه ویرایش شد" + "message": "پروژه ویرایش شد", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "پروژه ذخیره شد" + "message": "پروژه ذخیره شد", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "پروژه ساخته شد" + "message": "پروژه ساخته شد", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "نام پروژه" + "message": "نام پروژه", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "پروژه جدید" + "message": "پروژه جدید", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "حذف رازها می‌تواند ادغام های موجود را تحت تاثیر قرار دهد." + "message": "حذف رازها می‌تواند ادغام های موجود را تحت تاثیر قرار دهد.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "رازهای به زباله‌ها فرستاده شد" + "message": "رازهای به زباله‌ها فرستاده شد", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "سرویس حساب ساخته شد" - }, "smAccess": { - "message": "دسترسی" + "message": "دسترسی", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "پروژه، راز" + "message": "پروژه، راز", + "description": "" }, "serviceAccountName": { - "message": "نام حساب سرویس" + "message": "نام حساب سرویس", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "سرویس حساب ساخته شد", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "پروژه‌ها یا اسرار را تایپ یا انتخاب کنید" + "message": "پروژه‌ها یا اسرار را تایپ یا انتخاب کنید", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "برای فیلتر تایپ کنید" + "message": "برای فیلتر تایپ کنید", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "پروژه حذف شد" + "message": "پروژه حذف شد", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "پروژه و تمام رازهای مرتبط حذف شد" + "message": "پروژه و تمام رازهای مرتبط حذف شد", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "حذف پروژه $PROJECT$ دائمی و غیر قابل برگشت است.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "برای ادامه، «$CONFIRM$» را تایپ کنید", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "حذف $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ پروژه را حذف کنید", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "حذف پروژه‌ها دائمی و غیر قابل برگشت است." + "message": "حذف پروژه‌ها دائمی و غیر قابل برگشت است.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "پروژه‌ای برای نمایش نیست" + "message": "پروژه‌ای برای نمایش نیست", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "برای شروع سازماندهی رازها، پروژه جدیدی اضافه کنید." + "message": "برای شروع سازماندهی رازها، پروژه جدیدی اضافه کنید.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "به تأیید نیاز دارد" + "message": "به تأیید نیاز دارد", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "پروژه‌های زیر قابل حذف نیستند:" + "message": "پروژه‌های زیر قابل حذف نیستند:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "راز به سطل زباله فرستاده شد" + "message": "راز به سطل زباله فرستاده شد", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "جستجوی پروژه‌ها" - }, "accessTokens": { - "message": "دسترسی به توکن‌ها" + "message": "دسترسی به توکن‌ها", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "توکن دسترسی ایجاد کنید" + "message": "توکن دسترسی ایجاد کنید", + "description": "Button label for creating a new access token." }, "expires": { - "message": "منقضی می‌شود" + "message": "منقضی می‌شود", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "می‌تواند بخواند" + "message": "می‌تواند بخواند", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "هیچ توکن دسترسی برای نمایش وجود ندارد" + "message": "هیچ توکن دسترسی برای نمایش وجود ندارد", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "برای شروع، یک توکن دسترسی ایجاد کنید" + "message": "برای شروع، یک توکن دسترسی ایجاد کنید", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "قبل از بستن بارگیری یا کپی کنید." + "message": "قبل از بستن بارگیری یا کپی کنید.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "تاریخ انقضا:" + "message": "تاریخ انقضا:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "توکن های دسترسی ذخیره نمی‌شوند و قابل بازیابی نیستند" + "message": "توکن های دسترسی ذخیره نمی‌شوند و قابل بازیابی نیستند", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "کپی توکن" + "message": "کپی توکن", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "دسترسی به توکن" + "message": "دسترسی به توکن", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "تاریخ انقضا مورد نیاز است" + "message": "تاریخ انقضا مورد نیاز است", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "توکن دسترسی ایجاد و در کلیپ بورد کپی شد" + "message": "توکن دسترسی ایجاد و در کلیپ بورد کپی شد", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "مدیریت مجوزها برای نسخه بتا در دسترس نیست." + "message": "مدیریت مجوزها برای نسخه بتا در دسترس نیست.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "لغو دسترسی به توکن" + "message": "لغو دسترسی به توکن", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "برای اعطای دسترسی، حساب‌های سرویس اضافه کنید" }, - "canWrite": { - "message": "می‌توان نوشت" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "می‌توان خواند، نوشت" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index c52ba0c9362..253cf8ffeef 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -658,7 +658,7 @@ "message": "Pääsalasanalla pääset käsiksi holviisi. On erittäin tärkeää, että muistat pääsalasanasi, koska sen palautus ei ole mahdollista, jos unohdat sen." }, "masterPassImportant": { - "message": "Pääsalasanan palautus ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" }, "masterPassHintDesc": { "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan." @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Päivitä lisenssi" }, - "updatedLicense": { - "message": "Lisenssi päivitettiin" - }, "manageSubscription": { "message": "Hallitse tilausta" }, @@ -5707,28 +5704,36 @@ "message": "Piilota" }, "projects": { - "message": "Projektit" + "message": "Projektit", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Viimeksi muokattu" + "message": "Viimeksi muokattu", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Muokkaa salaisuutta" + "message": "Muokkaa salaisuutta", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Lisää salaisuus" + "message": "Lisää salaisuus", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopioi salaisuuden nimi" + "message": "Kopioi salaisuuden nimi", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Kopioi salaisuuden arvo" + "message": "Kopioi salaisuuden arvo", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Poista salaisuus" + "message": "Poista salaisuus", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Poista salaisuudet" + "message": "Poista salaisuudet", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Poista salaisuus pysyvästi" @@ -5737,106 +5742,143 @@ "message": "Poista salaisuudet pysyvästi" }, "secretProjectAssociationDescription": { - "message": "Valitse projektit, joihin salaisuus liitetään. Salaisuuden voivat nähdä vain ne organisaation käyttäjät, joilla on käyttöoikeudet näihin projekteihin." + "message": "Valitse projektit, joihin salaisuus liitetään. Salaisuuden voivat nähdä vain ne organisaation käyttäjät, joilla on käyttöoikeudet näihin projekteihin.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Valitse projektit" + "message": "Valitse projektit", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Etsi projekteista", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekti" + "message": "Projekti", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Muokkaa projektia" + "message": "Muokkaa projektia", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Näytä projekti" + "message": "Näytä projekti", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Poista projekti" + "message": "Poista projekti", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Poista projektit" + "message": "Poista projektit", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Salaisuus" + "message": "Salaisuus", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Palvelutili" + "message": "Palvelutili", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Palvelutilit" + "message": "Palvelutilit", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Salaisuudet" + "message": "Salaisuudet", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Nimi/arvopari" + "message": "Nimi/arvopari", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Salaisuutta muokattiin" + "message": "Salaisuutta muokattiin", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Salaisuus luotiin" + "message": "Salaisuus luotiin", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Uusi salaisuus" + "message": "Uusi salaisuus", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Uusi palvelutili" + "message": "Uusi palvelutili", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Näytettäviä salaisuuksia ei ole" + "message": "Näytettäviä salaisuuksia ei ole", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Aloita lisäämällä uusi salaisuus tai tuomalla niitä." + "message": "Aloita lisäämällä uusi salaisuus tai tuomalla niitä.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Roskakorissa ei ole salaisuuksia." }, - "serviceAccountsNoItemsTitle": { - "message": "Mitään näytettävää ei vielä ole" - }, "serviceAccountsNoItemsMessage": { - "message": "Aloita salaisen käytön automatisointi luomalla uusi palvelutili." + "message": "Aloita salaisen käytön automatisointi luomalla uusi palvelutili.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Mitään näytettävää ei vielä ole", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Etsi salaisuuksista" + "message": "Etsi salaisuuksista", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Poista palvelutilit" + "message": "Poista palvelutilit", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Poista palvelutili" + "message": "Poista palvelutili", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Näytä palvelutili" + "message": "Näytä palvelutili", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Etsi palvelutileistä" + "message": "Etsi palvelutileistä", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Lisää projekti" + "message": "Lisää projekti", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projektia muokattiin" + "message": "Projektia muokattiin", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projekti tallennettiin" + "message": "Projekti tallennettiin", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projekti luotiin" + "message": "Projekti luotiin", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projektin nimi" + "message": "Projektin nimi", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Uusi projekti" + "message": "Uusi projekti", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Salaisuuksien poisto voi vaikuttaa olemassa oleviin integrointeihin." + "message": "Salaisuuksien poisto voi vaikuttaa olemassa oleviin integrointeihin.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Salaisuudet siirrettiin roskakoriin" + "message": "Salaisuudet siirrettiin roskakoriin", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Haluatko varmasti poistaa salaisuuden pysyvästi?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Salaisuudet poistettiin pysyvästi" }, - "serviceAccountCreated": { - "message": "Palvelutili luotiin" - }, "smAccess": { - "message": "Käyttöoikeudet" + "message": "Käyttöoikeudet", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekti, salaisuus" + "message": "Projekti, salaisuus", + "description": "" }, "serviceAccountName": { - "message": "Palvelutilin nimi" + "message": "Palvelutilin nimi", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Palvelutili luotiin", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Syötä tai valitse projekteja tai salaisuuksia" + "message": "Syötä tai valitse projekteja tai salaisuuksia", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Suodata kirjoittamalla" + "message": "Suodata kirjoittamalla", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projektit poistettiin" + "message": "Projektit poistettiin", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Projekti ja kaikki siihen liittyvät salaisuudet poistettiin" + "message": "Projekti ja kaikki siihen liittyvät salaisuudet poistettiin", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Projektin $PROJECT$ poisto on pysyvää, eikä sitä ole mahdollista perua.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Jatka syöttämällä \"$CONFIRM$\"", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Poista $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Poista $COUNT$ projektia", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Projektien poisto on pysyvää, eikä sitä ole mahdollista perua." + "message": "Projektien poisto on pysyvää, eikä sitä ole mahdollista perua.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Näytettäviä projekteja ei ole" + "message": "Näytettäviä projekteja ei ole", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Aloita salaisuuksien järjestely luomalla uusi projekti." + "message": "Aloita salaisuuksien järjestely luomalla uusi projekti.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Vahvistus vaaditaan" + "message": "Vahvistus vaaditaan", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Seuraavia projekteja ei voitu poistaa:" + "message": "Seuraavia projekteja ei voitu poistaa:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Salaisuus siirrettiin roskakoriin" + "message": "Salaisuus siirrettiin roskakoriin", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Salaisuus poistettiin pysyvästi" }, - "searchProjects": { - "message": "Etsi projekteista" - }, "accessTokens": { - "message": "Käyttötunnisteet" + "message": "Käyttötunnisteet", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Luo käyttötunniste" + "message": "Luo käyttötunniste", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Erääntyy" + "message": "Erääntyy", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Voi lukea" + "message": "Voi lukea", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Näytettäviä käyttötunnisteita ei ole" + "message": "Näytettäviä käyttötunnisteita ei ole", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Aloita luomalla käyttötunniste" + "message": "Aloita luomalla käyttötunniste", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Lataa tai kopioi ennen sulkua." + "message": "Lataa tai kopioi ennen sulkua.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Erääntyy:" + "message": "Erääntyy:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Käyttötunnisteita ei säilytetä, eikä niiden palautus ole mahdollista" + "message": "Käyttötunnisteita ei säilytetä, eikä niiden palautus ole mahdollista", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopioi tunniste" + "message": "Kopioi tunniste", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Käyttötunniste" + "message": "Käyttötunniste", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Erääntymisajankohta vaaditaan" + "message": "Erääntymisajankohta vaaditaan", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Käyttötunniste luotiin ja kopioitiin leikepöydälle" + "message": "Käyttötunniste luotiin ja kopioitiin leikepöydälle", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Käyttöoikeushallinta ei ole käytettävissä beta-vaiheessa." + "message": "Käyttöoikeushallinta ei ole käytettävissä beta-vaiheessa.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Mitätöi käyttötunniste" + "message": "Mitätöi käyttötunniste", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Mitätöi käyttötunnisteet" @@ -6341,13 +6413,13 @@ "message": "Tallenna lisenssi" }, "projectPeopleDescription": { - "message": "Myönnä ryhmille tai henkilöille käyttöoikeudet tähän projektiin." + "message": "Myönnä ryhmille tai henkilöille tämän projektin käyttöoikeus." }, "projectPeopleSelectHint": { "message": "Syötä tai valitse henkilöt tai ryhmät" }, "projectServiceAccountsDescription": { - "message": "Myönnä palvelutileille käyttöoikeudet tähän projektiin." + "message": "Myönnä palvelutileille tämän projektin käyttöoikeus." }, "projectServiceAccountsSelectHint": { "message": "Syötä tai valitse palvelutilit" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Myönnä käyttöoikeuksia lisäämällä palvelutilejä" }, - "canWrite": { - "message": "Voi kirjoittaa" + "serviceAccountPeopleDescription": { + "message": "Myönnä ryhmille tai henkilöille tämän palvelutilin käyttöoikeus." + }, + "serviceAccountProjectsDescription": { + "message": "Määritä palvelutilille projekteja. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Lisää projekteja käyttöoikeuksien myöntämiseksi" }, "canReadWrite": { "message": "Voi lukea, kirjoittaa" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Tuontitiedostoa luettaessa tapahtui virhe." }, + "accessedSecret": { + "message": "Avasi salaisuuden $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Luo salaisuus" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Hylkää" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index d8c034c11c5..1a4e1e5a2e1 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -1,6 +1,6 @@ { "pageTitle": { - "message": "$APP_NAME$ Web Vault", + "message": "Web Vault ng $APP_NAME$", "description": "The title of the website in the browser window.", "placeholders": { "app_name": { @@ -10,7 +10,7 @@ } }, "whatTypeOfItem": { - "message": "Anong type ng item ito" + "message": "Ano'ng uri ng item na ito?" }, "name": { "message": "Pangalan" @@ -32,22 +32,22 @@ "message": "Bagong URI" }, "username": { - "message": "Ang pangalan ng tagagamit" + "message": "Username" }, "password": { - "message": "Ang Password" + "message": "Password" }, "newPassword": { "message": "Bagong password" }, "passphrase": { - "message": "Pasa salita" + "message": "Passphrase" }, "notes": { - "message": "Mga nota" + "message": "Mga Tala" }, "customFields": { - "message": "Pasadyang mga patlang" + "message": "Ipinasadyang mga field" }, "cardholderName": { "message": "Pangalan ng cardholder" @@ -59,25 +59,25 @@ "message": "Tatak" }, "expiration": { - "message": "Pag-expire" + "message": "Mag-e-expire" }, "securityCode": { - "message": "Kodigo ng Seguridad" + "message": "Code panseguridad (CVV)" }, "identityName": { - "message": "Pangalan ng Identidad" + "message": "Pangalan ng pagkakakilanlan" }, "company": { "message": "Kumpanya" }, "ssn": { - "message": "Numero ng Seguridad Sosyal" + "message": "Numero ng National ID / Social Security" }, "passportNumber": { - "message": "Numero ng Pasaporte" + "message": "Numero ng pasaporte" }, "licenseNumber": { - "message": "Numero ng Lisensya" + "message": "Numero ng lisensya" }, "email": { "message": "Email" @@ -122,43 +122,43 @@ "message": "Disyembre" }, "title": { - "message": "Pamagat" + "message": "Title" }, "mr": { - "message": "Ginoo" + "message": "G" }, "mrs": { "message": "Gng" }, "ms": { - "message": "Ms" + "message": "Bb" }, "mx": { "message": "Mx" }, "dr": { - "message": "Dr" + "message": "Dr(a)" }, "expirationMonth": { - "message": "Buwan ng Pagpaso" + "message": "Buwan ng pag-expire" }, "expirationYear": { - "message": "Taon ng Pag-expire" + "message": "Taon ng pag-expire" }, "authenticatorKeyTotp": { - "message": "Susi ng Authenticator (TOTP)" + "message": "Authenticator key (TOTP)" }, "folder": { - "message": "Folder/Direktoryo" + "message": "Folder" }, "newCustomField": { - "message": "Bagong custom field" + "message": "Bagong pasadyang field" }, "value": { "message": "Halaga" }, "dragToSort": { - "message": "I-drag upang i-sort" + "message": "Hilahin para pagsunud-sunurin" }, "cfTypeText": { "message": "Teksto" @@ -170,11 +170,11 @@ "message": "Boolean" }, "cfTypeLinked": { - "message": "Nilikha", + "message": "Naka-link", "description": "This describes a field that is 'linked' (related) to another field." }, "remove": { - "message": "Alisin" + "message": "Tanggalin" }, "unassigned": { "message": "Hindi nakatalaga" @@ -187,7 +187,7 @@ "message": "Magdagdag ng folder" }, "editFolder": { - "message": "I-edit ang folder" + "message": "Baguhin ang folder" }, "baseDomain": { "message": "Base domain", @@ -205,38 +205,38 @@ "message": "Eksakto" }, "startsWith": { - "message": "Naguumpisa sa" + "message": "Nag-uumpisa sa" }, "regEx": { - "message": "Regular Expression - Regular na Pagpapahayag", + "message": "Regular na expression", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection - Pagtuklas ng Pares", + "message": "Deteksyon ng tugma", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Kamalian ng Default", + "message": "Default na deteksyon ng pagkakatugma", "description": "Default URI match detection for auto-fill." }, "never": { "message": "Hindi kailanman" }, "toggleVisibility": { - "message": "I-toggle ang kakayahang makita" + "message": "Ipakita/itago" }, "toggleCollapse": { - "message": "I-toggle ang pagbagal", + "message": "Palakihin/paliitin", "description": "Toggling an expand/collapse state." }, "generatePassword": { - "message": "Magtatag ng Password" + "message": "Gumawa ng password" }, "checkPassword": { - "message": "Suriin kung ang password ay na-expose." + "message": "Tingnan kung nakompromiso na ba ang password." }, "passwordExposed": { - "message": "Ang password na ito ay na-expose na $VALUE$ beses sa mga data breach. Dapat mong baguhin ito.", + "message": "Nakompromiso na nang $VALUE$ beses ang password na ito sa mga data breach. Dapat mo na itong palitan.", "placeholders": { "value": { "content": "$1", @@ -245,7 +245,7 @@ } }, "passwordSafe": { - "message": "Ang password na ito ay hindi natagpuan sa alinman sa mga alam na data breach. Maaari itong gamitin nang ligtas." + "message": "Hindi pa nakokompromiso ang password na ito sa mga naitalang data breach. Ligtas itong gamitin." }, "save": { "message": "I-save" @@ -260,56 +260,56 @@ "message": "Isara" }, "delete": { - "message": "Alisin" + "message": "Burahin" }, "favorite": { - "message": "Ang Paborito" + "message": "Paborito" }, "unfavorite": { "message": "Hindi paborito" }, "edit": { - "message": "I-edit" + "message": "Baguhin" }, "searchCollection": { - "message": "Maghanap ng koleksyon" + "message": "Maghanap sa koleksyon" }, "searchFolder": { - "message": "Maghanap ng folder" + "message": "Maghanap sa folder" }, "searchFavorites": { - "message": "Maghanap ng mga paborito" + "message": "Maghanap sa mga paborito" }, "searchLogin": { - "message": "Maghanap ng mga login", + "message": "Maghanap sa mga login", "description": "Search Login type" }, "searchCard": { - "message": "Mga search card", + "message": "Maghanap sa mga kard", "description": "Search Card type" }, "searchIdentity": { - "message": "Maghanap ng mga pagkakakilanlan", + "message": "Maghanap sa mga pagkakakilanlan", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Maghanap ng mga secure na tala", + "message": "Maghanap sa mga secure na tala", "description": "Search Secure Note type" }, "searchVault": { - "message": "Hanapin ang vault" + "message": "Maghanap sa vault" }, "searchMyVault": { - "message": "Maghanap sa aking vault" + "message": "Maghanap sa vault ko" }, "searchOrganization": { - "message": "Maghanap ng organisasyon" + "message": "Maghanap sa organisasyon" }, "searchMembers": { - "message": "Maghanap ng mga miyembro" + "message": "Maghanap sa mga miyembro" }, "searchGroups": { - "message": "Maghanap ng mga grupo" + "message": "Maghanap sa mga grupo" }, "allItems": { "message": "Lahat ng mga item" @@ -324,7 +324,7 @@ "message": "Login" }, "typeCard": { - "message": "Karta" + "message": "Kard" }, "typeIdentity": { "message": "Pagkakakilanlan" @@ -336,31 +336,31 @@ "message": "Mga Login" }, "typeCardPlural": { - "message": "Mga Karta" + "message": "Mga Kard" }, "typeIdentityPlural": { - "message": "Mga Identidad" + "message": "Mga Pagkakakilanlan" }, "typeSecureNotePlural": { - "message": "Mga Secure Note" + "message": "Mga Secure na Tala" }, "folders": { "message": "Mga Folder" }, "collections": { - "message": "Koleksyon" + "message": "Mga Koleksyon" }, "firstName": { - "message": "Unang Pangalan" + "message": "Unang pangalan" }, "middleName": { - "message": "Gitnang Pangalan" + "message": "Gitnang pangalan" }, "lastName": { - "message": "Huling pangalan" + "message": "Apelyido" }, "fullName": { - "message": "Buong Pangalan" + "message": "Buong pangalan" }, "address1": { "message": "Address 1" @@ -372,19 +372,19 @@ "message": "Address 3" }, "cityTown": { - "message": "Bayan/Town" + "message": "Lungsod / Bayan" }, "stateProvince": { - "message": "Estado/Probinsya" + "message": "Estado / Probinsya" }, "zipPostalCode": { - "message": "Código ng Zip / Postal" + "message": "Zip / Postal code" }, "country": { - "message": "Bayan" + "message": "Bansa" }, "shared": { - "message": "Iniimbak" + "message": "Naibahagi" }, "attachments": { "message": "Mga Attachment" @@ -396,33 +396,33 @@ "message": "Bagong item" }, "addItem": { - "message": "Magdagdag ng Item" + "message": "Magdagdag ng item" }, "editItem": { - "message": "Baguhin ang Item" + "message": "Baguhin ang item" }, "viewItem": { - "message": "Tingnan ang Item" + "message": "Tingnan ang item" }, "new": { - "message": "Bagong", + "message": "Bago", "description": "for adding new items" }, "item": { "message": "Item" }, "ex": { - "message": "ex.", + "message": "hal.", "description": "Short abbreviation for 'example'." }, "other": { "message": "Iba pa" }, "share": { - "message": "I-share" + "message": "Ibahagi" }, "moveToOrganization": { - "message": "Lumipat sa organisasyon" + "message": "Ilipat sa organisasyon" }, "valueCopied": { "message": "Kinopya ang $VALUE$", @@ -439,19 +439,19 @@ "description": "Copy value to clipboard" }, "copyPassword": { - "message": "Kopyahin ang Password", + "message": "Kopyahin ang password", "description": "Copy password to clipboard" }, "copyUsername": { - "message": "Kopyahin ang pangalan ng gumagamit", + "message": "Kopyahin ang username", "description": "Copy username to clipboard" }, "copyNumber": { - "message": "Pamamagitan ng Kopya ng Bilang", + "message": "Kopyahin ang numero", "description": "Copy credit card number" }, "copySecurityCode": { - "message": "Kopyahin ang code ng seguridad", + "message": "Kopyahin ang code panseguridad", "description": "Copy credit card security code (CVV)" }, "copyUri": { @@ -462,73 +462,73 @@ "message": "Ako" }, "myVault": { - "message": "Aking Kahadeyero" + "message": "Vault ko" }, "allVaults": { - "message": "Lahat ng Vault" + "message": "Lahat ng mga vault" }, "vault": { - "message": "Ayos" + "message": "Vault" }, "vaults": { - "message": "Mga Vault" + "message": "Mga vault" }, "vaultItems": { "message": "Mga item sa vault" }, "filter": { - "message": "Filter" + "message": "Mga pansala" }, "moveSelectedToOrg": { - "message": "Ilipat ang pinili sa organisasyon" + "message": "Ilipat sa napiling organisasyon" }, "deleteSelected": { - "message": "Tanggalin ang napiling" + "message": "Burahin ang napili" }, "moveSelected": { - "message": "Ilipat ang napiling" + "message": "Ilipat ang napili" }, "selectAll": { - "message": "Piliin ang lahat" + "message": "Piliin lahat" }, "unselectAll": { - "message": "I-unselect ang lahat" + "message": "Huwag piliin lahat" }, "launch": { - "message": "Paglulunsad" + "message": "Buksan" }, "newAttachment": { "message": "Magdagdag ng bagong attachment" }, "deletedAttachment": { - "message": "Attachment na natanggal" + "message": "Binura ang attachment" }, "deleteAttachmentConfirmation": { - "message": "Sigurado ka bang gusto mong tanggalin ang attachment na ito?" + "message": "Sigurado ka bang gusto mong burahin ang attachment na ito?" }, "attachmentSaved": { - "message": "Attachment na nai-save" + "message": "Na-save ang attachment" }, "file": { - "message": "Mag-file" + "message": "File" }, "selectFile": { - "message": "Pumili ng File" + "message": "Pumili ng file." }, "maxFileSize": { - "message": "Maximum na laki ng file ay 500 MB." + "message": "Hanggang sa 500 MB lang dapat ang mga file." }, "updateKey": { - "message": "Hindi mo maari gamitin ang tampok na ito hanggang hindi mo iupdate ang iyong encryption key." + "message": "Hindi mo magagamit ang feature na ito hanggang sa i-update mo ang encryption key mo." }, "addedItem": { - "message": "Ang item ay idinagdag" + "message": "Naidagdag ang item" }, "editedItem": { - "message": "Ang item ay nai-save" + "message": "Na-save ang item" }, "movedItemToOrg": { - "message": "$ITEMNAME$ lumipat sa $ORGNAME$", + "message": "Inilipat ang $ITEMNAME$ sa $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -550,22 +550,22 @@ } }, "deleteItem": { - "message": "Tanggalin ang Item" + "message": "Burahin ang item" }, "deleteFolder": { "message": "Burahin ang folder" }, "deleteAttachment": { - "message": "Tanggalin ang attachment" + "message": "Burahin ang attachment" }, "deleteItemConfirmation": { - "message": "Gusto mo bang talagang ipadala sa basura?" + "message": "Gusto mo ba talaga itong itapon?" }, "deletedItem": { - "message": "Pinadala ang Item sa basurahan" + "message": "Itinapon ang item sa basurahan" }, "deletedItems": { - "message": "Mga item na ipinadala sa basurahan" + "message": "Itinapon ang mga item sa basurahan" }, "movedItems": { "message": "Inilipat ang mga item" @@ -574,37 +574,37 @@ "message": "Sigurado ka bang gusto mong palitan ang kasalukuyang password?" }, "editedFolder": { - "message": "Nai-save na folder" + "message": "Sinave ang folder" }, "addedFolder": { - "message": "Idinagdag na folder" + "message": "Idinagdag ang folder" }, "deleteFolderConfirmation": { - "message": "Sigurado ka bang gusto mong tanggalin ang folder na ito?" + "message": "Sigurado ka bang gusto mong burahin ang folder na ito?" }, "deletedFolder": { - "message": "Tinanggal na folder" + "message": "Binura ang folder" }, "editInfo": { - "message": "I-edit ang impormasyon" + "message": "Baguhin ang impormasyon" }, "access": { - "message": "I-access" + "message": "Access" }, "loggedOut": { - "message": "Umalis na" + "message": "Naka-log out" }, "loginExpired": { - "message": "Nag-expire na ang iyong session sa login." + "message": "Nag-expire na ang login session mo." }, "logOutConfirmation": { "message": "Sigurado ka bang gusto mong mag-log out?" }, "logOut": { - "message": "Mag-Log Out" + "message": "Mag-log out" }, "ok": { - "message": "Ok" + "message": "Sige" }, "yes": { "message": "Oo" @@ -613,91 +613,91 @@ "message": "Hindi" }, "loginOrCreateNewAccount": { - "message": "Maglog-in o gumawa ng bagong account para ma-access ang iyong ligtas na kahadeyero." + "message": "Mag-log in o gumawa ng bagong account para ma-access ang secure vault mo." }, "loginWithDevice": { - "message": "Mag log in gamit ang device" + "message": "Mag-log in gamit ang device" }, "loginWithDeviceEnabledInfo": { - "message": "Ang pag log in gamit ang device ay dapat na naka set up sa mga setting ng Bitwarden mobile app. Kailangan mo ng ibang opsyon?" + "message": "Dapat nakahanda ang pagla-log in gamit ang device sa mga setting ng mobile app ng Bitwarden. Kailangan ng higit pang opsyon?" }, "loginWithMasterPassword": { - "message": "Mag-login gamit ang pangunahing password" + "message": "Mag-log in gamit ang master password" }, "createAccount": { - "message": "Gumawa ng Account" + "message": "Gumawa ng account" }, "newAroundHere": { - "message": "Mag-login gamit ang pangunahing password?" + "message": "Bago rito?" }, "startTrial": { - "message": "Simulan ang pagsubok" + "message": "Simulan ang trial" }, "logIn": { "message": "Mag-log in" }, "logInInitiated": { - "message": "Mag log in na sinimulan" + "message": "Sinimulan ang pag-log in" }, "submit": { - "message": "Isumite" + "message": "Ipadala" }, "emailAddressDesc": { - "message": "Gagamitin mo ang iyong email address upang mag log in." + "message": "Gagamitin mo ang email address mo para mag-log in." }, "yourName": { - "message": "Ang iyong pangalan" + "message": "Pangalan mo" }, "yourNameDesc": { - "message": "Ano po ba ang dapat naming itawag sa inyo" + "message": "Ano'ng dapat itawag namin sa'yo?" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "masterPassDesc": { - "message": "Ang master password ay ang password na gagamitin mo upang ma-access ang iyong kahadeyero. Napakaimportante na hindi mo makalimutan ang iyong master password. Walang paraan upang ma-recover ang password kapag nakalimutan mo ito." + "message": "Ang master password ang password na gagamitin mo para ma-access ang vault. Napakamahalagang hindi mo kailanman makalimutan ang master password—kung gaano kahalagang makalimutan mo ang iyong ex, ganyan kahalagang maalala mo ang master password mo. Hindi kayang mabalik ang master password kung nakalimutan mo ito." }, "masterPassImportant": { - "message": "Hindi mababawi ang mga master password kung nakalimutan mo ito!" + "message": "Hindi na mare-recover ang master password kapag nakalimutan mo ito!" }, "masterPassHintDesc": { - "message": "May isang pahiwatig para sa master password na makakatulong na maalala mo ang iyong password kapag nakalimutan mo ito." + "message": "Makakatulong ang palatandaan ng master password na maalala mo ang password mo kung nakalimutan mo ito." }, "reTypeMasterPass": { - "message": "Muling i-type ang Master Password" + "message": "I-type ulit ang master password" }, "masterPassHint": { - "message": "Mungkahi sa Master Password (opsyonal)" + "message": "Palatandaan ng master password (opsyonal)" }, "masterPassHintLabel": { - "message": "Master password pahiwatig" + "message": "Palatandaan ng master password" }, "settings": { - "message": "Mga Preperensya" + "message": "Mga Setting" }, "passwordHint": { - "message": "Mungkahi sa Password" + "message": "Palatandaan ng password" }, "enterEmailToGetHint": { - "message": "Ipasok ang iyong email address ng account para makatanggap ng hint ng iyong master password." + "message": "Ipasok ang email address ng account mo para makita ang palatandaan ng master password mo." }, "getMasterPasswordHint": { - "message": "Makuha ang Punong Password na Hint" + "message": "Kunin ang palatandaan ng master password" }, "emailRequired": { "message": "Kinakailangan ang email address." }, "invalidEmail": { - "message": "Di-wasto na email address." + "message": "'Di-wastong email address." }, "masterPasswordRequired": { - "message": "Maling address ng email." + "message": "Kinakailangan ang master password." }, "confirmMasterPasswordRequired": { - "message": "Kinakailangan ang ulitin ang master password." + "message": "Kailangang i-type ulit ang master password." }, "masterPasswordMinlength": { - "message": "Ang master password ay dapat na hindi bababa sa $VALUE$ na mga character.", + "message": "Hindi dapat bumaba sa $VALUE$ karakter ang master password.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -707,31 +707,31 @@ } }, "masterPassDoesntMatch": { - "message": "Hindi tumutugma ang kumpirmasyon ng master password." + "message": "May hindi pagtutugma sa kumpirmasyon ng master password." }, "newAccountCreated": { "message": "Nalikha na ang iyong bagong account! Maaari ka nang mag-log in." }, "trialAccountCreated": { - "message": "Matagumpay na nilikha ang account." + "message": "Matagumpay na nalikha ang account." }, "masterPassSent": { - "message": "Pinadala na namin sa iyo ang email na may hint ng master password mo." + "message": "Pinadalhan ka namin ng email na may palatandaan ng master password mo." }, "unexpectedError": { - "message": "Namana ang isang hindi inaasahang error." + "message": "Nagkaroon ng hindi inaasahang problema." }, "emailAddress": { - "message": "Email Address" + "message": "Email address" }, "yourVaultIsLocked": { - "message": "Naka-lock ang iyong vault. Patunayan ang iyong pagkakakilanlan upang magpatuloy." + "message": "Naka-lock ang vault mo. Beripikahin ang master password mo para tumuloy." }, "unlock": { - "message": "Buksan" + "message": "I-unlock" }, "loggedInAsEmailOn": { - "message": "Nag-log in bilang $EMAIL$ noong $HOSTNAME$.", + "message": "Naka-log in bilang si $EMAIL$ sa $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -747,40 +747,40 @@ "message": "Hindi wasto ang master password" }, "invalidFilePassword": { - "message": "Imbalidong file password, mangyaring gamitin ang password na iyong ipinasok kapag nilikha mo ang export file." + "message": "Hindi wasto ang password ng file, mangyaring gamitin ang password na inilagay mo noong ginawa mo ang export file." }, "lockNow": { - "message": "Mag-kandado Na" + "message": "I-lock ngayon" }, "noItemsInList": { - "message": "Walang mga bagay na maipapakita." + "message": "Walang maililistang item." }, "noPermissionToViewAllCollectionItems": { - "message": "Wala kang pahintulot na tingnan ang lahat ng item sa koleksyong ito." + "message": "Wala kang pahintulot na makita lahat ng mga item sa koleksyong ito." }, "noCollectionsInList": { - "message": "Walang mga koleksyon na maipapakita." + "message": "Walang maililistang koleksyon." }, "noGroupsInList": { - "message": "Walang mga grupo na ilista." + "message": "Walang maililistang mga pangkat." }, "noUsersInList": { - "message": "Walang mga gumagamit na ilista." + "message": "Walang maililistang user." }, "noMembersInList": { - "message": "Walang mga miyembro na ilista." + "message": "Walang maililistang miyembro." }, "noEventsInList": { - "message": "Walang mga kaganapan na ilista." + "message": "Walang maililistang kaganapan." }, "newOrganization": { "message": "Bagong organisasyon" }, "noOrganizationsList": { - "message": "Hindi ka kabilang sa anumang mga organisasyon. Pinapayagan ka ng mga organisasyon na ligtas na magbahagi ng mga item sa iba pang mga gumagamit." + "message": "Hindi ka kabilang sa anumang organisasyon. Ligtas kang makakapagbahagi ng mga item sa iba pang mga user sa organisasyon." }, "notificationSentDevice": { - "message": "Naipadala na ang notification sa iyong device." + "message": "Nakapagpadala na ng notipikasyon sa device mo." }, "versionNumber": { "message": "Bersyon $VERSION_NUMBER$", @@ -792,10 +792,10 @@ } }, "enterVerificationCodeApp": { - "message": "Ipasok ang 6 na digit na code ng pagpapatunay mula sa iyong authenticator app." + "message": "Ilagay ang 6 na numerong code pamberipika mula sa authenticator app mo." }, "enterVerificationCodeEmail": { - "message": "Ipasok ang 6 na digit na code na na-email sa $EMAIL$.", + "message": "Ilagay ang 6 na numerong code pamberipikang in-email sa $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -804,7 +804,7 @@ } }, "verificationCodeEmailSent": { - "message": "Veripikasyon na email na ipinadala sa $EMAIL$.", + "message": "Ipinadala ang email pamberipika sa $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -813,28 +813,28 @@ } }, "rememberMe": { - "message": "Tandaan mo ako" + "message": "Tandaan ako" }, "sendVerificationCodeEmailAgain": { - "message": "Ipadala muli ang email ng verification code" + "message": "Ipadala ulit ang email na naglalaman ng code pamberipika" }, "useAnotherTwoStepMethod": { - "message": "Gamitin ang isa pang two-step na paraan ng pag-login" + "message": "Gumamit ng ibang paraan sa dalawang-hakbang na pag-log in" }, "insertYubiKey": { - "message": "I-insert ang iyong YubiKey sa USB port ng iyong computer, pagkatapos ay tindigin ang buton nito." + "message": "Ipasok ang YubiKey mo sa USB port ng iyong computer, tapos pindutin ang buton nito." }, "insertU2f": { - "message": "I-insert ang iyong security key sa USB port ng iyong computer. Kung mayroon itong buton, tindigin ito." + "message": "Ipasok ang security key mo sa USB port ng iyong computer. Kung may buton, pindutin ito." }, "loginUnavailable": { - "message": "Hindi magagamit ang pag-login" + "message": "Hindi available ang login" }, "noTwoStepProviders": { - "message": "Mayroong naka-set up na two-step login ang account na ito, ngunit walang sinusuportahang two-step provider ng web browser na ito." + "message": "May dalawang-hakbang na pag-log in ang account na ito, pero hindi suportado ng web browser na ito ang anumang naitakdang two-step provider." }, "noTwoStepProviders2": { - "message": "Mangyaring gamitin ang isang suportadong web browser (tulad ng Chrome) at/o magdagdag ng karagdagang mga provider na mas suportado sa ibat ibang web browsers (tulad ng isang authenticator app)." + "message": "Mangyaring gumamit ng suportadong web browser (tulad ng Firefox) at/o karagdagang provider na may mas mainam na suporta sa iba't-ibang mga device (tulad ng isang authenticator app)." }, "twoStepOptions": { "message": "Mga pagpipilian para sa two-step login" @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update ng lisensya" }, - "updatedLicense": { - "message": "Na-update na lisensya" - }, "manageSubscription": { "message": "Pamahalaan ang subscription" }, @@ -5707,28 +5704,36 @@ "message": "Tago" }, "projects": { - "message": "Mga Proyekto" + "message": "Mga Proyekto", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Huling na-edit" + "message": "Huling na-edit", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit lihim" + "message": "Edit lihim", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Magdagdag ng lihim" + "message": "Magdagdag ng lihim", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopyahin ang lihim na pangalan" + "message": "Kopyahin ang lihim na pangalan", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Kopyahin ang lihim na halaga" + "message": "Kopyahin ang lihim na halaga", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Tanggalin ang lihim" + "message": "Tanggalin ang lihim", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Tanggalin ang mga lihim" + "message": "Tanggalin ang mga lihim", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanenteng burahin ang lihim" @@ -5737,106 +5742,143 @@ "message": "Permanenteng burahin ang mga lihim" }, "secretProjectAssociationDescription": { - "message": "Pumili ng mga proyekto na ang lihim ay maiugnay. Tanging ang mga gumagamit ng organisasyon na may access sa mga proyektong ito ang makakakita ng lihim." + "message": "Pumili ng mga proyekto na ang lihim ay maiugnay. Tanging ang mga gumagamit ng organisasyon na may access sa mga proyektong ito ang makakakita ng lihim.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Pilipitin ang mga proyekto" + "message": "Pilipitin ang mga proyekto", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Maghanap ng mga proyekto", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Proyekto" + "message": "Proyekto", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "I-edit ang proyekto" + "message": "I-edit ang proyekto", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Tingnan ang proyekto" + "message": "Tingnan ang proyekto", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Tanggalin ang proyekto" + "message": "Tanggalin ang proyekto", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Tanggalin ang mga proyekto" + "message": "Tanggalin ang mga proyekto", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Lihim na" + "message": "Lihim na", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Account sa serbisyo" + "message": "Account sa serbisyo", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Mga account sa serbisyo" + "message": "Mga account sa serbisyo", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Mga lihim" + "message": "Mga lihim", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Pares ng Pangalan/Halaga" + "message": "Pares ng Pangalan/Halaga", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Lihim na na edit" + "message": "Lihim na na edit", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Lihim na nilikha" + "message": "Lihim na nilikha", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Bagong lihim" + "message": "Bagong lihim", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Bagong account sa serbisyo" + "message": "Bagong account sa serbisyo", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Walang lihim na maipapakita" + "message": "Walang lihim na maipapakita", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Upang makapagsimula, magdagdag ng isang bagong lihim o mga lihim ng pag import." + "message": "Upang makapagsimula, magdagdag ng isang bagong lihim o mga lihim ng pag import.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Walang mga lihim sa basurahan." }, - "serviceAccountsNoItemsTitle": { - "message": "Wala pang maipapakita" - }, "serviceAccountsNoItemsMessage": { - "message": "Gumawa ng bagong service account para makapagsimula sa pag-automate ng lihim na access." + "message": "Gumawa ng bagong service account para makapagsimula sa pag-automate ng lihim na access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Wala pang maipapakita", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Maghanap ng mga lihim" + "message": "Maghanap ng mga lihim", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Tanggalin ang mga service account" + "message": "Tanggalin ang mga service account", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Tanggalin ang service account" + "message": "Tanggalin ang service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Tingnan ang service account" + "message": "Tingnan ang service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Maghanap ng mga account sa serbisyo" + "message": "Maghanap ng mga account sa serbisyo", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Magdagdag ng proyekto" + "message": "Magdagdag ng proyekto", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Na edit ng proyekto" + "message": "Na edit ng proyekto", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Nai save ang proyekto" + "message": "Nai save ang proyekto", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Nilikha ang proyekto" + "message": "Nilikha ang proyekto", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Pangalan ng proyekto" + "message": "Pangalan ng proyekto", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Bagong proyekto" + "message": "Bagong proyekto", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Ang pagtanggal ng mga lihim ay maaaring makaapekto sa mga umiiral na pagsasama." + "message": "Ang pagtanggal ng mga lihim ay maaaring makaapekto sa mga umiiral na pagsasama.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Mga lihim na ipinadala sa basurahan" + "message": "Mga lihim na ipinadala sa basurahan", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Sigurado ka bang gusto mong i-permanenteng burahin ang lihim na ito?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Lihim na permanenteng nabura" }, - "serviceAccountCreated": { - "message": "Nilikha ang service account" - }, "smAccess": { - "message": "I-access" + "message": "I-access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Proyekto, Lihim" + "message": "Proyekto, Lihim", + "description": "" }, "serviceAccountName": { - "message": "Pangalan ng account sa serbisyo" + "message": "Pangalan ng account sa serbisyo", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Nilikha ang service account", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Mag type o pumili ng mga proyekto o lihim" + "message": "Mag type o pumili ng mga proyekto o lihim", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Mag-type para i-filter" + "message": "Mag-type para i-filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Mga proyektong tinanggal" + "message": "Mga proyektong tinanggal", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Ang proyekto at lahat ng mga kaugnay na lihim ay tinanggal" + "message": "Ang proyekto at lahat ng mga kaugnay na lihim ay tinanggal", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Ang pagtanggal ng proyekto $PROJECT$ ay permanente at hindi mababago.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "I-type ang \"$CONFIRM$\" para magpatuloy", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Tanggalin ang $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Tanggalin ang $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Ang pagtanggal ng mga proyekto ay permanente at hindi maibabalik." + "message": "Ang pagtanggal ng mga proyekto ay permanente at hindi maibabalik.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Walang mga proyekto na ipapakita" + "message": "Walang mga proyekto na ipapakita", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Magdagdag ng isang bagong proyekto upang makapagsimula sa pag aayos ng mga lihim." + "message": "Magdagdag ng isang bagong proyekto upang makapagsimula sa pag aayos ng mga lihim.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Kailangan ang kumpirmasyon" + "message": "Kailangan ang kumpirmasyon", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Hindi matanggal ang mga sumusunod na proyekto:" + "message": "Hindi matanggal ang mga sumusunod na proyekto:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Lihim na ipinadala sa basurahan" + "message": "Lihim na ipinadala sa basurahan", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Lihim na permanenteng nabura" }, - "searchProjects": { - "message": "Maghanap ng mga proyekto" - }, "accessTokens": { - "message": "Mga token ng access" + "message": "Mga token ng access", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Lumikha ng access token" + "message": "Lumikha ng access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Nag-expire na" + "message": "Nag-expire na", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Marunong Magbasa" + "message": "Marunong Magbasa", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Walang access token na ipapakita" + "message": "Walang access token na ipapakita", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Upang makapagsimula, lumikha ng isang access token" + "message": "Upang makapagsimula, lumikha ng isang access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Mag download o kopyahin bago magsara." + "message": "Mag download o kopyahin bago magsara.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Nag-expire sa:" + "message": "Nag-expire sa:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Ang mga access token ay hindi naka-imbak at hindi maaaring makuha" + "message": "Ang mga access token ay hindi naka-imbak at hindi maaaring makuha", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopyahin ang token" + "message": "Kopyahin ang token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "I-access ang token" + "message": "I-access ang token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Kailangan ang expiration date" + "message": "Kailangan ang expiration date", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token na nilikha at kinopya sa clipboard" + "message": "Access token na nilikha at kinopya sa clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Ang pamamahala ng mga pahintulot ay hindi magagamit para sa beta." + "message": "Ang pamamahala ng mga pahintulot ay hindi magagamit para sa beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Bawiin ang access token" + "message": "Bawiin ang access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Tanggalin ang access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Magdagdag ng mga service account upang mabigyan ng access" }, - "canWrite": { - "message": "Maaaring magsulat" + "serviceAccountPeopleDescription": { + "message": "Bigyan ng access ang mga grupo o tao sa account ng serbisyo na ito." + }, + "serviceAccountProjectsDescription": { + "message": "Asignahin ang mga proyekto sa account ng serbisyo na ito. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Idagdag ang mga proyekto upang bigyan ng access" }, "canReadWrite": { "message": "Maaaring magbasa, magsulat" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "May nangyaring error kapag sinusubukang basahin ang import file" }, + "accessedSecret": { + "message": "Naka-access sa secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Lumikha ng lihim" }, @@ -6479,19 +6570,19 @@ "message": "Paganahin ang Secrets Manager Beta" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Tingnan ang kilalang breaches ng data para sa password na ito" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Nakalantad na Master Password" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Password na nakita sa data breach. Gamitin ang natatanging password upang makaproteksyon sa iyong account. Sigurado ka ba na gusto mong gamitin ang naipakitang password?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Mahinang at Naipakitang Pangunahing Password" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Mahinang password na nakilala at nakita sa data breach. Gamitin ang malakas at natatanging password upang makaproteksyon sa iyong account. Sigurado ka ba na gusto mong gamitin ang password na ito?" }, "characterMinimum": { "message": "$LENGTH$ character minimum", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Ang master password ay dapat na hindi bababa sa $LENGTH$ mga character.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 47a76d96659..995ae07d6ad 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -613,7 +613,7 @@ "message": "Non" }, "loginOrCreateNewAccount": { - "message": "Identifiez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." + "message": "Connectez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." }, "loginWithDevice": { "message": "Se connecter avec l'appareil" @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Mettre à jour la licence" }, - "updatedLicense": { - "message": "Licence mise à jour" - }, "manageSubscription": { "message": "Gérer l'abonnement" }, @@ -5707,28 +5704,36 @@ "message": "Masquer" }, "projects": { - "message": "Projets" + "message": "Projets", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Dernière Modification" + "message": "Dernière Modification", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Modifier le Secret" + "message": "Modifier le Secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Ajouter un Secret" + "message": "Ajouter un Secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copier le Nom du Secret" + "message": "Copier le Nom du Secret", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copier la Valeur Secrète" + "message": "Copier la Valeur Secrète", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Supprimer le Secret" + "message": "Supprimer le Secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Supprimer les Secrets" + "message": "Supprimer les Secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Supprimer définitivement le secret" @@ -5737,106 +5742,143 @@ "message": "Supprimer définitivement les secrets" }, "secretProjectAssociationDescription": { - "message": "Sélectionnez les projets auxquels le secret sera associé. Seuls les utilisateurs de l'organisation ayant accès à ces projets pourront voir le secret." + "message": "Sélectionnez les projets auxquels le secret sera associé. Seuls les utilisateurs de l'organisation ayant accès à ces projets pourront voir le secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Sélectionnez les projets" + "message": "Sélectionnez les projets", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Rechercher des Projets", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projet" + "message": "Projet", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Modifier le Projet" + "message": "Modifier le Projet", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Afficher le Projet" + "message": "Afficher le Projet", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Supprimer le Projet" + "message": "Supprimer le Projet", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Supprimer les Projets" + "message": "Supprimer les Projets", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Compte de Service" + "message": "Compte de Service", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Comptes de Service" + "message": "Comptes de Service", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Nom/Paire de Valeur" + "message": "Nom/Paire de Valeur", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret Modifié" + "message": "Secret Modifié", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret Créé" + "message": "Secret Créé", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Nouveau Secret" + "message": "Nouveau Secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nouveau Compte de Service" + "message": "Nouveau Compte de Service", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Aucun secret à afficher" + "message": "Aucun secret à afficher", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Pour commencer, ajoutez un nouveau secret ou importez des secrets." + "message": "Pour commencer, ajoutez un nouveau secret ou importez des secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Il n'y a pas de secrets dans la corbeille." }, - "serviceAccountsNoItemsTitle": { - "message": "Rien à afficher pour l'instant" - }, "serviceAccountsNoItemsMessage": { - "message": "Créez un nouveau Compte de Service pour commencer à automatiser l'accès secret." + "message": "Créez un nouveau Compte de Service pour commencer à automatiser l'accès secret.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Rien à afficher pour l'instant", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Rechercher des Secrets" + "message": "Rechercher des Secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Supprimer des Comptes de Service" + "message": "Supprimer des Comptes de Service", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Supprimer le Compte de Service" + "message": "Supprimer le Compte de Service", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Afficher le Compte de Service" + "message": "Afficher le Compte de Service", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Rechercher des Comptes de Service" + "message": "Rechercher des Comptes de Service", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Ajouter un Projet" + "message": "Ajouter un Projet", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projet modifié" + "message": "Projet modifié", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projet sauvegardé" + "message": "Projet sauvegardé", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projet créé" + "message": "Projet créé", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nom du Projet" + "message": "Nom du Projet", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nouveau Projet" + "message": "Nouveau Projet", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "La suppression de secrets peut affecter les intégrations existantes." + "message": "La suppression de secrets peut affecter les intégrations existantes.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets envoyés à la corbeille" + "message": "Secrets envoyés à la corbeille", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Êtes-vous sûr de vouloir supprimer définitivement ce secret ?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets définitivement supprimés" }, - "serviceAccountCreated": { - "message": "Compte de Service créé" - }, "smAccess": { - "message": "Accès" + "message": "Accès", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projet, Secret" + "message": "Projet, Secret", + "description": "" }, "serviceAccountName": { - "message": "Nom du Compte de Service" + "message": "Nom du Compte de Service", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Compte de Service créé", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Tapez ou Sélectionnez des Projets ou des Secrets" + "message": "Tapez ou Sélectionnez des Projets ou des Secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Tapez pour Filtrer" + "message": "Tapez pour Filtrer", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projets supprimés" + "message": "Projets supprimés", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Le projet et tous les secrets associés ont été supprimés" + "message": "Le projet et tous les secrets associés ont été supprimés", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "La suppression du projet $PROJECT$ est permanente et irréversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Tapez \"$CONFIRM$\" pour continuer", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Supprimer $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Supprimer $COUNT$ projets", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "La suppression de projets est permanente et irréversible." + "message": "La suppression de projets est permanente et irréversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Aucun projet à afficher" + "message": "Aucun projet à afficher", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Ajouter un nouveau projet pour commencer à organiser des secrets." + "message": "Ajouter un nouveau projet pour commencer à organiser des secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation requise" + "message": "Confirmation requise", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Les projets suivants n'ont pu être supprimés :" + "message": "Les projets suivants n'ont pu être supprimés :", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret envoyé à la corbeille" + "message": "Secret envoyé à la corbeille", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret définitivement supprimé" }, - "searchProjects": { - "message": "Rechercher des Projets" - }, "accessTokens": { - "message": "Jetons d'accès" + "message": "Jetons d'accès", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Créer un jeton d'accès" + "message": "Créer un jeton d'accès", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expire" + "message": "Expire", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Peut Lire" + "message": "Peut Lire", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Aucun jeton d'accès à afficher" + "message": "Aucun jeton d'accès à afficher", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Pour commencer, créez un jeton d'accès" + "message": "Pour commencer, créez un jeton d'accès", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Télécharger ou copier avant de fermer." + "message": "Télécharger ou copier avant de fermer.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expire le:" + "message": "Expire le:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Les jetons d'accès ne sont pas stockés et ne peuvent pas être récupérés" + "message": "Les jetons d'accès ne sont pas stockés et ne peuvent pas être récupérés", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copier le jeton" + "message": "Copier le jeton", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Jeton d'accès" + "message": "Jeton d'accès", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Date d'expiration requise" + "message": "Date d'expiration requise", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Jeton d'accès créé et copié dans le presse-papiers" + "message": "Jeton d'accès créé et copié dans le presse-papiers", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "La gestion des permissions n'est pas disponible pour la bêta." + "message": "La gestion des permissions n'est pas disponible pour la bêta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Révoquer le jeton d'accès" + "message": "Révoquer le jeton d'accès", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Révoquer les jetons d'accès" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Ajouter des comptes de service pour accorder l'accès" }, - "canWrite": { - "message": "Peut écrire" + "serviceAccountPeopleDescription": { + "message": "Accorder l'accès à ce compte de service à des groupes ou à des personnes." + }, + "serviceAccountProjectsDescription": { + "message": "Assigner des projets à ce compte de service. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Ajouter des projets pour accorder l'accès" }, "canReadWrite": { "message": "Peut lire, écrire" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Une erreur est survenue lors de la lecture du fichier importé" }, + "accessedSecret": { + "message": "Accès au secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Créer un secret" }, @@ -6494,7 +6585,7 @@ "message": "Mot de passe faible identifié et trouvé dans une brèche de données. Utilisez un mot de passe robuste et unique pour protéger votre compte. Êtes-vous sûr de vouloir utiliser ce mot de passe ?" }, "characterMinimum": { - "message": "$LENGTH$ caractère minimum", + "message": "$LENGTH$ caractères minimum", "placeholders": { "length": { "content": "$1", @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Rejeter" } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 2b6758534d6..09d84471ce7 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 51cbacba64e..19af83a36d7 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "עדכן רישיון" }, - "updatedLicense": { - "message": "רישיון עודכן" - }, "manageSubscription": { "message": "ניהול מנוי" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 3dfe45bb45e..9fde66fd4a2 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 0b180423e7f..b5744f64946 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Ažuriraj licencu" }, - "updatedLicense": { - "message": "Licenca ažurirana" - }, "manageSubscription": { "message": "Upravljaj pretplatom" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 42b241dbced..5c0ad698f00 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -658,7 +658,7 @@ "message": "A mesterjelszó a jelszó a széf eléréséhez. Nagyon fontos a mesterjelszó ismerete. Nincs mód a jelszó visszaállítására." }, "masterPassImportant": { - "message": "Az elfelejtett mesterjelszavak nem állíthatók helyre!" + "message": "Az mesterjelszó nem állítható helyre!" }, "masterPassHintDesc": { "message": "A mesterjelszó emlékeztető segíthet emlékezni a jelszóra elfelejtése esetén." @@ -697,7 +697,7 @@ "message": "A mesterjelszó ismételt megadása kötelező." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A mesterjelszónak legalább $VALUE$ karakter hosszúnak kell lennie.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -906,7 +906,7 @@ "message": "A megosztásra kerülő elem gyűjteményének szerkesztése. Csak az ezeket a gyűjteményeket elérő szervezeti felhasználók látják ezt az elemet." }, "deleteSelectedItemsDesc": { - "message": "$COUNT$ elem törlésre lett kijelölve. Biztosan törölni szeretnénk az összes ilyen elemet?", + "message": "$COUNT$ elem a lomtárba kerül.", "placeholders": { "count": { "content": "$1", @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Licensz frissítése" }, - "updatedLicense": { - "message": "A licensz frissítésre került." - }, "manageSubscription": { "message": "Előfizetés kezelése" }, @@ -2487,7 +2484,7 @@ "message": "Külső azonosító" }, "externalIdDesc": { - "message": "A külső azonosító hivatkozásként használható, vagy ahhoz, hogy ezt az erőforrást egy külső rendszerhez, például felhasználói könyvtárhoz kapcsoljuk." + "message": "A külső azonosító a Bitwarden tárkapcsoló és API által nem titkosított referencia." }, "nestCollectionUnder": { "message": "Gyűjtemény beágyazása:" @@ -2535,7 +2532,7 @@ "message": "Új felhasználó meghívása a szervezetéhez a Bitwarden fiók e-mail címének megadásával. Ha még nem rendelkezik Bitwarden-fiókkal, felkérjük új fiók létrehozására.\n" }, "inviteMultipleEmailDesc": { - "message": "Egymástól vesszővel elválasztott email címek megadásával egyszerre akár $COUNT$ felhasználó meghívható.", + "message": "Legfeljebb $COUNT$, egymástól vesszővel elválasztott email cím.", "placeholders": { "count": { "content": "$1", @@ -3027,7 +3024,7 @@ "message": "Csoport hozzáférés" }, "groupAccessUserDesc": { - "message": "A felhasználóhoz tartozó csoportok szerkesztése." + "message": "Tagi hozzáférés kiosztása gyűjteményekhez 1 vagy több csoporthoz hozzáadásssa." }, "invitedUsers": { "message": "A meghívott felhasználók." @@ -3063,7 +3060,7 @@ } }, "confirmUsers": { - "message": "Felhasználók megerősítése" + "message": "Tagok megerősítése" }, "usersNeedConfirmed": { "message": "Vannak olyan felhasználók, akik elfogadták a meghívást, de ezt még meg kell erősíteni. A felhasználók csak a megerősítésük utánt férhetnek hozzá a szervezethez." @@ -3238,7 +3235,7 @@ "message": "A bankszámla ellenőrzésének sikertelensége elmaradt fizetéshez és az előfizetés leállításához vezet." }, "verifiedBankAccount": { - "message": "A bankszámla megerősítésre került." + "message": "A bankszámla ellenőrzésre került." }, "bankAccount": { "message": "Bankszámla" @@ -3254,7 +3251,7 @@ } }, "routingNumber": { - "message": "Banki azonosító szám", + "message": "Útvonalszám", "description": "Bank account routing number" }, "accountNumber": { @@ -3495,7 +3492,7 @@ "message": "A szervezet letiltásra került." }, "disabledOrganizationFilterError": { - "message": "A letiltott szervezetek elemeii nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." + "message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." }, "licenseIsExpired": { "message": "A licensz lejárt." @@ -3571,7 +3568,7 @@ "message": "Ujjlenyomat kifejezés" }, "dontAskFingerprintAgain": { - "message": "Soha ne kérjükk a meghívottak ujjlenyomat kifejezésének ellenőrzését (nem ajánlott)", + "message": "Soha ne kérjük a meghívottak ujjlenyomat kifejezésének ellenőrzését (nem ajánlott)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "free": { @@ -4655,7 +4652,7 @@ "message": "Felhasználók eltávolítása" }, "revokeUsers": { - "message": "Felhasználók visstavonása" + "message": "Felhasználók visszavonása" }, "restoreUsers": { "message": "Felhasználók helyreállítása" @@ -5707,28 +5704,36 @@ "message": "Elrejtés" }, "projects": { - "message": "Projektek" + "message": "Projektek", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Utolsó szerkesztés" + "message": "Utolsó szerkesztés", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Titkos kód szerkesztés" + "message": "Titkos kód szerkesztés", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Titkos kód hozzáadás" + "message": "Titkos kód hozzáadás", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Titkos kódnév másolás" + "message": "Titkos kódnév másolás", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Titkos kódérték másolás" + "message": "Titkos kódérték másolás", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Titkos kód törlés" + "message": "Titkos kód törlés", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Titkos kódok törlése" + "message": "Titkos kódok törlése", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "A titkos kulcs végleges törlése" @@ -5737,106 +5742,143 @@ "message": "A titkos kulcsok végleges törlése" }, "secretProjectAssociationDescription": { - "message": "Válasszzuk ki azokat a projekteket, amelyekhez a titkos kód társítva lesz. Csak az ezekhez a projektekhez hozzáféréssel rendelkező szervezeti felhasználók láthatják a titkos kódot." + "message": "Válasszzuk ki azokat a projekteket, amelyekhez a titkos kód társítva lesz. Csak az ezekhez a projektekhez hozzáféréssel rendelkező szervezeti felhasználók láthatják a titkos kódot.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Projekt választás" + "message": "Projekt választás", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Projektek keresése", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekt" + "message": "Projekt", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Projekt szerkesztése" + "message": "Projekt szerkesztése", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Projekt megtekintése" + "message": "Projekt megtekintése", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Projekt törlése" + "message": "Projekt törlése", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Projektek törlése" + "message": "Projektek törlése", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Titkos kód" + "message": "Titkos kód", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Szolgáltatás fiók" + "message": "Szolgáltatás fiók", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Szolgáltatás fiókok" + "message": "Szolgáltatás fiókok", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Titkos kódok" + "message": "Titkos kódok", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Név/érték pár" + "message": "Név/érték pár", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "A titkos kód szerkesztésre került." + "message": "A titkos kód szerkesztésre került.", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "A titkos kód létrejött." + "message": "A titkos kód létrejött.", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Új titkos kód" + "message": "Új titkos kód", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Új szolgáltatás fiók" + "message": "Új szolgáltatás fiók", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Nincs megjeleníthető titkos kód." + "message": "Nincs megjeleníthető titkos kód.", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Az induláshoz adjunk hozzá egy új titkos kódot vagy importáljunk ilyeneket." + "message": "Az induláshoz adjunk hozzá egy új titkos kódot vagy importáljunk ilyeneket.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Nincs titkos kulcs a lomtárban." }, - "serviceAccountsNoItemsTitle": { - "message": "Nincs megjeleníthető tartalom." - }, "serviceAccountsNoItemsMessage": { - "message": "Új szolgáltatás fiók létrehozása a titkos kód automatikus hozzáféréséhez." + "message": "Új szolgáltatás fiók létrehozása a titkos kód automatikus hozzáféréséhez.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nincs megjeleníthető tartalom.", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Titkos kódok keresése" + "message": "Titkos kódok keresése", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Szolgáltatás fiókok törlése" + "message": "Szolgáltatás fiókok törlése", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Szolgáltatás fiók törlése" + "message": "Szolgáltatás fiók törlése", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Szolgáltatás fiók megtekintése" + "message": "Szolgáltatás fiók megtekintése", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Szolgáltatás fiókok keresése" + "message": "Szolgáltatás fiókok keresése", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Projekt hozzáadása" + "message": "Projekt hozzáadása", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "A projekt szerkesztésre került." + "message": "A projekt szerkesztésre került.", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "A projekt mentésre került." + "message": "A projekt mentésre került.", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "A projekt létrejött." + "message": "A projekt létrejött.", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projektnév" + "message": "Projektnév", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Új projekt" + "message": "Új projekt", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "A titkos kódok törlése érintheti a létező integrációkat." + "message": "A titkos kódok törlése érintheti a létező integrációkat.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "A titkos kód a lomtárba került." + "message": "A titkos kód a lomtárba került.", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Biztosan véglegesen törlésre kerüljön ez a titkos kulcs?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "A titkos kulcsok véglegesen törlésre kerültek." }, - "serviceAccountCreated": { - "message": "A szolgáltatás fiók létrejött." - }, "smAccess": { - "message": "Hozzáférés" + "message": "Hozzáférés", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekt titkos kód" + "message": "Projekt titkos kód", + "description": "" }, "serviceAccountName": { - "message": "Szolgáltatás fiók név" + "message": "Szolgáltatás fiók név", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "A szolgáltatás fiók létrejött.", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Gépeljük be vagy válasszunk projekteket vagy titkos kódokat" + "message": "Gépeljük be vagy válasszunk projekteket vagy titkos kódokat", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Gépelés a szűréshez" + "message": "Gépelés a szűréshez", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "A projekt törésre került." + "message": "A projekt törésre került.", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "A projekt és az összes társított titkos kód törlésre került." + "message": "A projekt és az összes társított titkos kód törlésre került.", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "$PROJECT$ projekt törlése végleges és visszafordíthatatlan.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "\"$CONFIRM$\" begépelése a folytatáshoz", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ törlése", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ projekt törlése", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "A projektek törlése végleges és visszavonhatatlan." + "message": "A projektek törlése végleges és visszavonhatatlan.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Nincs megjelenítendő projekt." + "message": "Nincs megjelenítendő projekt.", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Új projekt hozzáadása a titkos kódok szervezésének elkezdéséhez." + "message": "Új projekt hozzáadása a titkos kódok szervezésének elkezdéséhez.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Megerősítés szükséges" + "message": "Megerősítés szükséges", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "A következő projekteket nem lehet törölni:" + "message": "A következő projekteket nem lehet törölni:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "A titkos kód a lomtárba került." + "message": "A titkos kód a lomtárba került.", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "A titkos kulcs véglegesen törlésre került." }, - "searchProjects": { - "message": "Projektek keresése" - }, "accessTokens": { - "message": "Vezérjelek elérése" + "message": "Vezérjelek elérése", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Elérési vezérjel létrehozása" + "message": "Elérési vezérjel létrehozása", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Lejárat" + "message": "Lejárat", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Olvashat" + "message": "Olvashat", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Nincs megjelenítendő elérési vezérjel." + "message": "Nincs megjelenítendő elérési vezérjel.", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Az induláshoz hozzunk létre egy elérési vezérjelet." + "message": "Az induláshoz hozzunk létre egy elérési vezérjelet.", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Letöltés vagy másolás a bezárás eőtt." + "message": "Letöltés vagy másolás a bezárás eőtt.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Lejárat:" + "message": "Lejárat:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Az elérési vezérjelek nincsnek tárolva és nem olvashatók vissza." + "message": "Az elérési vezérjelek nincsnek tárolva és nem olvashatók vissza.", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Vezérjel másolása" + "message": "Vezérjel másolása", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Elérési vezérjel" + "message": "Elérési vezérjel", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "A lejárati dátum megadása kötelező." + "message": "A lejárati dátum megadása kötelező.", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Az elérési vezérjel létrejött és a vágólapra került." + "message": "Az elérési vezérjel létrejött és a vágólapra került.", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "A jofgosultság kezelő bétaként érhető el." + "message": "A jofgosultság kezelő bétaként érhető el.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Elérési vezérjel visszavonása" + "message": "Elérési vezérjel visszavonása", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Elérési vezérjelek visszavonása" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Adjunk hozzá szolgáltatás fiókokat a hozzáférés biztosításához" }, - "canWrite": { - "message": "Írhat" + "serviceAccountPeopleDescription": { + "message": "Adjunk hozzáférést csoportoknak vagy személyeknek ehhez a szolgáltatás fiókhoz." + }, + "serviceAccountProjectsDescription": { + "message": "Projektek hozzárendelése ehhez a szolgáltatás fiókhoz." + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Projektek hozzáadása jogosultság kiosztásához" }, "canReadWrite": { "message": "Írhat, olvashat" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Hiba történt az import fájl beolvasásának kísérletekor." }, + "accessedSecret": { + "message": "Hozzáférés a titkos $SECRET_ID$ azonosítóhoz.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Titkos kód létrehozása" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Elvetés" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 339b1bc84f1..3e3e49a0e1e 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Perbarui Lisensi" }, - "updatedLicense": { - "message": "Lisensi yang diperbarui" - }, "manageSubscription": { "message": "Kelola Langganan" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 8f97ec9c79e..dc960e95c9a 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Aggiorna licenza" }, - "updatedLicense": { - "message": "Licenza aggiornata" - }, "manageSubscription": { "message": "Gestisci abbonamento" }, @@ -5707,172 +5704,226 @@ "message": "Nascondi" }, "projects": { - "message": "Progetti" + "message": "Progetti", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Ultima modifica" + "message": "Ultima modifica", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Modifica segreto" + "message": "Modifica segreto", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Aggiungi segreto" + "message": "Aggiungi segreto", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copia nome segreto" + "message": "Copia nome segreto", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copia valore segreto" + "message": "Copia valore segreto", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Elimina segreto" + "message": "Elimina segreto", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Elimina segreti" + "message": "Elimina segreti", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Permanently delete secret" + "message": "Elimina definitivamente il segreto" }, "hardDeleteSecrets": { - "message": "Permanently delete secrets" + "message": "Elimina definitivamente i segreti" }, "secretProjectAssociationDescription": { - "message": "Seleziona i progetti a cui sarà associato il segreto. Solo gli utenti dell'organizzazione con accesso a questi progetti saranno in grado di vedere il segreto." + "message": "Seleziona i progetti a cui sarà associato il segreto. Solo gli utenti dell'organizzazione con accesso a questi progetti saranno in grado di vedere il segreto.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Seleziona i progetti" + "message": "Seleziona i progetti", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Cerca Progetti", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Progetto" + "message": "Progetto", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Modifica progetto" + "message": "Modifica progetto", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Visualizza progetto" + "message": "Visualizza progetto", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Elimina progetto" + "message": "Elimina progetto", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Elimina progetti" + "message": "Elimina progetti", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Segreto" + "message": "Segreto", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Account di servizio" + "message": "Account di servizio", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Account di servizio" + "message": "Account di servizio", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Segreti" + "message": "Segreti", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Coppia nome/valore" + "message": "Coppia nome/valore", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Segreto modificato" + "message": "Segreto modificato", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Segreto creato" + "message": "Segreto creato", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Nuovo segreto" + "message": "Nuovo segreto", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nuovo account di servizio" + "message": "Nuovo account di servizio", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Nessun segreto da mostrare" + "message": "Nessun segreto da mostrare", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Per iniziare, aggiungi un nuovo segreto o importa segreti." + "message": "Per iniziare, aggiungi un nuovo segreto o importa segreti.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { - "message": "There are no secrets in the trash." - }, - "serviceAccountsNoItemsTitle": { - "message": "Ancora niente da mostrare" + "message": "Non ci sono segreti nel cestino." }, "serviceAccountsNoItemsMessage": { - "message": "Crea un nuovo account di servizio per iniziare ad automatizzare l'accesso segreto." + "message": "Crea un nuovo account di servizio per iniziare ad automatizzare l'accesso segreto.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Ancora niente da mostrare", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Cerca segreti" + "message": "Cerca segreti", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Elimina account di servizio" + "message": "Elimina account di servizio", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Elimina account di servizio" + "message": "Elimina account di servizio", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Visualizza account di servizio" + "message": "Visualizza account di servizio", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Cerca account di servizio" + "message": "Cerca account di servizio", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Aggiungi progetto" + "message": "Aggiungi progetto", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Progetto modificato" + "message": "Progetto modificato", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Progetto salvato" + "message": "Progetto salvato", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Progetto creato" + "message": "Progetto creato", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nome del progetto" + "message": "Nome del progetto", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nuovo progetto" + "message": "Nuovo progetto", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "L'eliminazione dei segreti può influenzare le integrazioni esistenti." + "message": "L'eliminazione dei segreti può influenzare le integrazioni esistenti.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Segreti inviati al cestino" + "message": "Segreti inviati al cestino", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { - "message": "Are you sure you want to permanently delete this secret?" + "message": "Sei sicuro di voler eliminare definitivamente questo segreto?" }, "hardDeleteSecretsConfirmation": { - "message": "Are you sure you want to permanently delete these secrets?" + "message": "Sei sicuro di voler eliminare definitivamente questi segreti?" }, "hardDeletesSuccessToast": { - "message": "Secrets permanently deleted" - }, - "serviceAccountCreated": { - "message": "Account di servizio creato" + "message": "Segreti eliminati definitivamente" }, "smAccess": { - "message": "Accesso" + "message": "Accesso", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Progetto, segreto" + "message": "Progetto, segreto", + "description": "" }, "serviceAccountName": { - "message": "Nome account di servizio" + "message": "Nome account di servizio", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Account di servizio creato", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Digita o seleziona progetti o segreti" + "message": "Digita o seleziona progetti o segreti", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Digita per filtrare" + "message": "Digita per filtrare", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Progetti eliminati" + "message": "Progetti eliminati", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Il progetto e tutti i segreti associati sono stati eliminati" + "message": "Il progetto e tutti i segreti associati sono stati eliminati", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "L'eliminazione del progetto $PROJECT$ è permanente e irreversibile.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Digita \"$CONFIRM$\" per continuare", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Elimina $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Elimina $COUNT$ progetti", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,82 +5962,100 @@ } }, "deleteProjectsDialogMessage": { - "message": "L'eliminazione dei progetti è permanente e irreversibile." + "message": "L'eliminazione dei progetti è permanente e irreversibile.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Nessun progetto da mostrare" + "message": "Nessun progetto da mostrare", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Aggiungi un nuovo progetto per iniziare a organizzare i segreti." + "message": "Aggiungi un nuovo progetto per iniziare a organizzare i segreti.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Conferma richiesta" + "message": "Conferma richiesta", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Non è stato possibile eliminare i seguenti progetti:" + "message": "Non è stato possibile eliminare i seguenti progetti:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Segreti inviati al cestino" + "message": "Segreti inviati al cestino", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { - "message": "Secret permanently deleted" - }, - "searchProjects": { - "message": "Cerca Progetti" + "message": "Segreto eliminato definitivamente" }, "accessTokens": { - "message": "Token di accesso" + "message": "Token di accesso", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Genera token di accesso" + "message": "Genera token di accesso", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Scade" + "message": "Scade", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Può Leggere" + "message": "Può Leggere", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Nessun token di accesso da mostrare" + "message": "Nessun token di accesso da mostrare", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Per iniziare, crea un token di accesso" + "message": "Per iniziare, crea un token di accesso", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Scarica o copia prima della chiusura." + "message": "Scarica o copia prima della chiusura.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Scade il:" + "message": "Scade il:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "I token di accesso non sono memorizzati e non possono essere recuperati" + "message": "I token di accesso non sono memorizzati e non possono essere recuperati", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copia il token" + "message": "Copia il token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Token di accesso" + "message": "Token di accesso", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "La data di scadenza è obbligatoria" + "message": "La data di scadenza è obbligatoria", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Token di accesso creato e copiato negli appunti" + "message": "Token di accesso creato e copiato negli appunti", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "La gestione delle autorizzazioni non è disponibile nella versione beta." + "message": "La gestione delle autorizzazioni non è disponibile nella versione beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoca token di accesso" + "message": "Revoca token di accesso", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Revoca i token di accesso" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "La revoca dei token di accesso è definitiva e irreversibile." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Token di accesso revocati", "description": "Toast message after deleting one or multiple access tokens." }, "submenu": { @@ -6074,64 +6146,64 @@ "message": "Questo utente può accedere e modificare tutti gli elementi." }, "domainVerification": { - "message": "Domain verification" + "message": "Verifica dominio" }, "newDomain": { - "message": "New domain" + "message": "Nuovo dominio" }, "noDomains": { - "message": "No domains" + "message": "Nessun dominio" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "Connettere un dominio permette ai membri di saltare il campo identificatore SSO durante il login via SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "Verifica dominio" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "Verifica nuovamente il dominio" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Copia record TXT DNS" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "Record TXT DNS" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "Copia e incolla il record TXT nel tuo provider DNS." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "Esempio: mydomain.com. I sottodomini hanno bisogno di record separati per essere verificati." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "Verifica dominio automatica" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Bitwarden tenterà di verificare il dominio 3 volte durante le prime 72 ore. Se il dominio non può essere verificato, controllare il record DNS nel vostro host e verificare manualmente. Il dominio verrà rimosso dalla tua organizzazione in 7 giorni se non viene verificato" }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "L'input non è un formato valido. Formato: mydomain.com. I sottodomini richiedono la verifica di record separati." }, "removeDomain": { - "message": "Remove domain" + "message": "Rimuovi dominio" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "Quest'azione non può essere annullata. Sei sicuro di voler continuare?" }, "domainRemoved": { - "message": "Domain removed" + "message": "Dominio rimosso" }, "domainSaved": { - "message": "Domain saved" + "message": "Dominio salvato" }, "domainVerified": { - "message": "Domain verified" + "message": "Dominio verificato" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "Non è possibile associare lo stesso dominio due volte." }, "domainNotAvailable": { - "message": "Someone else is using $DOMAIN$. Use a different domain to continue.", + "message": "Qualcun altro sta usando $DOMAIN$. Per continuare scegli un altro dominio.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6140,7 +6212,7 @@ } }, "domainNotVerified": { - "message": "$DOMAIN$ not verified. Check your DNS record.", + "message": "$DOMAIN$ non verificato. Controlla il record DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6149,28 +6221,28 @@ } }, "domainStatusVerified": { - "message": "Verified" + "message": "Verificato" }, "domainStatusUnverified": { - "message": "Unverified" + "message": "Non verificato" }, "domainNameTh": { - "message": "Name" + "message": "Nome" }, "domainStatusTh": { - "message": "Status" + "message": "Stato" }, "lastChecked": { - "message": "Last checked" + "message": "Ultimo controllo" }, "editDomain": { - "message": "Edit domain" + "message": "Modifica dominio" }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "Ci sono errori che richiedono la tua attenzione" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "Il dominio $DOMAIN$ è stato aggiunto", "placeholders": { "DOMAIN": { "content": "$1", @@ -6179,7 +6251,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "Il dominio $DOMAIN$ è stato rimosso", "placeholders": { "DOMAIN": { "content": "$1", @@ -6188,7 +6260,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "$DOMAIN$ verificato", "placeholders": { "DOMAIN": { "content": "$1", @@ -6197,7 +6269,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "$DOMAIN$ non verificato", "placeholders": { "DOMAIN": { "content": "$1", @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Aggiungi account di servizio per concedere l'accesso" }, - "canWrite": { - "message": "Può scrivere" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Può leggere, scrivere" @@ -6389,13 +6467,13 @@ "message": "Questo utente può accedere alla beta del gestore segreti" }, "important": { - "message": "Important:" + "message": "Importante:" }, "viewAll": { - "message": "View all" + "message": "Mostra tutto" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Mostro $PORTION$ di $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6416,30 +6494,43 @@ "errorReadingImportFile": { "message": "Si è verificato un errore durante la lettura del file d'importazione" }, + "accessedSecret": { + "message": "Segreto $SECRET_ID$ acceduto.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { - "message": "Create a secret" + "message": "Crea un segreto" }, "createProject": { - "message": "Create a project" + "message": "Crea un progetto" }, "createServiceAccount": { - "message": "Create a service account" + "message": "Crea un account di servizio" }, "downloadThe": { - "message": "Download the", + "message": "Scarica la", "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" }, "smCLI": { - "message": "Secrets Manager CLI" + "message": "CLI del Gestore dei Segreti" }, "importSecrets": { - "message": "Import secrets" + "message": "Importa segreti" }, "getStarted": { - "message": "Get started" + "message": "Inizia adesso" }, "complete": { - "message": "$COMPLETED$/$TOTAL$ Complete", + "message": "$COMPLETED$/$TOTAL$ Completo", "placeholders": { "COMPLETED": { "content": "$1", @@ -6452,49 +6543,49 @@ } }, "restoreSecret": { - "message": "Restore secret" + "message": "Ripristina segreto" }, "restoreSecrets": { - "message": "Restore secrets" + "message": "Ripristina segreti" }, "restoreSecretPrompt": { - "message": "Are you sure you want to restore this secret?" + "message": "Vuoi veramente ripristinare questo segreto?" }, "restoreSecretsPrompt": { - "message": "Are you sure you want to restore these secrets?" + "message": "Vuoi veramente ripristinare questi segreti?" }, "secretRestoredSuccessToast": { - "message": "Secret restored" + "message": "Segreto ripristinato" }, "secretsRestoredSuccessToast": { - "message": "Secrets restored" + "message": "Segreti ripristinati" }, "selectionIsRequired": { - "message": "Selection is required." + "message": "Selezione richiesta." }, "secretsManagerSubscriptionDesc": { - "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + "message": "Attiva gratuitamente l'accesso dell'organizzazione al Gestore Segreti durante il programma Beta. Puoi concedere agli utenti l'accesso alla beta da Membri." }, "secretsManagerEnable": { - "message": "Enable Secrets Manager Beta" + "message": "Abilita il Gestore Segreti (Beta)" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Controlla se questa password è presente nei database dei data breach noti" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Password principale violata" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Password trovata in un database di data breach noto. Usa una password esclusiva per proteggere il tuo account. Sei sicuro di voler usare una password violata?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Password principale debole e violata" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Password debole trovata in un database di data breach noto. Usa una password forte ed esclusiva per proteggere il tuo account. Sei sicuro di voler utilizzare questa password?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Minimo $LENGTH$ caratteri", "placeholders": { "length": { "content": "$1", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "La password principale deve essere lunga almeno $LENGTH$ caratteri.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 7a9fea7a4b7..78247806d39 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -697,7 +697,7 @@ "message": "マスターパスワードの再入力が必要です。" }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "マスターパスワードは少なくとも $VALUE$ 文字以上でなければなりません。", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -831,7 +831,7 @@ "message": "ログインできません。" }, "noTwoStepProviders": { - "message": "このアカウントでは2段階ログインが有効になっていますが、このブラウザは設定された2段階ログインプロバイダのいずれにも対応していません。" + "message": "このアカウントは2段階認証が有効ですが、このブラウザに対応した2段階認証プロパイダーが一つも設定されていません。" }, "noTwoStepProviders2": { "message": "Chrome などの対応したブラウザを使うか、より幅広い端末に対応した認証プロパイダを追加してください。" @@ -1397,7 +1397,7 @@ "message": "SSO 設定または設定予定がある場合は、ID プロバイダーを通じて2段階ログインがすでに強制されている場合があります。" }, "twoStepLoginRecoveryWarning": { - "message": "二段階認証を有効にすると Bitwarden アカウントから永久に閉め出されてしまうことがあります。リカバリーコードがあれば、通常の二段階認証プロバイダを使えなくなったとき(デバイスの紛失等)でもアカウントにアクセスできます。アカウントにアクセスできなくなっても Bitwarden はサポート出来ないため、リカバリーコードを書き出すか印刷し安全な場所で保管しておくことを推奨します。" + "message": "2段階認証を有効にすると Bitwarden アカウントから永久に閉め出されてしまうことがあります。リカバリーコードがあれば、通常の2段階認証プロバイダを使えなくなったとき (デバイスの紛失等) でもアカウントにアクセスできます。アカウントにアクセスできなくなっても Bitwarden はサポート出来ないため、リカバリーコードを書き出すか印刷し安全な場所で保管しておくことを推奨します。" }, "viewRecoveryCode": { "message": "リカバリーコードを確認" @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "ライセンスの更新" }, - "updatedLicense": { - "message": "ライセンスは更新されました" - }, "manageSubscription": { "message": "契約の管理" }, @@ -5707,28 +5704,36 @@ "message": "隠す" }, "projects": { - "message": "プロジェクト" + "message": "プロジェクト", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "最終編集日" + "message": "最終編集日", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "シークレットを編集" + "message": "シークレットを編集", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "シークレットを追加" + "message": "シークレットを追加", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "シークレット名をコピー" + "message": "シークレット名をコピー", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "シークレット値をコピー" + "message": "シークレット値をコピー", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "シークレットを削除" + "message": "シークレットを削除", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "シークレットを削除" + "message": "シークレットを削除", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "シークレットを完全に削除" @@ -5737,106 +5742,143 @@ "message": "シークレットを完全に削除" }, "secretProjectAssociationDescription": { - "message": "シークレットを関連付けるプロジェクトを選択します。これらのプロジェクトにアクセスできる組織ユーザーのみがシークレットを表示できます。" + "message": "シークレットを関連付けるプロジェクトを選択します。これらのプロジェクトにアクセスできる組織ユーザーのみがシークレットを表示できます。", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "プロジェクトの選択" + "message": "プロジェクトの選択", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "プロジェクトを検索", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "プロジェクト" + "message": "プロジェクト", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "プロジェクトを編集" + "message": "プロジェクトを編集", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "プロジェクトを表示" + "message": "プロジェクトを表示", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "プロジェクトを削除" + "message": "プロジェクトを削除", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "プロジェクトを削除" + "message": "プロジェクトを削除", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "シークレット" + "message": "シークレット", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "サービスアカウント" + "message": "サービスアカウント", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "サービスアカウント" + "message": "サービスアカウント", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "シークレット" + "message": "シークレット", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "名前と値のペア" + "message": "名前と値のペア", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "シークレットを編集しました" + "message": "シークレットを編集しました", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "シークレットを作成しました" + "message": "シークレットを作成しました", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "新しいシークレット" + "message": "新しいシークレット", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "新しいサービスアカウント" + "message": "新しいサービスアカウント", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "表示するシークレットはありません" + "message": "表示するシークレットはありません", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "まずは新しいシークレットの追加またはインポートをしてください。" + "message": "まずは新しいシークレットの追加またはインポートをしてください。", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "ゴミ箱にシークレットはありません。" }, - "serviceAccountsNoItemsTitle": { - "message": "まだ表示するものはありません" - }, "serviceAccountsNoItemsMessage": { - "message": "シークレットアクセスを自動化するためには、新しいサービスアカウントを作成してください。" + "message": "シークレットアクセスを自動化するためには、新しいサービスアカウントを作成してください。", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "まだ表示するものはありません", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "シークレットを検索" + "message": "シークレットを検索", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "サービスアカウントを削除" + "message": "サービスアカウントを削除", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "サービスアカウントを削除" + "message": "サービスアカウントを削除", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "サービスアカウントを表示" + "message": "サービスアカウントを表示", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "サービスアカウントを検索" + "message": "サービスアカウントを検索", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "プロジェクトを追加" + "message": "プロジェクトを追加", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "プロジェクトを編集しました" + "message": "プロジェクトを編集しました", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "プロジェクトを保存しました" + "message": "プロジェクトを保存しました", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "プロジェクトを作成しました" + "message": "プロジェクトを作成しました", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "プロジェクト名" + "message": "プロジェクト名", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "新しいプロジェクト" + "message": "新しいプロジェクト", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "シークレットを削除すると、既存の連携に影響する可能性があります。" + "message": "シークレットを削除すると、既存の連携に影響する可能性があります。", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "シークレットをゴミ箱に送る" + "message": "シークレットをゴミ箱に送る", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "このシークレットを完全に削除してもよろしいですか?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "シークレットを完全に削除しました" }, - "serviceAccountCreated": { - "message": "サービスアカウントを作成しました" - }, "smAccess": { - "message": "アクセス" + "message": "アクセス", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "プロジェクト、シークレット" + "message": "プロジェクト、シークレット", + "description": "" }, "serviceAccountName": { - "message": "サービスアカウント名" + "message": "サービスアカウント名", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "サービスアカウントを作成しました", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "プロジェクトまたはシークレットを入力・選択" + "message": "プロジェクトまたはシークレットを入力・選択", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "入力して絞り込む" + "message": "入力して絞り込む", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "プロジェクトを削除しました" + "message": "プロジェクトを削除しました", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "プロジェクトと関連するすべてのシークレットを削除しました" + "message": "プロジェクトと関連するすべてのシークレットを削除しました", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "プロジェクト $PROJECT$ を削除すると元に戻せません。", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "「$CONFIRM$」と入力して続行", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ を削除", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ 個のプロジェクトを削除", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "プロジェクトを削除すると元に戻せません。" + "message": "プロジェクトを削除すると元に戻せません。", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "表示するプロジェクトがありません" + "message": "表示するプロジェクトがありません", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "秘密を始めるために新しいプロジェクトを追加する。" + "message": "秘密を始めるために新しいプロジェクトを追加する。", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "確認が必要です" + "message": "確認が必要です", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "次のプロジェクトを削除できませんでした:" + "message": "次のプロジェクトを削除できませんでした:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "シークレットをゴミ箱に送る" + "message": "シークレットをゴミ箱に送る", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "シークレットを完全に削除しました" }, - "searchProjects": { - "message": "プロジェクトを検索" - }, "accessTokens": { - "message": "アクセストークン" + "message": "アクセストークン", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "アクセストークンを作成" + "message": "アクセストークンを作成", + "description": "Button label for creating a new access token." }, "expires": { - "message": "有効期限" + "message": "有効期限", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "読み取り可能" + "message": "読み取り可能", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "表示するアクセス トークンはありません" + "message": "表示するアクセス トークンはありません", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "始めるにはアクセストークンを作成してください" + "message": "始めるにはアクセストークンを作成してください", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "閉じる前にダウンロードまたはコピーする。" + "message": "閉じる前にダウンロードまたはコピーする。", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "有効期限:" + "message": "有効期限:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "アクセストークンは保存されていないため、取得できません" + "message": "アクセストークンは保存されていないため、取得できません", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "トークンをコピー" + "message": "トークンをコピー", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "アクセストークン" + "message": "アクセストークン", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "有効期限は必須です" + "message": "有効期限は必須です", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "アクセストークンが作成され、クリップボードにコピーされました" + "message": "アクセストークンが作成され、クリップボードにコピーされました", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "ベータ版では権限管理が利用できません。" + "message": "ベータ版では権限管理が利用できません。", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "アクセストークンの取り消し" + "message": "アクセストークンの取り消し", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "アクセストークンを取り消す" @@ -6341,10 +6413,10 @@ "message": "ライセンスをアップロード" }, "projectPeopleDescription": { - "message": "グループまたは人にこのプロジェクトへのアクセスを許可します。" + "message": "グループまたはメンバーにこのプロジェクトへのアクセスを許可します。" }, "projectPeopleSelectHint": { - "message": "人やグループを入力・選択" + "message": "メンバーやグループを入力・選択" }, "projectServiceAccountsDescription": { "message": "このプロジェクトへのサービスアカウントのアクセスを許可します。" @@ -6353,13 +6425,19 @@ "message": "サービスアカウントを入力・選択" }, "projectEmptyPeopleAccessPolicies": { - "message": "人やグループを追加してコラボレーションを開始します" + "message": "メンバーやグループを追加してコラボレーションを開始します" }, "projectEmptyServiceAccountAccessPolicies": { "message": "アクセスを許可するサービスアカウントを追加" }, - "canWrite": { - "message": "書き込み可能" + "serviceAccountPeopleDescription": { + "message": "グループまたはメンバーにこのサービスアカウントへのアクセスを許可します。" + }, + "serviceAccountProjectsDescription": { + "message": "このサービスアカウントにプロジェクトを割り当てます。 " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "アクセスを許可するプロジェクトを追加" }, "canReadWrite": { "message": "読み取りと書き込み可能" @@ -6389,7 +6467,7 @@ "message": "このユーザーはベータ版シークレットマネージャーにアクセスできます" }, "important": { - "message": "Important:" + "message": "重要" }, "viewAll": { "message": "すべて表示" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "インポートファイルの読み込み中にエラーが発生しました" }, + "accessedSecret": { + "message": "シークレット $SECRET_ID$ にアクセスしました。", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "シークレットを作成" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "表示しない" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 2b6758534d6..09d84471ce7 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 2b6758534d6..09d84471ce7 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 1930f8eaf6d..6e3ddd35058 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "ಪರವಾನಗಿ ನವೀಕರಿಸಿ" }, - "updatedLicense": { - "message": "ನವೀಕರಿಸಿದ ಪರವಾನಗಿ" - }, "manageSubscription": { "message": "ಚಂದಾದಾರಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಿ" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 080062b207c..1228fdcce23 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "라이선스 업데이트" }, - "updatedLicense": { - "message": "라이선스 업데이트됨" - }, "manageSubscription": { "message": "구독 관리" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 166e7b2b3eb..794721a777b 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -236,7 +236,7 @@ "message": "Pārbaudīt, vai parole ir bijusi nopludināta." }, "passwordExposed": { - "message": "Šī parole ir atklāta $VALUE$ reizi(-es) datu pārkāpumos. Jums vajadzētu to nomainīt.", + "message": "Šī parole datu noplūdēs ir atklāta $VALUE$ reizi(es). To vajadzētu nomainīt.", "placeholders": { "value": { "content": "$1", @@ -245,7 +245,7 @@ } }, "passwordSafe": { - "message": "Šī parole netika atrasta nevienā no zināmajiem datu pārkāpumiem. Tai vajadzētu būt droši izmantojamai." + "message": "Šī parole netika atrasta nevienā zināmā datu noplūdē. Tai vajadzētu būt droši izmantojamai." }, "save": { "message": "Saglabāt" @@ -697,7 +697,7 @@ "message": "Ir nepieciešama galvenās paroles atkārtota ievadīšana." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Galvenajai parolei ir jābūt vismaz $VALUE$ rakstzīmes garai.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1696,13 +1696,13 @@ "message": "Atklāto paroļu pārskats" }, "exposedPasswordsReportDesc": { - "message": "Atklātās paroles ir paroles, kas ir atrastas zināmos datu pārkāpumos, kuras urķi ir publicējuši vai pārdod tumšajā tīmeklī." + "message": "Paroles, kas ir pieejamas datu noplūdēs, ir viegls mērķis uzbrucējiem. Šīs paroles ir jānomaina, lai novērstu iespējamu to ļaunprātīgu izmantošanu." }, "exposedPasswordsFound": { "message": "Atrastas atklātās paroles" }, "exposedPasswordsFoundDesc": { - "message": "Glabātavā tika atrasts(i) $COUNT$ vienums(i), kuros ir paroles, kas ir atklātas zināmos datu pārkāpumos. Vienumus vajadzētu mainīt, lai izmantotu jaunu paroli.", + "message": "Glabātavā tika atrasts(i) $COUNT$ vienums(i), kuros ir paroles, kas ir atklātas zināmās datu noplūdēs. Tos vajadzētu mainīt, lai izmantotu jaunu paroli.", "placeholders": { "count": { "content": "$1", @@ -1711,7 +1711,7 @@ } }, "noExposedPasswords": { - "message": "Glabātavā nav vienumu, kam būtu paroles, kas ir atklātas zināmos datu pārkāpumos." + "message": "Glabātavā nav vienumu, kuros būtu paroles, kas ir atklātas zināmās datu noplūdēs." }, "checkExposedPasswords": { "message": "Pārbaudīt atklātās paroles" @@ -1780,13 +1780,13 @@ "message": "Datu noplūde" }, "breachDesc": { - "message": "Uzlauzti konti var atklāt jūsu personisko informāciju. Aizsargājiet uzlauztos kontus, iespējojot 2FA vai izveidojot spēcīgāku paroli." + "message": "Kontu datu noplūde var atklāt personisko informāciju. Datu noplūdēs iekļuvušos kontus var padarīt drošus, iespējojot divpakāpju pārbaudi vai izveidojot spēcīgāku paroli." }, "breachCheckUsernameEmail": { - "message": "Pārbaudiet jebkādus lietotājvārdus vai e-pasta adreses kuras jūs izmantojat." + "message": "Jāpārbauda jebkurš lietotājvārds vai e-pasta adrese, kas tiek izmantota." }, "checkBreaches": { - "message": "Pārbaudīt datu pārkāpumus" + "message": "Pārbaudīt datu noplūdes" }, "breachUsernameNotFound": { "message": "$USERNAME$ netika atrasts nevienā zināmā datu noplūdē.", @@ -1802,7 +1802,7 @@ "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { - "message": "$USERNAME$ tika atrasts $COUNT$ (dažādos) datu pārkāpumā(os) tīmeklī.", + "message": "$USERNAME$ tika atrasts $COUNT$ dažādā(s) datu nopūdē(s), kas ir pieejama(s) tiešsaistē.", "placeholders": { "username": { "content": "$1", @@ -1815,7 +1815,7 @@ } }, "breachFound": { - "message": "Atrasti datu pārkāpumos iekļuvušie konti" + "message": "Atrasti datu noplūdēs iekļuvuši konti" }, "compromisedData": { "message": "Datu pārkāpumos iesaistītie dati" @@ -1827,10 +1827,10 @@ "message": "Ietekmētie lietotāji" }, "breachOccurred": { - "message": "Ir bijis datu pārkāpums" + "message": "Ir notikusi datu noplūde" }, "breachReported": { - "message": "Par datu pārkāpumu ir ziņots" + "message": "Ziņots par datu noplūdi" }, "reportError": { "message": "Radusies kļūda pārskata lādēšanā. Lūgums mēģināt vēlreiz" @@ -1889,7 +1889,7 @@ "message": "Ārkārtas piekļuve" }, "premiumSignUpReports": { - "message": "Paroles higiēnas, konta stāvokļa un datu pārkāpumu pārskati, lai jūsu glabātuve būtu drošībā." + "message": "Paroļu higiēnas, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu." }, "premiumSignUpTotp": { "message": "TOTP apstiprinājuma koda (2FA) veidotājs glabātavas pieteikšanās vienumiem." @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Atjaunināt licenci" }, - "updatedLicense": { - "message": "Atjauninātā licence" - }, "manageSubscription": { "message": "Pārvaldīt abonementus" }, @@ -5707,28 +5704,36 @@ "message": "Paslēpt" }, "projects": { - "message": "Projekti" + "message": "Projekti", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Pēdējo reizi labots" + "message": "Pēdējo reizi labots", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Labot noslēpumu" + "message": "Labot noslēpumu", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Pievienot noslēpumu" + "message": "Pievienot noslēpumu", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Ievietot noslēpuma nosaukumu starpliktuvē" + "message": "Ievietot noslēpuma nosaukumu starpliktuvē", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Ievietot noslēpuma vērtību starpliktuvē" + "message": "Ievietot noslēpuma vērtību starpliktuvē", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Izdzēst noslēpumu" + "message": "Izdzēst noslēpumu", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Izdzēst noslēpumus" + "message": "Izdzēst noslēpumus", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Neatgriezeniski izdzēst noslēpumu" @@ -5737,106 +5742,143 @@ "message": "Neatgriezeniski izdzēst noslēpumus" }, "secretProjectAssociationDescription": { - "message": "Atlasīt projektus, ar kuriem tiks saistīts noslēpums. Tikai apvienību lietotāji ar piekļuvi šiem projektiem varēs redzēt noslēpumu." + "message": "Atlasīt projektus, ar kuriem tiks saistīts noslēpums. Tikai apvienību lietotāji ar piekļuvi šiem projektiem varēs redzēt noslēpumu.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Atlasīt projektus" + "message": "Atlasīt projektus", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Meklēt projektus", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekts" + "message": "Projekts", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Labot projektu" + "message": "Labot projektu", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Skatīt projektu" + "message": "Skatīt projektu", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Izdzēst projektu" + "message": "Izdzēst projektu", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Izdzēst projektus" + "message": "Izdzēst projektus", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Noslēpums" + "message": "Noslēpums", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Pakalpojumu konts" + "message": "Pakalpojumu konts", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Pakalpojumu konti" + "message": "Pakalpojumu konti", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Noslēpumi" + "message": "Noslēpumi", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Nosaukuma/vērtības pāris" + "message": "Nosaukuma/vērtības pāris", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Noslēpums ir labots" + "message": "Noslēpums ir labots", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Noslēpums ir izveidots" + "message": "Noslēpums ir izveidots", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Jauns noslēpums" + "message": "Jauns noslēpums", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Jauns pakalpojumu konts" + "message": "Jauns pakalpojumu konts", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Nav noslēpumu, ko parādīt" + "message": "Nav noslēpumu, ko parādīt", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Lai sākut, ir jāpievieno jauns noslēpums vai jāievieto esoši." + "message": "Lai sākut, ir jāpievieno jauns noslēpums vai jāievieto esoši.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Atkritnē nav noslēpumu." }, - "serviceAccountsNoItemsTitle": { - "message": "Vēl nav nekā, ko parādīt" - }, "serviceAccountsNoItemsMessage": { - "message": "Jāizveido jauns pakalpojumu konts, lai sāktu automatizēt piekļuvi noslēpumiem." + "message": "Jāizveido jauns pakalpojumu konts, lai sāktu automatizēt piekļuvi noslēpumiem.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Vēl nav nekā, ko parādīt", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Meklēt noslēpumus" + "message": "Meklēt noslēpumus", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Izdzēst pakalpojumu kontus" + "message": "Izdzēst pakalpojumu kontus", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Izdzēst pakalpojumu kontu" + "message": "Izdzēst pakalpojumu kontu", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Skatīt pakalpojumu kontu" + "message": "Skatīt pakalpojumu kontu", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Meklēt pakalpojumu kontus" + "message": "Meklēt pakalpojumu kontus", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Pievienot projektu" + "message": "Pievienot projektu", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projekts labots" + "message": "Projekts labots", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projekts ir saglabāts" + "message": "Projekts ir saglabāts", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projekts ir izveidots" + "message": "Projekts ir izveidots", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projekta nosaukums" + "message": "Projekta nosaukums", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Jauns projekts" + "message": "Jauns projekts", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Noslēpumu dzēšana var ietekmēt esošās sasaistes." + "message": "Noslēpumu dzēšana var ietekmēt esošās sasaistes.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Noslēpumi ir pārvietoti uz atkritni" + "message": "Noslēpumi ir pārvietoti uz atkritni", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Vai tiešām neatgriezeniski izdzēst šo noslēpumu?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Noslēpumi ir neatgriezeniski izdzēsti" }, - "serviceAccountCreated": { - "message": "Pakalpojumu konts ir izveidots" - }, "smAccess": { - "message": "Piekļuve" + "message": "Piekļuve", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekts, noslēpums" + "message": "Projekts, noslēpums", + "description": "" }, "serviceAccountName": { - "message": "Pakalpojumu konta nosaukums" + "message": "Pakalpojumu konta nosaukums", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Pakalpojumu konts ir izveidots", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Rakstīt vai atlasīt projektus vai noslēpumus" + "message": "Rakstīt vai atlasīt projektus vai noslēpumus", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Rakstīt, lai atlasītu" + "message": "Rakstīt, lai atlasītu", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projekti ir izdzēsti" + "message": "Projekti ir izdzēsti", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Projekts un visi saistītie noslēpumi tika izdzēsti" + "message": "Projekts un visi saistītie noslēpumi tika izdzēsti", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Projekta $PROJECT$ izdzēšana ir paliekoša un neatgriezeniska.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Jāieraksta \"$CONFIRM$\", lai turpinātu", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Izdzēst $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Izdzēst $COUNT$ projektus", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Projektu izdzēšana ir paliekoša un neatgriezeniska." + "message": "Projektu izdzēšana ir paliekoša un neatgriezeniska.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Nav projektu, ko attēlot" + "message": "Nav projektu, ko attēlot", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Jāpievieno jauns projkets, lai sāktu kārtot noslēpumus." + "message": "Jāpievieno jauns projkets, lai sāktu kārtot noslēpumus.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Nepieciešams apstiprinājums" + "message": "Nepieciešams apstiprinājums", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Šos projektus nebija iespējams izdzēst:" + "message": "Šos projektus nebija iespējams izdzēst:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Noslēpums ir pārvietots uz atkritni" + "message": "Noslēpums ir pārvietots uz atkritni", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Noslēpums ir neatgriezeniski izdzēsts" }, - "searchProjects": { - "message": "Meklēt projektus" - }, "accessTokens": { - "message": "Piekļuves pilnvaras" + "message": "Piekļuves pilnvaras", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Izveidot piekļuves pilnvaru" + "message": "Izveidot piekļuves pilnvaru", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Izbeidzas" + "message": "Izbeidzas", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Var lasīt" + "message": "Var lasīt", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Nav piekļuves pilnvaru, ko parādīt" + "message": "Nav piekļuves pilnvaru, ko parādīt", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Lai sāktu, jāizveido piekļuves pilnvara" + "message": "Lai sāktu, jāizveido piekļuves pilnvara", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Jālejupielādē vai jāievieto starpliktuvē pirms aizvēršanas." + "message": "Jālejupielādē vai jāievieto starpliktuvē pirms aizvēršanas.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Beidzas:" + "message": "Beidzas:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Piekļuves pilnvaras netiek glabātas un tās nevar atgūt" + "message": "Piekļuves pilnvaras netiek glabātas un tās nevar atgūt", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Ievietot pilnvaru starpliktuvē" + "message": "Ievietot pilnvaru starpliktuvē", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Piekļuves pilnvara" + "message": "Piekļuves pilnvara", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Nepieciešams norādīt beigu datumu" + "message": "Nepieciešams norādīt beigu datumu", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Piekļuves pilnvara ir izveidota un ievietota starpliktuvē" + "message": "Piekļuves pilnvara ir izveidota un ievietota starpliktuvē", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Atļauju pārvaldība nav pieejama bēta laidienā." + "message": "Atļauju pārvaldība nav pieejama bēta laidienā.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Atsaukt piekļuves pilnvaru" + "message": "Atsaukt piekļuves pilnvaru", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Atsaukt piekļuves pilnvaras" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Pievienot pakalpojumu kontus, lai piešķirtu piekļuvi" }, - "canWrite": { - "message": "Var rakstīt" + "serviceAccountPeopleDescription": { + "message": "Piešķirt kopām vai cilvēkiem piekļuvi šim pakalpojumu kontam." + }, + "serviceAccountProjectsDescription": { + "message": "Piešķirt projektus šim pakalpojumu kontam. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Jāpievieno projekti, lai nodrošinātu piekļuvi" }, "canReadWrite": { "message": "Var lasīt, rakstīt" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Atgadījās kļūda, kad tika mēģināts nolasīt ievietošanas datni" }, + "accessedSecret": { + "message": "Tika piekļūts noslēpumam $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "Izstrādātāja rīkkopa", + "description": "Software Development Kit" + }, "createSecret": { "message": "Izveidot noslēpumu" }, @@ -6479,22 +6570,22 @@ "message": "Iespējot Noslēpumu pārvaldnieks Beta" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Meklēt šo paroli zināmās datu noplūdēs" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Noplūdusi galvenā parole" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Parole atrasta datu noplūdē. Jāizmanto neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Vāja un noplūdusi galvenā parole" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga un neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Vismaz $LENGTH$ rakstzīmes", "placeholders": { "length": { "content": "$1", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Galvenajai parolei ir jābūt vismaz $LENGTH$ rakstzīmes garai.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Noraidīt" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 5cadcb0601f..5eed7581769 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "ലൈസൻസ് അപ്ഡേറ്റ് ചെയ്യുക" }, - "updatedLicense": { - "message": "ലൈസൻസ് അപ്ഡേറ്റ് ചെയ്തു" - }, "manageSubscription": { "message": "സബ്സ്‌ക്രിപ്ഷനുകൾ മാനേജുചെയ്യുക" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index c03b4690ffd..bf3063c5a23 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Oppdater lisens" }, - "updatedLicense": { - "message": "Oppdaterte lisensen" - }, "manageSubscription": { "message": "Behandle abonnementet" }, @@ -5707,28 +5704,36 @@ "message": "Skjul" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Søk i prosjekter", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Tjenestekontonavn" + "message": "Tjenestekontonavn", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Skriv inn eller velg prosjekter eller hemmeligheter" + "message": "Skriv inn eller velg prosjekter eller hemmeligheter", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Skriv for å filtrere" + "message": "Skriv for å filtrere", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Prosjekter slettet" + "message": "Prosjekter slettet", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Prosjektet og alle tilknyttede hemmeligheter er slettet" + "message": "Prosjektet og alle tilknyttede hemmeligheter er slettet", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Sletting av prosjekt $PROJECT$ er permanent og kan ikke angres.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Skriv inn \"$CONFIRM$\" for å fortsette", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Slett $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Slett $COUNT$ prosjekter", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Sletting av prosjekter er permanent og kan ikke angres." + "message": "Sletting av prosjekter er permanent og kan ikke angres.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Ingen prosjekter å vise" + "message": "Ingen prosjekter å vise", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Legg til et nytt prosjekt for å komme i gang med å organisere hemmeligheter." + "message": "Legg til et nytt prosjekt for å komme i gang med å organisere hemmeligheter.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Bekreftelse kreves" + "message": "Bekreftelse kreves", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Følgende prosjekter kunne ikke slettes:" + "message": "Følgende prosjekter kunne ikke slettes:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Hemmelighet sendt til papirkurven" + "message": "Hemmelighet sendt til papirkurven", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Søk i prosjekter" - }, "accessTokens": { - "message": "Tilgangstoken" + "message": "Tilgangstoken", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Opprett tilgangstoken" + "message": "Opprett tilgangstoken", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Utløper" + "message": "Utløper", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Kan lese" + "message": "Kan lese", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Ingen tilgangstokens å vise" + "message": "Ingen tilgangstokens å vise", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Opprett et tilgangstoken for å komme i gang" + "message": "Opprett et tilgangstoken for å komme i gang", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Last ned eller kopier før lukking." + "message": "Last ned eller kopier før lukking.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Utløper den:" + "message": "Utløper den:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Tilgangstokens er ikke lagret og kan ikke hentes" + "message": "Tilgangstokens er ikke lagret og kan ikke hentes", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopier token" + "message": "Kopier token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Tilgangstoken" + "message": "Tilgangstoken", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Utløpsdato kreves" + "message": "Utløpsdato kreves", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Tilgangstoken er opprettet og kopiert til utklippstavlen" + "message": "Tilgangstoken er opprettet og kopiert til utklippstavlen", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Administrasjon av tilganger er ikke tilgjengelig i beta." + "message": "Administrasjon av tilganger er ikke tilgjengelig i beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Opphev tilgangstoken" + "message": "Opphev tilgangstoken", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 2b6758534d6..09d84471ce7 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 5724afede74..676d443912a 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Licentie bijwerken" }, - "updatedLicense": { - "message": "Licentie bijgewerkt" - }, "manageSubscription": { "message": "Abonnement beheren" }, @@ -5707,28 +5704,36 @@ "message": "Verbergen" }, "projects": { - "message": "Projecten" + "message": "Projecten", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Laatst bewerkt" + "message": "Laatst bewerkt", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Bewerk geheim" + "message": "Bewerk geheim", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Geheim toevoegen" + "message": "Geheim toevoegen", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopieer geheime naam" + "message": "Kopieer geheime naam", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Geheime waarde kopiëren" + "message": "Geheime waarde kopiëren", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Geheim verwijderen" + "message": "Geheim verwijderen", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Geheimen verwijderen" + "message": "Geheimen verwijderen", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Geheim definitief verwijderen" @@ -5737,106 +5742,143 @@ "message": "Geheimen definitief verwijderen" }, "secretProjectAssociationDescription": { - "message": "Kies projecten om het geheim aan te koppelen. Alleen gebruikers uit de organisatie met toegang tot deze projecten kunnen het geheim zien." + "message": "Kies projecten om het geheim aan te koppelen. Alleen gebruikers uit de organisatie met toegang tot deze projecten kunnen het geheim zien.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Projecten selecteren" + "message": "Projecten selecteren", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Zoek projecten", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Bewerk project" + "message": "Bewerk project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Bekijk project" + "message": "Bekijk project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Verwijder project" + "message": "Verwijder project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Verwijder projecten" + "message": "Verwijder projecten", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Geheim" + "message": "Geheim", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service-account" + "message": "Service-account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service-accounts" + "message": "Service-accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Geheimen" + "message": "Geheimen", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Naam/waarde paar" + "message": "Naam/waarde paar", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Geheim bewerkt" + "message": "Geheim bewerkt", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Geheim aangemaakt" + "message": "Geheim aangemaakt", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Nieuw geheim" + "message": "Nieuw geheim", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nieuw service account" + "message": "Nieuw service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Geen geheimen om weer te geven" + "message": "Geen geheimen om weer te geven", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Om te starten, voeg een nieuw geheim toe of importeer een geheim." + "message": "Om te starten, voeg een nieuw geheim toe of importeer een geheim.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Er bevinden zich geen geheimen in de prullenbak." }, - "serviceAccountsNoItemsTitle": { - "message": "Geen inhoud beschikbaar" - }, "serviceAccountsNoItemsMessage": { - "message": "Maak een nieuw service account aan om te beginnen met het automatiseren van geheime toegang." + "message": "Maak een nieuw service account aan om te beginnen met het automatiseren van geheime toegang.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Geen inhoud beschikbaar", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Geheimen zoeken" + "message": "Geheimen zoeken", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Verwijder service accounts" + "message": "Verwijder service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Verwijder service account" + "message": "Verwijder service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Bekijk service account" + "message": "Bekijk service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Zoek service account" + "message": "Zoek service account", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Project toevoegen" + "message": "Project toevoegen", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project bewerkt" + "message": "Project bewerkt", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project opgeslagen" + "message": "Project opgeslagen", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project aangemaakt" + "message": "Project aangemaakt", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projectnaam" + "message": "Projectnaam", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nieuw Project" + "message": "Nieuw Project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Verwijderen van geheimen kan invloed hebben op bestaande integraties." + "message": "Verwijderen van geheimen kan invloed hebben op bestaande integraties.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Geheimen verplaatst naar prullenbak" + "message": "Geheimen verplaatst naar prullenbak", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Weet je zeker dat je dit geheim permanent wilt verwijderen?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Geheimen permanent verwijderd" }, - "serviceAccountCreated": { - "message": "Service account aangemaakt" - }, "smAccess": { - "message": "Toegang" + "message": "Toegang", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, geheim" + "message": "Project, geheim", + "description": "" }, "serviceAccountName": { - "message": "Service account naam" + "message": "Service account naam", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account aangemaakt", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Typ of selecteer projecten of geheimen" + "message": "Typ of selecteer projecten of geheimen", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Typ om te filteren" + "message": "Typ om te filteren", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projecten verwijderd" + "message": "Projecten verwijderd", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Het project en alle bijbehorende geheimen zijn verwijderd" + "message": "Het project en alle bijbehorende geheimen zijn verwijderd", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Het verwijderen van project $PROJECT$ is permanent en onomkeerbaar.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Typ \"$CONFIRM$\" om door te gaan", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ verwijderen", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ projecten verwijderen", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Het verwijderen van projecten is permanent en onomkeerbaar." + "message": "Het verwijderen van projecten is permanent en onomkeerbaar.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Geen projecten om weer te geven" + "message": "Geen projecten om weer te geven", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Voeg een nieuw project toe om te starten met het organiseren van geheimen." + "message": "Voeg een nieuw project toe om te starten met het organiseren van geheimen.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Bevestiging vereist" + "message": "Bevestiging vereist", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "De volgende projecten konden niet worden verwijderd:" + "message": "De volgende projecten konden niet worden verwijderd:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Geheim verplaatst naar prullenbak" + "message": "Geheim verplaatst naar prullenbak", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Geheim permanent verwijderd" }, - "searchProjects": { - "message": "Zoek projecten" - }, "accessTokens": { - "message": "Toegangstoken" + "message": "Toegangstoken", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Toegangstoken aanmaken" + "message": "Toegangstoken aanmaken", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Verloopt" + "message": "Verloopt", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Kan lezen" + "message": "Kan lezen", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Geen toegangstokens om weer te geven" + "message": "Geen toegangstokens om weer te geven", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Om te starten, creeer een toegangstoken" + "message": "Om te starten, creeer een toegangstoken", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download of kopieer voordat u afsluit." + "message": "Download of kopieer voordat u afsluit.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Verloopt op:" + "message": "Verloopt op:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Toegangstokens zijn niet opgeslagen en kunnen niet worden opgehaald" + "message": "Toegangstokens zijn niet opgeslagen en kunnen niet worden opgehaald", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopieer token" + "message": "Kopieer token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Toegangstoken" + "message": "Toegangstoken", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Vervaldatum vereist" + "message": "Vervaldatum vereist", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Toegangstoken aangemaakt en gekopieerd naar klembord" + "message": "Toegangstoken aangemaakt en gekopieerd naar klembord", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Beheer van machtigingen is niet beschikbaar in deze beta." + "message": "Beheer van machtigingen is niet beschikbaar in deze beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Toegangstoken intrekken" + "message": "Toegangstoken intrekken", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Toegangstokens intrekken" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Serviceaccounts toevoegen om toegang te verlenen" }, - "canWrite": { - "message": "Kan schrijven" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Projecten aan dit serviceaccount toewijzen. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Projecten toevoegen om toegang te verlenen" }, "canReadWrite": { "message": "Kan lezen, schrijven" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Er is een fout opgetreden bij het lezen van het bronbestand" }, + "accessedSecret": { + "message": "Geopend geheim $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Geheim aanmaken" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Sluiten" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index e5ae975b9e1..66ef0c6a9b9 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index c5fde27aab4..f260d98f8be 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Zaktualizuj licencję" }, - "updatedLicense": { - "message": "Licencja została zaktualizowana" - }, "manageSubscription": { "message": "Zarządzaj subskrypcją" }, @@ -5312,7 +5309,7 @@ } }, "idpSingleSignOnServiceUrlRequired": { - "message": "Wymagane, jeśli identyfikator podmiotu nie jest adres URL." + "message": "Wymagane, jeśli identyfikatorem podmiotu nie jest adres URL." }, "openIdOptionalCustomizations": { "message": "Opcjonalne dostosowania" @@ -5707,28 +5704,36 @@ "message": "Ukryj" }, "projects": { - "message": "Projekty" + "message": "Projekty", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Ostatnio edytowane" + "message": "Ostatnio edytowane", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edytuj sekret" + "message": "Edytuj sekret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Dodaj sekret" + "message": "Dodaj sekret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Kopiuj nazwę sekretu" + "message": "Kopiuj nazwę sekretu", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Kopiuj wartość sekretu" + "message": "Kopiuj wartość sekretu", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Usuń sekret" + "message": "Usuń sekret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Usuń sekrety" + "message": "Usuń sekrety", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Trwale usuń sekret" @@ -5737,106 +5742,143 @@ "message": "Trwale usuń sekrety" }, "secretProjectAssociationDescription": { - "message": "Wybierz projekty, z którymi będzie skojarzony sekret. Tylko użytkownicy organizacji z dostępem do tych projektów będą mogli zobaczyć sekret." + "message": "Wybierz projekty, z którymi będzie skojarzony sekret. Tylko użytkownicy organizacji z dostępem do tych projektów będą mogli zobaczyć sekret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Wybierz projekty" + "message": "Wybierz projekty", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Szukaj w projektach", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekt" + "message": "Projekt", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edytuj projekt" + "message": "Edytuj projekt", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Wyświetl projekt" + "message": "Wyświetl projekt", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Usuń projekt" + "message": "Usuń projekt", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Usuń projekty" + "message": "Usuń projekty", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Sekret" + "message": "Sekret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Konto usługi" + "message": "Konto serwisowe", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Konta usług" + "message": "Konta serwisowe", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Sekrety" + "message": "Sekrety", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Para nazwa/wartość" + "message": "Para nazwa/wartość", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Sekret został zaktualizowany" + "message": "Sekret został zaktualizowany", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Sekret został utworzony" + "message": "Sekret został utworzony", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Nowy sekret" + "message": "Nowy sekret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nowe konto usługi" + "message": "Nowe konto serwisowe", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Brak sekretów do wyświetlenia" + "message": "Brak sekretów do wyświetlenia", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Aby rozpocząć, dodaj nowy sekret lub zaimportuj sekrety." + "message": "Aby rozpocząć, dodaj nowy sekret lub zaimportuj sekrety.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "W koszu nie ma żadnych sekretów." }, - "serviceAccountsNoItemsTitle": { - "message": "Nie ma nic do pokazania" - }, "serviceAccountsNoItemsMessage": { - "message": "Utwórz nowe konto usługi, aby rozpocząć automatyzację dostępu do sekretu." + "message": "Utwórz nowe konto serwisowe, aby rozpocząć automatyzację dostępu do sekretu.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nie ma nic do pokazania", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Szukaj w sekretach" + "message": "Szukaj w sekretach", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Usuń konta usług" + "message": "Usuń konta serwisowe", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Usuń konto usługi" + "message": "Usuń konto serwisowe", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Wyświetl konto usługi" + "message": "Wyświetl konto serwisowe", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Szukaj w kontach usług" + "message": "Szukaj kont serwisowych", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Dodaj projekt" + "message": "Dodaj projekt", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projekt został zaktualizowany" + "message": "Projekt został zaktualizowany", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projekt został zapisany" + "message": "Projekt został zapisany", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projekt został utworzony" + "message": "Projekt został utworzony", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nazwa projektu" + "message": "Nazwa projektu", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nowy projekt" + "message": "Nowy projekt", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Usuwanie sekretów może mieć wpływ na istniejące integracje." + "message": "Usuwanie sekretów może mieć wpływ na istniejące integracje.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Sekrety zostały przeniesione do kosza" + "message": "Sekrety zostały przeniesione do kosza", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Czy na pewno chcesz trwale usunąć ten sekret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Sekrety zostały trwale usunięte" }, - "serviceAccountCreated": { - "message": "Konto usługi zostało utworzone" - }, "smAccess": { - "message": "Dostęp" + "message": "Dostęp", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projekt, sekret" + "message": "Projekt, sekret", + "description": "" }, "serviceAccountName": { - "message": "Nazwa konta usługi" + "message": "Nazwa konta usługi", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Utworzono konto serwisowe", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Wpisz lub wybierz projekty lub sekrety" + "message": "Wpisz lub wybierz projekty lub sekrety", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Wpisz, aby filtrować" + "message": "Wpisz, aby filtrować", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projekty zostały usunięte" + "message": "Projekty zostały usunięte", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Projekt i wszystkie powiązane sekrety zostały usunięte" + "message": "Projekt i wszystkie powiązane sekrety zostały usunięte", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Usuwanie projektu $PROJECT$ jest trwałe i nieodwracalne.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Wpisz \"$CONFIRM$\", aby kontynuować", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Usuń $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Usuń projekty", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Usuwanie projektów jest trwałe i nieodwracalne." + "message": "Usuwanie projektów jest trwałe i nieodwracalne.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Brak projektów do wyświetlenia" + "message": "Brak projektów do wyświetlenia", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Dodaj nowy projekt, aby rozpocząć organizowanie sekretów." + "message": "Dodaj nowy projekt, aby rozpocząć organizowanie sekretów.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Wymagane potwierdzenie" + "message": "Wymagane potwierdzenie", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Następujące projekty nie mogą być usunięte:" + "message": "Następujące projekty nie mogą być usunięte:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Sekret został przeniesiony do kosza" + "message": "Sekret został przeniesiony do kosza", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Sekrety zostały trwale usunięty" }, - "searchProjects": { - "message": "Szukaj w projektach" - }, "accessTokens": { - "message": "Tokeny dostępu" + "message": "Tokeny dostępu", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Utwórz token dostępu" + "message": "Utwórz token dostępu", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Wygasa" + "message": "Wygasa", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Można przeczytać" + "message": "Można przeczytać", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Brak tokenów dostępu" + "message": "Brak tokenów dostępu", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Aby rozpocząć, utwórz token dostępu" + "message": "Aby rozpocząć, utwórz token dostępu", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Pobierz lub skopiuj przed zamknięciem." + "message": "Pobierz lub skopiuj przed zamknięciem.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Wygasa dnia:" + "message": "Wygasa dnia:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Tokeny dostępu nie są przechowywane i nie można ich pobrać" + "message": "Tokeny dostępu nie są przechowywane i nie można ich pobrać", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopiuj token" + "message": "Kopiuj token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Token dostępu" + "message": "Token dostępu", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Wymagana data ważności" + "message": "Wymagana data ważności", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Token dostępu został utworzony i skopiowany do schowka" + "message": "Token dostępu został utworzony i skopiowany do schowka", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Zarządzanie uprawnieniami jest niedostępne w wersji beta." + "message": "Zarządzanie uprawnieniami jest niedostępne w wersji beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Unieważnij token dostępu" + "message": "Unieważnij token dostępu", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Unieważnij tokeny dostępu" @@ -6356,10 +6428,16 @@ "message": "Dodaj osoby lub grupy, aby rozpocząć współpracę" }, "projectEmptyServiceAccountAccessPolicies": { - "message": "Dodaj konta serwisowe, aby udzielić dostępu" + "message": "Aby udzielić dostępu dodaj konta serwisowe" }, - "canWrite": { - "message": "Można pisać" + "serviceAccountPeopleDescription": { + "message": "Przyznaj grupom lub osobom dostęp do tego konta serwisowego." + }, + "serviceAccountProjectsDescription": { + "message": "Przypisz projekty do tego konta serwisowego. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Dodaj projekty, aby udzielić dostępu" }, "canReadWrite": { "message": "Może odczytywać, pisać" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Wystąpił błąd podczas próby odczytu pliku importu" }, + "accessedSecret": { + "message": "Uzyskano dostęp do sekretu $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Utwórz sekret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Odrzuć" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index d85433bb88f..17825f70794 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Atualizar Licença" }, - "updatedLicense": { - "message": "Licença atualizada" - }, "manageSubscription": { "message": "Gerenciar Assinatura" }, @@ -5707,28 +5704,36 @@ "message": "Ocultar" }, "projects": { - "message": "Projetos" + "message": "Projetos", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Última edição" + "message": "Última edição", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Editar segredo" + "message": "Editar segredo", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Adicionar segredo" + "message": "Adicionar segredo", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copiar nome do segredo" + "message": "Copiar nome do segredo", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copiar valor do segredo" + "message": "Copiar valor do segredo", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Excluir segredo" + "message": "Excluir segredo", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Excluir segredos" + "message": "Excluir segredos", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Excluir permanentemente o segredo" @@ -5737,106 +5742,143 @@ "message": "Excluir permanentemente os segredos" }, "secretProjectAssociationDescription": { - "message": "Selecione os projetos aos quais o segredo será associado. Somente os usuários da organização com acesso a estes projetos poderão ver o segredo." + "message": "Selecione os projetos aos quais o segredo será associado. Somente os usuários da organização com acesso a estes projetos poderão ver o segredo.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Selecionar projetos" + "message": "Selecionar projetos", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Pesquisar projetos", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projecto" + "message": "Projecto", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Editar projeto" + "message": "Editar projeto", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Ver projeto" + "message": "Ver projeto", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Excluir projeto" + "message": "Excluir projeto", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Excluir projetos" + "message": "Excluir projetos", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Segredo" + "message": "Segredo", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Conta de serviço" + "message": "Conta de serviço", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Contas de Serviço" + "message": "Contas de Serviço", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Segredos" + "message": "Segredos", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Par de Nome/Valor" + "message": "Par de Nome/Valor", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secreto editado" + "message": "Secreto editado", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Segredo criado" + "message": "Segredo criado", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Novo segredo" + "message": "Novo segredo", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Nova conta de serviço" + "message": "Nova conta de serviço", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Sem segredos para mostrar" + "message": "Sem segredos para mostrar", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Para começar, adicione um novo segredo ou importe segredos." + "message": "Para começar, adicione um novo segredo ou importe segredos.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Não há segredos no lixo." }, - "serviceAccountsNoItemsTitle": { - "message": "Nada para mostrar ainda" - }, "serviceAccountsNoItemsMessage": { - "message": "Crie uma nova conta de serviço para começar a automatizar o acesso secreto." + "message": "Crie uma nova conta de serviço para começar a automatizar o acesso secreto.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nada para mostrar ainda", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Pesquisar segredos" + "message": "Pesquisar segredos", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Excluir contas de serviço" + "message": "Excluir contas de serviço", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Excluir conta de serviço" + "message": "Excluir conta de serviço", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Ver conta de serviço" + "message": "Ver conta de serviço", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Pesquisar contas de serviço" + "message": "Pesquisar contas de serviço", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Adicionar projeto" + "message": "Adicionar projeto", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Projeto editado" + "message": "Projeto editado", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Projeto salvo" + "message": "Projeto salvo", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Projeto criado" + "message": "Projeto criado", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Nome do projeto" + "message": "Nome do projeto", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Novo projeto" + "message": "Novo projeto", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Excluir segredos pode afetar integrações existentes." + "message": "Excluir segredos pode afetar integrações existentes.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Segredos enviados para lixeira" + "message": "Segredos enviados para lixeira", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Tem certeza de que deseja excluir permanentemente este segredo?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Segredos excluídos permanentemente" }, - "serviceAccountCreated": { - "message": "Conta de serviço criada" - }, "smAccess": { - "message": "Acesso" + "message": "Acesso", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Projeto, Segredo" + "message": "Projeto, Segredo", + "description": "" }, "serviceAccountName": { - "message": "Nome da conta de serviço" + "message": "Nome da conta de serviço", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Conta de serviço criada", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Digite ou selecione projetos ou segredos" + "message": "Digite ou selecione projetos ou segredos", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Digite para filtrar" + "message": "Digite para filtrar", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projetos excluídos" + "message": "Projetos excluídos", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "O projeto e todos os segredos associados foram excluídos" + "message": "O projeto e todos os segredos associados foram excluídos", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Excluir o projeto $PROJECT$ é permanente e irreversível.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Digite \"$CONFIRM$\" para continuar", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Excluir $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Excluir $COUNT$ Projetos", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "A exclusão de projetos é permanente e irreversível." + "message": "A exclusão de projetos é permanente e irreversível.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Nenhum projeto para exibir" + "message": "Nenhum projeto para exibir", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Adicione um novo projeto para começar a organizar segredos." + "message": "Adicione um novo projeto para começar a organizar segredos.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmação necessária" + "message": "Confirmação necessária", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Os seguintes projetos não puderam ser excluídos:" + "message": "Os seguintes projetos não puderam ser excluídos:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Segredo enviado para lixeira" + "message": "Segredo enviado para lixeira", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Segredo excluído permanentemente" }, - "searchProjects": { - "message": "Pesquisar projetos" - }, "accessTokens": { - "message": "Tokens de acesso" + "message": "Tokens de acesso", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Criar token de acesso" + "message": "Criar token de acesso", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expira em" + "message": "Expira em", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Pode ler" + "message": "Pode ler", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Nenhum token de acesso para exibir" + "message": "Nenhum token de acesso para exibir", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Para começar, crie um token de acesso" + "message": "Para começar, crie um token de acesso", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Baixe ou copie antes de fechar." + "message": "Baixe ou copie antes de fechar.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expira em:" + "message": "Expira em:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Ocorreu um erro ao tentar ler o arquivo de importação" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Crie um segredo" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index eec500b1b84..fcf203b9489 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Atualizar licença" }, - "updatedLicense": { - "message": "Licença atualizada" - }, "manageSubscription": { "message": "Gerir subscrição" }, @@ -5707,28 +5704,36 @@ "message": "Ocultar" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Conceder a grupos ou pessoas acesso a esta conta de serviço." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dispensar" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index bc21fad2ca1..2b4d51a1f1a 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Actualizare licență" }, - "updatedLicense": { - "message": "Licența s-a actualizat" - }, "manageSubscription": { "message": "Gestionare abonament" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 41dbc1c30bc..602a1a9e6ea 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -658,7 +658,7 @@ "message": "Мастер-пароль – это ключ к вашему защищенному хранилищу. Он очень важен, поэтому не забывайте его. Восстановить мастер-пароль невозможно." }, "masterPassImportant": { - "message": "Мастер-пароли невозможно восстановить, если вы их забудете!" + "message": "Ваш мастер-пароль невозможно восстановить, если вы его забудете!" }, "masterPassHintDesc": { "message": "Подсказка к мастер-паролю может помочь вам его вспомнить." @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Обновить лицензию" }, - "updatedLicense": { - "message": "Лицензия обновлена" - }, "manageSubscription": { "message": "Управление подпиской" }, @@ -3532,7 +3529,7 @@ "message": "Слабый мастер-пароль" }, "weakMasterPasswordDesc": { - "message": "Вы выбрали слабый мастер-пароль. Для надежной защиты аккаунта Bitwarden следует использовать сильный мастер-пароль (или парольную фразу). Вы действительно хотите использовать этот мастер-пароль?" + "message": "Обнаружен слабый пароль. Для защиты аккаунта следует установить надежный пароль. Вы уверены, что хотите использовать слабый пароль?" }, "rotateAccountEncKey": { "message": "Также сменить ключ шифрования моего аккаунта" @@ -4589,7 +4586,7 @@ "message": "Подтверждение мастер-пароля" }, "passwordConfirmationDesc": { - "message": "Это действие защищено. Для продолжения введите свой мастер-пароль, чтобы подтвердить свою личность." + "message": "Это действие защищено. Чтобы продолжить, введите ваш мастер-пароль для подтверждения личности." }, "reinviteSelected": { "message": "Отправить приглашения повторно" @@ -5707,28 +5704,36 @@ "message": "Скрыть" }, "projects": { - "message": "Проекты" + "message": "Проекты", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Последнее изменение" + "message": "Последнее изменение", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Изменить секрет" + "message": "Изменить секрет", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Добавить секрет" + "message": "Добавить секрет", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Скопировать название секрета" + "message": "Скопировать название секрета", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Скопировать значение секрета" + "message": "Скопировать значение секрета", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Удалить секрет" + "message": "Удалить секрет", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Удалить секреты" + "message": "Удалить секреты", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Окончательно удалить секрет" @@ -5737,106 +5742,143 @@ "message": "Окончательно удалить секреты" }, "secretProjectAssociationDescription": { - "message": "Выберите проекты, с которыми будет связан секрет. Только пользователи организации, имеющие доступ к этим проектам, смогут увидеть секрет." + "message": "Выберите проекты, с которыми будет связан секрет. Только пользователи организации, имеющие доступ к этим проектам, смогут увидеть секрет.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Выберите проекты" + "message": "Выберите проекты", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Поиск проектов", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Проект" + "message": "Проект", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Изменить проект" + "message": "Изменить проект", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Просмотреть проект" + "message": "Просмотреть проект", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Удалить проект" + "message": "Удалить проект", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Удалить проекты" + "message": "Удалить проекты", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Секрет" + "message": "Секрет", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Сервисный аккаунт" + "message": "Сервисный аккаунт", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Сервисные аккаунты" + "message": "Сервисные аккаунты", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Секреты" + "message": "Секреты", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Пара название/значение" + "message": "Пара название/значение", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Секрет изменен" + "message": "Секрет изменен", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Секрет создан" + "message": "Секрет создан", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Новый секрет" + "message": "Новый секрет", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Новый сервисный аккаунт" + "message": "Новый сервисный аккаунт", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Нет секретов для отображения" + "message": "Нет секретов для отображения", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Чтобы начать, добавьте новый секрет или импортируйте их." + "message": "Чтобы начать, добавьте новый секрет или импортируйте их.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "В корзине нет секретов." }, - "serviceAccountsNoItemsTitle": { - "message": "Пока нечего показать" - }, "serviceAccountsNoItemsMessage": { - "message": "Чтобы приступить к автоматизации секретного доступа, создайте новый сервисный аккаунт." + "message": "Чтобы приступить к автоматизации секретного доступа, создайте новый сервисный аккаунт.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Пока нечего показать", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Поиск секретов" + "message": "Поиск секретов", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Удалить сервисные аккаунты" + "message": "Удалить сервисные аккаунты", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Удалить сервисный аккаунт" + "message": "Удалить сервисный аккаунт", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Просмотреть сервисный аккаунт" + "message": "Просмотреть сервисный аккаунт", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Поиск сервисных аккаунтов" + "message": "Поиск сервисных аккаунтов", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Добавить проект" + "message": "Добавить проект", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Проект изменен" + "message": "Проект изменен", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Проект сохранен" + "message": "Проект сохранен", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Проект создан" + "message": "Проект создан", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Название проекта" + "message": "Название проекта", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Новый проект" + "message": "Новый проект", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Удаление секретов может повлиять на существующие интеграции." + "message": "Удаление секретов может повлиять на существующие интеграции.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Секреты отправлены в корзину" + "message": "Секреты отправлены в корзину", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Вы уверены, что хотите удалить этот секрет?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Секреты удалены окончательно" }, - "serviceAccountCreated": { - "message": "Сервисный аккаунт создан" - }, "smAccess": { - "message": "Доступ" + "message": "Доступ", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Проект, секрет" + "message": "Проект, секрет", + "description": "" }, "serviceAccountName": { - "message": "Название сервисного аккаунта" + "message": "Название сервисного аккаунта", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Сервисный аккаунт создан", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Введите или выберите проекты или секреты" + "message": "Введите или выберите проекты или секреты", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Введите для фильтрации" + "message": "Введите для фильтрации", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Проект удален" + "message": "Проект удален", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Проект и все связанные с ним секреты были удалены" + "message": "Проект удалены", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Удаление проекта $PROJECT$ окончательно и необратимо.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Наберите \"$CONFIRM$\", чтобы продолжить", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Удалить $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Удалить проектов: $COUNT$", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Удаление проектов окончательно и необратимо." + "message": "Удаление проектов окончательно и необратимо.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Нет проектов для отображения" + "message": "Нет проектов для отображения", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Добавить новый проект, чтобы приступить к организации секретов." + "message": "Добавить новый проект, чтобы приступить к организации секретов.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Требуется подтверждение" + "message": "Требуется подтверждение", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Следующие проекты не могут быть удалены:" + "message": "Следующие проекты не могут быть удалены:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Секрет отправлен в корзину" + "message": "Секрет отправлен в корзину", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Секрет удален окончательно" }, - "searchProjects": { - "message": "Поиск проектов" - }, "accessTokens": { - "message": "Токены доступа" + "message": "Токены доступа", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Создать токен доступа" + "message": "Создать токен доступа", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Истекает" + "message": "Истекает", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Может читать" + "message": "Может читать", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Нет токенов доступа для отображения" + "message": "Нет токенов доступа для отображения", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Чтобы начать работу, создайте токен доступа" + "message": "Чтобы начать работу, создайте токен доступа", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Скачайте или скопируйте перед закрытием." + "message": "Скачайте или скопируйте перед закрытием.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Истекает:" + "message": "Истекает:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Токены доступа не сохраняются и не могут быть получены" + "message": "Токены доступа не сохраняются и не могут быть получены", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Скопировать токен" + "message": "Скопировать токен", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Токен доступа" + "message": "Токен доступа", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Срок действия обязателен" + "message": "Срок действия обязателен", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Токен доступа создан и скопирован в буфер обмена" + "message": "Токен доступа создан и скопирован в буфер обмена", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Управление разрешениями недоступно в бета-версии." + "message": "Управление разрешениями недоступно в бета-версии.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Отозвать токен доступа" + "message": "Отозвать токен доступа", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Отозвать токены доступа" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Добавить сервисные аккаунты для предоставления доступа" }, - "canWrite": { - "message": "Может записывать" + "serviceAccountPeopleDescription": { + "message": "Предоставить группам или людям доступ к этому сервисному аккаунту." + }, + "serviceAccountProjectsDescription": { + "message": "Назначить проекты этому сервисному аккаунту. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Добавить проекты для предоставления доступа" }, "canReadWrite": { "message": "Может читать, записывать" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Произошла ошибка при попытке чтения импортируемого файла" }, + "accessedSecret": { + "message": "Получен доступ к секрету $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Создать секрет" }, @@ -6479,22 +6570,22 @@ "message": "Менеджер секретов Бета" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Проверьте известные случаи утечки данных для этого пароля" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Мастер-пароль скомпрометирован" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Пароль найден в утечке данных. Используйте уникальный пароль для защиты вашего аккаунта. Вы уверены, что хотите использовать скомпрометированный пароль?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Слабый и скомпрометированный мастер-пароль" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Обнаружен слабый пароль, найденный в утечке данных. Используйте надежный и уникальный пароль для защиты вашего аккаунта. Вы уверены, что хотите использовать этот пароль?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Минимум символов: $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Мастер-пароль должен содержать не менее $LENGTH$ символов.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Отклонить" } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index b387021ad56..fc7bb2f5d37 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 10766ac476f..1e0c850c496 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Aktualizovať licenciu" }, - "updatedLicense": { - "message": "Licencia aktualizovaná" - }, "manageSubscription": { "message": "Spravovať predplatné" }, @@ -5707,28 +5704,36 @@ "message": "Skryť" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Natrvalo odstrániť položku" @@ -5737,106 +5742,143 @@ "message": "Natrvalo odstrániť položky" }, "secretProjectAssociationDescription": { - "message": "Vyberte projekty ku ktorým bude heslo patriť. Iba tí používatelia organizácie, ktorí majú prístup k zvoleným projektom budú môcť vidieť heslo." + "message": "Vyberte projekty ku ktorým bude heslo patriť. Iba tí používatelia organizácie, ktorí majú prístup k zvoleným projektom budú môcť vidieť heslo.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Vyberte projekty" + "message": "Vyberte projekty", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "V koši nie sú žiadne položky." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Naozaj chcete natrvalo odstrániť túto položku?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Položky natrvalo odstránené" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Položka natrvalo odstránená" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Zrušiť prístupové tokeny" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Pridajte služobné kontá pre povolenie prístupu" }, - "canWrite": { - "message": "Môže zapisovať" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Priraďte projekty tomuto služobnému kontu. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Pridajte projekty pre udelenie prístupu" }, "canReadWrite": { "message": "Môže čítať, zapisovať" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Pri pokuse o prečítanie súboru na import sa vyskytla chyba" }, + "accessedSecret": { + "message": "Prístup k heslu $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Vytvoriť položku" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index accbed21238..52d275b0961 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index aa785e1c805..1e754d539fa 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Ажурирање лиценце" }, - "updatedLicense": { - "message": "Лиценца ажурирана" - }, "manageSubscription": { "message": "Управљај претплатама" }, @@ -5707,28 +5704,36 @@ "message": "Сакриј" }, "projects": { - "message": "Пројекти" + "message": "Пројекти", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Последња измена" + "message": "Последња измена", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Уреди тајну" + "message": "Уреди тајну", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Додај тајну" + "message": "Додај тајну", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Копирати име тајне" + "message": "Копирати име тајне", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Копирати вредност тајне" + "message": "Копирати вредност тајне", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Обрисати тајну" + "message": "Обрисати тајну", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Обрисати тајне" + "message": "Обрисати тајне", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Трајно избрисати тајну" @@ -5737,106 +5742,143 @@ "message": "Трајно избрисати тајне" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Одабрати пројекте" + "message": "Одабрати пројекте", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Претражити пројекте", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Пројекат" + "message": "Пројекат", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Уреди Пројекат" + "message": "Уреди Пројекат", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Приказ пројекта" + "message": "Приказ пројекта", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Избриши пројекат" + "message": "Избриши пројекат", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Избриши пројекте" + "message": "Избриши пројекте", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Тајна" + "message": "Тајна", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Налог сервиса" + "message": "Налог сервиса", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Налози сервиса" + "message": "Налози сервиса", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Тајне" + "message": "Тајне", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Тајна промењена" + "message": "Тајна промењена", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Тајна креирана" + "message": "Тајна креирана", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Нова тајна" + "message": "Нова тајна", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Нема тајне за приказ" + "message": "Нема тајне за приказ", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "У отпад нема тајне." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Претражити тајне" + "message": "Претражити тајне", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Додај пројекат" + "message": "Додај пројекат", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Пројекат промењен" + "message": "Пројекат промењен", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Пројекат сачуван" + "message": "Пројекат сачуван", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Пројекат креиран" + "message": "Пројекат креиран", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Назив Пројекта" + "message": "Назив Пројекта", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Нови пројекат" + "message": "Нови пројекат", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Да ли сте сигурни да желите да трајно избришете ову тајну?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Тајне трајно избрисане" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Приступ" + "message": "Приступ", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Пројекат, тајна" + "message": "Пројекат, тајна", + "description": "" }, "serviceAccountName": { - "message": "Има налога сервиса" + "message": "Има налога сервиса", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Тип за филтрирање" + "message": "Тип за филтрирање", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Пројекат избрисан" + "message": "Пројекат избрисан", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Пројекат и све повезане тајне су избрисане" + "message": "Пројекат и све повезане тајне су избрисане", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Брисање пројекта $PROJECT$ је трајно и неповратно.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Унети \"$CONFIRM$\" за наставак", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Обрисати $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Обрисати $COUNT$ пројекта", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Брисање пројекта је трајно и неповратно." + "message": "Брисање пројекта је трајно и неповратно.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Нема пројекта за приказ" + "message": "Нема пројекта за приказ", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Потврда је обавезна" + "message": "Потврда је обавезна", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Следећи пројекти се не могу избрисати:" + "message": "Следећи пројекти се не могу избрисати:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Тајна послана у отпад" + "message": "Тајна послана у отпад", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Тајна трајно избрисана" }, - "searchProjects": { - "message": "Претражити пројекте" - }, "accessTokens": { - "message": "Приступни токени" + "message": "Приступни токени", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Креирати приступни токен" + "message": "Креирати приступни токен", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Истиче" + "message": "Истиче", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Може да чита" + "message": "Може да чита", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Нема токен за приказ" + "message": "Нема токен за приказ", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Преузмите или копирајте пре затварања." + "message": "Преузмите или копирајте пре затварања.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Истиче:" + "message": "Истиче:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Копирај токен" + "message": "Копирај токен", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Приступни токени" + "message": "Приступни токени", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Потребан је датум истека" + "message": "Потребан је датум истека", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Опозови приступ токена" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Додајте налоге услуге да бисте одобрили приступ" }, - "canWrite": { - "message": "Може писати" + "serviceAccountPeopleDescription": { + "message": "Одобрите групама или људима приступ овом налогу сервиса." + }, + "serviceAccountProjectsDescription": { + "message": "Доделите пројекте овом налогу услуге. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Додајте пројекте да бисте одобрили приступ" }, "canReadWrite": { "message": "Може читати, писати" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Дошло је до грешке у покушају читања датотеке за увоз" }, + "accessedSecret": { + "message": "Приступ тајни $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Креирати тајну" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Одбаци" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index cb11fc34fd7..7cd15be8b67 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 9c41249bd4c..5889061848c 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Uppdatera licens" }, - "updatedLicense": { - "message": "Uppdaterade licens" - }, "manageSubscription": { "message": "Hantera prenumeration" }, @@ -5707,28 +5704,36 @@ "message": "Dölj" }, "projects": { - "message": "Projekt" + "message": "Projekt", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Senast redigerad" + "message": "Senast redigerad", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Välj projekt" + "message": "Välj projekt", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projekt" + "message": "Projekt", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Redigera projekt" + "message": "Redigera projekt", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Visa projekt" + "message": "Visa projekt", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Radera projekt" + "message": "Radera projekt", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Radera projekt" + "message": "Radera projekt", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Lägg till projekt" + "message": "Lägg till projekt", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Projektnamn" + "message": "Projektnamn", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Nytt projekt" + "message": "Nytt projekt", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Ange \"$CONFIRM$\" för att fortsätta", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Radera $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Radera $COUNT$ projekt", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Inga projekt att visa" + "message": "Inga projekt att visa", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Följande projekt kunde inte raderas:" + "message": "Följande projekt kunde inte raderas:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Upphör" + "message": "Upphör", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Kan läsa" + "message": "Kan läsa", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Kopiera token" + "message": "Kopiera token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6503,12 +6594,15 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Huvudlösenordet måste vara minst $LENGTH$ tecken långt.", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 2b6758534d6..09d84471ce7 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 60e88b6d96c..73fdd3b6fee 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 6cfe164f04b..444eff23314 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Lisansı güncelle" }, - "updatedLicense": { - "message": "Lisans güncellendi" - }, "manageSubscription": { "message": "Aboneliği yönet" }, @@ -5707,28 +5704,36 @@ "message": "Gizle" }, "projects": { - "message": "Projeler" + "message": "Projeler", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Son Düzenlenen" + "message": "Son Düzenlenen", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Gizli Düzenle" + "message": "Gizli Düzenle", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Sır Ekle" + "message": "Sır Ekle", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Gizli Adı Kopyala" + "message": "Gizli Adı Kopyala", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Gizli Değeri Kopyala" + "message": "Gizli Değeri Kopyala", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Sırrı Sil" + "message": "Sırrı Sil", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Sırları Sil" + "message": "Sırları Sil", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Sırrı kalıcı olarak sil" @@ -5737,106 +5742,143 @@ "message": "Sırları kalıcı olarak sil" }, "secretProjectAssociationDescription": { - "message": "Sırrın ilişkilendirileceği projeleri seçin. Yalnızca bu projelere erişimi olan kuruluş kullanıcıları sırrı görebilir." + "message": "Sırrın ilişkilendirileceği projeleri seçin. Yalnızca bu projelere erişimi olan kuruluş kullanıcıları sırrı görebilir.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Projeleri seçin" + "message": "Projeleri seçin", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Projeleri ara", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Proje" + "message": "Proje", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Proje Düzenleme" + "message": "Proje Düzenleme", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Proje Görüntüle" + "message": "Proje Görüntüle", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Proje Silme" + "message": "Proje Silme", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Projeleri Sil" + "message": "Projeleri Sil", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Gizli" + "message": "Gizli", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Hizmet Hesabı" + "message": "Hizmet Hesabı", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Hizmet Hesapları" + "message": "Hizmet Hesapları", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Sırlar" + "message": "Sırlar", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "İsim/Değer Çifti" + "message": "İsim/Değer Çifti", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Sır düzenlendi" + "message": "Sır düzenlendi", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Sır yaratıldı" + "message": "Sır yaratıldı", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Yeni Sır" + "message": "Yeni Sır", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Yeni Hizmet Hesabı" + "message": "Yeni Hizmet Hesabı", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Gösterecek sır yok" + "message": "Gösterecek sır yok", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Başlamak için yeni bir gizli dizin ekleyin veya gizli dizinleri içe aktarın." + "message": "Başlamak için yeni bir gizli dizin ekleyin veya gizli dizinleri içe aktarın.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "Çöpte sır yok." }, - "serviceAccountsNoItemsTitle": { - "message": "Henüz gösterecek bir şey yok" - }, "serviceAccountsNoItemsMessage": { - "message": "Gizli erişimi otomatikleştirmeye başlamak için yeni bir Hizmet Hesabı oluşturun." + "message": "Gizli erişimi otomatikleştirmeye başlamak için yeni bir Hizmet Hesabı oluşturun.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Henüz gösterecek bir şey yok", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Arama Sırları" + "message": "Arama Sırları", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Hizmet Hesaplarını Sil" + "message": "Hizmet Hesaplarını Sil", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Hizmet Hesabını Sil" + "message": "Hizmet Hesabını Sil", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Hizmet Hesabını Görüntüle" + "message": "Hizmet Hesabını Görüntüle", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Hizmet Hesaplarını Ara" + "message": "Hizmet Hesaplarını Ara", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Proje Ekle" + "message": "Proje Ekle", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Proje düzenlendi" + "message": "Proje düzenlendi", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Proje kaydedildi" + "message": "Proje kaydedildi", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Proje oluşturuldu" + "message": "Proje oluşturuldu", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Proje Adı" + "message": "Proje Adı", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Yeni Proje" + "message": "Yeni Proje", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Sırların silinmesi mevcut entegrasyonları etkileyebilir." + "message": "Sırların silinmesi mevcut entegrasyonları etkileyebilir.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Çöpe atılan sırlar" + "message": "Çöpe atılan sırlar", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Bu sırrı kalıcı olarak silmek istediğinizden emin misiniz?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Sırlar kalıcı olarak silindi" }, - "serviceAccountCreated": { - "message": "Hizmet Hesabı Oluşturuldu" - }, "smAccess": { - "message": "Erişim" + "message": "Erişim", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Proje, Gizli" + "message": "Proje, Gizli", + "description": "" }, "serviceAccountName": { - "message": "Hizmet hesabı adı" + "message": "Hizmet hesabı adı", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Hizmet Hesabı Oluşturuldu", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Projeleri veya Sırları Yazın veya Seçin" + "message": "Projeleri veya Sırları Yazın veya Seçin", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Filtrelemek için yaz" + "message": "Filtrelemek için yaz", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Silinen projeler" + "message": "Silinen projeler", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Proje ve ilişkili tüm sırlar silindi" + "message": "Proje ve ilişkili tüm sırlar silindi", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "$PROJECT$ projesinin silinmesi kalıcıdır ve geri döndürülemez.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Devam etmek için \"$CONFIRM$\" yazın", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "$PROJECT$ sil", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "$COUNT$ Projelerini Sil", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Projelerin silinmesi kalıcıdır ve geri döndürülemez." + "message": "Projelerin silinmesi kalıcıdır ve geri döndürülemez.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Sergilenecek proje yok" + "message": "Sergilenecek proje yok", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Sırları düzenlemeye başlamak için yeni bir proje ekleyin." + "message": "Sırları düzenlemeye başlamak için yeni bir proje ekleyin.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Onaylama gerekli" + "message": "Onaylama gerekli", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Aşağıdaki projeler silinememiştir:" + "message": "Aşağıdaki projeler silinememiştir:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Çöpe atılan sır" + "message": "Çöpe atılan sır", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Sır kalıcı olarak silindi" }, - "searchProjects": { - "message": "Projeleri ara" - }, "accessTokens": { - "message": "Erişim anahtarları" + "message": "Erişim anahtarları", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Erişim anahtarı oluşturma" + "message": "Erişim anahtarı oluşturma", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Bitiş tarihi" + "message": "Bitiş tarihi", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Okuyabilir" + "message": "Okuyabilir", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Gösterilecek erişim anahtarları yok" + "message": "Gösterilecek erişim anahtarları yok", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Başlamak için bir erişim anahtarı oluşturun" + "message": "Başlamak için bir erişim anahtarı oluşturun", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Kapatmadan önce indirin veya kopyalayın." + "message": "Kapatmadan önce indirin veya kopyalayın.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Bitiş tarihi:" + "message": "Bitiş tarihi:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Erişim anahtarları saklanmaz ve geri alınamaz" + "message": "Erişim anahtarları saklanmaz ve geri alınamaz", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Erişim anahtarını kopyala" + "message": "Erişim anahtarını kopyala", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Erişim anahtarı" + "message": "Erişim anahtarı", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Son kullanma tarihi gerekli" + "message": "Son kullanma tarihi gerekli", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Erişim anahtarı oluşturuldu ve panoya kopyalandı" + "message": "Erişim anahtarı oluşturuldu ve panoya kopyalandı", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "İzin yönetimi beta sürümünde kullanılamıyor." + "message": "İzin yönetimi beta sürümünde kullanılamıyor.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Erişim anahtarını İptal Et" + "message": "Erişim anahtarını İptal Et", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Erişim anahtarını iptal et" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Erişim vermek için hizmet hesapları ekleyin" }, - "canWrite": { - "message": "Yazabilir" + "serviceAccountPeopleDescription": { + "message": "Gruplara veya kişilere bu hizmet hesabına erişim izni verin." + }, + "serviceAccountProjectsDescription": { + "message": "Bu hizmet hesabına projeler atayın. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Erişim izni vermek için proje ekleyin" }, "canReadWrite": { "message": "Okuyabilir, yazabilir" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "İçe aktarma dosyası okunurken bir hata oluştu" }, + "accessedSecret": { + "message": "$SECRET_ID$ gizliliiğine erişildi.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Bir sır oluştur" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Kapat" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 67899e49e67..3a01df9d919 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Оновити ліцензію" }, - "updatedLicense": { - "message": "Ліцензію оновлено" - }, "manageSubscription": { "message": "Керувати передплатою" }, @@ -5707,28 +5704,36 @@ "message": "Приховати" }, "projects": { - "message": "Проєкти" + "message": "Проєкти", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Востаннє редаговано" + "message": "Востаннє редаговано", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Редагувати секрет" + "message": "Редагувати секрет", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Додати секрет" + "message": "Додати секрет", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Копіювати назву секрету" + "message": "Копіювати назву секрету", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Копіювати значення секрету" + "message": "Копіювати значення секрету", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Видалити секрет" + "message": "Видалити секрет", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Видалити секрети" + "message": "Видалити секрети", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Остаточно видалити секрет" @@ -5737,106 +5742,143 @@ "message": "Остаточно видалити секрети" }, "secretProjectAssociationDescription": { - "message": "Оберіть проєкти, з якими буде пов'язано секретний ключ." + "message": "Оберіть проєкти, з якими буде пов'язано секретний ключ.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Виберіть проєкти" + "message": "Виберіть проєкти", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Пошук проєктів", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Проєкт" + "message": "Проєкт", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Редагувати проєкт" + "message": "Редагувати проєкт", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "Переглянути проєкт" + "message": "Переглянути проєкт", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Видалити проєкт" + "message": "Видалити проєкт", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Видалити проєкти" + "message": "Видалити проєкти", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Секрет" + "message": "Секрет", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Службовий обліковий запис" + "message": "Службовий обліковий запис", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Службові облікові записи" + "message": "Службові облікові записи", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Секрети" + "message": "Секрети", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Пара – Назва/Значення" + "message": "Пара – Назва/Значення", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Секрет відредаговано" + "message": "Секрет відредаговано", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Секрет створено" + "message": "Секрет створено", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "Новий секрет" + "message": "Новий секрет", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "Новий службовий обліковий запис" + "message": "Новий службовий обліковий запис", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Немає секретів для показу" + "message": "Немає секретів для показу", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "Для початку додайте або імпортуйте секрети." + "message": "Для початку додайте або імпортуйте секрети.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "У смітнику немає секретів." }, - "serviceAccountsNoItemsTitle": { - "message": "Наразі немає даних для показу" - }, "serviceAccountsNoItemsMessage": { - "message": "Створіть новий службовий обліковий запис, щоб почати автоматизацію доступу до секретів." + "message": "Створіть новий службовий обліковий запис, щоб почати автоматизацію доступу до секретів.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Наразі немає даних для показу", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Пошук секретів" + "message": "Пошук секретів", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Видалити службові облікові записи" + "message": "Видалити службові облікові записи", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Видалити службовий обліковий запис" + "message": "Видалити службовий обліковий запис", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "Переглянути службовий обліковий запис" + "message": "Переглянути службовий обліковий запис", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Пошук службових облікових записів" + "message": "Пошук службових облікових записів", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Додати проєкт" + "message": "Додати проєкт", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Проєкт відредаговано" + "message": "Проєкт відредаговано", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Проєкт збережено" + "message": "Проєкт збережено", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Проєкт створено" + "message": "Проєкт створено", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Назва проєкту" + "message": "Назва проєкту", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "Новий проєкт" + "message": "Новий проєкт", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Видалення секретів може вплинути на наявні інтеграції." + "message": "Видалення секретів може вплинути на наявні інтеграції.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Секрети переміщено до смітника" + "message": "Секрети переміщено до смітника", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Ви дійсно хочете остаточно видалити цей секрет?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Секрети остаточно видалено" }, - "serviceAccountCreated": { - "message": "Службовий обліковий запис створено" - }, "smAccess": { - "message": "Доступ" + "message": "Доступ", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Проєкт, секрет" + "message": "Проєкт, секрет", + "description": "" }, "serviceAccountName": { - "message": "Назва сервісного облікового запису" + "message": "Назва сервісного облікового запису", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Службовий обліковий запис створено", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Введіть або виберіть проєкти чи секрети" + "message": "Введіть або виберіть проєкти чи секрети", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Введіть, щоб фільтрувати" + "message": "Введіть, щоб фільтрувати", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Проєкти видалено" + "message": "Проєкти видалено", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Проєкт і всі пов'язані секрети було видалено" + "message": "Проєкт видалено", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Видалення проєкту $PROJECT$ – незворотна дія.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Введіть \"$CONFIRM$\" для продовження", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Видалити $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Видалити $COUNT$ проєктів", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Видалення проєктів – це незворотна дія." + "message": "Видалення проєктів – це незворотна дія.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "Немає проєктів для показу" + "message": "Немає проєктів для показу", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Додайте новий проєкт, щоб почати організовувати секрети." + "message": "Додайте новий проєкт, щоб почати організовувати секрети.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Потрібне підтвердження" + "message": "Потрібне підтвердження", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Зазначені проєкти неможливо видалити:" + "message": "Зазначені проєкти неможливо видалити:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Секрет переміщено до смітника" + "message": "Секрет переміщено до смітника", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Секрет остаточно видалено" }, - "searchProjects": { - "message": "Пошук проєктів" - }, "accessTokens": { - "message": "Токени доступу" + "message": "Токени доступу", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Створити токен доступу" + "message": "Створити токен доступу", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Завершується" + "message": "Завершується", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Може читати" + "message": "Може читати", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Немає токенів доступу" + "message": "Немає токенів доступу", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Щоб розпочати, створіть токен доступу" + "message": "Щоб розпочати, створіть токен доступу", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Завантажте чи скопіюйте перед закриттям." + "message": "Завантажте чи скопіюйте перед закриттям.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Завершується:" + "message": "Завершується:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Токени доступу не зберігаються і не можуть бути завантажені" + "message": "Токени доступу не зберігаються і не можуть бути завантажені", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Копіювати токен" + "message": "Копіювати токен", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Токен доступу" + "message": "Токен доступу", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Дата завершення обов'язкова" + "message": "Дата завершення обов'язкова", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Токен доступу створено і скопійовано до буфера обміну" + "message": "Токен доступу створено і скопійовано до буфера обміну", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Керування дозволами недоступне у бета-версії." + "message": "Керування дозволами недоступне у бета-версії.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Відкликати токен доступу" + "message": "Відкликати токен доступу", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Відкликати токени доступу" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Додайте службові облікові записи для надання доступу" }, - "canWrite": { - "message": "Може записувати" + "serviceAccountPeopleDescription": { + "message": "Надайте групам або людям доступ до цього службового облікового запису." + }, + "serviceAccountProjectsDescription": { + "message": "Призначити проєкти цьому службовому обліковому запису. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Додайте проєкти, щоб надати доступ" }, "canReadWrite": { "message": "Може читати й записувати" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Під час спроби прочитання імпортованого файлу сталася помилка" }, + "accessedSecret": { + "message": "Доступ до секрету $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Створити секрет" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index c5facd286fa..7a532179d66 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "Update license" }, - "updatedLicense": { - "message": "Updated license" - }, "manageSubscription": { "message": "Manage subscription" }, @@ -5707,28 +5704,36 @@ "message": "Hide" }, "projects": { - "message": "Projects" + "message": "Projects", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited" + "message": "Last edited", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret" + "message": "Edit secret", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret" + "message": "Add secret", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name" + "message": "Copy secret name", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value" + "message": "Copy secret value", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret" + "message": "Delete secret", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets" + "message": "Delete secrets", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret." + "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "Search projects", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project" + "message": "Project", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project" + "message": "Edit project", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project" + "message": "View project", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project" + "message": "Delete project", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects" + "message": "Delete projects", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret" + "message": "Secret", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account" + "message": "Service account", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts" + "message": "Service accounts", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets" + "message": "Secrets", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair" + "message": "Name/Value pair", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited" + "message": "Secret edited", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created" + "message": "Secret created", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret" + "message": "New secret", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account" + "message": "New service account", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show" + "message": "No secrets to show", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets." + "message": "To get started, add a new secret or import secrets.", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets" + "message": "Search secrets", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts" + "message": "Delete service accounts", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account" + "message": "Delete service account", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account" + "message": "View service account", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "Search service accounts" + "message": "Search service accounts", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "Add project" + "message": "Add project", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited" + "message": "Project edited", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved" + "message": "Project saved", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created" + "message": "Project created", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name" + "message": "Project name", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project" + "message": "New project", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations." + "message": "Deleting secrets can affect existing integrations.", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash" + "message": "Secrets sent to trash", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "Service account created" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret" + "message": "Project, Secret", + "description": "" }, "serviceAccountName": { - "message": "Service account name" + "message": "Service account name", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "Service account created", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets" + "message": "Type or select projects or secrets", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter" + "message": "Type to filter", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted" + "message": "Projects deleted", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "The project and all associated secrets have been deleted" + "message": "Project deleted", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "Type \"$CONFIRM$\" to continue", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "Delete $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "Delete $COUNT$ Projects", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible." + "message": "Deleting projects is permanent and irreversible.", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display" + "message": "No projects to display", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required" + "message": "Confirmation required", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:" + "message": "The following projects could not be deleted:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash" + "message": "Secret sent to trash", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "Search projects" - }, "accessTokens": { - "message": "Access tokens" + "message": "Access tokens", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token" + "message": "Create access token", + "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires" + "message": "Expires", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read" + "message": "Can read", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show" + "message": "No access tokens to show", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token" + "message": "To get started, create an access token", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing." + "message": "Download or copy before closing.", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:" + "message": "Expires on:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved" + "message": "Access tokens are not stored and cannot be retrieved", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token" + "message": "Copy token", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token" + "message": "Access token", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required" + "message": "Expiration date required", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard" + "message": "Access token created and copied to clipboard", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta." + "message": "Permissions management is unavailable for beta.", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token" + "message": "Revoke access token", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "Đã xảy ra lỗi khi cố đọc tập tin nhập" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 9e46f4ee3fb..08ff10dc70e 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "更新许可证" }, - "updatedLicense": { - "message": "许可证已更新" - }, "manageSubscription": { "message": "管理订阅" }, @@ -5681,7 +5678,7 @@ "message": "自定义颜色" }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- 选择 --" }, "multiSelectPlaceholder": { "message": "-- 键入以筛选 --" @@ -5707,28 +5704,36 @@ "message": "隐藏" }, "projects": { - "message": "项目" + "message": "项目", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "上次编辑时间" + "message": "上次编辑时间", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "编辑机密" + "message": "编辑机密", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "添加机密" + "message": "添加机密", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "复制机密名称" + "message": "复制机密名称", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "复制机密值" + "message": "复制机密值", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "删除机密" + "message": "删除机密", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "删除机密" + "message": "删除机密", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "选择与机密相关联的项目。仅有权访问该项目的组织用户能查看该机密。" + "message": "选择与机密相关联的项目。仅有权访问该项目的组织用户能查看该机密。", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "选择项目" + "message": "选择项目", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "搜索项目", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "项目" + "message": "项目", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "编辑项目" + "message": "编辑项目", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "查看项目" + "message": "查看项目", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "删除项目" + "message": "删除项目", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "删除项目" + "message": "删除项目", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "机密" + "message": "机密", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "服务账户" + "message": "服务账户", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "服务帐户" + "message": "服务帐户", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "机密" + "message": "机密", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "名称/值对" + "message": "名称/值对", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "机密已编辑" + "message": "机密已编辑", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "机密已创建" + "message": "机密已创建", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "新建机密" + "message": "新建机密", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "新建服务账户" + "message": "新建服务账户", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "没有可显示的机密" + "message": "没有可显示的机密", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "要开始,请添加一个新的机密或导入机密。" + "message": "要开始,请添加一个新的机密或导入机密。", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "还没有要显示的内容" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "还没有要显示的内容", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "搜索机密" + "message": "搜索机密", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "删除服务账户" + "message": "删除服务账户", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "删除服务帐户" + "message": "删除服务帐户", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "查看服务账户" + "message": "查看服务账户", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "搜索服务账户" + "message": "搜索服务账户", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "添加项目" + "message": "添加项目", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "项目已编辑" + "message": "项目已编辑", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "项目已保存" + "message": "项目已保存", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "项目已创建" + "message": "项目已创建", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "项目名称" + "message": "项目名称", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "新建项目" + "message": "新建项目", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "删除机密可能会影响现有的集成。" + "message": "删除机密可能会影响现有的集成。", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "机密已发送到回收站" + "message": "机密已发送到回收站", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "服务帐户已创建" - }, "smAccess": { - "message": "Access" + "message": "Access", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "项目,机密" + "message": "项目,机密", + "description": "" }, "serviceAccountName": { - "message": "服务账户名称" + "message": "服务账户名称", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "服务帐户已创建", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "输入或选择项目或机密" + "message": "输入或选择项目或机密", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "键入以筛选" + "message": "键入以筛选", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "项目已删除" + "message": "项目已删除", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "项目和所有相关的机密已被删除" + "message": "项目和所有相关的机密已被删除", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "删除项目 $PROJECT$ 是永久性的,不可撤销!", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "输入「$CONFIRM$」以继续", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "删除 $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "删除 $COUNT$ 个项目", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "删除项目是永久性的,不可撤销!" + "message": "删除项目是永久性的,不可撤销!", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "没有可显示的项目" + "message": "没有可显示的项目", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "需要确认" + "message": "需要确认", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "以下项目无法删除:" + "message": "以下项目无法删除:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "机密已发送到回收站" + "message": "机密已发送到回收站", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "搜索项目" - }, "accessTokens": { - "message": "访问令牌" + "message": "访问令牌", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "创建访问令牌" + "message": "创建访问令牌", + "description": "Button label for creating a new access token." }, "expires": { - "message": "到期" + "message": "到期", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "可以读取" + "message": "可以读取", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "没有可显示的访问令牌" + "message": "没有可显示的访问令牌", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "要开始,请创建一个访问令牌" + "message": "要开始,请创建一个访问令牌", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "关闭前下载或复制。" + "message": "关闭前下载或复制。", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "有效期至:" + "message": "有效期至:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "访问令牌未存储,无法获取" + "message": "访问令牌未存储,无法获取", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "复制令牌" + "message": "复制令牌", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "访问令牌" + "message": "访问令牌", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "到期日期是必需的。" + "message": "到期日期是必需的。", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "访问令牌已创建且已复制到剪贴板" + "message": "访问令牌已创建且已复制到剪贴板", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Beta 版中的权限管理不可用。" + "message": "Beta 版中的权限管理不可用。", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "撤销访问令牌" + "message": "撤销访问令牌", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6389,10 +6467,10 @@ "message": "此用户可以访问 Secrets Manager 测试版" }, "important": { - "message": "Important:" + "message": "重要事项:" }, "viewAll": { - "message": "View all" + "message": "查看全部" }, "showingPortionOfTotal": { "message": "Showing $PORTION$ of $TOTAL$", @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "访问了密钥 $SECRET_ID$。", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "关闭" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 232da65f3ff..48d86a10414 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -2061,9 +2061,6 @@ "updateLicense": { "message": "更新授權" }, - "updatedLicense": { - "message": "已更新授權" - }, "manageSubscription": { "message": "管理訂閱" }, @@ -5707,28 +5704,36 @@ "message": "隱藏" }, "projects": { - "message": "項目" + "message": "項目", + "description": "Description for the Projects field." }, "lastEdited": { - "message": "最後編輯紀錄" + "message": "最後編輯紀錄", + "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "編輯機密" + "message": "編輯機密", + "description": "Action to modify an existing secret." }, "addSecret": { - "message": "加入機密" + "message": "加入機密", + "description": "Action to create a new secret." }, "copySecretName": { - "message": "複製機密名稱" + "message": "複製機密名稱", + "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "複製機密值" + "message": "複製機密值", + "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "刪除機密" + "message": "刪除機密", + "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "刪除機密" + "message": "刪除機密", + "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { "message": "Permanently delete secret" @@ -5737,106 +5742,143 @@ "message": "Permanently delete secrets" }, "secretProjectAssociationDescription": { - "message": "選擇與機密相關聯的項目。僅有權存取該項目的組織使用者能檢視該機密。" + "message": "選擇與機密相關聯的項目。僅有權存取該項目的組織使用者能檢視該機密。", + "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects" + "message": "Select projects", + "description": "A label for a type-to-filter input field to choose projects." + }, + "searchProjects": { + "message": "搜尋項目", + "description": "Label for the search bar used to search projects." }, "project": { - "message": "項目" + "message": "項目", + "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "編輯項目" + "message": "編輯項目", + "description": "The action to modify an existing project." }, "viewProject": { - "message": "檢視項目" + "message": "檢視項目", + "description": "The action to view details of a project." }, "deleteProject": { - "message": "刪除項目" + "message": "刪除項目", + "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "刪除項目" + "message": "刪除項目", + "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "機密" + "message": "機密", + "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "服務帳號" + "message": "服務帳號", + "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "服務帳號" + "message": "服務帳號", + "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "機密" + "message": "機密", + "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "名稱/值對" + "message": "名稱/值對", + "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "機密已編輯" + "message": "機密已編輯", + "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "機密已建立" + "message": "機密已建立", + "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "新增機密" + "message": "新增機密", + "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "新增服務帳號" + "message": "新增服務帳號", + "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "沒有可顯示的機密" + "message": "沒有可顯示的機密", + "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "要開始,請加入一個新的機密或匯入機密。" + "message": "要開始,請加入一個新的機密或匯入機密。", + "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { "message": "There are no secrets in the trash." }, - "serviceAccountsNoItemsTitle": { - "message": "還沒有要顯示的內容" - }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access." + "message": "Create a new service account to get started automating secret access.", + "description": "Message to encourage the user to start creating service accounts." + }, + "serviceAccountsNoItemsTitle": { + "message": "還沒有要顯示的內容", + "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "搜尋機密" + "message": "搜尋機密", + "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "刪除服務帳號" + "message": "刪除服務帳號", + "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "刪除服務帳號" + "message": "刪除服務帳號", + "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "檢視服務帳號" + "message": "檢視服務帳號", + "description": "Action to view the details of a service account." }, "searchServiceAccounts": { - "message": "搜尋服務帳號" + "message": "搜尋服務帳號", + "description": "Placeholder text for searching service accounts." }, "addProject": { - "message": "加入項目" + "message": "加入項目", + "description": "Title for creating a new project." }, "projectEdited": { - "message": "項目已編輯" + "message": "項目已編輯", + "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "項目已儲存" + "message": "項目已儲存", + "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "項目已建立" + "message": "項目已建立", + "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "項目名稱" + "message": "項目名稱", + "description": "Label for entering the name of a project." }, "newProject": { - "message": "新增項目" + "message": "新增項目", + "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "刪除機密可能會影響現有的整合。" + "message": "刪除機密可能會影響現有的整合。", + "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "機密已移至垃圾桶" + "message": "機密已移至垃圾桶", + "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { "message": "Are you sure you want to permanently delete this secret?" @@ -5847,32 +5889,41 @@ "hardDeletesSuccessToast": { "message": "Secrets permanently deleted" }, - "serviceAccountCreated": { - "message": "服務帳號已建立" - }, "smAccess": { - "message": "存取" + "message": "存取", + "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "項目,機密" + "message": "項目,機密", + "description": "" }, "serviceAccountName": { - "message": "服務帳號名稱" + "message": "服務帳號名稱", + "description": "Label for the name of a service account" + }, + "serviceAccountCreated": { + "message": "服務帳號已建立", + "description": "Notifies that a new service account has been created" }, "newSaSelectAccess": { - "message": "輸入或選擇項目或機密" + "message": "輸入或選擇項目或機密", + "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "輸入以進行篩選" + "message": "輸入以進行篩選", + "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "項目已刪除" + "message": "項目已刪除", + "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "項目和所有相關的機密已被刪除" + "message": "項目和所有相關的機密已被刪除", + "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { "message": "刪除項目 $PROJECT$ 為永久性動作,並且無法恢復。", + "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { "content": "$1", @@ -5882,6 +5933,7 @@ }, "deleteProjectInputLabel": { "message": "輸入「$CONFIRM$」以繼續", + "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { "content": "$1", @@ -5891,6 +5943,7 @@ }, "deleteProjectConfirmMessage": { "message": "刪除 $PROJECT$", + "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { "content": "$1", @@ -5900,6 +5953,7 @@ }, "deleteProjectsConfirmMessage": { "message": "刪除 $COUNT$ 個項目", + "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { "content": "$1", @@ -5908,73 +5962,91 @@ } }, "deleteProjectsDialogMessage": { - "message": "刪除項目為永久性動作,並且無法恢復。" + "message": "刪除項目為永久性動作,並且無法恢復。", + "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "沒有可顯示的項目" + "message": "沒有可顯示的項目", + "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets." + "message": "Add a new project to get started organizing secrets.", + "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "需要確認" + "message": "需要確認", + "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "以下項目無法刪除:" + "message": "以下項目無法刪除:", + "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "機密已移至垃圾桶" + "message": "機密已移至垃圾桶", + "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { "message": "Secret permanently deleted" }, - "searchProjects": { - "message": "搜尋項目" - }, "accessTokens": { - "message": "存取權杖" + "message": "存取權杖", + "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "建立存取權杖" + "message": "建立存取權杖", + "description": "Button label for creating a new access token." }, "expires": { - "message": "逾期" + "message": "逾期", + "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "可以讀取" + "message": "可以讀取", + "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "沒有可顯示的存取權杖" + "message": "沒有可顯示的存取權杖", + "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "要開始,請建立一個存取權杖" + "message": "要開始,請建立一個存取權杖", + "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "關閉前下載或複製。" + "message": "關閉前下載或複製。", + "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "到期日:" + "message": "到期日:", + "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "存取權杖未儲存,無法取得" + "message": "存取權杖未儲存,無法取得", + "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "複製權杖" + "message": "複製權杖", + "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "存取權杖" + "message": "存取權杖", + "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "到期日期是必需的。" + "message": "到期日期是必需的。", + "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "存取權杖已建立且已複製到剪貼簿" + "message": "存取權杖已建立且已複製到剪貼簿", + "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Beta 版中的權限管理不可用。" + "message": "Beta 版中的權限管理不可用。", + "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "撤銷存取權杖" + "message": "撤銷存取權杖", + "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { "message": "Revoke access tokens" @@ -6358,8 +6430,14 @@ "projectEmptyServiceAccountAccessPolicies": { "message": "Add service accounts to grant access" }, - "canWrite": { - "message": "Can write" + "serviceAccountPeopleDescription": { + "message": "Grant groups or people access to this service account." + }, + "serviceAccountProjectsDescription": { + "message": "Assign projects to this service account. " + }, + "serviceAccountEmptyProjectAccesspolicies": { + "message": "Add projects to grant access" }, "canReadWrite": { "message": "Can read, write" @@ -6416,6 +6494,19 @@ "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" }, + "accessedSecret": { + "message": "Accessed secret $SECRET_ID$.", + "placeholders": { + "secret_id": { + "content": "$1", + "example": "4d34e8a8" + } + } + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, "createSecret": { "message": "Create a secret" }, @@ -6510,5 +6601,8 @@ "example": "14" } } + }, + "dismiss": { + "message": "Dismiss" } } From c711312fee3cf36408138fafa87d9c29f51232d9 Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:32:02 -0600 Subject: [PATCH 113/232] [SM-581] User access removal warnings (#4904) * init refactor * Fix current user access checks * Add in warning dialogs that are aware of other APs * cleanup handlers; refresh sa list on removal * Code review updates * [SM-580] Add warning dialog for Service account People tab (#4893) * Add warning dialog from figma * move dialog out of access selector component; add after delete event; remove people-sa logic * remove commented code and unused service * Updates to work with SM-581 --------- Co-authored-by: William Martin --------- Co-authored-by: William Martin --- apps/web/src/locales/en/messages.json | 21 +++++ .../models/view/access-policy.view.ts | 4 + .../project/project-people.component.html | 2 + .../project/project-people.component.ts | 94 ++++++++++++++++++- .../project-service-accounts.component.html | 1 + .../project-service-accounts.component.ts | 15 ++- .../projects/projects/projects.component.ts | 14 ++- .../service-account-people.component.html | 1 + .../service-account-people.component.ts | 78 ++++++++++++++- .../service-account-projects.component.html | 1 + .../service-account-projects.component.ts | 15 ++- .../service-accounts.component.ts | 14 ++- .../access-policies/access-policy.service.ts | 65 +++++++++++-- .../access-selector.component.html | 8 +- .../access-selector.component.ts | 49 +++++----- .../access-removal-dialog.component.html | 14 +++ .../access-removal-dialog.component.ts | 65 +++++++++++++ .../responses/access-policy.response.ts | 8 ++ .../shared/sm-shared.module.ts | 3 + 19 files changed, 416 insertions(+), 56 deletions(-) create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 2773efc17f7..786ebea9f4e 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -6570,6 +6570,27 @@ "secretsManagerEnable": { "message": "Enable Secrets Manager Beta" }, + "saPeopleWarningTitle": { + "message": "Access tokens still available" + }, + "saPeopleWarningMessage": { + "message": "Removing people from a service account does not remove the access tokens they created. For security best practice, it is recommended to revoke access tokens created by people removed from a service account." + }, + "smAccessRemovalWarningProjectTitle": { + "message": "Remove access to this project" + }, + "smAccessRemovalWarningProjectMessage": { + "message": "This action will remove your access to the project." + }, + "smAccessRemovalWarningSaTitle": { + "message": "Remove access to this service account" + }, + "smAccessRemovalWarningSaMessage": { + "message": "This action will remove your access to the service account." + }, + "removeAccess": { + "message": "Remove access" + }, "checkForBreaches": { "message": "Check known data breaches for this password" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts index 0f93b549f3a..ac6edfe39e1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policy.view.ts @@ -10,24 +10,28 @@ export class UserProjectAccessPolicyView extends BaseAccessPolicyView { organizationUserId: string; organizationUserName: string; grantedProjectId: string; + userId: string; } export class UserServiceAccountAccessPolicyView extends BaseAccessPolicyView { organizationUserId: string; organizationUserName: string; grantedServiceAccountId: string; + userId: string; } export class GroupProjectAccessPolicyView extends BaseAccessPolicyView { groupId: string; groupName: string; grantedProjectId: string; + currentUserInGroup: boolean; } export class GroupServiceAccountAccessPolicyView extends BaseAccessPolicyView { groupId: string; groupName: string; grantedServiceAccountId: string; + currentUserInGroup: boolean; } export class ServiceAccountProjectAccessPolicyView extends BaseAccessPolicyView { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html index 124eafb8de0..b461c10a3b1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.html @@ -10,6 +10,8 @@ [columnTitle]="'groupSlashUser' | i18n" [emptyMessage]="'projectEmptyPeopleAccessPolicies' | i18n" (onCreateAccessPolicies)="handleCreateAccessPolicies($event)" + (onDeleteAccessPolicy)="handleDeleteAccessPolicy($event)" + (onUpdateAccessPolicy)="handleUpdateAccessPolicy($event)" >
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts index 4a1ea9c7fdb..5dda1a5a54c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts @@ -1,8 +1,9 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; +import { map, Observable, share, startWith, Subject, switchMap, takeUntil } from "rxjs"; -import { SelectItemView } from "@bitwarden/components"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; +import { DialogService, SelectItemView } from "@bitwarden/components"; import { GroupProjectAccessPolicyView, @@ -14,6 +15,10 @@ import { AccessSelectorComponent, AccessSelectorRowView, } from "../../shared/access-policies/access-selector.component"; +import { + AccessRemovalDetails, + AccessRemovalDialogComponent, +} from "../../shared/access-policies/dialogs/access-removal-dialog.component"; @Component({ selector: "sm-project-people", @@ -23,6 +28,7 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); private organizationId: string; private projectId: string; + private rows: AccessSelectorRowView[]; protected rows$: Observable = this.accessPolicyService.projectAccessPolicyChanges$.pipe( @@ -40,6 +46,7 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { accessPolicyId: policy.id, read: policy.read, write: policy.write, + userId: policy.userId, icon: AccessSelectorComponent.userIcon, }); }); @@ -52,11 +59,13 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { accessPolicyId: policy.id, read: policy.read, write: policy.write, + currentUserInGroup: policy.currentUserInGroup, icon: AccessSelectorComponent.groupIcon, }); }); return rows; - }) + }), + share() ); protected handleCreateAccessPolicies(selected: SelectItemView[]) { @@ -90,17 +99,94 @@ export class ProjectPeopleComponent implements OnInit, OnDestroy { ); } - constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + protected async handleDeleteAccessPolicy(policy: AccessSelectorRowView) { + if ( + await this.accessPolicyService.needToShowAccessRemovalWarning( + this.organizationId, + policy, + this.rows + ) + ) { + this.launchDeleteWarningDialog(policy); + return; + } + + try { + await this.accessPolicyService.deleteAccessPolicy(policy.accessPolicyId); + } catch (e) { + this.validationService.showError(e); + } + } + + protected async handleUpdateAccessPolicy(policy: AccessSelectorRowView) { + if ( + policy.read === true && + policy.write === false && + (await this.accessPolicyService.needToShowAccessRemovalWarning( + this.organizationId, + policy, + this.rows + )) + ) { + this.launchUpdateWarningDialog(policy); + return; + } + + try { + return await this.accessPolicyService.updateAccessPolicy( + AccessSelectorComponent.getBaseAccessPolicyView(policy) + ); + } catch (e) { + this.validationService.showError(e); + } + } + + constructor( + private route: ActivatedRoute, + private dialogService: DialogService, + private validationService: ValidationService, + private accessPolicyService: AccessPolicyService + ) {} ngOnInit(): void { this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { this.organizationId = params.organizationId; this.projectId = params.projectId; }); + + this.rows$.pipe(takeUntil(this.destroy$)).subscribe((rows) => { + this.rows = rows; + }); } ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } + + private async launchDeleteWarningDialog(policy: AccessSelectorRowView) { + this.dialogService.open(AccessRemovalDialogComponent, { + data: { + title: "smAccessRemovalWarningProjectTitle", + message: "smAccessRemovalWarningProjectMessage", + operation: "delete", + type: "project", + returnRoute: ["sm", this.organizationId, "projects"], + policy, + }, + }); + } + + private launchUpdateWarningDialog(policy: AccessSelectorRowView) { + this.dialogService.open(AccessRemovalDialogComponent, { + data: { + title: "smAccessRemovalWarningProjectTitle", + message: "smAccessRemovalWarningProjectMessage", + operation: "update", + type: "project", + returnRoute: ["sm", this.organizationId, "projects"], + policy, + }, + }); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html index 12bdd05316a..fb6eab471bb 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.html @@ -10,6 +10,7 @@ [columnTitle]="'serviceAccounts' | i18n" [emptyMessage]="'projectEmptyServiceAccountAccessPolicies' | i18n" (onCreateAccessPolicies)="handleCreateAccessPolicies($event)" + (onDeleteAccessPolicy)="handleDeleteAccessPolicy($event)" >
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts index e46c3038b9d..19105c6cf88 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts @@ -2,6 +2,7 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { SelectItemView } from "@bitwarden/components"; import { @@ -65,7 +66,19 @@ export class ProjectServiceAccountsComponent implements OnInit, OnDestroy { ); } - constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + protected async handleDeleteAccessPolicy(policy: AccessSelectorRowView) { + try { + await this.accessPolicyService.deleteAccessPolicy(policy.accessPolicyId); + } catch (e) { + this.validationService.showError(e); + } + } + + constructor( + private route: ActivatedRoute, + private validationService: ValidationService, + private accessPolicyService: AccessPolicyService + ) {} ngOnInit(): void { this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts index 440e88864be..35a5dc87734 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts @@ -1,10 +1,11 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { combineLatestWith, Observable, startWith, switchMap } from "rxjs"; +import { combineLatest, Observable, startWith, switchMap } from "rxjs"; import { DialogService } from "@bitwarden/components"; import { ProjectListView } from "../../models/view/project-list.view"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; import { ProjectDeleteDialogComponent, ProjectDeleteOperation, @@ -29,14 +30,17 @@ export class ProjectsComponent implements OnInit { constructor( private route: ActivatedRoute, private projectService: ProjectService, + private accessPolicyService: AccessPolicyService, private dialogService: DialogService ) {} ngOnInit() { - this.projects$ = this.projectService.project$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(async ([_, params]) => { + this.projects$ = combineLatest([ + this.route.params, + this.projectService.project$.pipe(startWith(null)), + this.accessPolicyService.projectAccessPolicyChanges$.pipe(startWith(null)), + ]).pipe( + switchMap(async ([params]) => { this.organizationId = params.organizationId; return await this.getProjects(); }) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html index 2eb41bce214..3d896e62253 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.html @@ -10,6 +10,7 @@ [columnTitle]="'groupSlashUser' | i18n" [emptyMessage]="'projectEmptyPeopleAccessPolicies' | i18n" (onCreateAccessPolicies)="handleCreateAccessPolicies($event)" + (onDeleteAccessPolicy)="handleDeleteAccessPolicy($event)" >
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts index 302bbd1f359..e539e0bf083 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts @@ -1,7 +1,19 @@ import { Component } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { combineLatestWith, map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; +import { + combineLatestWith, + map, + Observable, + share, + startWith, + Subject, + switchMap, + takeUntil, +} from "rxjs"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; +import { DialogService, SimpleDialogOptions, SimpleDialogType } from "@bitwarden/components"; import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; import { @@ -14,6 +26,10 @@ import { AccessSelectorComponent, AccessSelectorRowView, } from "../../shared/access-policies/access-selector.component"; +import { + AccessRemovalDetails, + AccessRemovalDialogComponent, +} from "../../shared/access-policies/dialogs/access-removal-dialog.component"; @Component({ selector: "sm-service-account-people", @@ -22,6 +38,8 @@ import { export class ServiceAccountPeopleComponent { private destroy$ = new Subject(); private serviceAccountId: string; + private organizationId: string; + private rows: AccessSelectorRowView[]; protected rows$: Observable = this.accessPolicyService.serviceAccountAccessPolicyChanges$.pipe( @@ -40,6 +58,7 @@ export class ServiceAccountPeopleComponent { accessPolicyId: policy.id, read: policy.read, write: policy.write, + userId: policy.userId, icon: AccessSelectorComponent.userIcon, static: true, }); @@ -53,13 +72,15 @@ export class ServiceAccountPeopleComponent { accessPolicyId: policy.id, read: policy.read, write: policy.write, + currentUserInGroup: policy.currentUserInGroup, icon: AccessSelectorComponent.groupIcon, static: true, }); }); return rows; - }) + }), + share() ); protected handleCreateAccessPolicies(selected: SelectItemView[]) { @@ -92,11 +113,49 @@ export class ServiceAccountPeopleComponent { ); } - constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + protected async handleDeleteAccessPolicy(policy: AccessSelectorRowView) { + if ( + await this.accessPolicyService.needToShowAccessRemovalWarning( + this.organizationId, + policy, + this.rows + ) + ) { + this.launchDeleteWarningDialog(policy); + return; + } + + try { + await this.accessPolicyService.deleteAccessPolicy(policy.accessPolicyId); + const simpleDialogOpts: SimpleDialogOptions = { + title: this.i18nService.t("saPeopleWarningTitle"), + content: this.i18nService.t("saPeopleWarningMessage"), + type: SimpleDialogType.WARNING, + acceptButtonText: this.i18nService.t("close"), + cancelButtonText: null, + }; + this.dialogService.openSimpleDialog(simpleDialogOpts); + } catch (e) { + this.validationService.showError(e); + } + } + + constructor( + private route: ActivatedRoute, + private dialogService: DialogService, + private i18nService: I18nService, + private validationService: ValidationService, + private accessPolicyService: AccessPolicyService + ) {} ngOnInit(): void { this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { this.serviceAccountId = params.serviceAccountId; + this.organizationId = params.organizationId; + }); + + this.rows$.pipe(takeUntil(this.destroy$)).subscribe((rows) => { + this.rows = rows; }); } @@ -104,4 +163,17 @@ export class ServiceAccountPeopleComponent { this.destroy$.next(); this.destroy$.complete(); } + + private launchDeleteWarningDialog(policy: AccessSelectorRowView) { + this.dialogService.open(AccessRemovalDialogComponent, { + data: { + title: "smAccessRemovalWarningSaTitle", + message: "smAccessRemovalWarningSaMessage", + operation: "delete", + type: "service-account", + returnRoute: ["sm", this.organizationId, "service-accounts"], + policy, + }, + }); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html index 6ceb2dc5f87..8ffc465e1bc 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.html @@ -10,6 +10,7 @@ [columnTitle]="'projects' | i18n" [emptyMessage]="'serviceAccountEmptyProjectAccesspolicies' | i18n" (onCreateAccessPolicies)="handleCreateAccessPolicies($event)" + (onDeleteAccessPolicy)="handleDeleteAccessPolicy($event)" >
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts index c886523834a..87e88082799 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts @@ -2,6 +2,7 @@ import { Component } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { combineLatestWith, map, Observable, startWith, Subject, switchMap, takeUntil } from "rxjs"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; import { ServiceAccountProjectAccessPolicyView } from "../../models/view/access-policy.view"; @@ -62,7 +63,19 @@ export class ServiceAccountProjectsComponent { ); } - constructor(private route: ActivatedRoute, private accessPolicyService: AccessPolicyService) {} + protected async handleDeleteAccessPolicy(policy: AccessSelectorRowView) { + try { + await this.accessPolicyService.deleteAccessPolicy(policy.accessPolicyId); + } catch (e) { + this.validationService.showError(e); + } + } + + constructor( + private route: ActivatedRoute, + private validationService: ValidationService, + private accessPolicyService: AccessPolicyService + ) {} ngOnInit(): void { this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts index 5c24559c10c..8d82ab111b1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts @@ -1,10 +1,11 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { combineLatestWith, Observable, startWith, switchMap } from "rxjs"; +import { combineLatest, Observable, startWith, switchMap } from "rxjs"; import { DialogService } from "@bitwarden/components"; import { ServiceAccountView } from "../models/view/service-account.view"; +import { AccessPolicyService } from "../shared/access-policies/access-policy.service"; import { ServiceAccountDialogComponent, @@ -24,14 +25,17 @@ export class ServiceAccountsComponent implements OnInit { constructor( private route: ActivatedRoute, private dialogService: DialogService, + private accessPolicyService: AccessPolicyService, private serviceAccountService: ServiceAccountService ) {} ngOnInit() { - this.serviceAccounts$ = this.serviceAccountService.serviceAccount$.pipe( - startWith(null), - combineLatestWith(this.route.params), - switchMap(async ([_, params]) => { + this.serviceAccounts$ = combineLatest([ + this.route.params, + this.serviceAccountService.serviceAccount$.pipe(startWith(null)), + this.accessPolicyService.serviceAccountAccessPolicyChanges$.pipe(startWith(null)), + ]).pipe( + switchMap(async ([params]) => { this.organizationId = params.organizationId; return await this.getServiceAccounts(); }) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index c99161b8a1e..2adfc3b3b24 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -4,6 +4,7 @@ import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; @@ -23,6 +24,7 @@ import { AccessPoliciesCreateRequest } from "../../shared/access-policies/models import { ProjectAccessPoliciesResponse } from "../../shared/access-policies/models/responses/project-access-policies.response"; import { ServiceAccountAccessPoliciesResponse } from "../../shared/access-policies/models/responses/service-accounts-access-policies.response"; +import { AccessSelectorRowView } from "./access-selector.component"; import { AccessPolicyUpdateRequest } from "./models/requests/access-policy-update.request"; import { AccessPolicyRequest } from "./models/requests/access-policy.request"; import { GrantedPolicyRequest } from "./models/requests/granted-policy.request"; @@ -64,10 +66,19 @@ export class AccessPolicyService { constructor( private cryptoService: CryptoService, + private organizationService: OrganizationService, protected apiService: ApiService, protected encryptService: EncryptService ) {} + refreshProjectAccessPolicyChanges() { + this._projectAccessPolicyChanges$.next(null); + } + + refreshServiceAccountAccessPolicyChanges() { + this._serviceAccountAccessPolicyChanges$.next(null); + } + async getGrantedPolicies( serviceAccountId: string, organizationId: string @@ -196,6 +207,36 @@ export class AccessPolicyService { ); } + async needToShowAccessRemovalWarning( + organizationId: string, + policy: AccessSelectorRowView, + currentPolicies: AccessSelectorRowView[] + ): Promise { + const organization = this.organizationService.get(organizationId); + if (organization.isOwner || organization.isAdmin) { + return false; + } + const currentUserId = organization.userId; + const readWriteGroupPolicies = currentPolicies + .filter((x) => x.accessPolicyId != policy.accessPolicyId) + .filter((x) => x.currentUserInGroup && x.read && x.write).length; + const readWriteUserPolicies = currentPolicies + .filter((x) => x.accessPolicyId != policy.accessPolicyId) + .filter((x) => x.userId == currentUserId && x.read && x.write).length; + + if (policy.type === "user" && policy.userId == currentUserId && readWriteGroupPolicies == 0) { + return true; + } else if ( + policy.type === "group" && + policy.currentUserInGroup && + readWriteUserPolicies == 0 && + readWriteGroupPolicies == 0 + ) { + return true; + } + return false; + } + private async createProjectAccessPoliciesView( organizationId: string, projectAccessPoliciesResponse: ProjectAccessPoliciesResponse @@ -255,6 +296,7 @@ export class AccessPolicyService { grantedProjectId: response.grantedProjectId, organizationUserId: response.organizationUserId, organizationUserName: response.organizationUserName, + userId: response.userId, }; } @@ -266,6 +308,7 @@ export class AccessPolicyService { grantedProjectId: response.grantedProjectId, groupId: response.groupId, groupName: response.groupName, + currentUserInGroup: response.currentUserInGroup, }; } @@ -335,6 +378,7 @@ export class AccessPolicyService { grantedServiceAccountId: response.grantedServiceAccountId, organizationUserId: response.organizationUserId, organizationUserName: response.organizationUserName, + userId: response.userId, }; } @@ -346,6 +390,7 @@ export class AccessPolicyService { grantedServiceAccountId: response.grantedServiceAccountId, groupId: response.groupId, groupName: response.groupName, + currentUserInGroup: response.currentUserInGroup, }; } @@ -471,14 +516,18 @@ export class AccessPolicyService { view.revisionDate = response.revisionDate; view.serviceAccountId = response.serviceAccountId; view.grantedProjectId = response.grantedProjectId; - view.serviceAccountName = await this.encryptService.decryptToUtf8( - new EncString(response.serviceAccountName), - orgKey - ); - view.grantedProjectName = await this.encryptService.decryptToUtf8( - new EncString(response.grantedProjectName), - orgKey - ); + view.serviceAccountName = response.serviceAccountName + ? await this.encryptService.decryptToUtf8( + new EncString(response.serviceAccountName), + orgKey + ) + : null; + view.grantedProjectName = response.grantedProjectName + ? await this.encryptService.decryptToUtf8( + new EncString(response.grantedProjectName), + orgKey + ) + : null; return view; }) ); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html index cef0f582447..9da038a2d8a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.html @@ -35,11 +35,7 @@ *ngIf="!row.static; else staticPermissions" class="tw-mb-auto tw-inline-block tw-w-auto" > - @@ -62,7 +58,7 @@ size="default" [attr.title]="'remove' | i18n" [attr.aria-label]="'remove' | i18n" - [bitAction]="delete(row.accessPolicyId)" + [bitAction]="delete(row)" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts index 89784e81fc8..7776c35be57 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-selector.component.ts @@ -12,7 +12,6 @@ import { tap, } from "rxjs"; -import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; @@ -28,6 +27,8 @@ export type AccessSelectorRowView = { read: boolean; write: boolean; icon: string; + userId?: string; + currentUserInGroup?: boolean; static?: boolean; }; @@ -41,7 +42,12 @@ export class AccessSelectorComponent implements OnInit { static readonly serviceAccountIcon = "bwi-wrench"; static readonly projectIcon = "bwi-collection"; + /** + * Emits the selected itemss on submit. + */ @Output() onCreateAccessPolicies = new EventEmitter(); + @Output() onDeleteAccessPolicy = new EventEmitter(); + @Output() onUpdateAccessPolicy = new EventEmitter(); @Input() label: string; @Input() hint: string; @@ -105,11 +111,7 @@ export class AccessSelectorComponent implements OnInit { share() ); - constructor( - private accessPolicyService: AccessPolicyService, - private validationService: ValidationService, - private route: ActivatedRoute - ) {} + constructor(private accessPolicyService: AccessPolicyService, private route: ActivatedRoute) {} ngOnInit(): void { this.formGroup.disable(); @@ -128,28 +130,21 @@ export class AccessSelectorComponent implements OnInit { return firstValueFrom(this.selectItems$); }; - async update(target: any, accessPolicyId: string): Promise { - try { - const accessPolicyView = new BaseAccessPolicyView(); - accessPolicyView.id = accessPolicyId; - if (target.value === "canRead") { - accessPolicyView.read = true; - accessPolicyView.write = false; - } else if (target.value === "canReadWrite") { - accessPolicyView.read = true; - accessPolicyView.write = true; - } - - await this.accessPolicyService.updateAccessPolicy(accessPolicyView); - } catch (e) { - this.validationService.showError(e); + async update(target: any, row: AccessSelectorRowView): Promise { + if (target.value === "canRead") { + row.read = true; + row.write = false; + } else if (target.value === "canReadWrite") { + row.read = true; + row.write = true; } + this.onUpdateAccessPolicy.emit(row); } - delete = (accessPolicyId: string) => async () => { + delete = (row: AccessSelectorRowView) => async () => { this.loading = true; this.formGroup.disable(); - await this.accessPolicyService.deleteAccessPolicy(accessPolicyId); + this.onDeleteAccessPolicy.emit(row); return firstValueFrom(this.selectItems$); }; @@ -176,4 +171,12 @@ export class AccessSelectorComponent implements OnInit { return "project"; } } + + static getBaseAccessPolicyView(row: AccessSelectorRowView) { + const view = new BaseAccessPolicyView(); + view.id = row.accessPolicyId; + view.read = row.read; + view.write = row.write; + return view; + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.html new file mode 100644 index 00000000000..72f360523a0 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.html @@ -0,0 +1,14 @@ + + {{ data.title | i18n }} + + {{ data.message | i18n }} + +
    + + +
    +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.ts new file mode 100644 index 00000000000..ecf80041eec --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/dialogs/access-removal-dialog.component.ts @@ -0,0 +1,65 @@ +import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { Component, Inject, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; + +import { AccessPolicyService } from "../access-policy.service"; +import { AccessSelectorComponent, AccessSelectorRowView } from "../access-selector.component"; + +export interface AccessRemovalDetails { + title: string; + message: string; + operation: "update" | "delete"; + type: "project" | "service-account"; + returnRoute: string[]; + policy: AccessSelectorRowView; +} + +@Component({ + selector: "sm-access-removal-dialog", + templateUrl: "./access-removal-dialog.component.html", +}) +export class AccessRemovalDialogComponent implements OnInit { + constructor( + public dialogRef: DialogRef, + private router: Router, + private accessPolicyService: AccessPolicyService, + @Inject(DIALOG_DATA) public data: AccessRemovalDetails + ) {} + + ngOnInit(): void { + // TODO remove null checks once strictNullChecks in TypeScript is turned on. + if ( + !this.data.message || + !this.data.title || + !this.data.operation || + !this.data.returnRoute || + !this.data.policy + ) { + this.dialogRef.close(); + throw new Error( + "The access removal dialog was not called with the appropriate operation values." + ); + } + } + + removeAccess = async () => { + await this.router.navigate(this.data.returnRoute); + if (this.data.operation === "delete") { + await this.accessPolicyService.deleteAccessPolicy(this.data.policy.accessPolicyId); + } else if (this.data.operation == "update") { + await this.accessPolicyService.updateAccessPolicy( + AccessSelectorComponent.getBaseAccessPolicyView(this.data.policy) + ); + } + this.dialogRef.close(); + }; + + cancel = () => { + if (this.data.type == "project") { + this.accessPolicyService.refreshProjectAccessPolicyChanges(); + } else if (this.data.type == "service-account") { + this.accessPolicyService.refreshServiceAccountAccessPolicyChanges(); + } + this.dialogRef.close(); + }; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts index 58f574f4ad2..d17b22dc860 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/responses/access-policy.response.ts @@ -21,12 +21,14 @@ export class UserProjectAccessPolicyResponse extends BaseAccessPolicyResponse { organizationUserId: string; organizationUserName: string; grantedProjectId: string; + userId: string; constructor(response: any) { super(response); this.organizationUserId = this.getResponseProperty("OrganizationUserId"); this.organizationUserName = this.getResponseProperty("OrganizationUserName"); this.grantedProjectId = this.getResponseProperty("GrantedProjectId"); + this.userId = this.getResponseProperty("UserId"); } } @@ -34,12 +36,14 @@ export class UserServiceAccountAccessPolicyResponse extends BaseAccessPolicyResp organizationUserId: string; organizationUserName: string; grantedServiceAccountId: string; + userId: string; constructor(response: any) { super(response); this.organizationUserId = this.getResponseProperty("OrganizationUserId"); this.organizationUserName = this.getResponseProperty("OrganizationUserName"); this.grantedServiceAccountId = this.getResponseProperty("GrantedServiceAccountId"); + this.userId = this.getResponseProperty("UserId"); } } @@ -47,12 +51,14 @@ export class GroupProjectAccessPolicyResponse extends BaseAccessPolicyResponse { groupId: string; groupName: string; grantedProjectId: string; + currentUserInGroup: boolean; constructor(response: any) { super(response); this.groupId = this.getResponseProperty("GroupId"); this.groupName = this.getResponseProperty("GroupName"); this.grantedProjectId = this.getResponseProperty("GrantedProjectId"); + this.currentUserInGroup = this.getResponseProperty("CurrentUserInGroup"); } } @@ -60,12 +66,14 @@ export class GroupServiceAccountAccessPolicyResponse extends BaseAccessPolicyRes groupId: string; groupName: string; grantedServiceAccountId: string; + currentUserInGroup: boolean; constructor(response: any) { super(response); this.groupId = this.getResponseProperty("GroupId"); this.groupName = this.getResponseProperty("GroupName"); this.grantedServiceAccountId = this.getResponseProperty("GrantedServiceAccountId"); + this.currentUserInGroup = this.getResponseProperty("CurrentUserInGroup"); } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts index 129016c947d..9361c1ab037 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts @@ -6,6 +6,7 @@ import { CoreOrganizationModule } from "@bitwarden/web-vault/app/organizations/c import { SharedModule } from "@bitwarden/web-vault/app/shared"; import { AccessSelectorComponent } from "./access-policies/access-selector.component"; +import { AccessRemovalDialogComponent } from "./access-policies/dialogs/access-removal-dialog.component"; import { BulkStatusDialogComponent } from "./dialogs/bulk-status-dialog.component"; import { HeaderComponent } from "./header.component"; import { NewMenuComponent } from "./new-menu.component"; @@ -17,6 +18,7 @@ import { SecretsListComponent } from "./secrets-list.component"; imports: [SharedModule, ProductSwitcherModule, MultiSelectModule, CoreOrganizationModule], exports: [ SharedModule, + AccessRemovalDialogComponent, BulkStatusDialogComponent, HeaderComponent, NewMenuComponent, @@ -26,6 +28,7 @@ import { SecretsListComponent } from "./secrets-list.component"; AccessSelectorComponent, ], declarations: [ + AccessRemovalDialogComponent, BulkStatusDialogComponent, HeaderComponent, NewMenuComponent, From fbd0d41b518445502b7d09d15ad27c9daa44acee Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Mon, 6 Mar 2023 20:25:06 +0100 Subject: [PATCH 114/232] [SM-568] Delete service accounts (#4881) --- apps/web/src/locales/en/messages.json | 27 ++++ ...rvice-account-delete-dialog.component.html | 35 +++++ ...service-account-delete-dialog.component.ts | 122 ++++++++++++++++++ .../service-account.service.ts | 16 +++ .../service-accounts-list.component.html | 2 +- .../service-accounts-list.component.ts | 10 +- .../service-accounts.component.html | 1 + .../service-accounts.component.ts | 15 +++ .../service-accounts.module.ts | 2 + 9 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 786ebea9f4e..14077394f6b 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5845,6 +5845,33 @@ "message": "View service account", "description": "Action to view the details of a service account." }, + "deleteServiceAccountDialogMessage": { + "message": "Deleting service account $SERVICE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "service_account": { + "content": "$1", + "example": "Service account name" + } + } + }, + "deleteServiceAccountsDialogMessage":{ + "message": "Deleting service accounts is permanent and irreversible." + }, + "deleteServiceAccountsConfirmMessage":{ + "message": "Delete $COUNT$ service accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteServiceAccountToast":{ + "message": "The service account have been deleted" + }, + "deleteServiceAccountsToast":{ + "message": "Service accounts deleted" + }, "searchServiceAccounts": { "message": "Search service accounts", "description": "Placeholder text for searching service accounts." diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.html new file mode 100644 index 00000000000..6be10fd5b8d --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.html @@ -0,0 +1,35 @@ +
    + + + {{ title }} + + + {{ data.serviceAccounts[0].name }} + + + {{ data.serviceAccounts.length }} + {{ "serviceAccounts" | i18n }} + + + + +
    + + {{ dialogContent }} + + + {{ dialogConfirmationLabel }} + + +
    + +
    + + +
    +
    +
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts new file mode 100644 index 00000000000..3c1696d918e --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts @@ -0,0 +1,122 @@ +import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { Component, Inject } from "@angular/core"; +import { + FormControl, + FormGroup, + ValidationErrors, + ValidatorFn, + AbstractControl, +} from "@angular/forms"; + +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { DialogService } from "@bitwarden/components"; + +import { ServiceAccountView } from "../../models/view/service-account.view"; +import { + BulkOperationStatus, + BulkStatusDetails, + BulkStatusDialogComponent, +} from "../../shared/dialogs/bulk-status-dialog.component"; +import { ServiceAccountService } from "../service-account.service"; + +export interface ServiceAccountDeleteOperation { + serviceAccounts: ServiceAccountView[]; +} + +@Component({ + selector: "sm-service-account-delete-dialog", + templateUrl: "./service-account-delete-dialog.component.html", +}) +export class ServiceAccountDeleteDialogComponent { + formGroup = new FormGroup({ + confirmDelete: new FormControl("", [this.matchConfirmationMessageValidator()]), + }); + + constructor( + public dialogRef: DialogRef, + @Inject(DIALOG_DATA) public data: ServiceAccountDeleteOperation, + private serviceAccountService: ServiceAccountService, + private i18nService: I18nService, + private platformUtilsService: PlatformUtilsService, + private dialogService: DialogService + ) {} + + get title() { + return this.data.serviceAccounts.length === 1 + ? this.i18nService.t("deleteServiceAccount") + : this.i18nService.t("deleteServiceAccounts"); + } + + get dialogContent() { + return this.data.serviceAccounts.length === 1 + ? this.i18nService.t("deleteServiceAccountDialogMessage", this.data.serviceAccounts[0].name) + : this.i18nService.t("deleteServiceAccountsDialogMessage"); + } + + get dialogConfirmationLabel() { + return this.i18nService.t("deleteProjectInputLabel", this.dialogConfirmationMessage); + } + + submit = async () => { + this.formGroup.markAllAsTouched(); + + if (this.formGroup.invalid) { + return; + } + + await this.delete(); + this.dialogRef.close(); + }; + + async delete() { + const bulkResponses = await this.serviceAccountService.delete(this.data.serviceAccounts); + + const errors = bulkResponses.filter((response) => response.errorMessage); + if (errors.length > 0) { + this.openBulkStatusDialog(errors); + return; + } + + const message = + this.data.serviceAccounts.length === 1 + ? "deleteServiceAccountToast" + : "deleteServiceAccountsToast"; + this.platformUtilsService.showToast("success", null, this.i18nService.t(message)); + } + + openBulkStatusDialog(bulkStatusResults: BulkOperationStatus[]) { + this.dialogService.open(BulkStatusDialogComponent, { + data: { + title: "deleteServiceAccounts", + subTitle: "serviceAccounts", + columnTitle: "serviceAccountName", + message: "bulkDeleteProjectsErrorMessage", + details: bulkStatusResults, + }, + }); + } + + private get dialogConfirmationMessage() { + return this.data.serviceAccounts?.length === 1 + ? this.i18nService.t("deleteProjectConfirmMessage", this.data.serviceAccounts[0].name) + : this.i18nService.t( + "deleteServiceAccountsConfirmMessage", + this.data.serviceAccounts?.length.toString() + ); + } + + private matchConfirmationMessageValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + if (this.dialogConfirmationMessage.toLowerCase() == control.value.toLowerCase()) { + return null; + } else { + return { + confirmationDoesntMatchError: { + message: this.i18nService.t("smConfirmationRequired"), + }, + }; + } + }; + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts index 4870ac12f29..d9abfbf6d26 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts @@ -9,6 +9,7 @@ import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-cr import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { ServiceAccountView } from "../models/view/service-account.view"; +import { BulkOperationStatus } from "../shared/dialogs/bulk-status-dialog.component"; import { ServiceAccountRequest } from "./models/requests/service-account.request"; import { ServiceAccountResponse } from "./models/responses/service-account.response"; @@ -54,6 +55,21 @@ export class ServiceAccountService { ); } + async delete(serviceAccounts: ServiceAccountView[]): Promise { + const ids = serviceAccounts.map((serviceAccount) => serviceAccount.id); + const r = await this.apiService.send("POST", "/service-accounts/delete", ids, true, true); + + this._serviceAccount.next(null); + + return r.data.map((element: { id: string; error: string }) => { + const bulkOperationStatus = new BulkOperationStatus(); + bulkOperationStatus.id = element.id; + bulkOperationStatus.name = serviceAccounts.find((sa) => sa.id == element.id).name; + bulkOperationStatus.errorMessage = element.error; + return bulkOperationStatus; + }); + } + private async getOrganizationKey(organizationId: string): Promise { return await this.cryptoService.getOrgKey(organizationId); } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html index e706a1f8bdc..0a8237e8dd2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.html @@ -83,7 +83,7 @@ {{ "viewServiceAccount" | i18n }} - - + @@ -31,9 +31,9 @@ {{ "all" | i18n }} - {{ "name" | i18n }} + {{ "name" | i18n }} {{ "secrets" | i18n }} - {{ "lastEdited" | i18n }} + {{ "lastEdited" | i18n }}
    From f2276227aa1fb201f641b16e3136e10e3b5355b7 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 7 Mar 2023 10:14:14 +0100 Subject: [PATCH 118/232] [SM-579] Prevent creating secret without project (#4892) * Change project select to simple dropdown * Handle null --- .../dialog/secret-dialog.component.html | 85 ++++++------------- .../secrets/dialog/secret-dialog.component.ts | 46 ++-------- 2 files changed, 31 insertions(+), 100 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html index 03ce1d866a0..19b1866fd4e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html @@ -1,71 +1,38 @@ - -
    - + {{ title | i18n }}
    - - -
    - - {{ "name" | i18n }} - - - - {{ "value" | i18n }} - - -
    - - {{ "notes" | i18n }} - + +
    + + {{ "name" | i18n }} + - - - {{ - "secretProjectAssociationDescription" | i18n - }} - - {{ "project" | i18n }} - + + {{ "value" | i18n }} + - {{ "selectProjects" | i18n }} +
    + + {{ "notes" | i18n }} + + - - - - {{ "project" | i18n }} - - - - - - - {{ e.name }} - - - - - - - -
    -
    +
    + + + {{ "project" | i18n }} + + +
    -
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts index 3fb4bcb32e5..9b664c718e6 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.component.ts @@ -23,10 +23,6 @@ export class OnboardingComponent { return this.tasks.length === 0 ? 0 : (this.amountCompleted / this.tasks.length) * 100; } - protected get isComplete(): boolean { - return this.tasks.length > 0 && this.tasks.length === this.amountCompleted; - } - protected toggle() { this.open = !this.open; } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts index f8d156c3cb7..73fc2738ec8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts @@ -54,6 +54,11 @@ const Template: Story = (args) => ({ {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} + ({ icon="bwi-key" [completed]="createSecret" > - `, }); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html index 60c8410f854..62b5bca2738 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html @@ -14,6 +14,13 @@ {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} + -
    diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts index 8df58782c92..73d73be053d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts @@ -91,6 +91,7 @@ export class OverviewComponent implements OnInit, OnDestroy { ) {} ngOnInit() { + this.stateService.setSMOnboardingTasks(null); const orgId$ = this.route.params.pipe( map((p) => p.organizationId), distinctUntilChanged() @@ -297,5 +298,11 @@ export class OverviewComponent implements OnInit, OnDestroy { protected hideOnboarding() { this.showOnboarding = false; + this.saveCompletedTasks(this.organizationId, { + importSecrets: true, + createSecret: true, + createProject: true, + createServiceAccount: true, + }); } } From cafd2d2561f86700a04b9c4141df773f6b1e9622 Mon Sep 17 00:00:00 2001 From: Will Martin Date: Wed, 8 Mar 2023 16:07:30 -0500 Subject: [PATCH 133/232] [SM-621] add unassigned secret badge (#4956) --- .../app/secrets-manager/shared/secrets-list.component.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html index 829e23e8126..3ffe59b3d5c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.html @@ -79,6 +79,10 @@ > {{ project.name | ellipsis: 32 }} + {{ "unassigned" | i18n }} {{ secret.revisionDate | date: "medium" }} From f592963191b71fa54c1d1bfaedbe5b1457c349a9 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Thu, 9 Mar 2023 08:12:43 +1000 Subject: [PATCH 134/232] [EC-475] Auto-save password prompt enhancements (#4808) * [EC-1062] Convert bar.js to TS and refactor (#4623) * [EC-476 / EC-478] Add notificationBar edit flow (#4626) * [EC-477] Enable auto-save for users without individual vault (#4760) * [EC-1057] Add data loss warning to notificationBar edit flow (#4761) * [AC-1173] Fix state bugs in auto-save edit flow (#4936) --------- Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> --- .../background/notification.background.ts | 131 +++++------ .../src/autofill/content/message_handler.ts | 1 + .../src/autofill/content/notification-bar.ts | 1 + .../src/autofill/notification/bar.html | 36 +-- apps/browser/src/autofill/notification/bar.js | 168 -------------- .../src/autofill/notification/bar.scss | 23 +- apps/browser/src/autofill/notification/bar.ts | 218 ++++++++++++++++++ .../src/autofill/notification/variables.scss | 6 + .../browser/src/background/main.background.ts | 5 +- .../models/addChangePasswordQueueMessage.ts | 2 + .../background/models/addLoginQueueMessage.ts | 26 +++ .../src/background/runtime.background.ts | 30 ++- apps/browser/src/browser/browserApi.ts | 58 +++-- .../popup/generator/generator.component.ts | 3 +- apps/browser/src/popup/scss/base.scss | 24 +- .../src/popup/services/popup-utils.service.ts | 35 +++ .../components/vault/add-edit.component.ts | 55 +++-- apps/browser/webpack.config.js | 2 +- .../vault/components/add-edit.component.ts | 34 ++- libs/common/src/abstractions/state.service.ts | 5 +- libs/common/src/services/state.service.ts | 5 +- .../src/vault/types/add-edit-cipher-info.ts | 12 + 22 files changed, 537 insertions(+), 343 deletions(-) delete mode 100644 apps/browser/src/autofill/notification/bar.js create mode 100644 apps/browser/src/autofill/notification/bar.ts create mode 100644 libs/common/src/vault/types/add-edit-cipher-info.ts diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index ca0149bd729..85e8633b2b9 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -10,8 +10,6 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; -import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import AddChangePasswordQueueMessage from "../../background/models/addChangePasswordQueueMessage"; import AddLoginQueueMessage from "../../background/models/addLoginQueueMessage"; @@ -95,7 +93,7 @@ export default class NotificationBackground { await BrowserApi.tabSendMessageData(sender.tab, "promptForLogin"); return; } - await this.saveOrUpdateCredentials(sender.tab, msg.folder); + await this.saveOrUpdateCredentials(sender.tab, msg.edit, msg.folder); break; case "bgNeverSave": await this.saveNever(sender.tab); @@ -168,6 +166,7 @@ export default class NotificationBackground { typeData: { isVaultLocked: this.notificationQueue[i].wasVaultLocked, theme: await this.getCurrentTheme(), + removeIndividualVault: await this.removeIndividualVault(), }, }); } else if (this.notificationQueue[i].type === NotificationQueueMessageType.ChangePassword) { @@ -225,10 +224,6 @@ export default class NotificationBackground { return; } - if (!(await this.allowPersonalOwnership())) { - return; - } - this.pushAddLoginToQueue(loginDomain, loginInfo, tab, true); return; } @@ -242,10 +237,6 @@ export default class NotificationBackground { return; } - if (!(await this.allowPersonalOwnership())) { - return; - } - this.pushAddLoginToQueue(loginDomain, loginInfo, tab); } else if ( usernameMatches.length === 1 && @@ -332,14 +323,10 @@ export default class NotificationBackground { await this.checkNotificationQueue(tab); } - private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, folderId?: string) { + private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, edit: boolean, folderId?: string) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; - if ( - queueMessage.tabId !== tab.id || - (queueMessage.type !== NotificationQueueMessageType.AddLogin && - queueMessage.type !== NotificationQueueMessageType.ChangePassword) - ) { + if (queueMessage.tabId !== tab.id || !(queueMessage.type in NotificationQueueMessageType)) { continue; } @@ -352,63 +339,79 @@ export default class NotificationBackground { BrowserApi.tabSendMessageData(tab, "closeNotificationBar"); if (queueMessage.type === NotificationQueueMessageType.ChangePassword) { - const changePasswordMessage = queueMessage as AddChangePasswordQueueMessage; - const cipher = await this.getDecryptedCipherById(changePasswordMessage.cipherId); - if (cipher == null) { - return; - } - await this.updateCipher(cipher, changePasswordMessage.newPassword); + const cipherView = await this.getDecryptedCipherById(queueMessage.cipherId); + await this.updatePassword(cipherView, queueMessage.newPassword, edit, tab); return; } if (queueMessage.type === NotificationQueueMessageType.AddLogin) { - if (!queueMessage.wasVaultLocked) { - await this.createNewCipher(queueMessage as AddLoginQueueMessage, folderId); - BrowserApi.tabSendMessageData(tab, "addedCipher"); - return; - } - // If the vault was locked, check if a cipher needs updating instead of creating a new one - const addLoginMessage = queueMessage as AddLoginQueueMessage; - const ciphers = await this.cipherService.getAllDecryptedForUrl(addLoginMessage.uri); - const usernameMatches = ciphers.filter( - (c) => - c.login.username != null && c.login.username.toLowerCase() === addLoginMessage.username - ); + if (queueMessage.wasVaultLocked) { + const allCiphers = await this.cipherService.getAllDecryptedForUrl(queueMessage.uri); + const existingCipher = allCiphers.find( + (c) => + c.login.username != null && c.login.username.toLowerCase() === queueMessage.username + ); - if (usernameMatches.length >= 1) { - await this.updateCipher(usernameMatches[0], addLoginMessage.password); + if (existingCipher != null) { + await this.updatePassword(existingCipher, queueMessage.password, edit, tab); + return; + } + } + + folderId = (await this.folderExists(folderId)) ? folderId : null; + const newCipher = AddLoginQueueMessage.toCipherView(queueMessage, folderId); + + if (edit) { + await this.editItem(newCipher, tab); return; } - await this.createNewCipher(addLoginMessage, folderId); + const cipher = await this.cipherService.encrypt(newCipher); + await this.cipherService.createWithServer(cipher); BrowserApi.tabSendMessageData(tab, "addedCipher"); } } } - private async createNewCipher(queueMessage: AddLoginQueueMessage, folderId: string) { - const loginModel = new LoginView(); - const loginUri = new LoginUriView(); - loginUri.uri = queueMessage.uri; - loginModel.uris = [loginUri]; - loginModel.username = queueMessage.username; - loginModel.password = queueMessage.password; - const model = new CipherView(); - model.name = Utils.getHostname(queueMessage.uri) || queueMessage.domain; - model.name = model.name.replace(/^www\./, ""); - model.type = CipherType.Login; - model.login = loginModel; + private async updatePassword( + cipherView: CipherView, + newPassword: string, + edit: boolean, + tab: chrome.tabs.Tab + ) { + cipherView.login.password = newPassword; - if (!Utils.isNullOrWhitespace(folderId)) { - const folders = await firstValueFrom(this.folderService.folderViews$); - if (folders.some((x) => x.id === folderId)) { - model.folderId = folderId; - } + if (edit) { + await this.editItem(cipherView, tab); + BrowserApi.tabSendMessage(tab, "editedCipher"); + return; } - const cipher = await this.cipherService.encrypt(model); - await this.cipherService.createWithServer(cipher); + const cipher = await this.cipherService.encrypt(cipherView); + await this.cipherService.updateWithServer(cipher); + // We've only updated the password, no need to broadcast editedCipher message + return; + } + + private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) { + await this.stateService.setAddEditCipherInfo({ + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }); + + await BrowserApi.tabSendMessageData(senderTab, "openAddEditCipher", { + cipherId: cipherView.id, + }); + } + + private async folderExists(folderId: string) { + if (Utils.isNullOrWhitespace(folderId) || folderId === "null") { + return false; + } + + const folders = await firstValueFrom(this.folderService.folderViews$); + return folders.some((x) => x.id === folderId); } private async getDecryptedCipherById(cipherId: string) { @@ -419,14 +422,6 @@ export default class NotificationBackground { return null; } - private async updateCipher(cipher: CipherView, newPassword: string) { - if (cipher != null && cipher.type === CipherType.Login) { - cipher.login.password = newPassword; - const newCipher = await this.cipherService.encrypt(cipher); - await this.cipherService.updateWithServer(newCipher); - } - } - private async saveNever(tab: chrome.tabs.Tab) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; @@ -459,9 +454,9 @@ export default class NotificationBackground { await BrowserApi.tabSendMessageData(tab, responseCommand, responseData); } - private async allowPersonalOwnership(): Promise { - return !(await firstValueFrom( + private async removeIndividualVault(): Promise { + return await firstValueFrom( this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership) - )); + ); } } diff --git a/apps/browser/src/autofill/content/message_handler.ts b/apps/browser/src/autofill/content/message_handler.ts index 0f690bd4f79..5302a5042be 100644 --- a/apps/browser/src/autofill/content/message_handler.ts +++ b/apps/browser/src/autofill/content/message_handler.ts @@ -31,6 +31,7 @@ const forwardCommands = [ "addToLockedVaultPendingNotifications", "unlockCompleted", "addedCipher", + "openAddEditCipher", ]; chrome.runtime.onMessage.addListener((event) => { diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 5a6d519b75e..c031929988d 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -502,6 +502,7 @@ document.addEventListener("DOMContentLoaded", (event) => { type, isVaultLocked: typeData.isVaultLocked, theme: typeData.theme, + removeIndividualVault: typeData.removeIndividualVault, }; const barQueryString = new URLSearchParams(barQueryParams).toString(); const barPage = "notification/bar.html?" + barQueryString; diff --git a/apps/browser/src/autofill/notification/bar.html b/apps/browser/src/autofill/notification/bar.html index 6f5b111f040..deec7fd512c 100644 --- a/apps/browser/src/autofill/notification/bar.html +++ b/apps/browser/src/autofill/notification/bar.html @@ -28,21 +28,27 @@
    -