From 08a022fa520241e3eff5c3cbfd71051b50765996 Mon Sep 17 00:00:00 2001 From: Bryan Cunningham Date: Wed, 1 Oct 2025 14:01:53 -0400 Subject: [PATCH 01/14] [CL-227] Tooltip component (#16442) * add tooltip component * fix typescript errors * fix more typescript errors * remove css comments * fix tooltip blocking mouse events * move default position logic to shared util * fix tooltip stories options * add tooltip spec * add offset arg to default positions * add shadow to tooltip * increase offset * adding max width * fix disabled button cursor * add stronger position type * fixing types * change get positions function to type return correctly * more fixing types * default options object * add mock to tooltip stories * add figma link to story * update positions file name. remove getter * remove standalone. add comment about component use * add jsdoc comment to directive inputs * fix typo * remove instances of setInput * fix storybook injection error * remove unneeded functions * remove unneeded variables * remove comment * move popover positions back with component * fix popover i18n mock * creat etooltip positions file * update test to account for change to setInput calls * remove panel class as it's not necessary * improve tooltip docs page * use classes for styling. Simpliy position changes * simplify tests. No longer need to track position changes * move comment to correct place * fix typos * remove unnecessary standalone declaration --- .../src/icon-button/icon-button.component.ts | 6 +- .../components/src/popover/popover.stories.ts | 1 + libs/components/src/tooltip/index.ts | 1 + .../src/tooltip/tooltip-positions.ts | 61 +++++++ .../src/tooltip/tooltip.component.css | 132 +++++++++++++++ .../src/tooltip/tooltip.component.html | 10 ++ .../src/tooltip/tooltip.component.ts | 36 +++++ .../src/tooltip/tooltip.directive.ts | 110 +++++++++++++ libs/components/src/tooltip/tooltip.mdx | 31 ++++ libs/components/src/tooltip/tooltip.spec.ts | 103 ++++++++++++ .../components/src/tooltip/tooltip.stories.ts | 153 ++++++++++++++++++ libs/components/src/tw-theme.css | 1 + 12 files changed, 644 insertions(+), 1 deletion(-) create mode 100644 libs/components/src/tooltip/index.ts create mode 100644 libs/components/src/tooltip/tooltip-positions.ts create mode 100644 libs/components/src/tooltip/tooltip.component.css create mode 100644 libs/components/src/tooltip/tooltip.component.html create mode 100644 libs/components/src/tooltip/tooltip.component.ts create mode 100644 libs/components/src/tooltip/tooltip.directive.ts create mode 100644 libs/components/src/tooltip/tooltip.mdx create mode 100644 libs/components/src/tooltip/tooltip.spec.ts create mode 100644 libs/components/src/tooltip/tooltip.stories.ts diff --git a/libs/components/src/icon-button/icon-button.component.ts b/libs/components/src/icon-button/icon-button.component.ts index 6bb6ccf10bd..d712d5cb2b8 100644 --- a/libs/components/src/icon-button/icon-button.component.ts +++ b/libs/components/src/icon-button/icon-button.component.ts @@ -130,7 +130,11 @@ export class BitIconButtonComponent implements ButtonLikeAbstraction, FocusableE .concat(sizes[this.size()]) .concat( this.showDisabledStyles() || this.disabled() - ? ["aria-disabled:tw-opacity-60", "aria-disabled:hover:!tw-bg-transparent"] + ? [ + "aria-disabled:tw-opacity-60", + "aria-disabled:hover:!tw-bg-transparent", + "tw-cursor-default", + ] : [], ); } diff --git a/libs/components/src/popover/popover.stories.ts b/libs/components/src/popover/popover.stories.ts index 6d2cf77e47d..596381d0777 100644 --- a/libs/components/src/popover/popover.stories.ts +++ b/libs/components/src/popover/popover.stories.ts @@ -23,6 +23,7 @@ export default { useFactory: () => { return new I18nMockService({ close: "Close", + loading: "Loading", }); }, }, diff --git a/libs/components/src/tooltip/index.ts b/libs/components/src/tooltip/index.ts new file mode 100644 index 00000000000..28c35fd6ee6 --- /dev/null +++ b/libs/components/src/tooltip/index.ts @@ -0,0 +1 @@ +export * from "./tooltip.directive"; diff --git a/libs/components/src/tooltip/tooltip-positions.ts b/libs/components/src/tooltip/tooltip-positions.ts new file mode 100644 index 00000000000..6396bb6632e --- /dev/null +++ b/libs/components/src/tooltip/tooltip-positions.ts @@ -0,0 +1,61 @@ +import { ConnectedPosition } from "@angular/cdk/overlay"; + +const ORIGIN_OFFSET_PX = 10; + +export type TooltipPositionIdentifier = + | "right-center" + | "left-center" + | "below-center" + | "above-center"; + +export interface TooltipPosition extends ConnectedPosition { + id: TooltipPositionIdentifier; +} + +export const tooltipPositions: TooltipPosition[] = [ + /** + * The order of these positions matters. The Tooltip component will use + * the first position that fits within the viewport. + */ + + // Tooltip opens to right of trigger + { + id: "right-center", + offsetX: ORIGIN_OFFSET_PX, + originX: "end", + originY: "center", + overlayX: "start", + overlayY: "center", + panelClass: ["bit-tooltip-right-center"], + }, + // ... to left of trigger + { + id: "left-center", + offsetX: -ORIGIN_OFFSET_PX, + originX: "start", + originY: "center", + overlayX: "end", + overlayY: "center", + panelClass: ["bit-tooltip-left-center"], + }, + // ... below trigger + { + id: "below-center", + offsetY: ORIGIN_OFFSET_PX, + originX: "center", + originY: "bottom", + overlayX: "center", + overlayY: "top", + panelClass: ["bit-tooltip-below-center"], + }, + // ... above trigger + { + id: "above-center", + offsetY: -ORIGIN_OFFSET_PX, + originX: "center", + originY: "top", + overlayX: "center", + overlayY: "bottom", + panelClass: ["bit-tooltip-above-center"], + }, +]; diff --git a/libs/components/src/tooltip/tooltip.component.css b/libs/components/src/tooltip/tooltip.component.css new file mode 100644 index 00000000000..4abb9908f25 --- /dev/null +++ b/libs/components/src/tooltip/tooltip.component.css @@ -0,0 +1,132 @@ +:root { + --tooltip-shadow: rgb(0 0 0 / 0.1); +} + +.cdk-overlay-pane:has(.bit-tooltip[data-visible="false"]) { + pointer-events: none; +} + +.bit-tooltip-container { + position: relative; + max-width: 12rem; + opacity: 0; + width: max-content; + box-shadow: + 0 4px 6px -1px var(--tooltip-shadow), + 0 2px 4px -2px var(--tooltip-shadow); + border-radius: 0.75rem; + transition: + transform 100ms ease-in-out, + opacity 100ms ease-in-out; + transform: scale(0.95); + z-index: 1; + + &::before, + &::after { + content: ""; + position: absolute; + width: 1rem; + height: 1rem; + z-index: 1; + rotate: 45deg; + border-radius: 3px; + } + + &::before { + background: linear-gradient(135deg, transparent 50%, rgb(var(--color-text-main)) 50%); + z-index: -1; + } + + &::after { + background: rgb(var(--color-text-main)); + z-index: -1; + } + + &[data-visible="true"] { + opacity: 1; + transform: scale(1); + z-index: 1000; + } + + .bit-tooltip-above-center &, + .bit-tooltip-below-center & { + &::before, + &::after { + inset-inline-start: 50%; + transform: translateX(-50%); + transform-origin: left; + } + } + + .bit-tooltip-above-center & { + &::after { + filter: drop-shadow(0 3px 5px var(--tooltip-shadow)) + drop-shadow(0 1px 3px var(--tooltip-shadow)); + } + + &::before, + &::after { + inset-block-end: -0.25rem; + } + } + + .bit-tooltip-below-center & { + &::after { + display: none; + } + + &::after, + &::before { + inset-block-start: -0.25rem; + rotate: -135deg; + } + } + + .bit-tooltip-left-center &, + .bit-tooltip-right-center & { + &::after, + &::before { + inset-block-start: 50%; + transform: translateY(-50%); + transform-origin: top; + } + } + + .bit-tooltip-left-center & { + &::after { + filter: drop-shadow(-3px 1px 3px var(--tooltip-shadow)) + drop-shadow(-1px 2px 3px var(--tooltip-shadow)); + } + + &::after, + &::before { + inset-inline-end: -0.25rem; + rotate: -45deg; + } + } + + .bit-tooltip-right-center & { + &::after { + filter: drop-shadow(2px -4px 2px var(--tooltip-shadow)) + drop-shadow(0 -1px 3px var(--tooltip-shadow)); + } + + &::after, + &::before { + inset-inline-start: -0.25rem; + rotate: 135deg; + } + } +} + +.bit-tooltip { + width: max-content; + max-width: 12rem; + background-color: rgb(var(--color-text-main)); + color: rgb(var(--color-text-contrast)); + padding: 0.5rem 0.75rem; + border-radius: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + z-index: 2; +} diff --git a/libs/components/src/tooltip/tooltip.component.html b/libs/components/src/tooltip/tooltip.component.html new file mode 100644 index 00000000000..c75cd5fb0d4 --- /dev/null +++ b/libs/components/src/tooltip/tooltip.component.html @@ -0,0 +1,10 @@ + +
+ +
diff --git a/libs/components/src/tooltip/tooltip.component.ts b/libs/components/src/tooltip/tooltip.component.ts new file mode 100644 index 00000000000..6b240507311 --- /dev/null +++ b/libs/components/src/tooltip/tooltip.component.ts @@ -0,0 +1,36 @@ +import { CommonModule } from "@angular/common"; +import { + Component, + ElementRef, + inject, + InjectionToken, + Signal, + TemplateRef, + viewChild, +} from "@angular/core"; + +import { TooltipPosition } from "./tooltip-positions"; + +type TooltipData = { + content: Signal; + isVisible: Signal; + tooltipPosition: Signal; +}; + +export const TOOLTIP_DATA = new InjectionToken("TOOLTIP_DATA"); + +/** + * tooltip component used internally by the tooltip.directive. Not meant to be used explicitly + */ +@Component({ + selector: "bit-tooltip", + templateUrl: "./tooltip.component.html", + imports: [CommonModule], +}) +export class TooltipComponent { + readonly templateRef = viewChild.required(TemplateRef); + + private elementRef = inject(ElementRef); + + readonly tooltipData = inject(TOOLTIP_DATA); +} diff --git a/libs/components/src/tooltip/tooltip.directive.ts b/libs/components/src/tooltip/tooltip.directive.ts new file mode 100644 index 00000000000..153fecfe7bf --- /dev/null +++ b/libs/components/src/tooltip/tooltip.directive.ts @@ -0,0 +1,110 @@ +import { Overlay, OverlayConfig, OverlayRef } from "@angular/cdk/overlay"; +import { ComponentPortal } from "@angular/cdk/portal"; +import { + Directive, + ViewContainerRef, + inject, + OnInit, + ElementRef, + Injector, + input, + effect, + signal, +} from "@angular/core"; + +import { TooltipPositionIdentifier, tooltipPositions } from "./tooltip-positions"; +import { TooltipComponent, TOOLTIP_DATA } from "./tooltip.component"; + +/** + * Directive to add a tooltip to any element. The tooltip content is provided via the `bitTooltip` input. + * The position of the tooltip can be set via the `tooltipPosition` input. Default position is "above-center". + */ +@Directive({ + selector: "[bitTooltip]", + host: { + "(mouseenter)": "showTooltip()", + "(mouseleave)": "hideTooltip()", + "(focus)": "showTooltip()", + "(blur)": "hideTooltip()", + }, +}) +export class TooltipDirective implements OnInit { + /** + * The value of this input is forwarded to the tooltip.component to render + */ + readonly bitTooltip = input.required(); + /** + * The value of this input is forwarded to the tooltip.component to set its position explicitly. + * @default "above-center" + */ + readonly tooltipPosition = input("above-center"); + + private isVisible = signal(false); + private overlayRef: OverlayRef | undefined; + private elementRef = inject(ElementRef); + private overlay = inject(Overlay); + private viewContainerRef = inject(ViewContainerRef); + private injector = inject(Injector); + private positionStrategy = this.overlay + .position() + .flexibleConnectedTo(this.elementRef) + .withFlexibleDimensions(false) + .withPush(true); + + private tooltipPortal = new ComponentPortal( + TooltipComponent, + this.viewContainerRef, + Injector.create({ + providers: [ + { + provide: TOOLTIP_DATA, + useValue: { + content: this.bitTooltip, + isVisible: this.isVisible, + tooltipPosition: this.tooltipPosition, + }, + }, + ], + }), + ); + + private showTooltip = () => { + this.isVisible.set(true); + }; + + private hideTooltip = () => { + this.isVisible.set(false); + }; + + private computePositions(tooltipPosition: TooltipPositionIdentifier) { + const chosenPosition = tooltipPositions.find((position) => position.id === tooltipPosition); + + return chosenPosition ? [chosenPosition, ...tooltipPositions] : tooltipPositions; + } + + get defaultPopoverConfig(): OverlayConfig { + return { + hasBackdrop: false, + scrollStrategy: this.overlay.scrollStrategies.reposition(), + }; + } + + ngOnInit() { + this.positionStrategy.withPositions(this.computePositions(this.tooltipPosition())); + + this.overlayRef = this.overlay.create({ + ...this.defaultPopoverConfig, + positionStrategy: this.positionStrategy, + }); + + this.overlayRef.attach(this.tooltipPortal); + + effect( + () => { + this.positionStrategy.withPositions(this.computePositions(this.tooltipPosition())); + this.overlayRef?.updatePosition(); + }, + { injector: this.injector }, + ); + } +} diff --git a/libs/components/src/tooltip/tooltip.mdx b/libs/components/src/tooltip/tooltip.mdx new file mode 100644 index 00000000000..4b6f10d97f8 --- /dev/null +++ b/libs/components/src/tooltip/tooltip.mdx @@ -0,0 +1,31 @@ +import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; + +import * as stories from "./tooltip.stories"; + + + +```ts +import { TooltipDirective } from "@bitwarden/components"; +``` + + +<Description /> + +NOTE: The `TooltipComponent` can't be used on its own. It must be applied via the `TooltipDirective` + +<Primary /> +<Controls /> + +## Stories + +### All available positions + +<Canvas of={stories.AllPositions} /> + +### Used with a long content + +<Canvas of={stories.LongContent} /> + +### On disabled element + +<Canvas of={stories.OnDisabledButton} /> diff --git a/libs/components/src/tooltip/tooltip.spec.ts b/libs/components/src/tooltip/tooltip.spec.ts new file mode 100644 index 00000000000..57e05e4f65f --- /dev/null +++ b/libs/components/src/tooltip/tooltip.spec.ts @@ -0,0 +1,103 @@ +import { + ConnectedOverlayPositionChange, + ConnectionPositionPair, + OverlayConfig, + Overlay, +} from "@angular/cdk/overlay"; +import { ComponentPortal } from "@angular/cdk/portal"; +import { Component } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { Observable, Subject } from "rxjs"; + +import { TooltipDirective } from "./tooltip.directive"; + +@Component({ + standalone: true, + imports: [TooltipDirective], + template: ` <button [bitTooltip]="tooltipText" type="button">Hover or focus me</button> `, +}) +class TooltipHostComponent { + tooltipText = "Hello Tooltip"; +} + +/** Minimal strategy shape the directive expects */ +interface StrategyLike { + withFlexibleDimensions: (flex: boolean) => StrategyLike; + withPush: (push: boolean) => StrategyLike; + withPositions: (positions: ReadonlyArray<ConnectionPositionPair>) => StrategyLike; + readonly positionChanges: Observable<ConnectedOverlayPositionChange>; +} + +/** Minimal Overlay service shape */ +interface OverlayLike { + position: () => { flexibleConnectedTo: (_: unknown) => StrategyLike }; + create: (_: OverlayConfig) => OverlayRefStub; + scrollStrategies: { reposition: () => unknown }; +} + +interface OverlayRefStub { + attach: (portal: ComponentPortal<unknown>) => unknown; + updatePosition: () => void; +} + +describe("TooltipDirective (visibility only)", () => { + let fixture: ComponentFixture<TooltipHostComponent>; + + beforeEach(() => { + const positionChanges$ = new Subject<ConnectedOverlayPositionChange>(); + + const strategy: StrategyLike = { + withFlexibleDimensions: jest.fn(() => strategy), + withPush: jest.fn(() => strategy), + withPositions: jest.fn(() => strategy), + get positionChanges() { + return positionChanges$.asObservable(); + }, + }; + + const overlayRefStub: OverlayRefStub = { + attach: jest.fn(() => ({})), + updatePosition: jest.fn(), + }; + + const overlayMock: OverlayLike = { + position: () => ({ flexibleConnectedTo: () => strategy }), + create: (_: OverlayConfig) => overlayRefStub, + scrollStrategies: { reposition: () => ({}) }, + }; + + TestBed.configureTestingModule({ + imports: [TooltipHostComponent], + providers: [{ provide: Overlay, useValue: overlayMock as unknown as Overlay }], + }); + + fixture = TestBed.createComponent(TooltipHostComponent); + fixture.detectChanges(); + }); + + function getDirective(): TooltipDirective { + const hostDE = fixture.debugElement.query(By.directive(TooltipDirective)); + return hostDE.injector.get(TooltipDirective); + } + + it("sets isVisible to true on mouseenter", () => { + const button: HTMLButtonElement = fixture.debugElement.query(By.css("button")).nativeElement; + const directive = getDirective(); + + const isVisible = (directive as unknown as { isVisible: () => boolean }).isVisible; + + button.dispatchEvent(new Event("mouseenter")); + expect(isVisible()).toBe(true); + }); + + it("sets isVisible to true on focus", () => { + const button: HTMLButtonElement = fixture.debugElement.query(By.css("button")).nativeElement; + const directive = getDirective(); + + const isVisible = (directive as unknown as { isVisible: () => boolean }).isVisible; + + button.dispatchEvent(new Event("focus")); + expect(isVisible()).toBe(true); + }); +}); diff --git a/libs/components/src/tooltip/tooltip.stories.ts b/libs/components/src/tooltip/tooltip.stories.ts new file mode 100644 index 00000000000..8ea3f52f913 --- /dev/null +++ b/libs/components/src/tooltip/tooltip.stories.ts @@ -0,0 +1,153 @@ +import { signal } from "@angular/core"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; +import { getByRole, userEvent } from "@storybook/test"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; + +import { ButtonComponent } from "../button"; +import { BitIconButtonComponent } from "../icon-button"; +import { I18nMockService } from "../utils"; + +import { TooltipPosition, TooltipPositionIdentifier, tooltipPositions } from "./tooltip-positions"; +import { TOOLTIP_DATA, TooltipComponent } from "./tooltip.component"; +import { TooltipDirective } from "./tooltip.directive"; + +import { formatArgsForCodeSnippet } from ".storybook/format-args-for-code-snippet"; + +export default { + title: "Component Library/Tooltip", + component: TooltipDirective, + decorators: [ + moduleMetadata({ + imports: [TooltipDirective, TooltipComponent, BitIconButtonComponent, ButtonComponent], + providers: [ + { + provide: I18nService, + useFactory: () => { + return new I18nMockService({ + loading: "Loading", + }); + }, + }, + { + provide: TOOLTIP_DATA, + useFactory: () => { + // simple fixed demo values for the Default story + return { + content: signal("This is a tooltip"), + isVisible: signal(true), + tooltipPosition: signal<TooltipPositionIdentifier>("above-center"), + }; + }, + }, + ], + }), + ], + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?m=auto&node-id=30558-13730&t=4k23PtzCwqDekAZW-1", + }, + }, + argTypes: { + bitTooltip: { + control: "text", + description: "Text content of the tooltip", + }, + tooltipPosition: { + control: "select", + options: tooltipPositions.map((position: TooltipPosition) => position.id), + description: "Position of the tooltip relative to the element", + table: { + type: { + summary: tooltipPositions.map((position: TooltipPosition) => position.id).join(" | "), + }, + defaultValue: { summary: "above-center" }, + }, + }, + }, +} as Meta<TooltipDirective>; + +type Story = StoryObj<TooltipDirective>; + +export const Default: Story = { + args: { + bitTooltip: "This is a tooltip", + tooltipPosition: "above-center", + }, + render: (args) => ({ + props: args, + template: ` + <div class="tw-p-4"> + <button + bitIconButton="bwi-ellipsis-v" + ${formatArgsForCodeSnippet<TooltipDirective>(args)} + > + Button label here + </button> + </div> + `, + }), + play: async (context) => { + const canvasEl = context.canvasElement; + const button = getByRole(canvasEl, "button"); + + await userEvent.hover(button); + }, +}; + +export const AllPositions: Story = { + render: () => ({ + template: ` + <div class="tw-p-16 tw-grid tw-grid-cols-2 tw-gap-8 tw-place-items-center"> + <button + bitIconButton="bwi-angle-up" + bitTooltip="Top tooltip" + tooltipPosition="above-center" + ></button> + <button + bitIconButton="bwi-angle-right" + bitTooltip="Right tooltip" + tooltipPosition="right-center" + ></button> + <button + bitIconButton="bwi-angle-left" + bitTooltip="Left tooltip" + tooltipPosition="left-center" + ></button> + <button + bitIconButton="bwi-angle-down" + bitTooltip="Bottom tooltip" + tooltipPosition="below-center" + ></button> + </div> + `, + }), +}; + +export const LongContent: Story = { + render: () => ({ + template: ` + <div class="tw-p-16 tw-flex tw-items-center tw-justify-center"> + <button + bitIconButton="bwi-ellipsis-v" + bitTooltip="This is a very long tooltip that will wrap to multiple lines to demonstrate how the tooltip handles long content. This is not recommended for usability." + ></button> + </div> + `, + }), +}; + +export const OnDisabledButton: Story = { + render: () => ({ + template: ` + <div class="tw-p-16 tw-flex tw-items-center tw-justify-center"> + <button + bitIconButton="bwi-ellipsis-v" + bitTooltip="Tooltip on disabled button" + [disabled]="true" + ></button> + </div> + `, + }), +}; diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css index ec29bc522eb..1e0a6f438f0 100644 --- a/libs/components/src/tw-theme.css +++ b/libs/components/src/tw-theme.css @@ -5,6 +5,7 @@ @import "./popover/popover.component.css"; @import "./toast/toast.tokens.css"; @import "./toast/toastr.css"; +@import "./tooltip/tooltip.component.css"; @import "./search/search.component.css"; @tailwind base; From e5ffd7f09ff39f55e077dbe5fda11007eb2328cc Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:22:23 -0500 Subject: [PATCH 02/14] Ignore .serena (#16688) --- .gitignore | 1 + .serena/.gitignore | 1 - .serena/project.yml | 67 --------------------------------------------- 3 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 .serena/.gitignore delete mode 100644 .serena/project.yml diff --git a/.gitignore b/.gitignore index 0f609335b63..61a20195592 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ Thumbs.db .settings/ *.sublime-workspace .claude +.serena # Visual Studio Code .vscode/* diff --git a/.serena/.gitignore b/.serena/.gitignore deleted file mode 100644 index 14d86ad6230..00000000000 --- a/.serena/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/cache diff --git a/.serena/project.yml b/.serena/project.yml deleted file mode 100644 index 1886c87239a..00000000000 --- a/.serena/project.yml +++ /dev/null @@ -1,67 +0,0 @@ -# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby) -# * For C, use cpp -# * For JavaScript, use typescript -# Special requirements: -# * csharp: Requires the presence of a .sln file in the project folder. -language: typescript - -# whether to use the project's gitignore file to ignore files -# Added on 2025-04-07 -ignore_all_files_in_gitignore: true -# list of additional paths to ignore -# same syntax as gitignore, so you can use * and ** -# Was previously called `ignored_dirs`, please update your config if you are using that. -# Added (renamed) on 2025-04-07 -ignored_paths: [] - -# whether the project is in read-only mode -# If set to true, all editing tools will be disabled and attempts to use them will result in an error -# Added on 2025-04-18 -read_only: false - -# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. -# Below is the complete list of tools for convenience. -# To make sure you have the latest list of tools, and to view their descriptions, -# execute `uv run scripts/print_tool_overview.py`. -# -# * `activate_project`: Activates a project by name. -# * `check_onboarding_performed`: Checks whether project onboarding was already performed. -# * `create_text_file`: Creates/overwrites a file in the project directory. -# * `delete_lines`: Deletes a range of lines within a file. -# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. -# * `execute_shell_command`: Executes a shell command. -# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. -# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). -# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). -# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. -# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. -# * `initial_instructions`: Gets the initial instructions for the current project. -# Should only be used in settings where the system prompt cannot be set, -# e.g. in clients you have no control over, like Claude Desktop. -# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. -# * `insert_at_line`: Inserts content at a given line in a file. -# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. -# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). -# * `list_memories`: Lists memories in Serena's project-specific memory store. -# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). -# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). -# * `read_file`: Reads a file within the project directory. -# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. -# * `remove_project`: Removes a project from the Serena configuration. -# * `replace_lines`: Replaces a range of lines within a file with new content. -# * `replace_symbol_body`: Replaces the full definition of a symbol. -# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. -# * `search_for_pattern`: Performs a search for a pattern in the project. -# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. -# * `switch_modes`: Activates modes by providing a list of their names -# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. -# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. -# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. -# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. -excluded_tools: [] - -# initial prompt for the project. It will always be given to the LLM upon activating the project -# (contrary to the memories, which are loaded on demand). -initial_prompt: "" - -project_name: "clients" From 8cb908ef6879b8d0bbe675ac6dcd8311b92e30d5 Mon Sep 17 00:00:00 2001 From: Colton Hurst <colton@coltonhurst.com> Date: Wed, 1 Oct 2025 15:03:52 -0400 Subject: [PATCH 03/14] [PM-26319] Fix default ctrl-shift-b issue (#16683) --- .../desktop/src/autofill/services/desktop-autotype.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/autofill/services/desktop-autotype.service.ts b/apps/desktop/src/autofill/services/desktop-autotype.service.ts index 6f9289f3513..24ec3907a62 100644 --- a/apps/desktop/src/autofill/services/desktop-autotype.service.ts +++ b/apps/desktop/src/autofill/services/desktop-autotype.service.ts @@ -73,7 +73,9 @@ export class DesktopAutotypeService { async init() { this.autotypeEnabledUserSetting$ = this.autotypeEnabledState.state$; - this.autotypeKeyboardShortcut$ = this.autotypeKeyboardShortcut.state$; + this.autotypeKeyboardShortcut$ = this.autotypeKeyboardShortcut.state$.pipe( + map((shortcut) => shortcut ?? defaultWindowsAutotypeKeyboardShortcut), + ); // Currently Autotype is only supported for Windows if (this.platformUtilsService.getDevice() === DeviceType.WindowsDesktop) { From 420b26776bf14521e5c71e20751640ebeb63f3fe Mon Sep 17 00:00:00 2001 From: Konrad <11725227+mKoonrad@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:36:02 +0200 Subject: [PATCH 04/14] [PM-26325] Archive string - separate noun and verb (#16652) * Separation of noun and verb --- apps/browser/src/_locales/en/messages.json | 9 +++++++-- .../item-more-options/item-more-options.component.html | 2 +- .../popup/settings/vault-settings-v2.component.html | 2 +- apps/desktop/src/locales/en/messages.json | 9 +++++++-- .../vault-filter/components/vault-filter.component.ts | 2 +- .../vault-header/vault-header.component.ts | 2 +- apps/web/src/locales/en/messages.json | 9 +++++++-- 7 files changed, 25 insertions(+), 10 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 72c3892af62..4e399a530e1 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html index 16cc04ce612..7ee7e141ee5 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html @@ -40,7 +40,7 @@ </ng-container> @if (canArchive$ | async) { <button type="button" bitMenuItem (click)="archive()" *ngIf="canArchive$ | async"> - {{ "archive" | i18n }} + {{ "archiveVerb" | i18n }} </button> } </bit-menu> diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html index 630c55d0038..3c1278b4d44 100644 --- a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html @@ -37,7 +37,7 @@ @if (userCanArchive() || showArchiveFilter()) { <bit-item> <a bit-item-content routerLink="/archive"> - {{ "archive" | i18n }} + {{ "archiveNoun" | i18n }} <i slot="end" class="bwi bwi-angle-right" aria-hidden="true"></i> </a> </bit-item> diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 08ec76af874..a9b5efda357 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -4114,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" 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 0a8c0f6f1d0..278ae62aaa6 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 @@ -424,7 +424,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { [ { id: "archive", - name: this.i18nService.t("archive"), + name: this.i18nService.t("archiveNoun"), type: "archive", icon: "bwi-archive", }, diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts index 63e6d391b42..aaa3a90aa98 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts @@ -140,7 +140,7 @@ export class VaultHeaderComponent { } if (this.filter.type === "archive") { - return this.i18nService.t("archive"); + return this.i18nService.t("archiveNoun"); } const activeOrganization = this.activeOrganization; diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 35f369aa647..e107b34d038 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -11078,8 +11078,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" From cae58232e5884b272fb26b1baa5aa66852528b9d Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Wed, 1 Oct 2025 12:57:41 -0700 Subject: [PATCH 05/14] feat(new-device-verification-screen): (Auth) [PM-17489] Back Button on New Device Verification Screen (#16599) On Web and Desktop, show back button on `NewDeviceVerificationComponent` (route `/device-verification`). Do not show it on Extension, because Extension already has a back button in the header. --- ...ice-verification-component.service.spec.ts | 21 +++++++++++++++++++ ...w-device-verification-component.service.ts | 13 ++++++++++++ .../src/popup/services/services.module.ts | 7 +++++++ .../src/services/jslib-services.module.ts | 7 +++++++ libs/auth/src/angular/index.ts | 2 ++ ...ice-verification-component.service.spec.ts | 21 +++++++++++++++++++ ...w-device-verification-component.service.ts | 9 ++++++++ ...w-device-verification-component.service.ts | 8 +++++++ .../new-device-verification.component.html | 10 ++++++++- .../new-device-verification.component.ts | 15 ++++++++++--- 10 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.spec.ts create mode 100644 apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.ts create mode 100644 libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.spec.ts create mode 100644 libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.ts create mode 100644 libs/auth/src/angular/new-device-verification/new-device-verification-component.service.ts diff --git a/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.spec.ts b/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.spec.ts new file mode 100644 index 00000000000..7c91cae3fcb --- /dev/null +++ b/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.spec.ts @@ -0,0 +1,21 @@ +import { ExtensionNewDeviceVerificationComponentService } from "./extension-new-device-verification-component.service"; + +describe("ExtensionNewDeviceVerificationComponentService", () => { + let sut: ExtensionNewDeviceVerificationComponentService; + + beforeEach(() => { + sut = new ExtensionNewDeviceVerificationComponentService(); + }); + + it("should instantiate the service", () => { + expect(sut).not.toBeFalsy(); + }); + + describe("showBackButton()", () => { + it("should return false", () => { + const result = sut.showBackButton(); + + expect(result).toBe(false); + }); + }); +}); diff --git a/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.ts b/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.ts new file mode 100644 index 00000000000..05e60fc8dad --- /dev/null +++ b/apps/browser/src/auth/services/new-device-verification/extension-new-device-verification-component.service.ts @@ -0,0 +1,13 @@ +import { + DefaultNewDeviceVerificationComponentService, + NewDeviceVerificationComponentService, +} from "@bitwarden/auth/angular"; + +export class ExtensionNewDeviceVerificationComponentService + extends DefaultNewDeviceVerificationComponentService + implements NewDeviceVerificationComponentService +{ + showBackButton() { + return false; + } +} diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index ef4dd0be090..7a10dc2343f 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -29,6 +29,7 @@ import { TwoFactorAuthDuoComponentService, TwoFactorAuthWebAuthnComponentService, SsoComponentService, + NewDeviceVerificationComponentService, } from "@bitwarden/auth/angular"; import { LockService, @@ -36,6 +37,7 @@ import { SsoUrlService, LogoutService, } from "@bitwarden/auth/common"; +import { ExtensionNewDeviceVerificationComponentService } from "@bitwarden/browser/auth/services/new-device-verification/extension-new-device-verification-component.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -710,6 +712,11 @@ const safeProviders: SafeProvider[] = [ useClass: DefaultCipherArchiveService, deps: [CipherService, ApiService, BillingAccountProfileStateService, ConfigService], }), + safeProvider({ + provide: NewDeviceVerificationComponentService, + useClass: ExtensionNewDeviceVerificationComponentService, + deps: [], + }), ]; @NgModule({ diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 8c727a98d11..3304c54a86f 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -20,11 +20,13 @@ import { import { DefaultLoginComponentService, DefaultLoginDecryptionOptionsService, + DefaultNewDeviceVerificationComponentService, DefaultRegistrationFinishService, DefaultTwoFactorAuthComponentService, DefaultTwoFactorAuthWebAuthnComponentService, LoginComponentService, LoginDecryptionOptionsService, + NewDeviceVerificationComponentService, RegistrationFinishService as RegistrationFinishServiceAbstraction, TwoFactorAuthComponentService, TwoFactorAuthWebAuthnComponentService, @@ -1646,6 +1648,11 @@ const safeProviders: SafeProvider[] = [ ConfigService, ], }), + safeProvider({ + provide: NewDeviceVerificationComponentService, + useClass: DefaultNewDeviceVerificationComponentService, + deps: [], + }), ]; @NgModule({ diff --git a/libs/auth/src/angular/index.ts b/libs/auth/src/angular/index.ts index fdd06509511..454a9091c25 100644 --- a/libs/auth/src/angular/index.ts +++ b/libs/auth/src/angular/index.ts @@ -59,6 +59,8 @@ export * from "./two-factor-auth"; // device verification export * from "./new-device-verification/new-device-verification.component"; +export * from "./new-device-verification/new-device-verification-component.service"; +export * from "./new-device-verification/default-new-device-verification-component.service"; // validators export * from "./validators/compare-inputs.validator"; diff --git a/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.spec.ts b/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.spec.ts new file mode 100644 index 00000000000..a2ea26268ea --- /dev/null +++ b/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.spec.ts @@ -0,0 +1,21 @@ +import { DefaultNewDeviceVerificationComponentService } from "./default-new-device-verification-component.service"; + +describe("DefaultNewDeviceVerificationComponentService", () => { + let sut: DefaultNewDeviceVerificationComponentService; + + beforeEach(() => { + sut = new DefaultNewDeviceVerificationComponentService(); + }); + + it("should instantiate the service", () => { + expect(sut).not.toBeFalsy(); + }); + + describe("showBackButton()", () => { + it("should return true", () => { + const result = sut.showBackButton(); + + expect(result).toBe(true); + }); + }); +}); diff --git a/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.ts b/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.ts new file mode 100644 index 00000000000..88ea652bc4b --- /dev/null +++ b/libs/auth/src/angular/new-device-verification/default-new-device-verification-component.service.ts @@ -0,0 +1,9 @@ +import { NewDeviceVerificationComponentService } from "./new-device-verification-component.service"; + +export class DefaultNewDeviceVerificationComponentService + implements NewDeviceVerificationComponentService +{ + showBackButton() { + return true; + } +} diff --git a/libs/auth/src/angular/new-device-verification/new-device-verification-component.service.ts b/libs/auth/src/angular/new-device-verification/new-device-verification-component.service.ts new file mode 100644 index 00000000000..c34fc40ef00 --- /dev/null +++ b/libs/auth/src/angular/new-device-verification/new-device-verification-component.service.ts @@ -0,0 +1,8 @@ +export abstract class NewDeviceVerificationComponentService { + /** + * States whether component should show a back button. Can be overridden by client-specific component services. + * - Default = `true` + * - Extension = `false` (because Extension shows a back button in the header instead) + */ + abstract showBackButton: () => boolean; +} diff --git a/libs/auth/src/angular/new-device-verification/new-device-verification.component.html b/libs/auth/src/angular/new-device-verification/new-device-verification.component.html index e731f3afcb6..814c48db0fc 100644 --- a/libs/auth/src/angular/new-device-verification/new-device-verification.component.html +++ b/libs/auth/src/angular/new-device-verification/new-device-verification.component.html @@ -22,7 +22,7 @@ {{ "resendCode" | i18n }} </button> - <div class="tw-flex tw-mt-4"> + <div class="tw-grid tw-gap-3 tw-mt-4"> <button bitButton bitFormButton @@ -33,5 +33,13 @@ > {{ "continueLoggingIn" | i18n }} </button> + + @if (showBackButton) { + <div class="tw-text-center">{{ "or" | i18n }}</div> + + <button type="button" bitButton block buttonType="secondary" (click)="goBack()"> + {{ "back" | i18n }} + </button> + } </div> </form> diff --git a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts index 6362b901fc8..2211b3390a7 100644 --- a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts +++ b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts @@ -1,4 +1,4 @@ -import { CommonModule } from "@angular/common"; +import { CommonModule, Location } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms"; import { Router } from "@angular/router"; @@ -11,7 +11,6 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. @@ -26,6 +25,8 @@ import { import { LoginStrategyServiceAbstraction } from "../../common/abstractions/login-strategy.service"; +import { NewDeviceVerificationComponentService } from "./new-device-verification-component.service"; + /** * Component for verifying a new device via a one-time password (OTP). */ @@ -57,6 +58,7 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { protected disableRequestOTP = false; private destroy$ = new Subject<void>(); protected authenticationSessionTimeoutRoute = "/authentication-timeout"; + protected showBackButton = true; constructor( private router: Router, @@ -66,12 +68,15 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { private logService: LogService, private i18nService: I18nService, private loginSuccessHandlerService: LoginSuccessHandlerService, - private configService: ConfigService, private accountService: AccountService, private masterPasswordService: MasterPasswordServiceAbstraction, + private newDeviceVerificationComponentService: NewDeviceVerificationComponentService, + private location: Location, ) {} async ngOnInit() { + this.showBackButton = this.newDeviceVerificationComponentService.showBackButton(); + // Redirect to timeout route if session expires this.loginStrategyService.authenticationSessionTimeout$ .pipe(takeUntil(this.destroy$)) @@ -179,4 +184,8 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { codeControl.markAsTouched(); } }; + + protected goBack() { + this.location.back(); + } } From 5de8a145ecaf6574252001318e7d4c69eb90a1ef Mon Sep 17 00:00:00 2001 From: Daniel Riera <driera@livefront.com> Date: Wed, 1 Oct 2025 16:20:03 -0400 Subject: [PATCH 06/14] [PM-26410] Update autotype policy to include all org members (#16689) * PM-26410 use policies$ to apply default behavior to all org members * linting error, remove unused imports --- .../desktop-autotype-policy.service.spec.ts | 177 +++++++++++++++--- .../desktop-autotype-policy.service.ts | 19 +- 2 files changed, 164 insertions(+), 32 deletions(-) diff --git a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts index 7fb30333e28..555e6ceef5b 100644 --- a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts +++ b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts @@ -1,8 +1,10 @@ import { TestBed } from "@angular/core/testing"; import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject, firstValueFrom, take, timeout, TimeoutError } from "rxjs"; +import { BehaviorSubject, firstValueFrom, take } from "rxjs"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -18,10 +20,10 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { let policyService: MockProxy<InternalPolicyService>; let configService: MockProxy<ConfigService>; - let mockAccountSubject: BehaviorSubject<{ id: UserId } | null>; + let mockAccountSubject: BehaviorSubject<Account | null>; let mockFeatureFlagSubject: BehaviorSubject<boolean>; let mockAuthStatusSubject: BehaviorSubject<AuthenticationStatus>; - let mockPolicyAppliesSubject: BehaviorSubject<boolean>; + let mockPoliciesSubject: BehaviorSubject<Policy[]>; const mockUserId = "user-123" as UserId; @@ -36,7 +38,7 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { mockAuthStatusSubject = new BehaviorSubject<AuthenticationStatus>( AuthenticationStatus.Unlocked, ); - mockPolicyAppliesSubject = new BehaviorSubject<boolean>(false); + mockPoliciesSubject = new BehaviorSubject<Policy[]>([]); accountService = mock<AccountService>(); authService = mock<AuthService>(); @@ -50,9 +52,7 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { authService.authStatusFor$ = jest .fn() .mockImplementation((_: UserId) => mockAuthStatusSubject.asObservable()); - policyService.policyAppliesToUser$ = jest - .fn() - .mockReturnValue(mockPolicyAppliesSubject.asObservable()); + policyService.policies$ = jest.fn().mockReturnValue(mockPoliciesSubject.asObservable()); TestBed.configureTestingModule({ providers: [ @@ -72,7 +72,7 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { mockAccountSubject.complete(); mockFeatureFlagSubject.complete(); mockAuthStatusSubject.complete(); - mockPolicyAppliesSubject.complete(); + mockPoliciesSubject.complete(); }); describe("autotypeDefaultSetting$", () => { @@ -82,11 +82,20 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { expect(result).toBeNull(); }); - it("should not emit when no active account", async () => { + it("does not emit until an account appears", async () => { mockAccountSubject.next(null); - await expect( - firstValueFrom(service.autotypeDefaultSetting$.pipe(timeout({ first: 30 }))), - ).rejects.toBeInstanceOf(TimeoutError); + + mockAccountSubject.next({ id: mockUserId } as Account); + mockAuthStatusSubject.next(AuthenticationStatus.Unlocked); + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); + + const result = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + expect(result).toBe(true); }); it("should emit null when user is not unlocked", async () => { @@ -96,34 +105,56 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { }); it("should emit null when no autotype policy exists", async () => { - mockPolicyAppliesSubject.next(false); + mockPoliciesSubject.next([]); const policy = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(policy).toBeNull(); }); it("should emit true when autotype policy is enabled", async () => { - mockPolicyAppliesSubject.next(true); + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); const policyStatus = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(policyStatus).toBe(true); }); - it("should emit false when autotype policy is disabled", async () => { - mockPolicyAppliesSubject.next(false); + it("should emit null when autotype policy is disabled", async () => { + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: false, + } as Policy, + ]); const policyStatus = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(policyStatus).toBeNull(); }); it("should emit null when autotype policy does not apply", async () => { - mockPolicyAppliesSubject.next(false); + mockPoliciesSubject.next([ + { + type: PolicyType.RequireSso, + enabled: true, + } as Policy, + ]); const policy = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(policy).toBeNull(); }); it("should react to authentication status changes", async () => { + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); + // Expect one emission when unlocked mockAuthStatusSubject.next(AuthenticationStatus.Unlocked); const first = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); - expect(first).toBeNull(); + expect(first).toBe(true); // Expect null emission when locked mockAuthStatusSubject.next(AuthenticationStatus.Locked); @@ -134,33 +165,131 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { it("should react to account changes", async () => { const newUserId = "user-456" as UserId; + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); + // First value for original user const firstValue = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); - expect(firstValue).toBeNull(); + expect(firstValue).toBe(true); // Change account and expect a new emission mockAccountSubject.next({ id: newUserId, - }); + } as Account); const secondValue = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); - expect(secondValue).toBeNull(); + expect(secondValue).toBe(true); // Verify the auth lookup was switched to the new user expect(authService.authStatusFor$).toHaveBeenCalledWith(newUserId); + expect(policyService.policies$).toHaveBeenCalledWith(newUserId); }); it("should react to policy changes", async () => { - mockPolicyAppliesSubject.next(false); + mockPoliciesSubject.next([]); const nullValue = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(nullValue).toBeNull(); - mockPolicyAppliesSubject.next(true); + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); const trueValue = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(trueValue).toBe(true); - mockPolicyAppliesSubject.next(false); + mockPoliciesSubject.next([]); const nullValueAgain = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); expect(nullValueAgain).toBeNull(); }); + + it("emits null again if the feature flag turns off after emitting", async () => { + mockPoliciesSubject.next([ + { type: PolicyType.AutotypeDefaultSetting, enabled: true } as Policy, + ]); + expect(await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1)))).toBe(true); + + mockFeatureFlagSubject.next(false); + expect(await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1)))).toBeNull(); + }); + + it("replays the latest value to late subscribers", async () => { + mockPoliciesSubject.next([ + { type: PolicyType.AutotypeDefaultSetting, enabled: true } as Policy, + ]); + + await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + + const late = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + expect(late).toBe(true); + }); + + it("does not re-emit when effective value is unchanged", async () => { + mockAccountSubject.next({ id: mockUserId } as Account); + mockAuthStatusSubject.next(AuthenticationStatus.Unlocked); + + const policies = [ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]; + + mockPoliciesSubject.next(policies); + const first = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + expect(first).toBe(true); + + let emissionCount = 0; + const subscription = service.autotypeDefaultSetting$.subscribe(() => { + emissionCount++; + }); + + mockPoliciesSubject.next(policies); + + await new Promise((resolve) => setTimeout(resolve, 50)); + subscription.unsubscribe(); + + expect(emissionCount).toBe(1); + }); + + it("does not emit policy values while locked; emits after unlocking", async () => { + mockAuthStatusSubject.next(AuthenticationStatus.Locked); + mockPoliciesSubject.next([ + { type: PolicyType.AutotypeDefaultSetting, enabled: true } as Policy, + ]); + + expect(await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1)))).toBeNull(); + + mockAuthStatusSubject.next(AuthenticationStatus.Unlocked); + expect(await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1)))).toBe(true); + }); + + it("emits correctly if auth unlocks before policies arrive", async () => { + mockAccountSubject.next({ id: mockUserId } as Account); + mockAuthStatusSubject.next(AuthenticationStatus.Unlocked); + mockPoliciesSubject.next([ + { + type: PolicyType.AutotypeDefaultSetting, + enabled: true, + } as Policy, + ]); + + const result = await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + expect(result).toBe(true); + }); + + it("wires dependencies with initial user id", async () => { + mockPoliciesSubject.next([ + { type: PolicyType.AutotypeDefaultSetting, enabled: true } as Policy, + ]); + await firstValueFrom(service.autotypeDefaultSetting$.pipe(take(1))); + + expect(authService.authStatusFor$).toHaveBeenCalledWith(mockUserId); + expect(policyService.policies$).toHaveBeenCalledWith(mockUserId); + }); }); }); diff --git a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.ts b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.ts index 887a30ef6f6..d3ae67d2c8d 100644 --- a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.ts +++ b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.ts @@ -34,7 +34,7 @@ export class DesktopAutotypeDefaultSettingPolicy { } return this.accountService.activeAccount$.pipe( - filter((account) => account != null), + filter((account) => account != null && account.id != null), getUserId, distinctUntilChanged(), switchMap((userId) => { @@ -43,13 +43,16 @@ export class DesktopAutotypeDefaultSettingPolicy { distinctUntilChanged(), ); - const policy$ = this.policyService - .policyAppliesToUser$(PolicyType.AutotypeDefaultSetting, userId) - .pipe( - map((appliesToUser) => (appliesToUser ? true : null)), - distinctUntilChanged(), - shareReplay({ bufferSize: 1, refCount: true }), - ); + const policy$ = this.policyService.policies$(userId).pipe( + map((policies) => { + const autotypePolicy = policies.find( + (policy) => policy.type === PolicyType.AutotypeDefaultSetting && policy.enabled, + ); + return autotypePolicy ? true : null; + }), + distinctUntilChanged(), + shareReplay({ bufferSize: 1, refCount: true }), + ); return isUnlocked$.pipe(switchMap((unlocked) => (unlocked ? policy$ : of(null)))); }), From 688647b2c69243b14ec14a37b51639da400a6bf2 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:21:11 -0700 Subject: [PATCH 07/14] [PM-25216] - handle extension already installed on new user creation (#16650) * handle extension already installed on new user creation * fix tests * remove comment --- .../setup-extension.component.html | 25 ++++++++++++++++--- .../setup-extension.component.spec.ts | 7 +----- .../setup-extension.component.ts | 6 +++-- .../setup-extension-redirect.guard.spec.ts | 7 ------ .../guards/setup-extension-redirect.guard.ts | 14 ----------- apps/web/src/locales/en/messages.json | 6 +++++ 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html index 41ee1b4707e..09bd38c8517 100644 --- a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html +++ b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html @@ -29,15 +29,32 @@ </div> </section> -<section *ngIf="state === SetupExtensionState.Success" class="tw-flex tw-flex-col tw-items-center"> +<section + *ngIf="state === SetupExtensionState.Success || state === SetupExtensionState.AlreadyInstalled" + class="tw-flex tw-flex-col tw-items-center" +> <div class="tw-size-[90px]"> <bit-icon [icon]="PartyIcon"></bit-icon> </div> - <h1 bitTypography="h2" class="tw-mb-6 tw-mt-4">{{ "bitwardenExtensionInstalled" | i18n }}</h1> + <h1 bitTypography="h2" class="tw-mb-6 tw-mt-4 tw-text-center"> + {{ + (state === SetupExtensionState.Success + ? "bitwardenExtensionInstalled" + : "openTheBitwardenExtension" + ) | i18n + }} + </h1> <div - class="tw-flex tw-flex-col tw-rounded-2xl tw-bg-background tw-border tw-border-solid tw-border-secondary-300 tw-p-8" + class="tw-flex tw-flex-col tw-rounded-2xl tw-bg-background tw-border tw-border-solid tw-border-secondary-300 tw-p-8 tw-max-w-md tw-text-center" > - <p>{{ "openExtensionToAutofill" | i18n }}</p> + <p> + {{ + (state === SetupExtensionState.Success + ? "openExtensionToAutofill" + : "bitwardenExtensionInstalledOpenExtension" + ) | i18n + }} + </p> <button type="button" bitButton buttonType="primary" class="tw-mb-2" (click)="openExtension()"> {{ "openBitwardenExtension" | i18n }} </button> diff --git a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.spec.ts b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.spec.ts index 3be8251b1d7..f755c83832f 100644 --- a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.spec.ts +++ b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.spec.ts @@ -93,14 +93,9 @@ describe("SetupExtensionComponent", () => { }); describe("extensionInstalled$", () => { - it("redirects the user to the vault when the first emitted value is true", () => { - extensionInstalled$.next(true); - - expect(navigate).toHaveBeenCalledWith(["/vault"]); - }); - describe("success state", () => { beforeEach(() => { + update.mockClear(); // avoid initial redirect extensionInstalled$.next(false); diff --git a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts index 558f0eb06c9..a04c529004c 100644 --- a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts +++ b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts @@ -36,6 +36,7 @@ export const SetupExtensionState = { Loading: "loading", NeedsExtension: "needs-extension", Success: "success", + AlreadyInstalled: "already-installed", ManualOpen: "manual-open", } as const; @@ -99,9 +100,10 @@ export class SetupExtensionComponent implements OnInit, OnDestroy { this.webBrowserExtensionInteractionService.extensionInstalled$ .pipe(takeUntilDestroyed(this.destroyRef), startWith(null), pairwise()) .subscribe(([previousState, currentState]) => { - // Initial state transitioned to extension installed, redirect the user + // User landed on the page and the extension is already installed, show already installed state if (previousState === null && currentState) { - void this.router.navigate(["/vault"]); + void this.dismissExtensionPage(); + this.state = SetupExtensionState.AlreadyInstalled; } // Extension was not installed and now it is, show success state diff --git a/apps/web/src/app/vault/guards/setup-extension-redirect.guard.spec.ts b/apps/web/src/app/vault/guards/setup-extension-redirect.guard.spec.ts index 14f6763dbf9..7520451df34 100644 --- a/apps/web/src/app/vault/guards/setup-extension-redirect.guard.spec.ts +++ b/apps/web/src/app/vault/guards/setup-extension-redirect.guard.spec.ts @@ -82,13 +82,6 @@ describe("setupExtensionRedirectGuard", () => { expect(await setupExtensionGuard()).toBe(true); }); - it("returns `true` when the user has the extension installed", async () => { - state$.next(false); - extensionInstalled$.next(true); - - expect(await setupExtensionGuard()).toBe(true); - }); - it('redirects the user to "/setup-extension" when all criteria do not pass', async () => { state$.next(false); extensionInstalled$.next(false); diff --git a/apps/web/src/app/vault/guards/setup-extension-redirect.guard.ts b/apps/web/src/app/vault/guards/setup-extension-redirect.guard.ts index 5355ebf7232..0c9e31ae77f 100644 --- a/apps/web/src/app/vault/guards/setup-extension-redirect.guard.ts +++ b/apps/web/src/app/vault/guards/setup-extension-redirect.guard.ts @@ -11,8 +11,6 @@ import { UserKeyDefinition, } from "@bitwarden/common/platform/state"; -import { WebBrowserInteractionService } from "../services/web-browser-interaction.service"; - export const SETUP_EXTENSION_DISMISSED = new UserKeyDefinition<boolean>( SETUP_EXTENSION_DISMISSED_DISK, "setupExtensionDismissed", @@ -27,7 +25,6 @@ export const setupExtensionRedirectGuard: CanActivateFn = async () => { const accountService = inject(AccountService); const vaultProfileService = inject(VaultProfileService); const stateProvider = inject(StateProvider); - const webBrowserInteractionService = inject(WebBrowserInteractionService); const isMobile = Utils.isMobileBrowser; @@ -43,10 +40,6 @@ export const setupExtensionRedirectGuard: CanActivateFn = async () => { return router.createUrlTree(["/login"]); } - const hasExtensionInstalledPromise = firstValueFrom( - webBrowserInteractionService.extensionInstalled$, - ); - const dismissedExtensionPage = await firstValueFrom( stateProvider .getUser(currentAcct.id, SETUP_EXTENSION_DISMISSED) @@ -66,13 +59,6 @@ export const setupExtensionRedirectGuard: CanActivateFn = async () => { return true; } - // Checking for the extension is a more expensive operation, do it last to avoid unnecessary delays. - const hasExtensionInstalled = await hasExtensionInstalledPromise; - - if (hasExtensionInstalled) { - return true; - } - return router.createUrlTree(["/setup-extension"]); }; diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index e107b34d038..50b361f3d5a 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -11199,6 +11199,12 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, + "openTheBitwardenExtension": { + "message": "Open the Bitwarden extension" + }, + "bitwardenExtensionInstalledOpenExtension": { + "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." }, From 75253c77095a2912c8bd7ef7ba27e58e259217ea Mon Sep 17 00:00:00 2001 From: John Harrington <84741727+harr1424@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:26:30 -0700 Subject: [PATCH 08/14] [PM-24099] Tools - Remove getOrgKey from the key service (#16351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * replace deprecated getOrgKey() method • obtain account using `accountService.activeAccount$` and then use id property to guarentee validity of UserId --- .../bitwarden/bitwarden-json-importer.ts | 14 +++-- ...warden-password-protected-importer.spec.ts | 53 +++++++++++++++++++ .../src/services/org-vault-export.service.ts | 22 +++++--- 3 files changed, 75 insertions(+), 14 deletions(-) diff --git a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts index 70c783df52a..14a16211deb 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts @@ -64,12 +64,13 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { private async parseEncrypted( results: BitwardenEncryptedIndividualJsonExport | BitwardenEncryptedOrgJsonExport, ) { + const account = await firstValueFrom(this.accountService.activeAccount$); + if (results.encKeyValidation_DO_NOT_EDIT != null) { - let keyForDecryption: SymmetricCryptoKey = await this.keyService.getOrgKey( - this.organizationId, - ); + const orgKeys = await firstValueFrom(this.keyService.orgKeys$(account.id)); + let keyForDecryption: SymmetricCryptoKey = orgKeys?.[this.organizationId]; if (keyForDecryption == null) { - keyForDecryption = await this.keyService.getUserKey(); + keyForDecryption = await firstValueFrom(this.keyService.userKey$(account.id)); } const encKeyValidation = new EncString(results.encKeyValidation_DO_NOT_EDIT); try { @@ -113,10 +114,7 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { }); } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - const view = await this.cipherService.decrypt(cipher, activeUserId); + const view = await this.cipherService.decrypt(cipher, account.id); this.cleanupCipher(view); this.result.ciphers.push(view); } diff --git a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts index 7812cce2c05..dfdcef51735 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts @@ -1,12 +1,17 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { of } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { emptyGuid, OrganizationId } from "@bitwarden/common/types/guid"; +import { OrgKey, UserKey } from "@bitwarden/common/types/key"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { newGuid } from "@bitwarden/guid"; import { KdfType, KeyService } from "@bitwarden/key-management"; +import { UserId } from "@bitwarden/user-core"; import { emptyAccountEncrypted } from "../spec-data/bitwarden-json/account-encrypted.json"; import { emptyUnencryptedExport } from "../spec-data/bitwarden-json/unencrypted.json"; @@ -35,6 +40,36 @@ describe("BitwardenPasswordProtectedImporter", () => { pinService = mock<PinServiceAbstraction>(); accountService = mock<AccountService>(); + accountService.activeAccount$ = of({ + id: newGuid() as UserId, + email: "test@example.com", + emailVerified: true, + name: "Test User", + }); + + const mockOrgId = emptyGuid as OrganizationId; + /* + The key values below are never read, empty objects are cast as types for compilation type checking only. + Tests specific to key contents are in key-service.spec.ts + */ + const mockOrgKey = {} as unknown as OrgKey; + const mockUserKey = {} as unknown as UserKey; + + keyService.orgKeys$.mockImplementation(() => + of({ [mockOrgId]: mockOrgKey } as Record<OrganizationId, OrgKey>), + ); + keyService.userKey$.mockImplementation(() => of(mockUserKey)); + (keyService as any).activeUserOrgKeys$ = of({ + [mockOrgId]: mockOrgKey, + } as Record<OrganizationId, OrgKey>); + + /* + Crypto isn’t under test here; keys are just placeholders. + Decryption methods are stubbed to always return empty CipherView or string allowing OK import flow. + */ + cipherService.decrypt.mockResolvedValue({} as any); + encryptService.decryptString.mockResolvedValue("ok"); + importer = new BitwardenPasswordProtectedImporter( keyService, encryptService, @@ -62,6 +97,24 @@ describe("BitwardenPasswordProtectedImporter", () => { jest.spyOn(BitwardenJsonImporter.prototype, "parse"); }); + beforeEach(() => { + accountService.activeAccount$ = of({ + id: newGuid() as UserId, + email: "test@example.com", + emailVerified: true, + name: "Test User", + }); + importer = new BitwardenPasswordProtectedImporter( + keyService, + encryptService, + i18nService, + cipherService, + pinService, + accountService, + promptForPassword_callback, + ); + }); + it("Should call BitwardenJsonImporter", async () => { expect((await importer.parse(emptyAccountEncrypted)).success).toEqual(true); expect(BitwardenJsonImporter.prototype.parse).toHaveBeenCalledWith(emptyAccountEncrypted); diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts index 3884dde4b18..53952938aa8 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts @@ -15,6 +15,7 @@ import { EncryptService } from "@bitwarden/common/key-management/crypto/abstract import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { CipherWithIdExport, CollectionWithIdExport } from "@bitwarden/common/models/export"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -22,6 +23,7 @@ import { CipherData } from "@bitwarden/common/vault/models/data/cipher.data"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { RestrictedItemTypesService } from "@bitwarden/common/vault/services/restricted-item-types.service"; +import { newGuid } from "@bitwarden/guid"; import { KdfConfigService, KeyService } from "@bitwarden/key-management"; import { @@ -112,7 +114,7 @@ export class OrganizationVaultExportService type: "text/plain", data: onlyManagedCollections ? await this.getEncryptedManagedExport(userId, organizationId) - : await this.getOrganizationEncryptedExport(organizationId), + : await this.getOrganizationEncryptedExport(userId, organizationId), fileName: ExportHelper.getFileName("org", "encrypted_json"), } as ExportedVaultAsString; } @@ -184,7 +186,10 @@ export class OrganizationVaultExportService return this.buildJsonExport(decCollections, decCiphers); } - private async getOrganizationEncryptedExport(organizationId: OrganizationId): Promise<string> { + private async getOrganizationEncryptedExport( + userId: UserId, + organizationId: OrganizationId, + ): Promise<string> { const collections: Collection[] = []; const ciphers: Cipher[] = []; @@ -215,7 +220,7 @@ export class OrganizationVaultExportService } }); } - return this.BuildEncryptedExport(organizationId, collections, ciphers); + return this.BuildEncryptedExport(userId, organizationId, collections, ciphers); } private async getDecryptedManagedExport( @@ -295,16 +300,21 @@ export class OrganizationVaultExportService !this.restrictedItemTypesService.isCipherRestricted(f, restrictions), ); - return this.BuildEncryptedExport(organizationId, encCollections, encCiphers); + return this.BuildEncryptedExport(activeUserId, organizationId, encCollections, encCiphers); } private async BuildEncryptedExport( + activeUserId: UserId, organizationId: OrganizationId, collections: Collection[], ciphers: Cipher[], ): Promise<string> { - const orgKey = await this.keyService.getOrgKey(organizationId); - const encKeyValidation = await this.encryptService.encryptString(Utils.newGuid(), orgKey); + const orgKeys = await firstValueFrom(this.keyService.orgKeys$(activeUserId)); + const keyForEncryption: SymmetricCryptoKey = orgKeys?.[organizationId]; + if (keyForEncryption == null) { + throw new Error("No encryption key found for organization"); + } + const encKeyValidation = await this.encryptService.encryptString(newGuid(), keyForEncryption); const jsonDoc: BitwardenEncryptedOrgJsonExport = { encrypted: true, From 087e1a615517ca368e39b0fda5f79e85d058033c Mon Sep 17 00:00:00 2001 From: Danielle Flinn <43477473+danielleflinn@users.noreply.github.com> Date: Wed, 1 Oct 2025 16:00:47 -0700 Subject: [PATCH 09/14] [CL-866] Add default callout and update styles (#16481) * Updated callout styles * Added default callout variant * Refactored component to support icon + content variants (with no header) --------- Co-authored-by: Vicki League <vleague@bitwarden.com> Co-authored-by: Bryan Cunningham <bryan.cunningham@me.com> --- .../at-risk-password-callout.component.html | 1 - .../src/callout/callout.component.html | 38 +++++++++-------- .../src/callout/callout.component.spec.ts | 7 ++++ .../src/callout/callout.component.ts | 13 +++--- libs/components/src/callout/callout.mdx | 12 +++++- .../components/src/callout/callout.stories.ts | 41 ++++++++++++++++++- .../cipher-view/cipher-view.component.html | 1 - 7 files changed, 86 insertions(+), 27 deletions(-) diff --git a/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html index 16d9b6a322a..6c2bc3f77a0 100644 --- a/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html +++ b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html @@ -1,5 +1,4 @@ <bit-callout *ngIf="(pendingTasks$ | async)?.length as taskCount" type="warning" [title]="''"> - <i class="bwi bwi-exclamation-triangle tw-text-warning" aria-hidden="true"></i> <a bitLink [routerLink]="'/at-risk-passwords'"> {{ (taskCount === 1 ? "reviewAndChangeAtRiskPassword" : "reviewAndChangeAtRiskPasswordsPlural") diff --git a/libs/components/src/callout/callout.component.html b/libs/components/src/callout/callout.component.html index b98679766d5..e0fe0a182ea 100644 --- a/libs/components/src/callout/callout.component.html +++ b/libs/components/src/callout/callout.component.html @@ -1,24 +1,26 @@ <aside - class="tw-mb-4 tw-box-border tw-rounded-lg tw-bg-background tw-ps-3 tw-pe-3 tw-py-2 tw-leading-5 tw-text-main" - [ngClass]="calloutClass()" + class="tw-mb-4 tw-box-border tw-border tw-border-solid tw-rounded-lg tw-bg-background tw-ps-4 tw-pe-4 tw-py-3 tw-leading-5 tw-flex tw-gap-2" + [ngClass]="[calloutClass()]" [attr.aria-labelledby]="titleId" > - @if (titleComputed(); as title) { - <header - id="{{ titleId }}" - class="tw-mb-1 tw-mt-0 tw-text-base tw-font-semibold tw-flex tw-gap-2 tw-items-start" - > - @if (iconComputed(); as icon) { - <i - class="bwi !tw-text-main tw-relative tw-top-[3px]" - [ngClass]="[icon]" - aria-hidden="true" - ></i> - } - {{ title }} - </header> + @let title = titleComputed(); + @let icon = iconComputed(); + + @if (icon) { + <i + class="bwi tw-relative" + [ngClass]="[icon, title ? 'tw-top-[3px] tw-self-start' : 'tw-top-[1px]']" + aria-hidden="true" + ></i> } - <div class="tw-ps-6" bitTypography="body2"> - <ng-content></ng-content> + <div class="tw-flex tw-flex-col tw-gap-0.5"> + @if (title) { + <header id="{{ titleId }}" class="tw-text-base tw-font-semibold"> + {{ title }} + </header> + } + <div bitTypography="body2"> + <ng-content></ng-content> + </div> </div> </aside> diff --git a/libs/components/src/callout/callout.component.spec.ts b/libs/components/src/callout/callout.component.spec.ts index b7dfe29a643..e052395067d 100644 --- a/libs/components/src/callout/callout.component.spec.ts +++ b/libs/components/src/callout/callout.component.spec.ts @@ -56,5 +56,12 @@ describe("Callout", () => { expect(component.titleComputed()).toBe("Error"); expect(component.iconComputed()).toBe("bwi-error"); }); + + it("default", () => { + fixture.componentRef.setInput("type", "default"); + fixture.detectChanges(); + expect(component.titleComputed()).toBeUndefined(); + expect(component.iconComputed()).toBe("bwi-star"); + }); }); }); diff --git a/libs/components/src/callout/callout.component.ts b/libs/components/src/callout/callout.component.ts index 99a6c2aa123..62321a34d91 100644 --- a/libs/components/src/callout/callout.component.ts +++ b/libs/components/src/callout/callout.component.ts @@ -5,13 +5,14 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { SharedModule } from "../shared"; import { TypographyModule } from "../typography"; -export type CalloutTypes = "success" | "info" | "warning" | "danger"; +export type CalloutTypes = "success" | "info" | "warning" | "danger" | "default"; const defaultIcon: Record<CalloutTypes, string> = { success: "bwi-check-circle", info: "bwi-info-circle", warning: "bwi-exclamation-triangle", danger: "bwi-error", + default: "bwi-star", }; const defaultI18n: Partial<Record<CalloutTypes, string>> = { @@ -55,13 +56,15 @@ export class CalloutComponent { protected readonly calloutClass = computed(() => { switch (this.type()) { case "danger": - return "tw-bg-danger-100"; + return "tw-bg-danger-100 tw-border-danger-700 tw-text-danger-700"; case "info": - return "tw-bg-info-100"; + return "tw-bg-info-100 tw-bg-info-100 tw-border-info-700 tw-text-info-700"; case "success": - return "tw-bg-success-100"; + return "tw-bg-success-100 tw-bg-success-100 tw-border-success-700 tw-text-success-700"; case "warning": - return "tw-bg-warning-100"; + return "tw-bg-warning-100 tw-bg-warning-100 tw-border-warning-700 tw-text-warning-700"; + case "default": + return "tw-bg-background-alt tw-border-secondary-700 tw-text-secondary-700"; } }); } diff --git a/libs/components/src/callout/callout.mdx b/libs/components/src/callout/callout.mdx index a1254b3f691..297a2ffd0a3 100644 --- a/libs/components/src/callout/callout.mdx +++ b/libs/components/src/callout/callout.mdx @@ -41,6 +41,12 @@ automatically be checked. <Canvas of={stories.Info} /> +### Default + +Use for similar cases as the info callout but when content does not need to be as prominent. + +<Canvas of={stories.Default} /> + ### Warning Use a warning callout if the user is about to perform an action that may have unintended or @@ -67,4 +73,8 @@ Use the `role=”alert”` only if the callout is appearing on a page after the the content is static, do not use the alert role. This will cause a screen reader to announce the callout content on page load. -Ensure the title's color contrast remains WCAG compliant with the callout's background. +Ensure color contrast remains WCAG compliant with the callout's background. This is especially +important when adding `bit-link` or `bit-button` to the content area since the callout background is +colored. Currently only the `info` and `default` callouts are WCAG compliant for the `primary` +styling of these elements. The `secondary` `bit-link` styling may be used with the remaining +variants. diff --git a/libs/components/src/callout/callout.stories.ts b/libs/components/src/callout/callout.stories.ts index 4ac4191ce7e..c2185203034 100644 --- a/libs/components/src/callout/callout.stories.ts +++ b/libs/components/src/callout/callout.stories.ts @@ -1,6 +1,7 @@ import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LinkModule, IconModule } from "@bitwarden/components"; import { formatArgsForCodeSnippet } from "../../../../.storybook/format-args-for-code-snippet"; import { I18nMockService } from "../utils/i18n-mock.service"; @@ -12,6 +13,7 @@ export default { component: CalloutComponent, decorators: [ moduleMetadata({ + imports: [LinkModule, IconModule], providers: [ { provide: I18nService, @@ -69,6 +71,14 @@ export const Danger: Story = { }, }; +export const Default: Story = { + ...Info, + args: { + ...Info.args, + type: "default", + }, +}; + export const CustomIcon: Story = { ...Info, args: { @@ -80,6 +90,35 @@ export const CustomIcon: Story = { export const NoTitle: Story = { ...Info, args: { - icon: "bwi-star", + icon: "", + }, +}; + +export const NoTitleWithIcon: Story = { + render: (args) => ({ + props: args, + template: ` + <bit-callout ${formatArgsForCodeSnippet<CalloutComponent>(args)}>The content of the callout</bit-callout> + `, + }), + args: { + type: "default", + icon: "bwi-globe", + }, +}; + +export const WithTextButton: Story = { + render: (args) => ({ + props: args, + template: ` + <bit-callout ${formatArgsForCodeSnippet<CalloutComponent>(args)}> + <p class="tw-mb-2">The content of the callout</p> + <a bitLink> Visit the help center<i aria-hidden="true" class="bwi bwi-fw bwi-sm bwi-angle-right"></i> </a> + </bit-callout> + `, + }), + args: { + type: "default", + icon: "", }, }; diff --git a/libs/vault/src/cipher-view/cipher-view.component.html b/libs/vault/src/cipher-view/cipher-view.component.html index 62425bba7b3..b523c11c7e3 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.html +++ b/libs/vault/src/cipher-view/cipher-view.component.html @@ -12,7 +12,6 @@ </bit-callout> <bit-callout *ngIf="hasLoginUri && hadPendingChangePasswordTask" type="warning" [title]="''"> - <i class="bwi bwi-exclamation-triangle tw-text-warning" aria-hidden="true"></i> <a bitLink href="#" appStopClick (click)="launchChangePassword()"> {{ "changeAtRiskPassword" | i18n }} <i class="bwi bwi-external-link tw-ml-1" aria-hidden="true"></i> From f442baeba105f2fc5362f9e1e1904f0da2b1d0ab Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:36:09 +0200 Subject: [PATCH 10/14] Autosync the updated translations (#16693) 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 | 9 +- apps/browser/src/_locales/be/messages.json | 9 +- 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 | 9 +- apps/browser/src/_locales/cs/messages.json | 9 +- apps/browser/src/_locales/cy/messages.json | 9 +- apps/browser/src/_locales/da/messages.json | 9 +- apps/browser/src/_locales/de/messages.json | 75 ++++++++------- apps/browser/src/_locales/el/messages.json | 9 +- 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 | 9 +- apps/browser/src/_locales/fi/messages.json | 9 +- 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 | 91 ++++++++++--------- apps/browser/src/_locales/id/messages.json | 9 +- apps/browser/src/_locales/it/messages.json | 9 +- apps/browser/src/_locales/ja/messages.json | 9 +- 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 | 9 +- apps/browser/src/_locales/ml/messages.json | 9 +- apps/browser/src/_locales/mr/messages.json | 9 +- apps/browser/src/_locales/my/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/or/messages.json | 9 +- apps/browser/src/_locales/pl/messages.json | 9 +- 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 | 9 +- apps/browser/src/_locales/si/messages.json | 9 +- apps/browser/src/_locales/sk/messages.json | 9 +- apps/browser/src/_locales/sl/messages.json | 9 +- apps/browser/src/_locales/sr/messages.json | 9 +- apps/browser/src/_locales/sv/messages.json | 13 ++- apps/browser/src/_locales/ta/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 | 9 +- apps/browser/src/_locales/uk/messages.json | 9 +- apps/browser/src/_locales/vi/messages.json | 9 +- apps/browser/src/_locales/zh_CN/messages.json | 13 ++- apps/browser/src/_locales/zh_TW/messages.json | 21 +++-- apps/browser/store/locales/hu/copy.resx | 6 +- 62 files changed, 516 insertions(+), 211 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 397ea877cb5..84cece88d16 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 639e6c87d36..cc13e47a187 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Axtarışı sıfırla" }, - "archive": { - "message": "Arxivlə" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Arxivdən çıxart" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 44c82ef85b4..c5a94d223e2 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index a440690cee1..b9089a0e807 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Нулиране на търсенето" }, - "archive": { - "message": "Архивиране" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Изваждане от архива" diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index e7c4c36bce0..db306f0cfe6 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index d9003a749a6..c33d183c1e7 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 2002dfc467f..8abbf14100d 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Restableix la cerca" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 0638257d687..59d17582c3d 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Resetovat hledání" }, - "archive": { - "message": "Archivovat" + "archiveNoun": { + "message": "Archiv", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archivovat", + "description": "Verb" }, "unarchive": { "message": "Odebrat z archivu" diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 8756a138e81..f129b8ce771 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index a78ff26fb0f..452d9d9423c 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index f04ca5b11be..fc3707f03ee 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Suche zurücksetzen" }, - "archive": { - "message": "Archivieren" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Archivierung aufheben" @@ -563,7 +568,7 @@ "message": "Kein Eintrag im Archiv" }, "noItemsInArchiveDesc": { - "message": "Archivierte Einträge erscheinen hier und werden von allgemeinen Suchergebnissen und Autofill Vorschlägen ausgeschlossen." + "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Autofill-Vorschlägen ausgeschlossen." }, "itemSentToArchive": { "message": "Eintrag an das Archiv gesendet" @@ -575,7 +580,7 @@ "message": "Eintrag archivieren" }, "archiveItemConfirmDesc": { - "message": "Archivierte Einträge sind von allgemeinen Suchergebnissen und Autofill Vorschlägen ausgeschlossen. Sind Sie sicher, dass Sie diesen Eintrag archivieren möchten?" + "message": "Archivierte Einträge werden von allgemeinen Suchergebnissen und Autofill-Vorschlägen ausgeschlossen. Sind Sie sicher, dass Sie diesen Eintrag archivieren möchten?" }, "edit": { "message": "Bearbeiten" @@ -920,7 +925,7 @@ "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Folge den Schritten unten, um die Anmeldung mit deinem Sicherheitsschlüssel abzuschließen." + "message": "Folge den untenstehenden Schritten, um die Anmeldung mit deinem Sicherheitsschlüssel abzuschließen." }, "restartRegistration": { "message": "Registrierung neu starten" @@ -1096,7 +1101,7 @@ "message": "Speichern" }, "notificationViewAria": { - "message": "$ITEMNAME$ anzeigen, öffnet sich in neuem Fenster", + "message": "$ITEMNAME$ Ansicht, wird in einem neuen Fenster geöffnet", "placeholders": { "itemName": { "content": "$1" @@ -1105,7 +1110,7 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "Neuer Eintrag, öffnet sich in neuem Fenster", + "message": "Neuer Eintrag, wird in einem neuen Fenster geöffnet", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { @@ -1207,10 +1212,10 @@ "description": "Detailed error message shown when saving login details fails." }, "changePasswordWarning": { - "message": "Nachdem du dein Passwort geändert hast, musst du dich mit deinem neuen Passwort anmelden. Aktive Sitzungen auf anderen Geräten werden innerhalb einer Stunde abgemeldet." + "message": "Nachdem Sie Ihr Passwort geändert haben, müssen Sie sich mit Ihrem neuen Passwort anmelden. Aktive Sitzungen auf anderen Geräten werden innerhalb einer Stunde abgemeldet." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Ändere dein Master-Passwort, um die Kontowiederherstellung abzuschließen." + "message": "Ändern Sie Ihr Master-Passwort, um die Konto­wiederherstellung abzuschließen." }, "enableChangedPasswordNotification": { "message": "Nach dem Aktualisieren bestehender Zugangsdaten fragen" @@ -1405,7 +1410,7 @@ "message": "Funktion nicht verfügbar" }, "legacyEncryptionUnsupported": { - "message": "Die veraltete Verschlüsselung wird nicht mehr unterstützt. Bitte kontaktiere den Support, um dein Konto wiederherzustellen." + "message": "Alte Verschlüsselung wird nicht mehr unterstützt. Bitte wenden Sie sich an den Support, um Ihr Konto wiederherzustellen." }, "premiumMembership": { "message": "Premium-Mitgliedschaft" @@ -1636,10 +1641,10 @@ "message": "Vorschläge zum Auto-Ausfüllen" }, "autofillSpotlightTitle": { - "message": "Auto-Ausfüllen-Vorschläge einfach finden" + "message": "Autofill-Vorschläge leicht finden" }, "autofillSpotlightDesc": { - "message": "Deaktiviere die Auto-Ausfüllen-Einstellungen deines Browsers, damit sie nicht mit Bitwarden in Konflikt geraten." + "message": "Deaktivieren Sie die Autofill-Einstellungen des Browsers, damit sie nicht mit Bitwarden in Konflikt geraten." }, "turnOffBrowserAutofill": { "message": "$BROWSER$ Auto-Ausfüllen deaktivieren", @@ -1782,7 +1787,7 @@ "message": "Dieses Pop-up Fenster wird geschlossen, wenn du außerhalb des Fensters klickst um in deinen E-Mails nach dem Verifizierungscode zu suchen. Möchtest du, dass dieses Pop-up in einem separaten Fenster geöffnet wird, damit es nicht geschlossen wird?" }, "showIconsChangePasswordUrls": { - "message": "Website Symbole anzeigen und URLs zum Ändern von Passwörtern abrufen" + "message": "Website-Symbole anzeigen und URLs zum Ändern von Passwörtern abrufen" }, "cardholderName": { "message": "Name des Karteninhabers" @@ -2227,7 +2232,7 @@ "message": "Gebe deinen PIN-Code für das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurückgesetzt, wenn du dich vollständig von der Anwendung abmeldest." }, "setPinCode": { - "message": "Du kannst diese PIN verwenden, um Bitwarden zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich vollständig aus der Anwendung abmeldest." + "message": "Sie können diese PIN verwenden, um Bitwarden zu entsperren. Ihre PIN wird zurückgesetzt, wenn Sie sich jemals vollständig von der Anwendung abmelden." }, "pinRequired": { "message": "PIN-Code ist erforderlich." @@ -2561,7 +2566,7 @@ "message": "Karten-Eintragstypen können nicht importiert werden" }, "restrictCardTypeImportDesc": { - "message": "Eine von einer oder mehreren Organisationen festgelegte Richtlinie verhindert, dass du Karten in deinen Tresor importieren kannst." + "message": "Eine von 1 oder mehreren Organisationen festgelegte Richtlinie verhindert den Import von Karten in Ihre Tresore." }, "domainsTitle": { "message": "Domains", @@ -2645,7 +2650,7 @@ } }, "atRiskChangePrompt": { - "message": "Dein Passwort für diese Website ist gefährdet. $ORGANIZATION$ hat darum gebeten, dass du es änderst.", + "message": "Ihr Passwort für diese Website ist gefährdet. $ORGANIZATION$ hat Sie aufgefordert, es zu ändern.", "placeholders": { "organization": { "content": "$1", @@ -2655,7 +2660,7 @@ "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." }, "atRiskNavigatePrompt": { - "message": "$ORGANIZATION$ möchte, dass du dieses Passwort änderst, da es gefährdet ist. Wechsel zu deinen Kontoeinstellungen, um das Passwort zu ändern.", + "message": "$ORGANIZATION$ möchte, dass Sie dieses Passwort ändern, da es gefährdet ist. Gehen Sie zu Ihren Kontoeinstellungen, um das Passwort zu ändern.", "placeholders": { "organization": { "content": "$1", @@ -3538,7 +3543,7 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "Du hast einen Anmeldeversuch von einem anderen Gerät abgelehnt. Wenn du das wirklich warst, versuche dich erneut mit dem Gerät anzumelden." + "message": "Sie haben einen Versuch mit Zugangsdaten von einem anderen Gerät abgelehnt. Wenn Sie das waren, versuchen Sie, sich mit dem Gerät erneut anzumelden." }, "device": { "message": "Gerät" @@ -3752,7 +3757,7 @@ "message": "Anmeldung kann nicht abgeschlossen werden" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "Du musst dich auf einem vertrauenswürdigen Gerät anmelden oder deinem Administrator bitten, dir ein Passwort zuzuweisen." + "message": "Sie müssen sich auf einem vertrauenswürdigen Gerät anmelden oder Ihren Administrator bitten, Ihnen ein Passwort zuzuweisen." }, "ssoIdentifierRequired": { "message": "SSO-Kennung der Organisation erforderlich." @@ -3828,13 +3833,13 @@ "message": "Organisation ist nicht vertrauenswürdig" }, "emergencyAccessTrustWarning": { - "message": "Bestätige zur Sicherheit deines Kontos nur, wenn du den Notfallzugriff diesem Benutzer gewährt hast und sein Fingerabdruck mit dem übereinstimmt, was in seinem Konto angezeigt wird" + "message": "Zur Sicherheit Ihres Kontos bestätigen Sie nur, wenn Sie diesem Benutzer Notfallzugriff gewährt haben und sein Fingerabdruck mit dem in seinem Konto angezeigten übereinstimmt" }, "orgTrustWarning": { - "message": "Fahre zur Sicherheit deines Kontos nur fort, wenn du ein Mitglied dieser Organisation bist, die Kontowiederherstellung aktiviert hast und der unten angezeigte Fingerabdruck mit dem Fingerabdruck der Organisation übereinstimmt." + "message": "Zur Sicherheit Ihres Kontos fahren Sie nur fort, wenn Sie Mitglied dieser Organisation sind, die Kontowiederherstellung aktiviert haben und der unten angezeigte Fingerabdruck mit dem Fingerabdruck der Organisation übereinstimmt." }, "orgTrustWarning1": { - "message": "Diese Organisation hat eine Unternehmensrichtlinie, die dich für die Kontowiederherstellung registriert. Die Registrierung wird es den Administratoren der Organisation erlauben, dein Passwort zu ändern. Fahre nur fort, wenn du diese Organisation kennst und die unten angezeigte Fingerabdruck-Phrase mit der der Organisation übereinstimmt." + "message": "Diese Organisation hat eine Enterprise-Richtlinie, die Sie in die Kontowiederherstellung registriert. Die Registrierung ermöglicht es den Administratoren der Organisation, Ihr Passwort zu ändern. Fahren Sie nur fort, wenn Sie diese Organisation erkennen und die unten angezeigte Fingerabdruck-Phrase mit dem Fingerabdruck der Organisation übereinstimmt." }, "trustUser": { "message": "Benutzer vertrauen" @@ -5536,7 +5541,7 @@ "message": "Jetzt importieren" }, "hasItemsVaultNudgeTitle": { - "message": "Willkommen in deinem Tresor!" + "message": "Willkommen in Ihrem Tresor!" }, "phishingPageTitle": { "message": "Phishing Webseite" @@ -5557,7 +5562,7 @@ "message": "Favoriten-Einträge für einfachen Zugriff" }, "hasItemsVaultNudgeBodyThree": { - "message": "Deinen Tresor nach etwas anderem durchsuchen" + "message": "Durchsuchen Sie Ihren Tresor nach etwas anderem" }, "newLoginNudgeTitle": { "message": "Spare Zeit mit Auto-Ausfüllen" @@ -5581,30 +5586,30 @@ "message": "Nahtlose Online-Kaufabwicklung" }, "newCardNudgeBody": { - "message": "Mit Karten kannst du Zahlungsformulare sicher und präzise einfach automatisch ausfüllen." + "message": "Mit Karten können Sie Zahlungsformulare einfach, sicher und genau automatisch ausfüllen." }, "newIdentityNudgeTitle": { "message": "Erstellung von Konten vereinfachen" }, "newIdentityNudgeBody": { - "message": "Mit Identitäten kannst du lange Registrierungs- oder Kontaktformulare schnell automatisch ausfüllen." + "message": "Mit Identitäten können Sie lange Registrierungs- oder Kontaktformulare schnell per Autofill ausfüllen." }, "newNoteNudgeTitle": { - "message": "Bewahre deine sensiblen Daten sicher auf" + "message": "Halten Sie Ihre sensiblen Daten sicher" }, "newNoteNudgeBody": { - "message": "Mit Notizen speicherst du sensible Daten wie Bank- oder Versicherungs-Informationen." + "message": "Mit Notizen können Sie sensible Daten wie Bank- oder Versicherungsdaten sicher speichern." }, "newSshNudgeTitle": { "message": "Entwickler-freundlicher SSH-Zugriff" }, "newSshNudgeBodyOne": { - "message": "Speicher deine Schlüssel und verbinden dich mit dem SSH-Agenten für eine schnelle und verschlüsselte Authentifizierung.", + "message": "Speichern Sie Ihre Schlüssel und verbinden Sie sich mit dem SSH-Agenten für eine schnelle, verschlüsselte Authentifizierung.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Erfahre mehr über den SSH-Agenten", + "message": "Erfahren Sie mehr über den SSH-Agenten", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, @@ -5617,25 +5622,25 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": ", um dir zu helfen, deine Zugangsdaten sicher zu halten.", + "message": "damit Sie Ihre Zugangsdaten sicher halten können.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Generiere ganz einfach starke und einzigartige Passwörter, indem du auf den \"Passwort generieren\"-Button klickst, um dir zu helfen, deine Zugangsdaten sicher zu halten.", + "message": "Erstellen Sie ganz einfach starke und eindeutige Passwörter, indem Sie auf die Schaltfläche ‚Passwort generieren‘ klicken, damit Sie Ihre Zugangsdaten sicher halten können.", "description": "Aria label for the body content of the generator nudge" }, "aboutThisSetting": { "message": "Über diese Einstellung" }, "permitCipherDetailsDescription": { - "message": "Bitwarden wird gespeicherte Login-URIs verwenden, um zu ermitteln, welches Symbol oder welche URL zum Ändern des Passworts verwendet werden soll, um Ihr Erlebnis zu verbessern. Bei der Nutzung dieses Dienstes werden keine Informationen erfasst oder gespeichert." + "message": "Bitwarden verwendet gespeicherte Zugangsdaten-URIs, um zu bestimmen, welches Symbol oder welche Passwort-Ändern-URL verwendet werden soll, um Ihr Erlebnis zu verbessern. Es werden keine Informationen erfasst oder gespeichert, wenn Sie diesen Dienst nutzen." }, "noPermissionsViewPage": { - "message": "Du hast keine Berechtigung, diese Seite anzuzeigen. Versuche dich mit einem anderen Konto anzumelden." + "message": "Sie haben keine Berechtigung, diese Seite anzusehen. Versuchen Sie, sich mit einem anderen Konto anzumelden." }, "wasmNotSupported": { - "message": "WebAssembly wird von deinem Browser nicht unterstützt oder ist nicht aktiviert. WebAssembly wird benötigt, um die Bitwarden-App nutzen zu können.", + "message": "WebAssembly wird in Ihrem Browser nicht unterstützt oder ist nicht aktiviert. WebAssembly ist erforderlich, um die Bitwarden-App zu verwenden.", "description": "'WebAssembly' is a technical term and should not be translated." }, "showMore": { diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index cce3e0ea39f..9c23b511611 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Επαναφορά αναζήτησης" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 43bb17c297f..be548498512 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 59c4966a48c..b6f175afcfe 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index d3c6e3556a0..95d31915e2d 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Restablecer búsqueda" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 5508a1cee72..e50aad7c70f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 93242263dc0..a6abe270e38 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 129f2ee383a..d8634a88bd0 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 5de1d9fe7e4..cfe4bc3504d 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Nollaa haku" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 600abfb2d4e..678cf714915 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 765ebff53c5..031bca7c44c 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Réinitialiser la recherche" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index c2573ea6bfa..217c3d37176 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 38fe3618610..d2a8db5fdd7 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "אפס חיפוש" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 1575543aef3..35e69470e4c 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "खोज रीसेट करें" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 4f67de34071..bb76ea74b82 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Ponovno postavljanje pretraživanja" }, - "archive": { - "message": "Arhiviraj" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Poništi arhiviranje" diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 864580a64b0..6717b18d38e 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Keresés visszaállítása" }, - "archive": { - "message": "Archívum" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Visszavétel archívumból" @@ -1654,7 +1659,7 @@ "message": "Automat kitöltés bekapcsolása" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Automatikus kitöltési javaslatok megjelenítése űrlapmezőknél" }, "showInlineMenuIdentitiesLabel": { "message": "Az identitások megjelenítése javaslatként" @@ -1663,10 +1668,10 @@ "message": "A kártyák megjelenítése javaslatként" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Javaslatok megjelenítése a az ikon kiválasztásakor" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "Minden bejelentkezett fiókra vonatkozik." }, "turnOffBrowserBuiltInPasswordManagerSettings": { "message": "Az ütközések elkerülése érdekében kapcsoljuk ki a böngésző beépített jelszókezelő beállításait." @@ -1679,7 +1684,7 @@ "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { - "message": "When field is selected (on focus)", + "message": "Amikor a mező kiválasztásra kerül (fókuszoláskor)", "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { @@ -1687,7 +1692,7 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "Automatikus kitöltés az oldal betöltésénél" }, "enableAutoFillOnPageLoad": { "message": "Automatikus kitöltés engedélyezése oldal betöltéskor" @@ -1699,7 +1704,7 @@ "message": "Az oldalbetöltésnél automatikus kitöltést a feltört vagy nem megbízhatató weboldalak kihasználhatják." }, "learnMoreAboutAutofillOnPageLoadLinkText": { - "message": "Learn more about risks" + "message": "Bővebben a kockázatokról" }, "learnMoreAboutAutofill": { "message": "További információk az automatikus kitöltésről" @@ -2423,7 +2428,7 @@ "message": "Az új mesterjelszó nem felel meg a szabály követelményeknek." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "Tanácsokat, bejelentéseket, kutatási lehetőségeket kaphat a Bitwarden-től a postaládájába." }, "unsubscribe": { "message": "Leiratkozás" @@ -2459,10 +2464,10 @@ "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "Hozzáférési Token Frissítés Hiba" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "Nem található token vagy API kulcs. Próbáljon meg ki-, majd újra bejelentkezni." }, "desktopSyncVerificationTitle": { "message": "Asztali szinkronizálás ellenőrzés" @@ -3583,7 +3588,7 @@ "message": "A szervezeti szabályzat bekapcsolta az automatikus kitöltést az oldalbetöltéskor." }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "message": "Válasszon ki egy elemet a képernyőről, használja a $COMMAND$ kombinációt, vagy tekintse meg a többi lehetőséget a beállításokban.", "placeholders": { "command": { "content": "$1", @@ -3592,7 +3597,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this screen, or explore other options in settings." + "message": "Válasszon ki egy elemet a képernyőről, vagy tekintse meg a többi lehetőséget a beállításokban." }, "gotIt": { "message": "Rendben" @@ -3601,10 +3606,10 @@ "message": "Automatikus kitöltés beállítások" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Automatikus kitöltés gyorselérés" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "Billentyűparancs változtatás" }, "autofillKeyboardManagerShortcutsLabel": { "message": "Bullenytűparancsok kezelése" @@ -3971,17 +3976,17 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Oldalnavigáció váltás" }, "skipToContent": { "message": "Ugrás a tartalomra" }, "bitwardenOverlayButton": { - "message": "Bitwarden autofill menu button", + "message": "Bitwarden automatikus kitöltés menü gomb", "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { - "message": "Toggle Bitwarden autofill menu", + "message": "Bitwarden automatikus kitöltés menü váltás", "description": "Screen reader and tool tip label for the overlay button" }, "bitwardenVault": { @@ -3989,7 +3994,7 @@ "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { - "message": "Unlock your account to view matching logins", + "message": "Az összeillő belépések megtekintéséhez oldja fel fiókját", "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { @@ -4057,7 +4062,7 @@ "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Bitwarden autofill menu available. Press the down arrow key to select.", + "message": "Bitwarden automatikus kitöltés menü elérhető. Nyomja meg a lefele nyilat a kiválasztáshoz.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -4143,7 +4148,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "Hiba a Duo szolgáltatáshoz való kapcsolódáskor. Használjon másféle kétlépcsős bejelentkezést, vagy keresse fel a Duo ügyfélszolgálatot." }, "duoRequiredForAccount": { "message": "A fiókhoz kétlépcsős DUO bejelentkezés szükséges." @@ -4439,27 +4444,27 @@ "description": "Advanced option placeholder for uri option component" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "Továbblépés a böngésző beállításokhoz?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continue to Help Center?", + "message": "Továbblépés a Segítség Központba?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "A böngésző automatikus kitöltés és jelszókezelési beállításainak módosítása.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Megtekintheti vagy beállíthatja a bővítmény billentyűparancsokat a böngésző beállításoknál.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "A böngésző automatikus kitöltési és jelszókezelési beállításainak módosítása.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Megtekintheti vagy beállíthatja a bővítmény billentyűparancsokat a böngésző beállításoknál.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -4639,7 +4644,7 @@ "message": "Nincsenek másolandó értékek." }, "assignToCollections": { - "message": "Assign to collections" + "message": "Hozzárendelés gyűjteményhez" }, "copyEmail": { "message": "Email cím másolása" @@ -4702,7 +4707,7 @@ } }, "itemsWithNoFolder": { - "message": "Items with no folder" + "message": "Be nem mappázott elemek" }, "itemDetails": { "message": "Elem részletek" @@ -4711,7 +4716,7 @@ "message": "Elem neve" }, "organizationIsDeactivated": { - "message": "Organization is deactivated" + "message": "A szervezet deaktiválásra került" }, "owner": { "message": "Tulajdonos" @@ -4721,7 +4726,7 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { - "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + "message": "A deaktivált szervezetek elemeit nem lehet elérni. Keresse fel további segítségért a szervezet tulajdonosát." }, "additionalInformation": { "message": "További információ" @@ -4949,7 +4954,7 @@ "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { - "message": "Assign" + "message": "Hozzárendelés" }, "bulkCollectionAssignmentDialogDescriptionSingular": { "message": "Csak az ezekhez a gyűjteményekhez hozzáféréssel rendelkező szervezeti tagok láthatják az elemet." @@ -4958,7 +4963,7 @@ "message": "Csak az ezekhez a gyűjteményekhez hozzáféréssel rendelkező szervezeti tagok láthatják az elemeket." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "$TOTAL_COUNT$ elemeket jelölt ki. Nem frissítheti a $READONLY_COUNT$ részét, mert nem rendelkezik szerkesztési jogosultsággal.", "placeholders": { "total_count": { "content": "$1", @@ -5056,13 +5061,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "A hozzárendeléshez jelöljön ki gyűjteményeket" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 elem véglegesen áthelyezésre kerül a szervezethez. Többé nem Önhöz fog tartozni az elem." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ elemek véglegesen áthelyezésre kerülnek a kiválasztott szervezethez. Többé nem Önhöz fognak tartozni az elemek.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5071,7 +5076,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "Ez az 1 elem véglegesen áthelyezésre kerül a $ORG$ szervezethez. Többé nem az Öné lesz az elem.", "placeholders": { "org": { "content": "$1", @@ -5080,7 +5085,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ elem véglegesen áthelyezésre kerül a $ORG$ szervezethez. Többé nem az Öné lesz az elem.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5093,13 +5098,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Sikerült a gyűjteményhez való hozzárendelés" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Nem választott ki semmit." }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Elemek áthelyezve a $ORGNAME$ szervezethez", "placeholders": { "orgname": { "content": "$1", @@ -5108,7 +5113,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Elem áthelyezve a $ORGNAME$ szervezethez", "placeholders": { "orgname": { "content": "$1", @@ -5269,7 +5274,7 @@ "message": "Feloldás biometrikusan" }, "authenticating": { - "message": "Authenticating" + "message": "Hitelesítés" }, "fillGeneratedPassword": { "message": "Generált jelszó kitöltés", diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index b38b6f05628..9d3c2817bf1 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Atur ulang pencarian" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index df4411ee42b..ccabe3cb55c 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Svuota ricerca" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 5305a265781..df19cf23bc3 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index b759d674cca..b0c65bc8a37 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 1311a97df68..94f276e5b73 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 06611be0282..bffa0c34ee6 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 464fa5aae92..55555fe9b4f 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 99edb486d9d..a70aded2ed1 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Atiestatīt meklēšanu" }, - "archive": { - "message": "Arhivēt" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Atcelt arhivēšanu" diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index efe18c96a59..4ebcd08bb77 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 16ac31ff599..4bc66b4e85b 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index a23fd7fe4c1..113c28c65d3 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 2562b7a1d4c..155886506b0 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Zoekopdracht resetten" }, - "archive": { - "message": "Archiveren" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Dearchiveren" @@ -3432,10 +3437,10 @@ "message": "Premium-abonnement vereist" }, "organizationIsDisabled": { - "message": "Organisatie is uitgeschakeld." + "message": "Organisatie opgeschort." }, "disabledOrganizationFilterError": { - "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." + "message": "Je kunt items in opgeschorte organisaties niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." }, "loggingInTo": { "message": "Inloggen op $DOMAIN$", diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index f24e790c9ad..e455a0c7d2e 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Zresetuj wyszukiwanie" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Usuń z archiwum" diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 2d7dd1e42a4..0161aa77ea7 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index acc5b5332f9..cc90d7653c9 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Repor pesquisa" }, - "archive": { - "message": "Arquivar" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Desarquivar" diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index d184460e293..4cc552b11ab 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 17133350e3f..49cdcf62161 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Сбросить поиск" }, - "archive": { - "message": "Архив" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Разархивировать" diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 2fd8f53e148..6153cb49b6e 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index d0e143cce4a..da1ba9427ea 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Resetovať vyhľadávanie" }, - "archive": { - "message": "Archivovať" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Zrušiť archiváciu" diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 81b1a6bb52c..596ee118eab 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 269ebd41bdd..c3c9cac383d 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Ресетовати претрагу" }, - "archive": { - "message": "Архива" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Врати из архиве" diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 8b0263bf15a..02b334d9412 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Nollställ sökning" }, - "archive": { - "message": "Arkivera" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Packa upp" @@ -566,10 +571,10 @@ "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, "itemSentToArchive": { - "message": "Item sent to archive" + "message": "Objekt skickat till arkiv" }, "itemRemovedFromArchive": { - "message": "Item removed from archive" + "message": "Objekt borttaget från arkiv" }, "archiveItem": { "message": "Arkivera objekt" diff --git a/apps/browser/src/_locales/ta/messages.json b/apps/browser/src/_locales/ta/messages.json index 8d2199db6ca..c5a13db193e 100644 --- a/apps/browser/src/_locales/ta/messages.json +++ b/apps/browser/src/_locales/ta/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "தேடலை மீட்டமை" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 78a49021a0c..9646960000a 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 61f97564f6a..4eed06d0a9a 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Reset search" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 0b65ae7d476..f2acc401a2c 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Aramayı sıfırla" }, - "archive": { - "message": "Arşivle" + "archiveNoun": { + "message": "Arşiv", + "description": "Noun" + }, + "archiveVerb": { + "message": "Arşivle", + "description": "Verb" }, "unarchive": { "message": "Arşivden çıkar" diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index f088e610051..a99c585978b 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Скинути пошук" }, - "archive": { - "message": "Архівувати" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Видобути" diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 06920433037..3a11f0f237f 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "Đặt lại tìm kiếm" }, - "archive": { - "message": "Lưu trữ" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Hủy lưu trữ" diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index eb3cf1aa901..77a3855633c 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "重置搜索" }, - "archive": { - "message": "归档" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "取消归档" @@ -1134,7 +1139,7 @@ "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "选择 $ITEMTYPE$,$ITEMNAME$", + "message": "选择 $ITEMNAME$ 中的 $ITEMTYPE$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -4622,7 +4627,7 @@ } }, "copyFieldCipherName": { - "message": "复制 $CIPHERNAME$ 的 $FIELD$", + "message": "复制 $CIPHERNAME$ 中的 $FIELD$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index f5801fb2c7d..23564473318 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -550,8 +550,13 @@ "resetSearch": { "message": "重設搜尋" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" @@ -3541,7 +3546,7 @@ "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." }, "device": { - "message": "Device" + "message": "裝置" }, "loginStatus": { "message": "Login status" @@ -3640,7 +3645,7 @@ "message": "記住此裝置來讓未來的登入體驗更簡易" }, "manageDevices": { - "message": "Manage devices" + "message": "管理裝置" }, "currentSession": { "message": "Current session" @@ -3683,7 +3688,7 @@ "message": "Needs approval" }, "devices": { - "message": "Devices" + "message": "裝置" }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", @@ -3704,7 +3709,7 @@ "message": "Time" }, "deviceType": { - "message": "Device Type" + "message": "裝置類型" }, "loginRequest": { "message": "Login request" @@ -5434,10 +5439,10 @@ "message": "擴充套件寬度" }, "wide": { - "message": "寬度" + "message": "寬" }, "extraWide": { - "message": "更寬" + "message": "超寬" }, "sshKeyWrongPassword": { "message": "The password you entered is incorrect." diff --git a/apps/browser/store/locales/hu/copy.resx b/apps/browser/store/locales/hu/copy.resx index 814ebabaada..e3a5c733eb5 100644 --- a/apps/browser/store/locales/hu/copy.resx +++ b/apps/browser/store/locales/hu/copy.resx @@ -118,10 +118,10 @@ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Name" xml:space="preserve"> - <value>Bitwarden Password Manager</value> + <value>Bitwarden Jelszókezelő</value> </data> <data name="Summary" xml:space="preserve"> - <value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value> + <value>Legyen otthon, munkában, vagy úton, a Bitwarden könnyen biztosítja jelszavát, kulcsait, és kényes információit.</value> </data> <data name="Description" xml:space="preserve"> <value>Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! @@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga </value> </data> <data name="AssetTitle" xml:space="preserve"> - <value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value> + <value>Legyen otthon, munkában, vagy úton, a Bitwarden könnyen biztosítja jelszavát, kulcsait, és kényes információit.</value> </data> <data name="ScreenshotSync" xml:space="preserve"> <value>A széf szinkronizálása és elérése több eszközön.</value> From 3ec9087e7e09c881dbb8c3626d644a8b0b0f41f9 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:41:47 +0200 Subject: [PATCH 11/14] Autosync the updated translations (#16692) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/af/messages.json | 25 +++++-- apps/desktop/src/locales/ar/messages.json | 25 +++++-- apps/desktop/src/locales/az/messages.json | 25 +++++-- apps/desktop/src/locales/be/messages.json | 25 +++++-- apps/desktop/src/locales/bg/messages.json | 25 +++++-- apps/desktop/src/locales/bn/messages.json | 25 +++++-- apps/desktop/src/locales/bs/messages.json | 25 +++++-- apps/desktop/src/locales/ca/messages.json | 29 +++++--- apps/desktop/src/locales/cs/messages.json | 25 +++++-- apps/desktop/src/locales/cy/messages.json | 25 +++++-- apps/desktop/src/locales/da/messages.json | 25 +++++-- apps/desktop/src/locales/de/messages.json | 77 +++++++++++--------- apps/desktop/src/locales/el/messages.json | 25 +++++-- apps/desktop/src/locales/en_GB/messages.json | 25 +++++-- apps/desktop/src/locales/en_IN/messages.json | 25 +++++-- apps/desktop/src/locales/eo/messages.json | 25 +++++-- apps/desktop/src/locales/es/messages.json | 25 +++++-- apps/desktop/src/locales/et/messages.json | 25 +++++-- apps/desktop/src/locales/eu/messages.json | 25 +++++-- apps/desktop/src/locales/fa/messages.json | 25 +++++-- apps/desktop/src/locales/fi/messages.json | 25 +++++-- apps/desktop/src/locales/fil/messages.json | 25 +++++-- apps/desktop/src/locales/fr/messages.json | 25 +++++-- apps/desktop/src/locales/gl/messages.json | 25 +++++-- apps/desktop/src/locales/he/messages.json | 25 +++++-- apps/desktop/src/locales/hi/messages.json | 25 +++++-- apps/desktop/src/locales/hr/messages.json | 25 +++++-- apps/desktop/src/locales/hu/messages.json | 25 +++++-- apps/desktop/src/locales/id/messages.json | 25 +++++-- apps/desktop/src/locales/it/messages.json | 25 +++++-- apps/desktop/src/locales/ja/messages.json | 25 +++++-- apps/desktop/src/locales/ka/messages.json | 25 +++++-- apps/desktop/src/locales/km/messages.json | 25 +++++-- apps/desktop/src/locales/kn/messages.json | 25 +++++-- apps/desktop/src/locales/ko/messages.json | 25 +++++-- apps/desktop/src/locales/lt/messages.json | 25 +++++-- apps/desktop/src/locales/lv/messages.json | 25 +++++-- apps/desktop/src/locales/me/messages.json | 25 +++++-- apps/desktop/src/locales/ml/messages.json | 25 +++++-- apps/desktop/src/locales/mr/messages.json | 25 +++++-- apps/desktop/src/locales/my/messages.json | 25 +++++-- apps/desktop/src/locales/nb/messages.json | 25 +++++-- apps/desktop/src/locales/ne/messages.json | 25 +++++-- apps/desktop/src/locales/nl/messages.json | 25 +++++-- apps/desktop/src/locales/nn/messages.json | 25 +++++-- apps/desktop/src/locales/or/messages.json | 25 +++++-- apps/desktop/src/locales/pl/messages.json | 25 +++++-- apps/desktop/src/locales/pt_BR/messages.json | 25 +++++-- apps/desktop/src/locales/pt_PT/messages.json | 25 +++++-- apps/desktop/src/locales/ro/messages.json | 25 +++++-- apps/desktop/src/locales/ru/messages.json | 25 +++++-- apps/desktop/src/locales/si/messages.json | 25 +++++-- apps/desktop/src/locales/sk/messages.json | 25 +++++-- apps/desktop/src/locales/sl/messages.json | 25 +++++-- apps/desktop/src/locales/sr/messages.json | 25 +++++-- apps/desktop/src/locales/sv/messages.json | 25 +++++-- apps/desktop/src/locales/ta/messages.json | 25 +++++-- apps/desktop/src/locales/te/messages.json | 25 +++++-- apps/desktop/src/locales/th/messages.json | 25 +++++-- apps/desktop/src/locales/tr/messages.json | 25 +++++-- apps/desktop/src/locales/uk/messages.json | 25 +++++-- apps/desktop/src/locales/vi/messages.json | 25 +++++-- apps/desktop/src/locales/zh_CN/messages.json | 27 +++++-- apps/desktop/src/locales/zh_TW/messages.json | 27 +++++-- 64 files changed, 1182 insertions(+), 478 deletions(-) diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index e579c498ded..128a2e81864 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 4efec524886..3dacae24389 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 9618bafca3e..27b94d34ee7 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Daha az göstər" }, - "enableAutotype": { - "message": "Avto-yazmanı fəallaşdır" - }, "enableAutotypeDescription": { "message": "Bitwarden, giriş yerlərini doğrulamır, qısayolu istifadə etməzdən əvvəl doğru pəncərədə və xanada olduğunuza əmin olun." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Daha çox naviqasiya yolu", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Təsdiqlə" }, - "enableAutotypeTransitionKey": { - "message": "Avto-yazma qısayolunu fəallaşdır" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Veriləri yanlış yerə doldurmamaq üçün qısayolu istifadə etməzdən əvvəl doğru xanada olduğunuza əmin olun." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Qısayola düzəliş et" }, - "archive": { - "message": "Arxivlə" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Arxivdən çıxart" diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index eb5971c97af..475ef8805f8 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index e32363f0c55..c40afa02073 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Показване на по-малко" }, - "enableAutotype": { - "message": "Включване на автоматичното въвеждане" - }, "enableAutotypeDescription": { "message": "Битуорден не проверява местата за въвеждане, така че се уверете, че сте в правилния прозорец, преди да ползвате клавишната комбинация." }, + "typeShortcut": { + "message": "Комбинация за въвеждане" + }, + "editAutotypeShortcutDescription": { + "message": "Използвайте един или повече от модификаторите Ctrl, Alt, Win или Shift, заедно с някоя буква." + }, + "invalidShortcut": { + "message": "Неправилна комбинация" + }, "moreBreadcrumbs": { "message": "Още елементи в пътечката", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Потвърждаване" }, - "enableAutotypeTransitionKey": { - "message": "Включване на клавишната комбинация за автоматично попълване" + "enableAutotypeShortcutPreview": { + "message": "Включване на комбинация за автоматично попълване (Функционалност в изпитание)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Уверете се, че сет в правилното поле, преди да използвате комбинацията, за да избегнете попълването на данните на грешното място." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Редактиране на комбинацията" }, - "archive": { - "message": "Архивиране" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Изваждане от архива" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 60b925af2e3..c5dc6f5372f 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index e6cdff50696..b484970d59a 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 0defa7a878a..e3864cd7cc9 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2371,7 +2371,7 @@ "message": "Autenticar WebAuthn" }, "readSecurityKey": { - "message": "Llegeix clau de seguretat" + "message": "Llig la clau de seguretat" }, "awaitingSecurityKeyInteraction": { "message": "S'està esperant la interacció amb la clau de seguretat..." @@ -2887,7 +2887,7 @@ } }, "forwarderNoDomain": { - "message": "Domini de $SERVICENAME$ invàlid.", + "message": "Domini de $SERVICENAME$ no vàlid.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 2c5ed437187..d0539502661 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Zobrazit méně" }, - "enableAutotype": { - "message": "Povolit automatický zápis" - }, "enableAutotypeDescription": { "message": "Bitwarden neověřuje umístění vstupu. Před použitím zkratky se ujistěte, že jste ve správném okně a poli." }, + "typeShortcut": { + "message": "Napsat zkratku" + }, + "editAutotypeShortcutDescription": { + "message": "Zahrňte jeden nebo dva z následujících modifikátorů: Ctrl, Alt, Win nebo Shift a písmeno." + }, + "invalidShortcut": { + "message": "Neplatná zkratka" + }, "moreBreadcrumbs": { "message": "Více...", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Potvrdit" }, - "enableAutotypeTransitionKey": { - "message": "Povolit zkratku automatického psaní" + "enableAutotypeShortcutPreview": { + "message": "Povolit zkratku Autotype (náhled funkce)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Před použitím zkratky se ujistěte, že jste ve správném poli, abyste se vyhnuli vyplnění dat na nesprávné místo." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Upravit zkratku" }, - "archive": { - "message": "Archivovat" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Odebrat z archivu" diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 9ff42bfa2c7..77063607b47 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 4a064a004cb..dcbd21d3fe9 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 47b3bad34e8..094024f1a3f 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -449,7 +449,7 @@ "message": "Feld bearbeiten" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Bist du sicher, dass du diesen Anhang dauerhaft löschen möchtest?" + "message": "Sind Sie sicher, dass Sie diesen Anhang dauerhaft löschen möchten?" }, "fieldType": { "message": "Feldtyp" @@ -703,10 +703,10 @@ "message": "Anhang gespeichert" }, "addAttachment": { - "message": "Add attachment" + "message": "Anhang hinzufügen" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "Die maximale Dateigröße beträgt 500 MB" }, "file": { "message": "Datei" @@ -1303,7 +1303,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Website-Symbole anzeigen und URLs zum Ändern von Passwörtern abrufen" }, "enableMinToTray": { "message": "In Infobereich-Symbol minimieren" @@ -3486,10 +3486,10 @@ "message": "Sammlung auswählen" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "Wählen Sie diese Option, wenn die Inhalte der Import-Datei in eine Sammlung verschoben werden sollen" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "Wählen Sie diese Option, wenn die Inhalte der Import-Datei in einen Ordner verschoben werden sollen" }, "importUnassignedItemsError": { "message": "Die Datei enthält nicht zugewiesene Einträge." @@ -3586,10 +3586,10 @@ "message": "Bitte melde dich weiterhin mit deinen Firmenzugangsdaten an." }, "importDirectlyFromBrowser": { - "message": "Import directly from browser" + "message": "Direkter Import aus dem Browser" }, "browserProfile": { - "message": "Browser Profile" + "message": "Browser-Profil" }, "seeDetailedInstructions": { "message": "Detaillierte Anleitungen auf unserer Hilfeseite unter", @@ -3834,10 +3834,10 @@ "message": "Gefährdetes Passwort ändern" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Diese Zugangsdaten sind gefährdet und enthalten keine Website. Fügen Sie eine Website hinzu und ändern Sie das Passwort für mehr Sicherheit." }, "missingWebsite": { - "message": "Missing website" + "message": "Fehlende Webseite" }, "cannotRemoveViewOnlyCollections": { "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", @@ -3935,10 +3935,10 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "aboutThisSetting": { - "message": "About this setting" + "message": "Über diese Einstellung" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden verwendet gespeicherte Zugangsdaten-URIs, um zu bestimmen, welches Symbol oder welche Passwort-Ändern-URL verwendet werden soll, um Ihr Erlebnis zu verbessern. Es werden keine Informationen erfasst oder gespeichert, wenn Sie diesen Dienst nutzen." }, "assignToCollections": { "message": "Sammlungen zuweisen" @@ -4080,59 +4080,70 @@ "showLess": { "message": "Weniger anzeigen" }, - "enableAutotype": { - "message": "Autotype aktivieren" - }, "enableAutotypeDescription": { "message": "Bitwarden überprüft die Eingabestellen nicht. Vergewissere dich, dass du dich im richtigen Fenster und Feld befindest, bevor du die Tastenkombination verwendest." }, + "typeShortcut": { + "message": "Typ-Verknüpfung" + }, + "editAutotypeShortcutDescription": { + "message": "Fügen Sie einen oder zwei der folgenden Modifikatoren ein: Strg, Alt, Win oder Umschalt, sowie einen Buchstaben." + }, + "invalidShortcut": { + "message": "Ungültige Verknüpfung" + }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "Weitere Navigationspfade", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "next": { - "message": "Next" + "message": "Weiter" }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "Key Connector-Domain bestätigen" }, "confirm": { - "message": "Confirm" + "message": "Bestätigen" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Autotype-Shortcut aktivieren (Funktionsvorschau)" }, "enableAutotypeDescriptionTransitionKey": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "Stellen Sie sicher, dass Sie sich im richtigen Feld befinden, bevor Sie die Verknüpfung verwenden, um zu vermeiden, dass Daten an der falschen Stelle ausgefüllt werden." }, "editShortcut": { - "message": "Edit shortcut" + "message": "Verknüpfung bearbeiten" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { - "message": "Unarchive" + "message": "Archivierung aufheben" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Einträge im Archiv" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Keine Einträge im Archiv" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Ergebnissen der Suche sowie Autofill-Vorschlägen ausgeschlossen." }, "itemSentToArchive": { - "message": "Item sent to archive" + "message": "Eintrag an das Archiv gesendet" }, "itemRemovedFromArchive": { - "message": "Item removed from archive" + "message": "Eintrag aus dem Archiv entfernt" }, "archiveItem": { - "message": "Archive item" + "message": "Eintrag archivieren" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Archivierte Einträge werden von allgemeinen Suchergebnissen und Autofill-Vorschlägen ausgeschlossen. Sind Sie sicher, dass Sie diesen Eintrag archivieren möchten?" } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 0c2ee1fab65..3a0c5938e4b 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 625d8804676..ec95d939e0a 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 41211c2e7d7..7e07cbad38f 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index cebc2fa1432..fb9fe5cca9c 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 346dc0d4221..1dfd580f333 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden no valida las ubicaciones de entrada, asegúrate de que estás en la ventana y en el capo correctos antes de usar el atajo." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index b8afeb2ed6a..f4b5fdcc11a 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 7f719ec0a4b..173c3ece03e 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index fbbbdfd8c7f..9624647be95 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index ecde260d80e..3e2cfbc2650 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 5ad2661b46a..1ec8754bf96 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index f85708edbe0..fda65187812 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Afficher moins" }, - "enableAutotype": { - "message": "Activer la Saisie Auto" - }, "enableAutotypeDescription": { "message": "Bitwarden ne valide pas les emplacements d'entrée, assurez-vous d'être dans la bonne fenêtre et le bon champ avant d'utiliser le raccourci." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Plus de fil d'Ariane", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirmer" }, - "enableAutotypeTransitionKey": { - "message": "Activer le raccourci de la Saisie Auto" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Assurez-vous d'être dans le bon champ avant d'utiliser le raccourci pour éviter de remplir les données au mauvais endroit." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Modifier le raccourci" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Désarchiver" diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 5849d9d4cee..f301c30de7f 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 5cbceb3ad76..0b1e1b7ac9a 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "הצג פחות" }, - "enableAutotype": { - "message": "הפעל הקלדה אוטומטית" - }, "enableAutotypeDescription": { "message": "Bitwarden לא מאמת את מקומות הקלט, נא לוודא שזה החלון והשדה הנכונים בטרם שימוש בקיצור הדרך." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "עוד סימני דרך", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "אשר" }, - "enableAutotypeTransitionKey": { - "message": "הפעל קיצור דרך להקלדה אוטומטית" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "וודא שאתה נמצא בשדה הנכון לפני השימוש בקיצור הדרך כדי להימנע ממילוי נתונים במקום הלא נכון." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "ערוך קיצור דרך" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index 25ecbdf3840..28c73a7b45f 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 64f89a8b15f..c3dc662949a 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Pokaži manje" }, - "enableAutotype": { - "message": "Omogući automatski unos" - }, "enableAutotypeDescription": { "message": "Bitwarden ne provjerava lokacije unosa, prije korištenja prečaca provjeri da si u pravom prozoru i polju." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Više mrvica", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Potvrdi" }, - "enableAutotypeTransitionKey": { - "message": "Omogući prečac za automatsko tipkanje" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Prije korištenja prečaca provjeri nalaziš li se u ispravnom polju kako se podaci ne bi unijeli na pogrešno mjesto." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Uredi prečac" }, - "archive": { - "message": "Arhiviraj" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Poništi arhiviranje" diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 9f71448ce5a..7f3d4572ea3 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Kevesebb megjelenítése" }, - "enableAutotype": { - "message": "Autotípus engedélyezése" - }, "enableAutotypeDescription": { "message": "A Bitwarden nem érvényesíti a beviteli helyeket, győződjünk meg róla, hogy a megfelelő ablakban és mezőben vagyunk, mielőtt a parancsikont használnánk." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "További morzsamenük", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Megerősítés" }, - "enableAutotypeTransitionKey": { - "message": "Automatikus típusú parancsikon engedélyezése" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Győződjünk meg arról, hogy a megfelelő mezőben vagyunk, mielőtt a parancsikont használnánk, hogy elkerüljük az adatok rossz helyre történő kitöltését." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Parancsikon szerkesztése" }, - "archive": { - "message": "Archívum" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Visszavétel archívumból" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 3f44fd8bf97..acd61bf97ec 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 780d09f3582..09466c05807 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Mostra di meno" }, - "enableAutotype": { - "message": "Abilita auto immissione" - }, "enableAutotypeDescription": { "message": "Bitwarden non convalida i campi di input: assicurati di essere nella finestra e nel campo di testo corretti prima di usare la scorciatoia." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Ulteriori segmenti", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Conferma" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index a58543302fa..3231d7fa77f 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 0bb7e929979..4cfdea94e38 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 5849d9d4cee..f301c30de7f 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 66a6e43d0cb..608c427149a 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 59423b8ad73..8bbf4634a29 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 8159bc5e28b..152cdd03e86 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 5e29f10190b..2ccd255ea5b 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Rādīt mazāk" }, - "enableAutotype": { - "message": "Iespējot automātisko ievadi" - }, "enableAutotypeDescription": { "message": "Bitwarden nepārbauda ievades atrašanās vietas, jāpārliecinās, ka atrodies pareizajā logā un laukā, pirms saīsnes izmantošanas." }, + "typeShortcut": { + "message": "Ievadīt īsinājumtaustiņus" + }, + "editAutotypeShortcutDescription": { + "message": "Jāiekļauj viens vai divi no šiem taustiņiem - Ctrl, Alt, Win vai Shift - un burts." + }, + "invalidShortcut": { + "message": "Nederīgi īsinājumtaustiņi" + }, "moreBreadcrumbs": { "message": "Vairāk norāžu", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Apstiprināt" }, - "enableAutotypeTransitionKey": { - "message": "Iespējot automātiskās ievades saīsni" + "enableAutotypeShortcutPreview": { + "message": "Iespējot automātiskās ievades īsinājumtaustiņus (iespējas priekšskatījums)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Jāpārliecinās, ka pirms saīsnes izmantošanas kursors ir pareizajā laukā, lai izvairītos no datu ievadīšanas nepareizā vietā." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Labot saīsni" }, - "archive": { - "message": "Arhivēt" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Atcelt arhivēšanu" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index b023d0efab0..6509e5aafc2 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 863f3941a0f..03ed49a8fea 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 5849d9d4cee..f301c30de7f 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index fae67d310f1..58562cfc522 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index ec1c1bdb9b5..97d3291875c 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 813fa967252..7c34e823553 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index c726c003776..719be29bf91 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Minder weergeven" }, - "enableAutotype": { - "message": "Autotypen inschakelen" - }, "enableAutotypeDescription": { "message": "Bitwarden valideert de invoerlocaties niet, zorg ervoor dat je je in het juiste venster en veld bevindt voordat je de snelkoppeling gebruikt." }, + "typeShortcut": { + "message": "Typ de sneltoets" + }, + "editAutotypeShortcutDescription": { + "message": "Voeg een of twee van de volgende toetsen toe: Ctrl, Alt, Win of Shift, en een letter." + }, + "invalidShortcut": { + "message": "Ongeldige sneltoets" + }, "moreBreadcrumbs": { "message": "Meer broodkruimels", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Bevestigen" }, - "enableAutotypeTransitionKey": { - "message": "Snelkoppeling autotype inschakelen" + "enableAutotypeShortcutPreview": { + "message": "Autotype sneltoets inschakelen (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Zorg ervoor dat je je in het juiste veld bevindt voordat je de snelkoppeling gebruikt om te voorkomen dat je de gegevens op de verkeerde plaats invult." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Snelkoppeling bewerken" }, - "archive": { - "message": "Archiveren" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Dearchiveren" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 94c2196edfa..de0a57b0a79 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index 217439bec80..2212adcf311 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 6caee67447f..d364ac819d9 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Pokaż mniej" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Więcej nawigacji", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Potwierdź" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edytuj skrót" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Usuń z archiwum" diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 4b28ca4918a..dc28cf47345 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Mostrar menos" }, - "enableAutotype": { - "message": "Habilitar Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden não valida localizações de entrada, tenha certeza de estar na janela e campo corretos antes de utilizar o atalho." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Mais trilhas", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 49573dcd647..5ba1c52f7a6 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Mostrar menos" }, - "enableAutotype": { - "message": "Ativar digitação automática" - }, "enableAutotypeDescription": { "message": "O Bitwarden não valida a introdução de localizações. Certifique-se de que está na janela e no campo corretos antes de utilizar o atalho." }, + "typeShortcut": { + "message": "Introduzir atalho" + }, + "editAutotypeShortcutDescription": { + "message": "Inclua um ou dois dos seguintes modificadores: Ctrl, Alt, Win, ou Shift, e uma letra." + }, + "invalidShortcut": { + "message": "Atalho inválido" + }, "moreBreadcrumbs": { "message": "Mais da navegação estrutural", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirmar" }, - "enableAutotypeTransitionKey": { - "message": "Ativar o atalho de introdução automática" + "enableAutotypeShortcutPreview": { + "message": "Ativar o atalho de digitação automática (Pré-visualização da funcionalidade)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Certifique-se de que está no campo correto antes de utilizar o atalho para evitar preencher dados no local errado." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Editar atalho" }, - "archive": { - "message": "Arquivar" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Desarquivar" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 802afc3ef22..624cc8ef2c1 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 292564be5f3..54262cd9ec9 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Меньше" }, - "enableAutotype": { - "message": "Включить автоввод" - }, "enableAutotypeDescription": { "message": "Bitwarden не проверяет местоположение ввода, поэтому, прежде чем использовать ярлык, убедитесь, что вы находитесь в нужном окне и поле." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Больше хлебных крошек", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Подтвердить" }, - "enableAutotypeTransitionKey": { - "message": "Включить ярлык автоввода" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Прежде чем использовать ярлык, убедитесь, что вы поставили курсор в нужное поле, чтобы избежать ввода данных в неправильное место." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Изменить ярлык" }, - "archive": { - "message": "Архив" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Разархивировать" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 8d4072e1da2..5b009f67f33 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 566b9b8210a..a37ff270fd9 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Zobraziť menej" }, - "enableAutotype": { - "message": "Povoliť automatické vpisovanie" - }, "enableAutotypeDescription": { "message": "Bitwarden neoveruje miesto stupu, pred použitím skratky sa uistite, že ste v správnom okne a poli." }, + "typeShortcut": { + "message": "Zadajte klávesovú skratku" + }, + "editAutotypeShortcutDescription": { + "message": "Použite jeden alebo dva z nasledujúcich modifikátorov: Ctrl, Alt, Win, alebo Shift a písmeno." + }, + "invalidShortcut": { + "message": "Neplatná klávesová skratka" + }, "moreBreadcrumbs": { "message": "Viac", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Potvrdiť" }, - "enableAutotypeTransitionKey": { - "message": "Povoliť skratku automatického písania" + "enableAutotypeShortcutPreview": { + "message": "Povoliť skratku pre automatické vpisovanie (náhľad funkcie)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Pred použitím skratky sa uistite, že sa nachádzate v správnom poli, aby ste údaje nevyplnili na nesprávne miesto." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Upraviť skratku" }, - "archive": { - "message": "Archivovať" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Zrušiť archiváciu" diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 23a6df7ad95..5141d046876 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index cd41aa9e4b9..5a4b0500183 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Прикажи мање" }, - "enableAutotype": { - "message": "Упали ауто-унос" - }, "enableAutotypeDescription": { "message": "Bitwarden не потврђује локације уноса, будите сигурни да сте у добром прозору и поље пре употребе пречице." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Више мрвица", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Потврди" }, - "enableAutotypeTransitionKey": { - "message": "Омогућава пречицу за аутоматски унос" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Будите сигурни да сте у исправном пољу пре употребе пречице да бисте избегли попуњавање података на погрешно место." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Уреди пречицу" }, - "archive": { - "message": "Архива" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Врати из архиве" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index a867fc28753..26e97befd42 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Visa mindre" }, - "enableAutotype": { - "message": "Aktivera automatisk inmatning" - }, "enableAutotypeDescription": { "message": "Bitwarden validerar inte inmatningsplatser, så se till att du är i rätt fönster och fält innan du använder genvägen." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Inkludera en eller två av följande modifierare: Ctrl, Alt, Win, eller Skift och en bokstav." + }, + "invalidShortcut": { + "message": "Ogiltig genväg" + }, "moreBreadcrumbs": { "message": "Fler länkstigar", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Bekräfta" }, - "enableAutotypeTransitionKey": { - "message": "Aktivera genväg för automatisk inmatning" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Försäkra dig om att du befinner dig i rätt fält innan du använder genvägen för att undvika att fylla i data på fel ställe." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Redigera genväg" }, - "archive": { - "message": "Arkivera" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Packa upp" diff --git a/apps/desktop/src/locales/ta/messages.json b/apps/desktop/src/locales/ta/messages.json index 4874985a8fd..9fd0d75f2d1 100644 --- a/apps/desktop/src/locales/ta/messages.json +++ b/apps/desktop/src/locales/ta/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "குறைவாகக் காட்டு" }, - "enableAutotype": { - "message": "தானியங்கு வகையை இயக்கு" - }, "enableAutotypeDescription": { "message": "Bitwarden உள்ளீட்டு இடங்களைச் சரிபார்க்காது, ஷார்ட்கட்டைப் பயன்படுத்துவதற்கு முன் சரியான சாளரம் மற்றும் புலத்தில் நீங்கள் இருக்கிறீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "மேலும் பிரெட்க்ரம்புகள்", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "உறுதிப்படுத்து" }, - "enableAutotypeTransitionKey": { - "message": "தானியங்கு வகை குறுக்குவழியை இயக்கு" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "தவறான இடத்தில் தரவை நிரப்புவதைத் தவிர்க்க, குறுக்குவழியைப் பயன்படுத்துவதற்கு முன்பு நீங்கள் சரியான புலத்தில் இருப்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "குறுக்குவழியைத் திருத்து" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 5849d9d4cee..f301c30de7f 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index fa619695fdb..28d1a6bffcd 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index c33570af387..dd47f2662a3 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Daha az göster" }, - "enableAutotype": { - "message": "Otomatik yazmayı etkinleştir" - }, "enableAutotypeDescription": { "message": "Bitwarden giriş konumlarını doğrulamaz, kısayolu kullanmadan önce doğru pencerede ve alanda olduğunuzdan emin olun." }, + "typeShortcut": { + "message": "Kısayolu yazın" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Geçersiz kısayol" + }, "moreBreadcrumbs": { "message": "Daha fazla gezinme izi", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Onayla" }, - "enableAutotypeTransitionKey": { - "message": "Otomatik yazma kısayolunu etkinleştir" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Verilerin yanlış yere doldurulmasını önlemek için kısayolu kullanmadan önce doğru alanda olduğunuzdan emin olun." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Kısayolu düzenle" }, - "archive": { - "message": "Arşivle" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Arşivden çıkar" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index c5c86baacdf..7f9e3a00fc3 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Згорнути" }, - "enableAutotype": { - "message": "Увімкнути автовведення" - }, "enableAutotypeDescription": { "message": "Bitwarden не перевіряє місця введення. Переконайтеся, що у вас відкрите правильне вікно і вибрано потрібне поле, перш ніж застосувати комбінацію клавіш." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Інші елементи", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index a9ac6aa5bd7..e255e69d55c 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -4080,12 +4080,18 @@ "showLess": { "message": "Thu gọn" }, - "enableAutotype": { - "message": "Bật tính năng Tự động nhập liệu" - }, "enableAutotypeDescription": { "message": "Bitwarden không kiểm tra vị trí nhập liệu, hãy đảm bảo bạn đang ở trong đúng cửa sổ và trường nhập liệu trước khi dùng phím tắt." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "Thêm mục điều hướng", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Xác nhận" }, - "enableAutotypeTransitionKey": { - "message": "Bật phím tắt tự động điền" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Hãy đảm bảo bạn đang ở đúng trường trước khi sử dụng phím tắt để tránh điền dữ liệu vào chỗ không đúng." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Chỉnh sửa phím tắt" }, - "archive": { - "message": "Lưu trữ" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Hủy lưu trữ" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 552afdca34c..ed7f93f3768 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -576,7 +576,7 @@ "message": "复制验证码 (TOTP)" }, "copyFieldCipherName": { - "message": "复制 $CIPHERNAME$ 的 $FIELD$", + "message": "复制 $CIPHERNAME$ 中的 $FIELD$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4080,12 +4080,18 @@ "showLess": { "message": "显示更少" }, - "enableAutotype": { - "message": "启用自动输入" - }, "enableAutotypeDescription": { "message": "Bitwarden 不会验证输入位置,在使用快捷键之前,请确保您位于正确的窗口和字段中。" }, + "typeShortcut": { + "message": "输入快捷键" + }, + "editAutotypeShortcutDescription": { + "message": "包括以下一个或两个修饰符:Ctrl、Alt、Win 或 Shift,外加一个字母。" + }, + "invalidShortcut": { + "message": "无效的快捷键" + }, "moreBreadcrumbs": { "message": "更多导航项", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "确认" }, - "enableAutotypeTransitionKey": { - "message": "启用自动输入快捷键" + "enableAutotypeShortcutPreview": { + "message": "启用自动输入快捷键(功能预览)" }, "enableAutotypeDescriptionTransitionKey": { "message": "在使用快捷键之前,请确保您位于正确的字段中,以避免将数据填入错误的地方。" @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "编辑快捷键" }, - "archive": { - "message": "归档" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "取消归档" diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index d4e579f89c1..9671957c9cc 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -3075,7 +3075,7 @@ "message": "Login request" }, "deviceType": { - "message": "裝置類別" + "message": "裝置類型" }, "ipAddress": { "message": "IP 位址" @@ -4080,12 +4080,18 @@ "showLess": { "message": "Show less" }, - "enableAutotype": { - "message": "Enable Autotype" - }, "enableAutotypeDescription": { "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." }, + "typeShortcut": { + "message": "Type shortcut" + }, + "editAutotypeShortcutDescription": { + "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + }, + "invalidShortcut": { + "message": "Invalid shortcut" + }, "moreBreadcrumbs": { "message": "More breadcrumbs", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." @@ -4099,8 +4105,8 @@ "confirm": { "message": "Confirm" }, - "enableAutotypeTransitionKey": { - "message": "Enable autotype shortcut" + "enableAutotypeShortcutPreview": { + "message": "Enable autotype shortcut (Feature Preview)" }, "enableAutotypeDescriptionTransitionKey": { "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." @@ -4108,8 +4114,13 @@ "editShortcut": { "message": "Edit shortcut" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "unarchive": { "message": "Unarchive" From 91e90681c339f891178d16bbb522bede0d93e784 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 06:57:03 -0400 Subject: [PATCH 12/14] Autosync the updated translations (#16694) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 103 +++++-- apps/web/src/locales/ar/messages.json | 103 +++++-- apps/web/src/locales/az/messages.json | 103 +++++-- apps/web/src/locales/be/messages.json | 103 +++++-- apps/web/src/locales/bg/messages.json | 101 +++++-- apps/web/src/locales/bn/messages.json | 103 +++++-- apps/web/src/locales/bs/messages.json | 103 +++++-- apps/web/src/locales/ca/messages.json | 103 +++++-- apps/web/src/locales/cs/messages.json | 101 +++++-- apps/web/src/locales/cy/messages.json | 103 +++++-- apps/web/src/locales/da/messages.json | 103 +++++-- apps/web/src/locales/de/messages.json | 331 +++++++++++++---------- apps/web/src/locales/el/messages.json | 103 +++++-- apps/web/src/locales/en_GB/messages.json | 103 +++++-- apps/web/src/locales/en_IN/messages.json | 103 +++++-- apps/web/src/locales/eo/messages.json | 103 +++++-- apps/web/src/locales/es/messages.json | 103 +++++-- apps/web/src/locales/et/messages.json | 103 +++++-- apps/web/src/locales/eu/messages.json | 103 +++++-- apps/web/src/locales/fa/messages.json | 103 +++++-- apps/web/src/locales/fi/messages.json | 103 +++++-- apps/web/src/locales/fil/messages.json | 103 +++++-- apps/web/src/locales/fr/messages.json | 101 +++++-- apps/web/src/locales/gl/messages.json | 103 +++++-- apps/web/src/locales/he/messages.json | 103 +++++-- apps/web/src/locales/hi/messages.json | 103 +++++-- apps/web/src/locales/hr/messages.json | 107 ++++++-- apps/web/src/locales/hu/messages.json | 101 +++++-- apps/web/src/locales/id/messages.json | 103 +++++-- apps/web/src/locales/it/messages.json | 103 +++++-- apps/web/src/locales/ja/messages.json | 103 +++++-- apps/web/src/locales/ka/messages.json | 103 +++++-- apps/web/src/locales/km/messages.json | 103 +++++-- apps/web/src/locales/kn/messages.json | 103 +++++-- apps/web/src/locales/ko/messages.json | 103 +++++-- apps/web/src/locales/lv/messages.json | 103 +++++-- apps/web/src/locales/ml/messages.json | 103 +++++-- apps/web/src/locales/mr/messages.json | 103 +++++-- apps/web/src/locales/my/messages.json | 103 +++++-- apps/web/src/locales/nb/messages.json | 103 +++++-- apps/web/src/locales/ne/messages.json | 103 +++++-- apps/web/src/locales/nl/messages.json | 101 +++++-- apps/web/src/locales/nn/messages.json | 103 +++++-- apps/web/src/locales/or/messages.json | 103 +++++-- apps/web/src/locales/pl/messages.json | 103 +++++-- apps/web/src/locales/pt_BR/messages.json | 103 +++++-- apps/web/src/locales/pt_PT/messages.json | 101 +++++-- apps/web/src/locales/ro/messages.json | 103 +++++-- apps/web/src/locales/ru/messages.json | 103 +++++-- apps/web/src/locales/si/messages.json | 103 +++++-- apps/web/src/locales/sk/messages.json | 103 +++++-- apps/web/src/locales/sl/messages.json | 103 +++++-- apps/web/src/locales/sr_CS/messages.json | 103 +++++-- apps/web/src/locales/sr_CY/messages.json | 103 +++++-- apps/web/src/locales/sv/messages.json | 171 ++++++++---- apps/web/src/locales/ta/messages.json | 103 +++++-- apps/web/src/locales/te/messages.json | 103 +++++-- apps/web/src/locales/th/messages.json | 103 +++++-- apps/web/src/locales/tr/messages.json | 103 +++++-- apps/web/src/locales/uk/messages.json | 103 +++++-- apps/web/src/locales/vi/messages.json | 103 +++++-- apps/web/src/locales/zh_CN/messages.json | 105 +++++-- apps/web/src/locales/zh_TW/messages.json | 103 +++++-- 63 files changed, 5122 insertions(+), 1657 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index fcfd90269f2..5690392f205 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Daar is geen items om te lys nie." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisasie is gedeaktiveer." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "Lisensie het verstryk." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-identifiseerder" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Groep/Gebruiker" }, - "lowKdfIterations": { - "message": "Lae KDF-iteraties" - }, - "updateLowKdfIterationsDesc": { - "message": "Werk u enkripsie-instellings by om aan die nuwe beveiligingsaanbevelings te voldoen en die beskerming van u rekening te verbeter." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Verander KDF-instellings" - }, "secureYourInfrastructure": { "message": "Beveilig u infrastruktuur" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index fd0214fa71d..98b84791237 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "إنشاء عنصر تسجيل دخول جديد" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "التطبيقات الحساسة ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "الأعضاء المبلّغون ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "لا توجد أية عناصر في القائمة." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "ليس لديك الصلاحية لعرض جميع العناصر في هذه المجموعة." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "تم تعليق المؤسسة" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "معرف SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index c9d53bd9c52..7b9bbe01c62 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Yeni giriş elementi yarat" }, - "criticalApplicationsActivityDescription": { - "message": "Tətbiqləri kritik olaraq işarələsəniz, onlar burada nümayiş olunacaq." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritik tətbiqlər ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Məlumatlandırılan üzvlər ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Kritik tətbiqlər üçün risk altındakı elementlərə düzəliş erişimi olan üzvlər" }, - "membersAtRisk": { - "message": "$COUNT$ üzv riskdədir", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Sadalanacaq heç bir element yoxdur." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Bu kolleksiyadakı bütün elementlərə baxmaq üçün icazəniz yoxdur." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Təşkilat sıradan çıxarıldı." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Fəaliyyəti dayandırılmış təşkilatlara erişilə bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Xidmət hesabları dayandırılmış təşkilatlarda yaradıla bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, - "disabledOrganizationFilterError": { - "message": "Fəaliyyəti dayandırılmış təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." - }, "licenseIsExpired": { "message": "Lisenziyanın vaxtı bitib." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifikatoru" }, - "ssoIdentifierHintPartOne": { - "message": "SSO ilə giriş etmələri üçün üzvlərinizi bu kimliklə təmin edin. Bu addımı ötürmək üçün, quraşdırın ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO əlaqəsini kəs" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Qrup/İstifadəçi" }, - "lowKdfIterations": { - "message": "Aşağı KDF iterasiyaları" - }, - "updateLowKdfIterationsDesc": { - "message": "Yeni güvənlik tövsiyələrini qarşılamaq və hesab qorumasını təkmilləşdirmək üçün şifrələmə ayarlarınızı güncəlləyin." - }, "kdfSettingsChangeLogoutWarning": { "message": "Davam etsəniz, bütün aktiv seanslardan çıxış edəcəksiniz. Təkrar giriş etməyiniz və əgər varsa iki addımlı girişi tamamlamağınız lazım olacaq. Veri itkisini önləmək üçün şifrələmə ayarlarınızı dəyişdirməzdən əvvəl seyfinizi xaricə köçürməyinizi tövsiyə edirik." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "İnteqrasiya saxlanılmadı. Lütfən daha sonra yenidən sınayın." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "İnteqrasiya silinmədi. Lütfən daha sonra yenidən sınayın." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Aşağı KDF iterasiyaları. Hesabınızın güvənliyini təkmilləşdirmək üçün iterasiyaları artırın." - }, - "changeKDFSettings": { - "message": "KDF ayarlarını dəyişdir" - }, "secureYourInfrastructure": { "message": "İnfrastrukturunuzu qoruyun" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Arxivdə axtar" }, - "archive": { - "message": "Arxiv" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Arxivdə element yoxdur" diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 91eb4328810..e1f5639cda4 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Стварыць новы элемент запісу ўваходу" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Крытычныя праграмы ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Апавешчаныя ўдзельнікі ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "У спісе адсутнічаюць элементы." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "У вас няма правоў для прагляду ўсіх элементаў у гэтай калекцыі." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Арганізацыя адключана." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Доступ да элементаў у адключаных арганізацыях немагчымы. Звяжыце з уладальнікам арганізацыі для атрымання дапамогі." - }, "licenseIsExpired": { "message": "Ліцэнзія пратэрмінавана." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Ідэнтыфікатар SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Адлучыць SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Група/Карыстальнік" }, - "lowKdfIterations": { - "message": "Нізкае значэнне ітэрацыі KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Абнавіце свае налады шыфравання, каб адпавядаць новым рэкамендацыям бяспекі і палепшыць абарону ўліковага запісу." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 86136cb8f16..19119a31c34 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Създаване на нов елемент за вписване" }, - "criticalApplicationsActivityDescription": { - "message": "Когато отбележите някое приложение като важно, то ще се появи тук." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Когато отбележите някое приложение като важно, то ще се появи тук" + }, + "viewAtRiskMembers": { + "message": "Преглед на членовете в риск" + }, + "viewAtRiskApplications": { + "message": "Преглед на приложенията в риск" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ от $TOTAL$ важни приложения са в риск, тъй като има пароли в риск", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Важни приложения ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ прилжения са в риск", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Известени членове ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Членове с права за редактиране на елементи в риск за важни приложения" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ членове в риск", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Няма елементи за показване." }, + "noItemsInTrash": { + "message": "Няма елементи в кошчето" + }, + "noItemsInTrashDesc": { + "message": "Елементите, които изтривате, ще бъдат премествани тук и изтривани окончателно след 30 дни" + }, + "noItemsInVault": { + "message": "Няма елементи в трезора" + }, + "emptyVaultDescription": { + "message": "Трезорът може да пази не само паролите Ви. Тум можете да съхранявате сигурно данни за вписване, идентификационни данни, карти и бележки." + }, + "emptyFavorites": { + "message": "Все още нямате любими неща" + }, + "emptyFavoritesDesc": { + "message": "Добавете често ползваните неща в любимите си, за бърз достъп." + }, + "noSearchResults": { + "message": "Няма резултати от търсенето" + }, + "clearFiltersOrTryAnother": { + "message": "Изчистете филтрите или опитайте да търсите нещо друго" + }, "noPermissionToViewAllCollectionItems": { "message": "Нямате права да преглеждате всички елементи в тази колекция." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Организацията е изключена." }, + "organizationIsSuspended": { + "message": "Организацията е с преустановен достъп" + }, + "organizationIsSuspendedDesc": { + "message": "Записите в организации с преустановен достъп не са достъпни. Свържете се със собственика на организацията си за помощ." + }, "secretsAccessSuspended": { "message": "Изключените организации са недостъпни. Свържете се със собственика на организацията си за помощ." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "В изключени организации не могат да се създават сервизни акаунти. Свържете се със собственика на организацията си за помощ." }, - "disabledOrganizationFilterError": { - "message": "Записите в изключени организации не са достъпни. Свържете се със собственика на организацията си за помощ." - }, "licenseIsExpired": { "message": "Изтекъл лиценз." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Идентификатор за еднократна идентификация" }, - "ssoIdentifierHintPartOne": { - "message": "Дайте този идентификатор на членовете си, за да могат да се вписват чрез еднократно удостоверяване. Ако искате да пропуснете тази стъпка, настройте ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Дайте този идентификатор на членовете си, за да се вписват чрез еднократно удостоверяване. Членовете могат да пропуснат въвеждането та този идентификатор по време на еднократното удостоверяване, ако е настроен присвоен домейн. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Научете повече", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Прекъсване на еднократна идентификация" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Група/потребител" }, - "lowKdfIterations": { - "message": "Малко повторения за KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Променете настройките си за шифроване, така че да отговарят на новите препоръки за сигурността и да подобрите защитата на регистрацията си." - }, "kdfSettingsChangeLogoutWarning": { "message": "Ако продължите, ще излезете от всички активни сесии. Ще трябва да се впишете отново и да извършите двустепенно удостоверяване, ако такова е настроено. Препоръчително е да изнесете трезора си преди да променяте настройките за шифроване, за да избегнете загуба на данни." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Интеграцията не беше запазена. Опитайте отново по-късно." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Трябва да бъдете собственик на организацията, за да извършите това действие." + }, "failedToDeleteIntegration": { "message": "Интеграцията не беше изтрита. Опитайте отново по-късно." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Малък брой повторения за KDF. Увеличете броя повторения, за да подсилите защитата на регистрацията си." - }, - "changeKDFSettings": { - "message": "Промяна на настройките за KDF" - }, "secureYourInfrastructure": { "message": "Подсигурете инфраструктурата си" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Търсене в архива" }, - "archive": { - "message": "Архив" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Няма елементи в архива" diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 53f4cc91ae1..e5d2671bb9e 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "তালিকার জন্য কোনও বস্তু নেই।" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index f53fc830b7a..26835283fc2 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index d9dfa7c1eac..8dc3825e8c5 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Crea un nou element d'inici de sessió" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Aplicacions crítiques ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Membres notificats ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "No hi ha cap element a llistar." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "No teniu permís per veure tots els elements en aquesta col·lecció." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "L'organització està inhabilitada." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "No es pot accedir a les organitzacions suspeses. Poseu-vos en contacte amb el propietari de la vostra organització per obtenir ajuda." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "No es poden crear comptes de servei en organitzacions suspeses. Poseu-vos en contacte amb el propietari de la vostra organització per obtenir ajuda." }, - "disabledOrganizationFilterError": { - "message": "No es pot accedir als elements de les organitzacions inhabilitades. Poseu-vos en contacte amb el propietari de la vostra organització per obtenir ajuda." - }, "licenseIsExpired": { "message": "Llicència caducada." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identificador SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Proporcioneu aquest identificador als vostres membres per iniciar sessió amb SSO. Per evitar aquest pas, configureu-ho ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Desenllaça SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grup/Usuari" }, - "lowKdfIterations": { - "message": "Iteracions de KDF baixes" - }, - "updateLowKdfIterationsDesc": { - "message": "Actualitzeu la configuració d'encriptació per complir les noves recomanacions de seguretat i millorar la protecció del compte." - }, "kdfSettingsChangeLogoutWarning": { "message": "Si continueu, tancareu totes les sessions actives. Haureu de tornar a iniciar la sessió i completar l'inici de sessió en dos passos. Recomanem que exporteu la caixa forta abans de canviar la configuració de xifratge per evitar la pèrdua de dades." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Iteracions baixes de KDF. Augmenta les iteracions per millorar la seguretat del teu compte." - }, - "changeKDFSettings": { - "message": "Canvia la configuració de KDF" - }, "secureYourInfrastructure": { "message": "Assegureu la vostra infraestructura" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 5837d159e92..2fd97aab27e 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Vytvořit novou položku přihlášení" }, - "criticalApplicationsActivityDescription": { - "message": "Jakmile označíte aplikace jako kritické, zobrazí se zde." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Jakmile označíte aplikace jako kritické, zobrazí se zde" + }, + "viewAtRiskMembers": { + "message": "Zobrazit ohrožené členy" + }, + "viewAtRiskApplications": { + "message": "Zobrazit ohrožené aplikace" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ z $TOTAL$ kritických aplikací je ohrožených kvůli ohroženým heslům", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritické aplikace ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ ohrožených aplikací", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Obeznámení členové ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Členové, kteří upravují přístup k rizikovým položkám pro kritické aplikace" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ členů v ohrožení", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Žádné položky k zobrazení." }, + "noItemsInTrash": { + "message": "Žádné položky v koši" + }, + "noItemsInTrashDesc": { + "message": "Položky, které smažete, se zde zobrazí a budou trvale smazány po 30 dnech" + }, + "noItemsInVault": { + "message": "Žádné položky v trezoru" + }, + "emptyVaultDescription": { + "message": "Trezor chrání více než jen Vaše hesla. Bezpečně zde uložte zabezpečená přihlášení, ID, karty a poznámky." + }, + "emptyFavorites": { + "message": "Nemáte oblíbené žádné položky" + }, + "emptyFavoritesDesc": { + "message": "Přidejte často používané položky do oblíbených pro rychlý přístup." + }, + "noSearchResults": { + "message": "Nebyly vráceny žádné výsledky hledání" + }, + "clearFiltersOrTryAnother": { + "message": "Vymažte filtry nebo zkuste jiný hledaný výraz" + }, "noPermissionToViewAllCollectionItems": { "message": "Nemáte oprávnění k zobrazení všech položek v této sbírce." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizace byla deaktivována" }, + "organizationIsSuspended": { + "message": "Organizace je deaktivována" + }, + "organizationIsSuspendedDesc": { + "message": "K položkám v deaktivované organizaci nemáte přístup. Požádejte o pomoc vlastníka organizace." + }, "secretsAccessSuspended": { "message": "K deaktivované organizaci nemáte přístup. Požádejte o pomoc vlastníka organizace." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Servisní účty nelze vytvořit v pozastavených organizacích. Požádejte o pomoc vlastníka organizace." }, - "disabledOrganizationFilterError": { - "message": "K položkám v deaktivované organizaci nemáte přístup. Požádejte o pomoc vlastníka organizace." - }, "licenseIsExpired": { "message": "Licence vypršela." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifikátor" }, - "ssoIdentifierHintPartOne": { - "message": "Poskytněte toto ID Vašim členům pro přihlášení pomocí SSO. Chcete-li obejít tento krok, nastavte ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Zadejte toto ID svým členům a přihlaste se pomocí SSO. Členové mohou přeskočit zadání tohoto identifikátoru během SSO, pokud je nastavena požadovaná doména. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Dozvědět se více", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Zrušit propojení s SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Skupina/Uživatel" }, - "lowKdfIterations": { - "message": "Nízke iterace KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Aktualizujte své nastavení šifrování tak, aby splňovalo nová bezpečnostní doporučení a zlepšilo ochranu účtu." - }, "kdfSettingsChangeLogoutWarning": { "message": "Pokračováním se odhlásíte ze všech aktivních relací. Budete se muset znovu přihlásit a dokončit nastavení dvoufázového přihlášení, pokud nějaké máte. Před změnou nastavení šifrování doporučujeme exportovat trezor, aby nedošlo ke ztrátě dat." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Nepodařilo se uložit integraci. Opakujte akci později." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Pro provedení této akce musíte být vlastníkem organizace." + }, "failedToDeleteIntegration": { "message": "Nepodařilo se smazat integraci. Opakujte akci později." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Nízké iterace KDF. Zvyšte iterace pro zvýšení bezpečnosti Vašeho účtu." - }, - "changeKDFSettings": { - "message": "Změnit nastavení KDF" - }, "secureYourInfrastructure": { "message": "Zabezpečte Vaši infrastrukturu" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Hledat v archivu" }, - "archive": { - "message": "Archivovat" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Žádné položky v archivu" diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 43fc75230a9..5fba67468aa 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index f5441544b96..00e6f8c2389 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Opret nyt login-emne" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritiske apps ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Underrettede medlemmer ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Der er ingen emner at vise." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Ingen tilladelse til at se alle emner i denne samling." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisation suspenderet" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspenderede organisationer kan ikke tilgås. Kontakt organisationsejeren for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Tjenestekonti kan ikke oprettes i suspenderede organisationer. Kontakt organisationsejeren for hjælp." }, - "disabledOrganizationFilterError": { - "message": "Emner i deaktiverede organisationer kan ikke tilgås. Kontakt oganisationsejeren for hjælp." - }, "licenseIsExpired": { "message": "Licensen er udløbet." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-identifikator" }, - "ssoIdentifierHintPartOne": { - "message": "Giv medlemmerne dette ID til indlogning med SSO. For at omgå dette trin, opsæt ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Fjern SSO-tilknytning" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Gruppe/Bruger" }, - "lowKdfIterations": { - "message": "Få KDF-iterationer" - }, - "updateLowKdfIterationsDesc": { - "message": "Opdatér krypteringsindstillingerne for at opfylde nye sikkerhedsanbefalinger og forbedre kontobeskyttelsen." - }, "kdfSettingsChangeLogoutWarning": { "message": "Fortsættes, logges alle aktive sessioner af. Man vil skulle logge ind igen og færdiggøre opsætningen af totrinsindlogning. Eksport af boksen inden krypteringsindstillingerne ændres anbefales for at forhindre datatab." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Få KDF-iterationer. Forøg iterationer for at forbedre kontosikkerheden." - }, - "changeKDFSettings": { - "message": "Skift KDF-indstillinger" - }, "secureYourInfrastructure": { "message": "Sikr infrastrukturen" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 012f562fe8c..8019ed6950b 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -3,7 +3,7 @@ "message": "Alle Anwendungen" }, "activity": { - "message": "Activity" + "message": "Aktivität" }, "appLogoLabel": { "message": "Bitwarden-Logo" @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Neuen Zugangsdaten-Eintrag erstellen" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Sobald du Anwendungen als kritisch markierst, werden sie hier angezeigt" + }, + "viewAtRiskMembers": { + "message": "Gefährdete Mitglieder anzeigen" + }, + "viewAtRiskApplications": { + "message": "Gefährdete Anwendungen anzeigen" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ von $TOTAL$ kritischen Anwendungen sind aufgrund gefährdeter Passwörter gefährdet", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritische Anwendungen ($COUNT$)", @@ -72,7 +91,16 @@ } }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ kritische Anwendungen", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ gefährdete Anwendungen", "placeholders": { "count": { "content": "$1", @@ -102,13 +130,13 @@ "message": "Während Benutzer Zugangsdaten speichern, werden hier Anwendungen angezeigt, die alle gefährdeten Passwörter anzeigen. Markiere kritische Anwendungen und benachrichtige Benutzer, um Passwörter zu ändern." }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "Du hast keine Anwendung als kritisch markiert" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Wähle deine kritischsten Anwendungen aus, um Sicherheitsmaßnahmen für deine Benutzer zu priorisieren und gefährdete Passwörter zu beheben." }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "Kritische Anwendungen auswählen" }, "markAppAsCritical": { "message": "Anwendung als kritisch markieren" @@ -135,10 +163,10 @@ "message": "Gefährdete Mitglieder" }, "membersAtRiskActivityDescription": { - "message": "Members with edit access to at-risk items for critical applications" + "message": "Mitglieder mit Berechtigung zum Bearbeiten gefährdeter Einträge für kritische Anwendungen" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ gefährdete Mitglieder", "placeholders": { "count": { "content": "$1", @@ -204,10 +232,10 @@ "message": "Anwendungen insgesamt" }, "unmarkAsCritical": { - "message": "Unmark as critical" + "message": "Als kritisch-Markierung aufheben" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Successfully unmarked application as critical" + "message": "Anwendung erfolgreich als kritisch-Markierung aufgehoben" }, "whatTypeOfItem": { "message": "Um welche Art von Eintrag handelt es sich hierbei?" @@ -762,79 +790,79 @@ "message": "Eintrag anzeigen" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "Neue Zugangsdaten", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "Neue Karte", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "Neue Identität", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "Neue Notiz", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "Neuer SSH-Schlüssel", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Neuen Text senden", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Neue Datei senden", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "Zugangsdaten bearbeiten", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "Karte bearbeiten", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "Identität bearbeiten", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Notiz bearbeiten", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "SSH-Schlüssel bearbeiten", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Text bearbeiten Send", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Datei bearbeiten Send", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Zugangsdaten anzeigen", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Karte anzeigen", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Identität anzeigen", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Notiz anzeigen", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "SSH-Schlüssel anzeigen", "description": "Header for view SSH key item type" }, "new": { @@ -944,13 +972,13 @@ "message": "Lizenznummer kopieren" }, "copyPrivateKey": { - "message": "Copy private key" + "message": "Privaten Schlüssel kopieren" }, "copyPublicKey": { - "message": "Copy public key" + "message": "Öffentlichen Schlüssel kopieren" }, "copyFingerprint": { - "message": "Copy fingerprint" + "message": "Fingerabdruck kopieren" }, "copyName": { "message": "Name kopieren" @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Keine Einträge vorhanden." }, + "noItemsInTrash": { + "message": "Keine Einträge im Papierkorb" + }, + "noItemsInTrashDesc": { + "message": "Einträge, die du löschst, erscheinen hier und werden nach 30 Tagen dauerhaft gelöscht" + }, + "noItemsInVault": { + "message": "Keine Einträge im Tresor" + }, + "emptyVaultDescription": { + "message": "Der Tresor schützt mehr als nur Ihre Passwörter. Speichern Sie hier sichere Zugangsdaten, Ausweise, Karten und Notizen." + }, + "emptyFavorites": { + "message": "Du hast keine Einträge zu Favoriten hinzugefügt" + }, + "emptyFavoritesDesc": { + "message": "Füge häufig verwendete Einträge zu Favoriten hinzu, um schnell darauf zuzugreifen." + }, + "noSearchResults": { + "message": "Keine Suchergebnisse gefunden" + }, + "clearFiltersOrTryAnother": { + "message": "Filter löschen oder einen anderen Suchbegriff versuchen" + }, "noPermissionToViewAllCollectionItems": { "message": "Du hast nicht die Berechtigung, alle Einträge in dieser Sammlung anzuzeigen." }, @@ -1590,7 +1642,7 @@ "message": "Wiederherstellungscode" }, "invalidRecoveryCode": { - "message": "Invalid recovery code" + "message": "Ungültiger Wiederherstellungscode" }, "authenticatorAppTitle": { "message": "Authenticator App" @@ -2136,10 +2188,10 @@ "message": "Sammlung auswählen" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "Wähle diese Option, wenn die Inhalte der Import-Datei in eine Sammlung verschoben werden sollen" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "Wähle diese Option, wenn die Inhalte der Import-Datei in einen Ordner verschoben werden sollen" }, "importUnassignedItemsError": { "message": "Die Datei enthält nicht zugewiesene Einträge." @@ -2188,7 +2240,7 @@ "message": "Die Sprache des Web-Tresors ändern." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Website-Symbole anzeigen und URLs zum Ändern von Passwörtern abrufen" }, "default": { "message": "Standard" @@ -2900,10 +2952,10 @@ } }, "showPricingSummary": { - "message": "Show pricing summary" + "message": "Preisübersicht anzeigen" }, "hidePricingSummary": { - "message": "Hide pricing summary" + "message": "Preisübersicht ausblenden" }, "summary": { "message": "Zusammenfassung" @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisation ist deaktiviert" }, + "organizationIsSuspended": { + "message": "Organisation ist gesperrt" + }, + "organizationIsSuspendedDesc": { + "message": "Auf Einträge in gesperrten Organisationen kann nicht zugegriffen werden. Wenden Sie sich an den Eigentümer Ihrer Organisation, um Unterstützung zu erhalten." + }, "secretsAccessSuspended": { "message": "Auf deaktivierte Organisationen kann nicht zugegriffen werden. Bitte wende dich an deinen Organisationseigentümer." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Dienstkonten können in deaktivierten Organisationen nicht erstellt werden. Bitte kontaktiere deinen Organisationseigentümer, um Unterstützung zu erhalten." }, - "disabledOrganizationFilterError": { - "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." - }, "licenseIsExpired": { "message": "Lizenz ist abgelaufen." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-Kennung" }, - "ssoIdentifierHintPartOne": { - "message": "Gib diese ID deinen Mitgliedern zur Anmeldung über SSO. Um diesen Schritt zu umgehen, aktiviere die ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO-Verknüpfung aufheben" @@ -5558,10 +5617,10 @@ "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." }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "Desktop-Autotype-Standard­einstellung" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "Aktivieren Sie Desktop-Autotype standardmäßig für Mitglieder. Mitglieder können Autotype im Desktop-Client manuell deaktivieren.", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { @@ -6729,7 +6788,7 @@ "message": "SSO deaktiviert" }, "emailMustLoginWithSso": { - "message": "$EMAIL$ must login with Single Sign-on", + "message": "$EMAIL$ muss sich mit Single Sign-on anmelden", "placeholders": { "email": { "content": "$1", @@ -7127,10 +7186,10 @@ "message": "Unbekannter Eintrag. Du musst möglicherweise eine Berechtigung anfordern, um auf diesen Eintrag zuzugreifen." }, "unknownSecret": { - "message": "Unknown secret, you may need to request permission to access this secret." + "message": "Unbekanntes Geheimnis, möglicherweise müssen Sie eine Berechtigung anfordern, um auf dieses Geheimnis zuzugreifen." }, "unknownProject": { - "message": "Unknown project, you may need to request permission to access this project." + "message": "Unbekanntes Projekt, möglicherweise müssen Sie eine Berechtigung anfordern, um auf dieses Projekt zuzugreifen." }, "cannotSponsorSelf": { "message": "Du kannst nicht für das aktive Konto einlösen. Gib eine andere E-Mail ein." @@ -7520,7 +7579,7 @@ "message": "Aus" }, "connected": { - "message": "Connected" + "message": "Verbunden" }, "members": { "message": "Mitglieder" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Gruppe/Benutzer" }, - "lowKdfIterations": { - "message": "Geringe KDF-Iterationen" - }, - "updateLowKdfIterationsDesc": { - "message": "Aktualisiere deine Verschlüsselungseinstellungen, um neue Sicherheitsempfehlungen zu erfüllen und den Kontoschutz zu verbessern." - }, "kdfSettingsChangeLogoutWarning": { "message": "Wenn du fortfährst, wirst du von allen aktiven Sitzungen abgemeldet. Du musst dich erneut anmelden und, falls eingerichtet, die Zwei-Faktor-Authentifizierung durchführen. Wir empfehlen, deinen Tresor zu exportieren, bevor du deine Verschlüsselungseinstellungen änderst, um Datenverluste zu vermeiden." }, @@ -8459,7 +8512,7 @@ } }, "permanentlyDeletedSecretWithId": { - "message": "Permanently deleted a secret with identifier: $SECRET_ID$", + "message": "Ein Geheimnis mit der Kennung $SECRET_ID$ wurde dauerhaft gelöscht", "placeholders": { "secret_id": { "content": "$1", @@ -8468,7 +8521,7 @@ } }, "restoredSecretWithId": { - "message": "Restored a secret with identifier: $SECRET_ID$", + "message": "Ein Geheimnis mit der Kennung $SECRET_ID$ wurde wiederhergestellt", "placeholders": { "secret_id": { "content": "$1", @@ -8486,7 +8539,7 @@ } }, "accessedProjectWithId": { - "message": "Accessed a project with Id: $PROJECT_ID$.", + "message": "Auf ein Projekt mit der ID $PROJECT_ID$ zugegriffen.", "placeholders": { "project_id": { "content": "$1", @@ -8495,7 +8548,7 @@ } }, "nameUnavailableProjectDeleted": { - "message": "Deleted project Id: $PROJECT_ID$", + "message": "Projekt mit der ID $PROJECT_ID$ gelöscht", "placeholders": { "project_id": { "content": "$1", @@ -8504,7 +8557,7 @@ } }, "nameUnavailableSecretDeleted": { - "message": "Deleted secret Id: $SECRET_ID$", + "message": "Geheimnis mit der ID $SECRET_ID$ gelöscht", "placeholders": { "secret_id": { "content": "$1", @@ -8513,7 +8566,7 @@ } }, "editedProjectWithId": { - "message": "Edited a project with identifier: $PROJECT_ID$", + "message": "Ein Projekt mit der Kennung $PROJECT_ID$ bearbeitet", "placeholders": { "project_id": { "content": "$1", @@ -8522,7 +8575,7 @@ } }, "deletedProjectWithId": { - "message": "Deleted a project with identifier: $PROJECT_ID$", + "message": "Ein Projekt mit der Kennung $PROJECT_ID$ gelöscht", "placeholders": { "project_id": { "content": "$1", @@ -8531,7 +8584,7 @@ } }, "createdProjectWithId": { - "message": "Created a new project with identifier: $PROJECT_ID$", + "message": "Ein neues Projekt mit der Kennung $PROJECT_ID$ erstellt", "placeholders": { "project_id": { "content": "$1", @@ -9028,23 +9081,23 @@ "message": "Verwaltung der Sammlungen" }, "collectionManagementDescription": { - "message": "Configure the collection behavior for the organization" + "message": "Konfigurieren Sie das Sammlungsverhalten für die Organisation" }, "allowAdminAccessToAllCollectionItemsDescription": { - "message": "Allow owners and admins to manage all collections and items from the Admin Console" + "message": "Erlauben Sie Eigentümern und Administratoren, alle Sammlungen und Einträge über die Admin-Konsole zu verwalten" }, "restrictCollectionCreationDescription": { - "message": "Restrict collection creation to owners and admins" + "message": "Beschränken Sie die Erstellung von Sammlungen auf Eigentümer und Administratoren" }, "restrictCollectionDeletionDescription": { - "message": "Restrict collection deletion to owners and admins" + "message": "Beschränken Sie das Löschen von Sammlungen auf Eigentümer und Administratoren" }, "restrictItemDeletionDescriptionStart": { - "message": "Restrict item deletion to members with the ", + "message": "Beschränken Sie das Löschen von Einträgen auf Mitglieder mit der ", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "restrictItemDeletionDescriptionEnd": { - "message": " permission", + "message": " Berechtigung", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "updatedCollectionManagement": { @@ -9124,7 +9177,7 @@ } }, "limitCollectionCreationEnabled": { - "message": "Turned on Restrict collection creation setting $ID$.", + "message": "Die Einstellung Sammlungserstellung einschränken wurde für $ID$ aktiviert.", "placeholders": { "id": { "content": "$1", @@ -9133,7 +9186,7 @@ } }, "limitCollectionCreationDisabled": { - "message": "Turned off Restrict collection creation setting $ID$.", + "message": "Die Einstellung Sammlungserstellung einschränken wurde für $ID$ deaktiviert.", "placeholders": { "id": { "content": "$1", @@ -9142,7 +9195,7 @@ } }, "limitCollectionDeletionEnabled": { - "message": "Turned on Restrict collection deletion setting $ID$.", + "message": "Die Einstellung Sammlungslöschung einschränken wurde für $ID$ aktiviert.", "placeholders": { "id": { "content": "$1", @@ -9151,7 +9204,7 @@ } }, "limitCollectionDeletionDisabled": { - "message": "Turned off Restrict collection deletion setting $ID$.", + "message": "Die Einstellung Sammlungslöschung einschränken wurde für $ID$ deaktiviert.", "placeholders": { "id": { "content": "$1", @@ -9160,7 +9213,7 @@ } }, "limitItemDeletionEnabled": { - "message": "Turned on Restrict item deletion setting $ID$.", + "message": "Die Einstellung Eintragslöschung einschränken wurde für $ID$ aktiviert.", "placeholders": { "id": { "content": "$1", @@ -9169,7 +9222,7 @@ } }, "limitItemDeletionDisabled": { - "message": "Turned off Restrict item deletion setting $ID$.", + "message": "Die Einstellung Eintragslöschung einschränken wurde für $ID$ deaktiviert.", "placeholders": { "id": { "content": "$1", @@ -9178,7 +9231,7 @@ } }, "allowAdminAccessToAllCollectionItemsEnabled": { - "message": "Turned on Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Die Einstellung Eigentümern und Administratoren erlauben, alle Sammlungen und Einträge zu verwalten wurde für $ID$ aktiviert.", "placeholders": { "id": { "content": "$1", @@ -9187,7 +9240,7 @@ } }, "allowAdminAccessToAllCollectionItemsDisabled": { - "message": "Turned off Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Die Einstellung Eigentümern und Administratoren erlauben, alle Sammlungen und Einträge zu verwalten wurde für $ID$ deaktiviert.", "placeholders": { "id": { "content": "$1", @@ -9755,8 +9808,11 @@ "failedToSaveIntegration": { "message": "Fehler beim Speichern der Integration. Bitte versuche es später erneut." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Sie müssen Eigentümer der Organisation sein, um diese Aktion auszuführen." + }, "failedToDeleteIntegration": { - "message": "Failed to delete integration. Please try again later." + "message": "Löschen der Integration fehlgeschlagen. Bitte versuchen Sie es später erneut." }, "deviceIdMissing": { "message": "Geräte-ID fehlt" @@ -9783,7 +9839,7 @@ } }, "updateIntegrationButtonDesc": { - "message": "Update $INTEGRATION$", + "message": "$INTEGRATION$ aktualisieren", "placeholders": { "integration": { "content": "$1", @@ -9855,7 +9911,7 @@ "message": "Bearer-Token" }, "repositoryNameHint": { - "message": "Name of the repository to ingest into" + "message": "Name des Codespeichers, in den importiert werden soll" }, "index": { "message": "Index" @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Geringe KDF-Iterationen. Erhöhe deine Iterationen, um die Sicherheit deines Kontos zu steigern." - }, - "changeKDFSettings": { - "message": "KDF-Einstellungen ändern" - }, "secureYourInfrastructure": { "message": "Sichere deine Infrastruktur" }, @@ -10995,10 +11045,10 @@ "message": "Gefährdetes Passwort ändern" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Diese Zugangsdaten sind gefährdet und enthalten keine Website. Fügen Sie eine Website hinzu und ändern Sie das Passwort für mehr Sicherheit." }, "missingWebsite": { - "message": "Missing website" + "message": "Fehlende Webseite" }, "removeUnlockWithPinPolicyTitle": { "message": "Entsperren mit PIN entfernen" @@ -11016,22 +11066,27 @@ "message": "Diese Ereignisse sind nur Beispiele und spiegeln keine realen Ereignisse in deiner Bitwarden-Organisation wider." }, "viewEvents": { - "message": "View Events" + "message": "Ereignisse anzeigen" }, "cannotCreateCollection": { "message": "Kostenlose Organisationen können bis zu 2 Sammlungen haben. Upgrade auf ein kostenpflichtiges Abo, um mehr Sammlungen hinzuzufügen." }, "searchArchive": { - "message": "Search archive" + "message": "Archiv durchsuchen" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Keine Einträge im Archiv" }, "archivedItemsDescription": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Autofill-Vorschlägen ausgeschlossen." }, "businessUnit": { "message": "Geschäftsbereich" @@ -11188,10 +11243,10 @@ "description": "Error message shown when trying to add credit to a trialing organization without a billing address." }, "aboutThisSetting": { - "message": "About this setting" + "message": "Über diese Einstellung" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden verwendet gespeicherte Zugangsdaten-URIs, um zu bestimmen, welches Symbol oder welche Passwort-Ändern-URL verwendet werden soll, um Ihr Erlebnis zu verbessern. Es werden keine Informationen erfasst oder gespeichert, wenn Sie diesen Dienst nutzen." }, "billingAddress": { "message": "Rechnungsadresse" @@ -11311,7 +11366,7 @@ "message": "Maßnahme erforderlich: In den Zahlungsdetails fehlt eine Steueridentifikationsnummer. Wenn keine Steuernummer hinzugefügt wird, können deine Rechnungen zusätzliche Steuern enthalten." }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "Weitere Navigationspfade", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "addTaxId": { @@ -11355,46 +11410,46 @@ } }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "Key Connector-Domain bestätigen" }, "requiredToVerifyBankAccountWithStripe": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Zahlungen mit einem Bankkonto sind nur für Kunden in den Vereinigten Staaten verfügbar. Sie müssen Ihr Bankkonto verifizieren. Wir werden innerhalb der nächsten 1–2 Werktage eine kleine Einzahlung vornehmen. Wenn das Bankkonto nicht verifiziert wird, führt dies zu einer verpassten Zahlung und die Abonnement wird ausgesetzt." }, "verifyBankAccountWithStripe": { - "message": "We have made a micro-deposit to your bank account. This may take 1-2 business days. When you see the deposit in your account, you can verify your bank account. Failure to verify your bank account will result in a missed payment and your subscription will be suspended." + "message": "Wir haben eine kleine Einzahlung auf Ihr Bankkonto vorgenommen. Dies kann 1–2 Werktage dauern. Sobald Sie die Einzahlung auf Ihrem Konto sehen, können Sie Ihr Bankkonto verifizieren. Wenn das Bankkonto nicht verifiziert wird, führt dies zu einer verpassten Zahlung und Ihr Abonnement wird ausgesetzt." }, "verifyNow": { - "message": "Verify now." + "message": "Jetzt verifizieren." }, "additionalStorageGB": { - "message": "Additional storage GB" + "message": "Zusätzlicher Speicher GB" }, "additionalServiceAccountsV2": { - "message": "Additional machine accounts" + "message": "Zusätzliche Maschinenkonten" }, "secretsManagerSeats": { - "message": "Secrets Manager seats" + "message": "Secrets-Manager-Plätze" }, "additionalStorage": { - "message": "Additional Storage" + "message": "Zusätzlicher Speicher" }, "expandPurchaseDetails": { - "message": "Expand purchase details" + "message": "Kaufdetails erweitern" }, "collapsePurchaseDetails": { - "message": "Collapse purchase details" + "message": "Kaufdetails einklappen" }, "familiesMembership": { - "message": "Families membership" + "message": "Families-Mitgliedschaft" }, "planDescPremium": { - "message": "Complete online security" + "message": "Umfassende Online-Sicherheit" }, "planDescFamiliesV2": { - "message": "Premium security for your family" + "message": "Premium-Sicherheit für Ihre Familie" }, "planDescFreeV2": { - "message": "Share with $COUNT$ other user", + "message": "Mit $COUNT$ anderem Benutzer teilen", "placeholders": { "count": { "content": "$1", @@ -11403,37 +11458,37 @@ } }, "planDescEnterpriseV2": { - "message": "Advanced capabilities for any organization" + "message": "Erweiterte Funktionen für jede Organisation" }, "planNameCustom": { - "message": "Custom plan" + "message": "Individueller Plan" }, "planDescCustom": { - "message": "Bitwarden scales with businesses of all sizes to secure passwords and sensitive information. If you're part of a large enterprise, contact sales to request a quote." + "message": "Bitwarden wächst mit Unternehmen jeder Größe mit, um Passwörter und vertrauliche Informationen zu sichern. Wenn Sie Teil eines großen Unternehmens sind, kontaktieren Sie den Vertrieb, um ein Angebot anzufordern." }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "Integrierter Authenticator" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Datenpannen-Überwachung" }, "andMoreFeatures": { - "message": "And more!" + "message": "Und mehr!" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Sicherer Dateispeicher" }, "familiesUnlimitedSharing": { - "message": "Unlimited sharing - choose who sees what" + "message": "Unbegrenztes Teilen – wählen Sie, wer was sieht" }, "familiesUnlimitedCollections": { - "message": "Unlimited family collections" + "message": "Unbegrenzte Familiensammlungen" }, "familiesSharedStorage": { - "message": "Shared storage for important family info" + "message": "Gemeinsamer Speicher für wichtige Familieninformationen" }, "limitedUsersV2": { - "message": "Up to $COUNT$ members", + "message": "Bis zu $COUNT$ Mitglieder", "placeholders": { "count": { "content": "$1", @@ -11442,7 +11497,7 @@ } }, "limitedCollectionsV2": { - "message": "Up to $COUNT$ collections", + "message": "Bis zu $COUNT$ Sammlungen", "placeholders": { "count": { "content": "$1", @@ -11451,13 +11506,13 @@ } }, "alwaysFree": { - "message": "Always free" + "message": "Immer kostenlos" }, "twoSecretsIncluded": { - "message": "2 secrets" + "message": "2 Geheimnisse" }, "projectsIncludedV2": { - "message": "$COUNT$ project(s)", + "message": "$COUNT$ Projekt(e)", "placeholders": { "count": { "content": "$1", @@ -11466,13 +11521,13 @@ } }, "secureItemSharing": { - "message": "Secure item sharing" + "message": "Sicheres Eintrags-Teilen" }, "scimSupport": { - "message": "SCIM support" + "message": "SCIM-Unterstützung" }, "includedMachineAccountsV2": { - "message": "$COUNT$ machine accounts", + "message": "$COUNT$ Maschinenkonten", "placeholders": { "count": { "content": "$1", @@ -11481,21 +11536,21 @@ } }, "enterpriseSecurityPolicies": { - "message": "Enterprise security policies" + "message": "Enterprise-Sicherheitsrichtlinien" }, "selfHostOption": { - "message": "Self-host option" + "message": "Self-Host-Option" }, "complimentaryFamiliesPlan": { - "message": "Complimentary families plan for all users" + "message": "Kostenloser Families-Plan für alle Benutzer" }, "strengthenCybersecurity": { - "message": "Strengthen cybersecurity" + "message": "Cybersicherheit stärken" }, "boostProductivity": { - "message": "Boost productivity" + "message": "Produktivität steigern" }, "seamlessIntegration": { - "message": "Seamless integration" + "message": "Nahtlose Integration" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 0c876ddd282..c0f2a338557 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Κρίσιμες εφαρμογές ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Ειδοποιημένα μέλη ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Δεν υπάρχουν στοιχεία στη λίστα." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Δεν έχετε άδεια να δείτε όλα τα στοιχεία σε αυτήν τη συλλογή." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Ο οργανισμός είναι απενεργοποιημένος." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "Η άδεια χρήσης έληξε." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Αναγνωριστικό SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Δώστε αυτό το αναγνωριστικό στα μέλη σας για να συνδεθείτε με SSO. Για να παρακάμψετε αυτό το βήμα, ρυθμίστε την ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Αποσύνδεση SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Ομάδα/Χρήστης" }, - "lowKdfIterations": { - "message": "Λίγες επαναλήψεις KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Ενημερώστε τις ρυθμίσεις κρυπτογράφησής σας για να ανταποκριθείτε στις νέες συστάσεις ασφαλείας και να βελτιώσετε την προστασία του λογαριασμού." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Λίγες επαναλήψεις KDF. Αυξήστε τις επαναλήψεις σας για να βελτιώσετε την ασφάλεια του λογαριασμού σας." - }, - "changeKDFSettings": { - "message": "Αλλαγή ρυθμίσεων KDF" - }, "secureYourInfrastructure": { "message": "Ασφαλίστε την υποδομή σας" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index edf4b59c5bd..f187d6484d3 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in the bin" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favourited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favourites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisation suspended" }, + "organizationIsSuspended": { + "message": "Organisation is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organisations cannot be accessed. Contact your organisation owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organisations cannot be accessed. Please contact your organisation owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organisations. Please contact your organisation owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organisations cannot be accessed. Contact your organisation owner for assistance." - }, "licenseIsExpired": { "message": "Licence is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organisation owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index ed092371092..b69c7f4488c 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in the bin" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favourited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favourites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisation is disabled." }, + "organizationIsSuspended": { + "message": "Organisation is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organisations cannot be accessed. Contact your organisation owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organisations cannot be accessed. Please contact your organisation owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organisations. Please contact your organisation owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organisations cannot be accessed. Contact your organisation owner for assistance." - }, "licenseIsExpired": { "message": "Licence is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organisation owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 39ee969de3b..8d51d1f4ded 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Krei novan salutan eron" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Sciigitaj membroj ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Estas neniu ero por listi" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "La organizo suspendiĝis" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "Licenco eksvalidiĝis." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Malkonekti SSO-n" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupo/Uzanto" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Ŝanĝi agordojn pri KDF" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 7d76870ddc6..0cedc53a0ab 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Crear nuevo elemento de inicio de sesión" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Aplicaciones críticas ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Miembros notificados ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "No hay elementos que listar." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "No tiene los permisos para ver todos los elementos de esta colección." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "La organización está desactivada." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "No se puede acceder a las organizaciones suspendidas. Póngase en contacto con el propietario de su organización para obtener ayuda." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "No se pueden crear cuentas de servicio en organizaciones suspendidas. Póngase en contacto con el propietario de su organización para obtener ayuda." }, - "disabledOrganizationFilterError": { - "message": "No se puede acceder a los elementos que pertenecen a organizaciones que estén deshabilitadas. Por favor, póngase en contacto con el propietario de la organización para obtener ayuda." - }, "licenseIsExpired": { "message": "Licencia expirada." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identificador SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Proporcione este ID a sus miembros para iniciar sesión con SSO. Para evitar este paso, configure ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Desenlazar SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupo/Usuario" }, - "lowKdfIterations": { - "message": "Iteraciones KDF bajas" - }, - "updateLowKdfIterationsDesc": { - "message": "Actualice sus ajustes de cifrado para cumplir con las nuevas recomendaciones de seguridad y mejorar la protección de la cuenta." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 83ff0028e0d..dfc120b75fd 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Loo uus kirje" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Teavitatud liikmed ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Puuduvad kirjed, mida kuvada." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Sul ei ole õigust vaadata kõiki asju selles kogus." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisatsioon on määramata ajaks peatatud" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Peatatud organisatsioonidele ei ole võimalik ligi pääseda. Palun kontakteeruge oma organisatsiooni haldajaga." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Peatatud organisatsioonides ei ole võimalik luua uusi kontosid. Palun kontakteeruge oma organisatsiooni haldajaga." }, - "disabledOrganizationFilterError": { - "message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga." - }, "licenseIsExpired": { "message": "Litsents on aegunud." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Ühenda SSO lahti" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 0dc74e0bb94..cc955354537 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Ez dago erakusteko elementurik." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Erakundea desgaituta dago." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Ezin da sartu desgaitutako erakundeetako elementuetara. Laguntza lortzeko, jarri harremanetan zure erakundearekin." - }, "licenseIsExpired": { "message": "Lizentzia iraungi da." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifikatzailea" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO deskonektatu" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 0211b3a7d12..973bfb3b413 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "ایجاد مورد ورود جدید" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "برنامه‌های حیاتی ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "اعضا مطلع شدند ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "هیچ موردی برای نمایش وجود ندارد." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "شما اجازه مشاهده همه موارد در این مجموعه را ندارید." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "سازمان از کار افتاده است" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "سازمان‌های تعلیق شده قابل دسترسی نیستند. لطفاً برای کمک با مالک سازمان خود تماس بگیرید." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "حساب‌های خدماتی را نمی‌توان در سازمان‌های معلق ایجاد کرد. لطفاً برای کمک با مالک سازمان خود تماس بگیرید." }, - "disabledOrganizationFilterError": { - "message": "موارد موجود در سازمان‌های غیرفعال، قابل دسترسی نیستند. برای دریافت کمک با مالک سازمان خود تماس بگیرید." - }, "licenseIsExpired": { "message": "مجوز منقضی شده است." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "شناسه SSO" }, - "ssoIdentifierHintPartOne": { - "message": "این شناسه را در اختیار اعضای خود قرار دهید تا با SSO وارد شوند. برای دور زدن این مرحله، راه‌اندازی کنید ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "لغو پیوند SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "گروه/کاربر" }, - "lowKdfIterations": { - "message": "تکرار KDF کم" - }, - "updateLowKdfIterationsDesc": { - "message": "تنظیمات رمزگذاری خود را برای رعایت توصیه‌های امنیتی جدید و بهبود حفاظت از حساب به‌روزرسانی کنید." - }, "kdfSettingsChangeLogoutWarning": { "message": "ادامه دادن باعث خروج شما از تمام نشست‌های فعال خواهد شد. برای ادامه باید دوباره وارد شوید و در صورت فعال بودن، ورود دو مرحله‌ای را کامل کنید. توصیه می‌کنیم قبل از تغییر تنظیمات رمزنگاری، از گاوصندوق خود خروجی بگیرید تا از دست رفتن داده‌ها جلوگیری شود." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "تعداد تکرارهای KDF پایین است. برای افزایش امنیت حساب کاربری خود، تعداد تکرارها را افزایش دهید." - }, - "changeKDFSettings": { - "message": "تغییر تنظیمات KDF" - }, "secureYourInfrastructure": { "message": "زیرساخت خود را ایمن کنید" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 98f37b43cf4..f717ca1e5a5 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Luo uusi kirjautumiskohde" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kriittiset sovellukset ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Ilmoitetut jäsenet ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Näytettäviä kohteita ei ole." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Sinulla ei ole kokoelman kaikkien kohteiden tarkastelun sallivia käyttöoikeuksia." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisaatio on jäädytetty" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Jäädytettyjen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaatiosi omistajaan saadaksesi apua." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Palvelutilien luonti ei ole mahdollista jäädytetyissä organisaatioissa. Ole yhteydessä organisaatiosi omistajaan saadaksesi apua." }, - "disabledOrganizationFilterError": { - "message": "Jäädytettyjen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." - }, "licenseIsExpired": { "message": "Lisenssi on erääntynyt." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Kertakirjautumistunniste" }, - "ssoIdentifierHintPartOne": { - "message": "Toimita tämä tunniste jäsenillesi kertakirjautumista varten. Ohita vaihe määritämällä ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Poista kertakirjautumisliitos" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Ryhmä/käyttäjä" }, - "lowKdfIterations": { - "message": "Alhainen KDF-toistomäärä" - }, - "updateLowKdfIterationsDesc": { - "message": "Päivitä salausasetuksesi uusien suojaussuositusten mukaisiksi ja vahvista tilisi suojausta." - }, "kdfSettingsChangeLogoutWarning": { "message": "Jos jatkat, kirjataan kaikki aktiiviset istunnot ulos, jonka jälkeen sinun on kirjauduttava sisään uudelleen ja suoritettava mahdollisesti määritetty kaksivaiheinen tunnistautuminen. Tietojesi säilyvyyden varmistamiseksi suosittelemme, että viet holvisi sisällön ennen salausasetustesi muuttamista." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Alhainen KDF-toistojen määrä. Paranna tilisi suojausta korottamalla määrää." - }, - "changeKDFSettings": { - "message": "Muuta KDF-asetuksia" - }, "secureYourInfrastructure": { "message": "Suojaa infrastruktuurisi" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 8bb6d1fa53c..3e11a4eb943 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Walang maililistang item." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Wala kang pahintulot na makita lahat ng mga item sa koleksyong ito." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisasyon ay suspindido." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Mga item sa mga naka-suspindong Organisasyon ay hindi ma-access. Mangyaring makipag-ugnayan sa may-ari ng iyong Organisasyon para sa tulong." - }, "licenseIsExpired": { "message": "Ang lisensya ay expired na." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Tagatukoy ng SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "I-unlink ang SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupo/User" }, - "lowKdfIterations": { - "message": "Mababang KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index e0c6cf2287d..d1d00d7da63 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Créer un nouvel élément de connexion" }, - "criticalApplicationsActivityDescription": { - "message": "Une fois que vous avez marqué des applications comme critiques, elles s'afficheront ici." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Une fois que vous avez marqué des applications comme critiques, elles s'afficheront ici" + }, + "viewAtRiskMembers": { + "message": "Afficher les membres à risque" + }, + "viewAtRiskApplications": { + "message": "Afficher les applications à risque" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ sur $TOTAL$ applications critiques sont à risque en raison de mots de passe à risque", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Applications critiques ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications à risque", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Membres notifiés ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Membres pouvant modifier les éléments à risque pour les applications critiques" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ membres à risque", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Aucun élément à afficher." }, + "noItemsInTrash": { + "message": "Aucun élément dans la corbeille" + }, + "noItemsInTrashDesc": { + "message": "Les éléments que vous supprimez apparaîtront ici et seront définitivement supprimés après 30 jours" + }, + "noItemsInVault": { + "message": "Aucun élément dans le coffre" + }, + "emptyVaultDescription": { + "message": "Le coffre protège bien plus que vos mots de passe. Stockez vos identifiants, IDs, cartes et notes en toute sécurité ici." + }, + "emptyFavorites": { + "message": "Vous n'avez mis aucun élément en favori" + }, + "emptyFavoritesDesc": { + "message": "Ajouter les éléments fréquemment utilisés aux favoris pour un accès rapide." + }, + "noSearchResults": { + "message": "Aucun résultat de recherche retourné" + }, + "clearFiltersOrTryAnother": { + "message": "Effacer les filtres ou essayer un autre terme de recherche" + }, "noPermissionToViewAllCollectionItems": { "message": "Vous n'avez pas l'autorisation d'afficher tous les éléments de cette collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "L'organisation est désactivée." }, + "organizationIsSuspended": { + "message": "L'organisation est suspendue" + }, + "organizationIsSuspendedDesc": { + "message": "Les éléments des organisations suspendues ne sont pas accessibles. Contactez le propriétaire de votre organisation pour obtenir de l'aide." + }, "secretsAccessSuspended": { "message": "Impossible d'accéder aux organisations suspendues. Veuillez contacter le propriétaire de votre organisation pour obtenir de l'aide." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Les comptes de service ne peuvent pas être créés dans les organisations suspendues. Veuillez contacter le propriétaire de votre organisation pour obtenir de l'aide." }, - "disabledOrganizationFilterError": { - "message": "Les éléments des Organisations désactivées ne sont pas accessibles. Contactez le propriétaire de votre Organisation pour obtenir de l'aide." - }, "licenseIsExpired": { "message": "La licence a expiré." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identifiant SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Fournir cet ID à vos membres pour se connecter avec SSO. Pour contourner cette étape, configurer ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Délier SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Groupe/Utilisateur" }, - "lowKdfIterations": { - "message": "Itérations KDF basses" - }, - "updateLowKdfIterationsDesc": { - "message": "Mettez à jour vos paramètres de chiffrement pour répondre à de nouvelles recommandations de sécurité et améliorer la protection de votre compte." - }, "kdfSettingsChangeLogoutWarning": { "message": "Effectuer cette action vous déconnectera de toutes les sessions actives. Vous devrez vous connecter à nouveau et compléter votre authentification à 2 facteurs, s'il y a lieu. Nous vous recommandons d'exporter votre coffre avant de modifier vos paramètres de chiffrement pour prévenir la perte de vos données." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Impossible d'enregistrer l'intégration. Veuillez réessayer plus tard." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Vous devez être le propriétaire de l'organisation pour effectuer cette action." + }, "failedToDeleteIntegration": { "message": "La suppression de l'intégration échouée. Veuillez réessayer plus tard." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Nombres d'itérations KDF bas. Augmentez vos itérations pour améliorer la sécurité de votre compte." - }, - "changeKDFSettings": { - "message": "Modifier les paramètres KDF" - }, "secureYourInfrastructure": { "message": "Sécurisez votre infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Rechercher dans l'archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Aucun élément dans l'archive" diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 8c163ef4f6a..78589d8a3b6 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 72a63ab210a..99a172a71d1 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "צור פריט כניסה חדש" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "יישומים קריטיים ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "חברים שהודיעו להם ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "אין פריטים להצגה ברשימה." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "אין לך הרשאה להציג את כל הפריטים באוסף זה." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "הארגון הושעה" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "לא ניתן לגשת אל ארגונים מושעים. נא לפנות לבעל הארגון שלך עבור סיוע." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "לא ניתן ליצור חשבונות שירות בארגונים מושעים. נא לפנות אל בעל הארגון שלך עבור סיוע." }, - "disabledOrganizationFilterError": { - "message": "לא ניתן לגשת לפריטים בארגון מושעה. פנה אל בעל הארגון שלך עבור סיוע." - }, "licenseIsExpired": { "message": "תוקף הרשיון הסתיים." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "מזהה SSO" }, - "ssoIdentifierHintPartOne": { - "message": "ספק את המזהה הזה לחברים שלך כדי שיכנסו עם SSO. כדי לעקוף את השלב הזה, הגדר ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "נתק SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "קבוצה/משתמש" }, - "lowKdfIterations": { - "message": "חזרות KDF נמוכות" - }, - "updateLowKdfIterationsDesc": { - "message": "שדרג את הגדרות ההצפנה שלך כדי לעמוד בהמלצות אבטחה חדשות ולשפר את הגנת החשבון." - }, "kdfSettingsChangeLogoutWarning": { "message": "המשך התהליך יוציא אותך מכל ההפעלות הפעילות שלך. תידרש להיכנס חזרה כדי להמשיך כניסה דו-שלבית, אם ישנה. אנו ממליצים על ייצוא הכספת שלך לפני שינוי הגדרות ההצפנה שלך כדי למנוע איבוד נתונים." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "שמירת האינטגרציה נכשלה. נא לנסות שוב מאוחר יותר." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "חזרות KDF נמוכות. הגדל את מספר החזרות שלך כדי לשפר את האבטחה של חשבונך." - }, - "changeKDFSettings": { - "message": "שנה הגדרות KDF" - }, "secureYourInfrastructure": { "message": "אבטח את התשתית שלך" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 9cdcabf7423..96fdeacc6ff 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 66eca3f69a9..6ca05ee3f62 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Stvori novu stavku prijave" }, - "criticalApplicationsActivityDescription": { - "message": "Aplikacije označene kao kritične će biti prikazane ovdje." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "Rizični korisnici" + }, + "viewAtRiskApplications": { + "message": "Rizične aplikacije" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ od $TOTAL$ kritilčnih aplikacija su ugrožene zbog rizičnih lozinki", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritične aplikacije ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ aplikacija/e ugroženo", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Obaviješteni članovi ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Članovi koji mogu uređivati stavke za aplikacije označene kao kritične" }, - "membersAtRisk": { - "message": "Rizičnih članova: $COUNT$", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Nema stavki za prikaz." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Nemaš prava vidjeti sve stavke u ovoj zbirci." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizacija suspendirana" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Stavkama u suspendiranoj Organizaciji se ne može pristupiti. Kontaktiraj vlasnika Organizacije za pomoć." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Nije moguće stvoriti Servisne račune u suspendiranim organizacijama. Kontaktiraj vlasnika tvoje organizacije za pomoć." }, - "disabledOrganizationFilterError": { - "message": "Stavkama u suspendiranoj Organizaciji se ne može pristupiti. Kontaktiraj vlasnika Organizacije za pomoć." - }, "licenseIsExpired": { "message": "Licenca je istekla." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifikator" }, - "ssoIdentifierHintPartOne": { - "message": "Dajte ovaj ID svojim članovima za prijavu putem SSO-a. Za zaobilazak ovog koraka, postavi ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Odspoji SSO" @@ -5558,10 +5617,10 @@ "message": "Pravila tvrtke onemogućuju spremanje stavki u osobni trezor. Promijeni vlasništvo stavke na tvrtku i odaberi dostupnu Zbirku." }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "Zadana postavka automatskog tipkanja na radnoj površini" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "Uključi automatsko tipkanje na radnoj površini prema zadanim postavkama za članove. Članovi mogu ručno isključiti automatsko tipkanje u klijentu za radnu površinu.", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupa/korisnik" }, - "lowKdfIterations": { - "message": "Niske KDF iteracije" - }, - "updateLowKdfIterationsDesc": { - "message": "Ažuriraj svoje postavke enkripcije kako bi zadovoljili nove sigurnosne preporuke i poboljšali zaštitu računa." - }, "kdfSettingsChangeLogoutWarning": { "message": "Nastavkom ćeš se odjaviti iz svih aktivnih sesija. Morat ćeš se ponovno prijaviti i izvršiti dvostruku autentifikaciju, ako je aktivna. Preporučujemo izvoz tvog trezora prije promjene postavki enkripcije kako bi spriječili gubitak podataka." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Spremanje integracije nije uspjelo. Pokušaj ponovno kasnije." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Za ovo, moraš biti vlasnik organizacije." + }, "failedToDeleteIntegration": { "message": "Brisanje integracije nije uspjelo. Pokušaj ponovno kasnije." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Niske KDF iteracije. Povećaj svoje iteracije za poboljšanje sigurnost računa." - }, - "changeKDFSettings": { - "message": "Promijeni KDF postavke" - }, "secureYourInfrastructure": { "message": "Osiguraj svoju infrastrukturu" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Pretraži arhivu" }, - "archive": { - "message": "Arhiva" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Nema stavki u arhivi" diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 910447f236c..ba533d302f5 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Új bejelentkezési elem létrehozása" }, - "criticalApplicationsActivityDescription": { - "message": "Miután megjelöltük a kritikus alkalmazásokat, azok itt jelennek meg." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "A kritikus alkalmazások megjelölésével azok itt jelennek meg." + }, + "viewAtRiskMembers": { + "message": "Kockázatos tagok megtekintése" + }, + "viewAtRiskApplications": { + "message": "Kockázatos alkalmazások megtekintése" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ / $TOTAL$ kritikus alkalmazás veszélyben van a kockázatos jelszavak miatt.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritikus alkalmazások ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ kockázatos alkalmazás", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Értesített tagok ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Tagok szerkesztési hozzáféréssel a kritikus alkalmazások veszélyeztetett elemeihez" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ kockázatos tag", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Nincsenek megjeleníthető elemek." }, + "noItemsInTrash": { + "message": "Nincs elem a lomtárban." + }, + "noItemsInTrashDesc": { + "message": "A törölt elemek itt jelennek meg és 30 nap elteltével véglegesen törlődnek." + }, + "noItemsInVault": { + "message": "Nincsenek elemek a széfben." + }, + "emptyVaultDescription": { + "message": "A széf nemcsak a jelszavakat védi. Itt biztonságosan tárolhatjuk a bejelentkezési adatokat, egyéb azonosítókat, kártyákat és jegyzeteket." + }, + "emptyFavorites": { + "message": "Nem lett kedvencnek minősítve egyetlen elem sem." + }, + "emptyFavoritesDesc": { + "message": "Gyakran használt elemek hozzáadása a kedvencekhez a gyors hozzáférés érdekében." + }, + "noSearchResults": { + "message": "Nincsenek visszakapott keresési eredmények." + }, + "clearFiltersOrTryAnother": { + "message": "Töröljük a szűrőket vagy próbálkozzunk másik keresési kifejezéssel." + }, "noPermissionToViewAllCollectionItems": { "message": "Nincs jogosultság a gyűjtemény összes elemének megtekintésére." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "A szervezet letiltásra került." }, + "organizationIsSuspended": { + "message": "A szervezet felfüggesztésre került." + }, + "organizationIsSuspendedDesc": { + "message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." + }, "secretsAccessSuspended": { "message": "A felfüggesztett szervezetekhez nem lehet hozzáférni. Segítségért forduljunk a szervezet tulajdonosához." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "A felfüggesztett szervezetekben nem hozhatók létre szolgáltatásfiókok. Segítségért forduljunk a szervezet tulajdonosához." }, - "disabledOrganizationFilterError": { - "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." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Egyszeri azonosító" }, - "ssoIdentifierHintPartOne": { - "message": "Adjuk meg ezt az azonosítót a tagoknak a bejelentkezéshez SSO-val. A lépés megkerüléséhez üzemeljük be ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Adjuk meg ezt az azonosítót a tagokinak az SSO-val bejelentkezéshez. A tagok kihagyhatják ennek az azonosítónak a megadását az SSO során, ha egy igényelt tartomány be van állítva.", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "További információ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO szétkapcsolása" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Csoport/Felhasználó" }, - "lowKdfIterations": { - "message": "Alacsony KDF iterációk" - }, - "updateLowKdfIterationsDesc": { - "message": "Frissítsük a titkosítási beállításokat, hogy megfeleljünk az új biztonsági ajánlásoknak és javítsuk a fiókvédelmet." - }, "kdfSettingsChangeLogoutWarning": { "message": "A folytatás kijelentkeztet az összes aktív munkamenetből. Újra be kell jelentkezni és kétlépcsős bejelentkezést kell végrehajtani, ha van ilyen. Célszerű a titkosítási beállítások módosítása előtt a széf exportálása az adatvesztés elkerülése érdekében." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Nem sikerült menteni az integrációt. Próbáljuk újra később." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Ennek a műveletnek a végrehajtásához a szervezet tulajdonosának kell lenni." + }, "failedToDeleteIntegration": { "message": "Nem sikerült törölni az integrációt. Próbáljuk újra később." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Alacsony a KDF iterációk száma. Növeljük az iterációk számát a fiók biztonságának javítása érdekében." - }, - "changeKDFSettings": { - "message": "KDF beállítások megváltoztatása" - }, "secureYourInfrastructure": { "message": "Infrastruktúra biztosítása" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Keresés archívum" }, - "archive": { - "message": "Archívum" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Nincs elem az archívumban." diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 39f4232a707..2de26459ff0 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Buat entri masuk baru" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Semua aplikasi ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Anggota yang diberitahukan ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Tidak ada item yang dapat dicantumkan." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisasi dinonaktifkan." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Item di Organisasi yang dinonaktifkan tidak bisa diakses. Hubungi pemilik Organisasi Anda untuk mendapatkan bantuan." - }, "licenseIsExpired": { "message": "Lisensi sudah kadaluarsa." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Batalkan tautan SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Kelompok/Pengguna" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 3875bcb42f2..daeab7df8a1 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Crea nuovo elemento di login" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Applicazioni critiche ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Membri notificati ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Non ci sono elementi da mostrare." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Non hai i permessi necessari per visualizzare tutti gli elementi in questa raccolta." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizzazione disabilitata" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Non è possibile accedere alle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per assistenza." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Non è possibile creare account di servizio nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per assistenza." }, - "disabledOrganizationFilterError": { - "message": "Non è possibile accedere agli elementi nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per assistenza." - }, "licenseIsExpired": { "message": "La licenza è scaduta." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identificativo SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Fornisci questo ID ai tuoi membri per accedere con SSO. Per saltare questo passaggio, configura la ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Scollega SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Gruppo/Utente" }, - "lowKdfIterations": { - "message": "Iterazioni KDF basse" - }, - "updateLowKdfIterationsDesc": { - "message": "Aggiorna le tue impostazioni di crittografia per soddisfare le nuove raccomandazioni sulla sicurezza e migliorare la protezione del tuo account." - }, "kdfSettingsChangeLogoutWarning": { "message": "Procedere ti farà uscire da tutte le sessioni attive. Dovrai accedere di nuovo e completare la verifica in due passaggi, se impostata. Ti consigliamo di esportare la tua cassaforte prima di cambiare le impostazioni di crittografia per prevenire perdite di dati." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Impossibile salvare l'integrazione. Riprova più tardi." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Iterazioni KDF basse. Aumenta le tue iterazioni per migliorare la sicurezza del tuo account." - }, - "changeKDFSettings": { - "message": "Cambia impostazioni KDF" - }, "secureYourInfrastructure": { "message": "Proteggi la tua infrastruttura" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 3f2a2ada371..bf65ef30a28 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "新しいログインアイテムを作成" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "特に重要なアプリ ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "通知済みメンバー ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "表示するアイテムがありません" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "このコレクション内のアイテムをすべて表示する権限がありません。" }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "組織は無効です。" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "一時停止された組織にはアクセスできません。組織の所有者にお問い合わせください。" }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "一時停止中の組織ではサービスアカウントを作成できません。組織の所有者に問い合わせてください。" }, - "disabledOrganizationFilterError": { - "message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。" - }, "licenseIsExpired": { "message": "ライセンスの有効期限が切れています。" }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO 識別子" }, - "ssoIdentifierHintPartOne": { - "message": "SSO でログインできるようこの ID をメンバーに提供してください。この手順をバイパスするには、以下の設定をしてください:", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO のリンクを解除" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "グループ/ユーザー" }, - "lowKdfIterations": { - "message": "低 KDF イテレーション" - }, - "updateLowKdfIterationsDesc": { - "message": "新しいセキュリティの推奨事項に対応し、アカウントの保護を向上させるために、暗号化設定を更新してください。" - }, "kdfSettingsChangeLogoutWarning": { "message": "続行すると、すべてのアクティブなセッションからログアウトします。再度ログインし、2段階認証を完了する必要があります。 暗号化設定を変更する前に、保管庫をエクスポートしてデータの損失を防ぐことをおすすめします。" }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "KDF 反復回数が少ないです。あなたのアカウントのセキュリティを向上させるために反復回数を増やしてください。" - }, - "changeKDFSettings": { - "message": "KDF 設定の変更" - }, "secureYourInfrastructure": { "message": "インフラストラクチャの保護" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 170b989ff5d..ad1e820c179 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "არაა საგნები სიაში ჩამოსათველალდ." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "თქვენ არ გაქვთ უფლება ნახოთ ყველა საგანი ამ კოლექციაში." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 526b7567d99..fa4c124416d 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 13f72bed6c0..08dfc457843 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಐಟಂಗಳಿಲ್ಲ." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "ಸಂಘಟನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "ಪರವಾನಗಿ ಅವಧಿ ಮೀರಿದೆ." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "ಎಸ್‌ಎಸ್‌ಒ ಅನ್ಲಿಂಕ್ ಮಾಡಿ" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 33ccaee2b5c..53af3e5313f 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "항목이 없습니다." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "이 컬렉션의 모든 항목을 볼 권한이 없습니다." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "조직이 비활성화됨" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "라이선스가 만료되었습니다." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO 연결 해제" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index bdf7dbef0fb..7b6d22e3679 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Izveidot jaunu pieteikšanās vienumu" }, - "criticalApplicationsActivityDescription": { - "message": "Tiklīz lietotnes tiks atzīmētas kā būtiskas, tās tiks parādītas šeit." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Tikldīz lietotnes tiks atzīmētas kā būtiskas, tās tiks parādītas šeit" + }, + "viewAtRiskMembers": { + "message": "Apskatīt riskam pakļautos dalībniekus" + }, + "viewAtRiskApplications": { + "message": "Apskatīt riskam pakļautās lietotnes" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ no $TOTAL$ būtiskajām lietotnēm ir apdraudētas riskam pakļautu paroļu dēļ", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritiskās lietotnes ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ lietotnes ir pakļautas riskam", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Apziņotie dalībnieki ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Dalībnieki ar labošanas piekluvi riskam pakļautajiem vienumiem būtiskajām lietotnēm" }, - "membersAtRisk": { - "message": "$COUNT$ riskam pakļauti dalībnieki", + "membersAtRiskCount": { + "message": "$COUNT$ dalībnieki ir pakļauti riskam", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Nav vienumu, ko parādīt." }, + "noItemsInTrash": { + "message": "Atkritnē nav vienumu" + }, + "noItemsInTrashDesc": { + "message": "Izdzēstie vienumi parādīsies šeit, un tie tiks neatgriezeniski izdzēsti pēc 30 dienām" + }, + "noItemsInVault": { + "message": "Glabātavā nav vienumu" + }, + "emptyVaultDescription": { + "message": "Glabātava aizsargā vairāk kā tikai paroles. Drošā veidā glabā šeit pieteikšanās vienumus, identitātes, kartes un piezīmes!" + }, + "emptyFavorites": { + "message": "Izlasē nav neviena vienuma" + }, + "emptyFavoritesDesc": { + "message": "Šeit ir pievienojami bieži izmantoti vienumi ātrākai piekļuvei." + }, + "noSearchResults": { + "message": "Nekas netika atrasts" + }, + "clearFiltersOrTryAnother": { + "message": "Jānotīra atsijātāji vai jāmēģina cits meklēšanas vaicājums" + }, "noPermissionToViewAllCollectionItems": { "message": "Nav atļaujas apskatīt visus šī krājuma vienumus." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Apvienība ir atspējota." }, + "organizationIsSuspended": { + "message": "Apvienība ir apturēta" + }, + "organizationIsSuspendedDesc": { + "message": "Apturētu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." + }, "secretsAccessSuspended": { "message": "Apturētām apvienībām nav iespējams piekļūt. Lūgums vērsties pie savas apvienības īpašnieka pēc palīdzības." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Pakalpojumu kontus nav iespējams izveidot apturētās apvienībās. Lūgums vērsties pie savas apvienības īpašnieka pēc palīdzības." }, - "disabledOrganizationFilterError": { - "message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." - }, "licenseIsExpired": { "message": "Ir beidzies licences izmantošanas laiks." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Vienotās pieteikšanās identifikators" }, - "ssoIdentifierHintPartOne": { - "message": "Šis Id ir sniedzams dalībniekiem, lai pieteiktos ar vienoto pieteikšanos. Lai apietu šo soli, jāuzstāda ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Atsaistīt SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Kopa/Lietotājs" }, - "lowKdfIterations": { - "message": "Zems KDF atkārtojumu skaits" - }, - "updateLowKdfIterationsDesc": { - "message": "Jāatjaunina šifrēšanas iestatījumi, lai atbilstu jaunajiem drošības ieteikumiem un uzlabotu konta aizsardzību." - }, "kdfSettingsChangeLogoutWarning": { "message": "Turpinot notiks atteikšanās no visām esošajām sesijām. Būs atkārtoti jāpiesakās un jāpabeidz divpakāpju pieteikšanās, ja tāda ir. Mēs iesakām pirms šifrēšanas iestatījumu mainīšanas izgūt glabātavas saturu, lai novērstu datu zudumu." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Neizdevās saglabāt iekļaušanu. Lūgums vēlāk mēģināt vēlreiz." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Jābūt apvienības īpašniekam, lai veiktu šo darbību." + }, "failedToDeleteIntegration": { "message": "Neizdevās izdzēst iekļaušanu. Lūgums vēlāk mēģināt vēlreiz." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Zems KDF atkārtojumu skaits. Tas jāpalielina, lai uzlabotu sava konta drošību." - }, - "changeKDFSettings": { - "message": "Mainīt KDF iestatījumus" - }, "secureYourInfrastructure": { "message": "Nodrošini savu infrastruktūru" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Meklēt arhīvā" }, - "archive": { - "message": "Arhivēt" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Arhīvā nav vienumu" diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 7f345a5b85c..2c1fde02227 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "പ്രദർശിപ്പിക്കാൻ ഇനങ്ങളൊന്നുമില്ല." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "സംഘടന അപ്രാപ്‌തമാക്കി." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "ലൈസൻസ് കാലഹരണപ്പെട്ടു." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index b25c6fb16ea..c1aef5bc376 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "नवीन लॉगिन आयटम तयार करा" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 526b7567d99..fa4c124416d 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 3cfcd87ec64..bf44b5f7397 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Det er ingen elementer å vise." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Du har ikke tillatelse til å se alle elementer i denne samlingen." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisasjonen er skrudd av." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Gjenstander i deaktiverte organisasjoner kan ikke åpnes. Ta kontakt med eieren av organisasjonen for hjelp." - }, "licenseIsExpired": { "message": "Lisensen har utløpt." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-identifikator" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Koble fra SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Gruppe/Bruker" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 7dff2786a5d..29d4bd0da20 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 1ad5b20745a..f8db72ffe8c 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Nieuw login item aanmaken" }, - "criticalApplicationsActivityDescription": { - "message": "Als je toepassingen als belangrijk markeert, verschijnen ze hier." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Als je toepassingen als belangrijk markeert, verschijnen ze hier" + }, + "viewAtRiskMembers": { + "message": "Leden met risico bekijken" + }, + "viewAtRiskApplications": { + "message": "Applicaties met risico bekijken" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ van de $TOTAL$ kritische applicaties zijn in gevaar als gevolg van risicovolle wachtwoorden", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Belangrijke applicaties ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applicaties in gevaar", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Geînformeerde leden ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Leden met toegang voor bewerken van risico-items voor belangrijke applicaties" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ leden lopen risico", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Er zijn geen items om weer te geven." }, + "noItemsInTrash": { + "message": "Geen items in prullenbak" + }, + "noItemsInTrashDesc": { + "message": "Items die je verwijdert verschijnen hier en worden na 30 dagen definitief verwijderd" + }, + "noItemsInVault": { + "message": "Geen items in de kluis" + }, + "emptyVaultDescription": { + "message": "De kluis beschermt meer dan alleen je wachtwoorden. Sla hier beveiligde inloggegevens, ID's, kaarten en notities op." + }, + "emptyFavorites": { + "message": "Je hebt geen favoriete items" + }, + "emptyFavoritesDesc": { + "message": "Voeg veelgebruikte items toe aan favorieten voor snelle toegang." + }, + "noSearchResults": { + "message": "Geen resultaten teruggekregen" + }, + "clearFiltersOrTryAnother": { + "message": "Wis filters of probeer een andere zoekterm" + }, "noPermissionToViewAllCollectionItems": { "message": "Je hebt geen rechten om alle items in deze collectie te zien." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisatie opgeschort" }, + "organizationIsSuspended": { + "message": "Organisatie is opgeschort" + }, + "organizationIsSuspendedDesc": { + "message": "Je kunt items in opgeschorte organisaties niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." + }, "secretsAccessSuspended": { "message": "Opgeschorte organisaties zijn niet toegankelijk. Neem contact op met de eigenaar van je organisatie voor hulp." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Je kunt geen service accounts aanmaken in opgeschorte organisaties. Neem contact op met de eigenaar van je organisatie voor hulp." }, - "disabledOrganizationFilterError": { - "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." - }, "licenseIsExpired": { "message": "Licentie verlopen." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO Identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Geef dit ID aan je leden voor inloggen met SSO. Om deze stap te omzeilen, configureer je ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Geef dit ID aan je leden om in te loggen met SSO. Leden kunnen het invoeren van deze identificatie overslaan tijdens SSO als een geclaimde domein is ingesteld ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Meer informatie", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO ontkoppelen" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Groep/Gebruiker" }, - "lowKdfIterations": { - "message": "Weinig KDF-iteraties" - }, - "updateLowKdfIterationsDesc": { - "message": "Werk je versleutelingsinstellingen bij om aan de nieuwe beveiligingsaanbevelingen te voldoen en de bescherming van je account te verbeteren." - }, "kdfSettingsChangeLogoutWarning": { "message": "Als je doorgaat, log je uit van alle actieve sessies. Je zult opnieuw moeten inloggen en, indien van toepassing, tweestapsverificatie moeten voltooien. We raden aan om je kluis te exporteren voordat je je versleutelingsinstellingen wijzigt om gegevensverlies te voorkomen." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Opslaan van integratie mislukt. Probeer het later opnieuw." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Je moet de eigenaar van de organisatie zijn om deze actie uit te voeren." + }, "failedToDeleteIntegration": { "message": "Verwijderen van integratie mislukt. Probeer het later opnieuw." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Laag aantal KDF-iteraties. Verhoog je iteraties om de veiligheid van je account te verbeteren." - }, - "changeKDFSettings": { - "message": "KDF-instellingen wijzigen" - }, "secureYourInfrastructure": { "message": "Beveilig je infrastructuur" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 54323d9b12a..ec6da6ee754 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Det er inga oppføringar å lista opp." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 526b7567d99..fa4c124416d 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 8254d28f142..20a8331b61e 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Utwórz nowy element logowania" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Aplikacje krytyczne ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Powiadomieni członkowie ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Brak elementów." }, + "noItemsInTrash": { + "message": "Brak elementów w koszu" + }, + "noItemsInTrashDesc": { + "message": "Usunięte elementy pojawią się tutaj i zostaną trwale usunięte po 30 dniach" + }, + "noItemsInVault": { + "message": "Brak elementów w sejfie" + }, + "emptyVaultDescription": { + "message": "Sejf chroni nie tylko hasła. Przechowuj bezpiecznie dane logowania, identyfikatory, karty i notatki." + }, + "emptyFavorites": { + "message": "Brak ulubionych elementów" + }, + "emptyFavoritesDesc": { + "message": "Dodaj do ulubionych często używane elementy dla szybkiego dostępu." + }, + "noSearchResults": { + "message": "Brak pasujących elementów" + }, + "clearFiltersOrTryAnother": { + "message": "Wyczyść filtry lub użyj innej frazy" + }, "noPermissionToViewAllCollectionItems": { "message": "Nie masz uprawnień do przeglądania wszystkich elementów w tej kolekcji." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizacja została zawieszona" }, + "organizationIsSuspended": { + "message": "Organizacja została zawieszona" + }, + "organizationIsSuspendedDesc": { + "message": "Nie można uzyskać dostępu do elementów w zawieszonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." + }, "secretsAccessSuspended": { "message": "Nie można uzyskać dostępu do zawieszonych organizacji. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Konta serwisowe nie mogą być tworzone w zawieszonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, - "disabledOrganizationFilterError": { - "message": "Nie można uzyskać dostępu do elementów w zawieszonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." - }, "licenseIsExpired": { "message": "Licencja wygasła." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identyfikator SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Podaj ten identyfikator swoim członkowm, aby zalogować się za pomocą SSO. Aby pominąć ten krok, ustaw ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Odłącz logowanie jednokrotne SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupa/Użytkownik" }, - "lowKdfIterations": { - "message": "Niska liczba iteracji KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Zaktualizuj ustawienia szyfrowania, aby spełnić nowe zalecenia bezpieczeństwa i poprawić ochronę konta." - }, "kdfSettingsChangeLogoutWarning": { "message": "Kontynuowanie spowoduje wylogowanie ze wszystkich aktywnych sesji. Będzie trzeba zalogować się ponownie i wykonać logowanie dwuetapowe, jeśli jest włączone. Zalecamy wyeksportowanie sejfu przed zmianą ustawień szyfrowania, aby zapobiec utracie danych." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Niska liczba iteracji KDF. Zwiększ liczbę iteracji, aby zwiększyć bezpieczeństwo Twojego konta." - }, - "changeKDFSettings": { - "message": "Zmień ustawienia KDF" - }, "secureYourInfrastructure": { "message": "Zabezpiecz swoją infrastrukturę" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index b2a2924b28b..c7e782c32eb 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Criar item de \"login\"" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Aplicativos críticos ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Membros notificados ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Não há itens para listar." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Você não tem permissão para visualizar todos os itens desta coleção." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organização está desabilitada." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "As organizações suspensas não podem ser acessadas. Entre em contato com o proprietário da organização para obter assistência." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Contas de serviço não podem ser criadas em organizações suspensas. Entre em contato com o proprietário da organização para obter assistência." }, - "disabledOrganizationFilterError": { - "message": "Itens em Organizações Desativadas não podem ser acessados. Entre em contato com o proprietário da sua Organização para obter ajuda." - }, "licenseIsExpired": { "message": "A licença está expirada." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identificador SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Forneça esse ID aos seus membros para logar com SSO. Para ignorar essa etapa, configure ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Desvincular SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupo/Usuário" }, - "lowKdfIterations": { - "message": "Iterações KDF baixas" - }, - "updateLowKdfIterationsDesc": { - "message": "Atualize suas configurações de criptografia para atender às novas recomendações de segurança e melhorar a proteção da conta." - }, "kdfSettingsChangeLogoutWarning": { "message": "O processo desconectará você de todas as sessões ativas. Você precisará iniciar a sessão novamente e concluir o login em duas etapas, se houver. Recomendamos exportar seu cofre antes de alterar suas configurações de criptografia para evitar perda de dados." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Iterações baixas do KDF. Aumente as suas iterações para melhorar a segurança da sua conta." - }, - "changeKDFSettings": { - "message": "Atualizar as definições do KDF" - }, "secureYourInfrastructure": { "message": "Proteja sua infraestrutura" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 6f8e4d9c11c..ff2b97eb1d7 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Criar nova credencial" }, - "criticalApplicationsActivityDescription": { - "message": "Depois de marcar as aplicações como críticas, estas serão apresentadas aqui." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Depois de marcar as aplicações como críticas, estas serão apresentadas aqui" + }, + "viewAtRiskMembers": { + "message": "Ver membros em risco" + }, + "viewAtRiskApplications": { + "message": "Ver aplicações em risco" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ de $TOTAL$ aplicações críticas estão em risco devido a palavras-passe em risco", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Aplicações críticas ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ aplicações em risco", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Membros notificados ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "Membros com acesso de edição a itens em risco para aplicações críticas" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ membros em risco", "placeholders": { "count": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Não existem itens para listar." }, + "noItemsInTrash": { + "message": "Nenhum item no lixo" + }, + "noItemsInTrashDesc": { + "message": "Os itens que eliminar aparecerão aqui e serão permanentemente eliminados após 30 dias" + }, + "noItemsInVault": { + "message": "Nenhum item no cofre" + }, + "emptyVaultDescription": { + "message": "O cofre protege mais do que apenas as suas palavras-passe. Guarde aqui credenciais, IDs, cartões e notas de forma segura." + }, + "emptyFavorites": { + "message": "Não adicionou nenhum item aos favoritos" + }, + "emptyFavoritesDesc": { + "message": "Adicione itens utilizados frequentemente aos favoritos para um acesso rápido." + }, + "noSearchResults": { + "message": "Não foram apresentados resultados de pesquisa" + }, + "clearFiltersOrTryAnother": { + "message": "Limpe os filtros ou tente outro termo de pesquisa" + }, "noPermissionToViewAllCollectionItems": { "message": "Não tem permissão para ver todos os itens desta coleção." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organização suspensa" }, + "organizationIsSuspended": { + "message": "A organização está suspensa" + }, + "organizationIsSuspendedDesc": { + "message": "Não é possível aceder aos itens de organizações suspensas. Contacte o proprietário da organização para obter assistência." + }, "secretsAccessSuspended": { "message": "Não é possível aceder a organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "As contas de serviço não podem ser criadas em organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, - "disabledOrganizationFilterError": { - "message": "Não é possível aceder aos itens de organizações suspensas. Contacte o proprietário da organização para obter assistência." - }, "licenseIsExpired": { "message": "A licença expirou." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Identificador SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Forneça este ID aos seus membros para iniciarem sessão com o SSO. Para ignorar este passo, configure a ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Forneça este ID aos seus membros para iniciarem sessão com o SSO. Os membros podem ignorar a introdução deste identificador durante o SSO se estiver configurado um domínio reivindicado. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Saiba mais", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Desvincular SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupo/Utilizador" }, - "lowKdfIterations": { - "message": "Iterações KDF baixas" - }, - "updateLowKdfIterationsDesc": { - "message": "Atualize as suas definições de encriptação para cumprir as novas recomendações de segurança e melhorar a proteção da conta." - }, "kdfSettingsChangeLogoutWarning": { "message": "Ao prosseguir, sairá de todas as sessões ativas. Terá de voltar a iniciar sessão e concluir a verificação de dois passos, caso exista. Recomendamos que exporte o seu cofre antes de alterar as definições de encriptação para evitar a perda de dados." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Falha ao guardar a integração. Por favor, tente novamente mais tarde." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Precisa de ser o proprietário da organização para executar esta ação." + }, "failedToDeleteIntegration": { "message": "Falha ao eliminar a integração. Por favor, tente novamente mais tarde." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Baixa quantidade de iterações do KDF. Aumente as suas iterações para melhorar a segurança da sua conta." - }, - "changeKDFSettings": { - "message": "Alterar as definições do KDF" - }, "secureYourInfrastructure": { "message": "Proteja a sua infraestrutura" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Procurar no arquivo" }, - "archive": { - "message": "Arquivar" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Nenhum item no arquivo" diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 364e7f86e64..974250b3934 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Niciun articol de afișat." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizație suspendată" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Articolele din organizațiile suspendate nu pot fi accesate. Contactați proprietarul organizației pentru asistență." - }, "licenseIsExpired": { "message": "Licența a expirat." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Deconectare SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 753b5745f36..f06fa1449b8 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Создать новый логин" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Критичные приложения ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Уведомленные участники ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Нет элементов для отображения." }, + "noItemsInTrash": { + "message": "Нет элементов в корзине" + }, + "noItemsInTrashDesc": { + "message": "Элементы, которые вы удаляете, появятся здесь и будут удалены навсегда через 30 дней" + }, + "noItemsInVault": { + "message": "В хранилище нет элементов" + }, + "emptyVaultDescription": { + "message": "Хранилище защищает не только ваши пароли. Логины, идентификаторы, карты и заметки в нем надежно защищены." + }, + "emptyFavorites": { + "message": "В избранном нет элементов" + }, + "emptyFavoritesDesc": { + "message": "Добавляйте часто используемые элементы в избранное для быстрого доступа." + }, + "noSearchResults": { + "message": "Поиск не дал результатов" + }, + "clearFiltersOrTryAnother": { + "message": "Очистите фильтры или попробуйте другой поисковый запрос" + }, "noPermissionToViewAllCollectionItems": { "message": "У вас нет разрешения на просмотр всех элементов этой коллекции." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Организация приостановлена" }, + "organizationIsSuspended": { + "message": "Организация приостановлена" + }, + "organizationIsSuspendedDesc": { + "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." + }, "secretsAccessSuspended": { "message": "Доступ к отключенным организациям невозможен. Обратитесь за помощью к владельцу организации." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Сервисные аккаунты не могут быть созданы в отключенных организациях. Обратитесь за помощью к владельцу организации." }, - "disabledOrganizationFilterError": { - "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." - }, "licenseIsExpired": { "message": "Срок действия лицензии истек." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO идентификатор" }, - "ssoIdentifierHintPartOne": { - "message": "Предоставьте этот ID пользователям для авторизации с помощью SSO. Чтобы обойти этот шаг, настройте ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Предоставьте этот ID своим пользователям для авторизации при помощи единого входа. Пользователи могут не вводить этот идентификатор во время единого входа, если настроен заявленный домен. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Подробнее", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Отключить SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Группа/Пользователь" }, - "lowKdfIterations": { - "message": "Низкие итерации KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Обновите настройки шифрования в соответствии с новыми рекомендациями по безопасности и улучшите защиту аккаунта." - }, "kdfSettingsChangeLogoutWarning": { "message": "При продолжении все активные сессии будут завершены. Вам потребуется авторизоваться повторно и выполнить двухэтапную аутентификацию, если она включена. Мы рекомендуем экспортировать хранилище перед изменением настроек шифрования, чтобы предотвратить потерю данных." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Не удалось сохранить интеграцию. Пожалуйста, повторите попытку позже." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Для выполнения этого действия вы должны быть владельцем организации." + }, "failedToDeleteIntegration": { "message": "Не удалось удалить интеграцию. Пожалуйста, повторите попытку позже." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Низкое количество итераций KDF. Увеличьте количество итераций, чтобы повысить защищенность вашего аккаунта." - }, - "changeKDFSettings": { - "message": "Изменить параметры KDF" - }, "secureYourInfrastructure": { "message": "Защитите вашу инфраструктуру" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Поиск в архиве" }, - "archive": { - "message": "Архив" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "В архиве нет элементов" diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index b2b9714e766..062ea291fa1 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 396d37e157e..8bafa670e29 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Pridať novu položku s prihlásením" }, - "criticalApplicationsActivityDescription": { - "message": "Tu sa zobrazia aplikácie, ktoré označíte za kritické." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "Zobraziť ohrozených členov" + }, + "viewAtRiskApplications": { + "message": "Zobraziť ohrozené aplikácie" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ z $TOTAL$ kritických aplikácii je ohrozených nebezpečnými heslami", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritické aplikácie ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ aplikácií ohrozených", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Členovia s oprávnením upravovať ohrozené položky kritických aplikácii" }, - "membersAtRisk": { - "message": "$COUNT$ ohrozených členov", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Neexistujú žiadne položky na zobrazenie." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Nemáte povolenie pre zobrazenie všetkých položiek v tejto zbierke." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organizácia je vypnutá." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "K pozastaveným organizáciám nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "V pozastavených organizáciám nie je možné vytvárať služobné kontá. Požiadajte o pomoc vlastníka organizácie." }, - "disabledOrganizationFilterError": { - "message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." - }, "licenseIsExpired": { "message": "Licencia vypršala." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifikátor" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Zistiť viac", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Odpojiť SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Skupina/Používateľ" }, - "lowKdfIterations": { - "message": "Nízky počet iterácií KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Aktualizujte vaše nastavenie šifrovania aby ste boli v súlade s bezpečnostnými odporúčaniami a vylepšili si tak ochranu vášho konta." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Nepodarilo sa uložiť integráciu. Prosím skúste to neskôr." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Pre vykonanie tejto akcie musíte by vlastník organizácie." + }, "failedToDeleteIntegration": { "message": "Nepodarilo sa odstrániť integráciu. Prosím skúste to neskôr." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Nízky počet iterácií KDF. Pre zlepšenie bezpečnosti vášho konta, zvýšte počet iterácií." - }, - "changeKDFSettings": { - "message": "Zmeniť nastavenia KDF" - }, "secureYourInfrastructure": { "message": "Zabezpečte si infraštruktúru" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Prehľadať archív" }, - "archive": { - "message": "Archív" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Žiadne položky v archíve" diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index e54ef8bb4b6..17431aedecb 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Ni elementov za prikaz." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Nimate dovoljenja za ogled vseh elementov v tej zbirki." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "Licenca je potekla" }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Nizko število ponovitev KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Popravite svoje nastavitve šifriranja, da bodo v skladu z novimi priporočili za varnost, in izboljšajte zaščito svojega računa." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 8b8edaa1ec3..c3278674a56 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Kreirajte novu stavku za prijavu" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritične aplikacije ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Obavešteni članovi ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Nema stavki u listi." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index 68a440646a3..b500c6230e4 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Креирајте нову ставку за пријаву" }, - "criticalApplicationsActivityDescription": { - "message": "Апликације обележене као критичне, су приказане овде." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Критичне апликације ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Обавештени чланови ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Чланови са правом уређивања за угрожене ставке критичних апликација" }, - "membersAtRisk": { - "message": "Угрожени чланови: $COUNT$", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Нама ставке у листи." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Немате дозволу да видите све ставке у овој колекцији." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Организација је онемогућена." }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Суспендованим организацијама се не може приступити. За помоћ контактирајте власника своје организације." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Сервисни налози се не могу креирати у суспендованим организацијама. За помоћ контактирајте власника своје организације." }, - "disabledOrganizationFilterError": { - "message": "Није могуће приступити ставкама у онемогућене организације. Обратите се власнику организације за помоћ." - }, "licenseIsExpired": { "message": "Лиценца је истекла." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO идентификација" }, - "ssoIdentifierHintPartOne": { - "message": "Дајте овај ИД својим члановима да се пријаве са ССО. Да бисте заобишли овај корак, подесите ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Откачи SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Група/Корисник" }, - "lowKdfIterations": { - "message": "Ниска KDF понављања" - }, - "updateLowKdfIterationsDesc": { - "message": "Ажурирајте подешавања шифровања да бисте испунили нове безбедносне препоруке и побољшали заштиту налога." - }, "kdfSettingsChangeLogoutWarning": { "message": "Ако наставите, одјавићете се са свих активних сесија. Мораћете поново да се пријавите и завршитепријаве у два корака, ако имате. Препоручујемо да извезете трезор пре него што промените подешавања шифровања да бисте спречили губитак података." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Није успело сачувавање интеграције. Покушајте поново касније." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Ниске KDF итерације. Повећајте број понављања да бисте побољшали безбедност свог налога." - }, - "changeKDFSettings": { - "message": "Променити KDF подешавања" - }, "secureYourInfrastructure": { "message": "Обезбедите своју инфраструктуру" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Претражи архиву" }, - "archive": { - "message": "Архива" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Нема ставка у архиви" diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 853e60c95bc..130d076eee6 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Skapa nytt inloggningsobjekt" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "När du markerar applikationer som kritiska så kommer de att visas här" + }, + "viewAtRiskMembers": { + "message": "Visa medlemmar i riskzonen" + }, + "viewAtRiskApplications": { + "message": "Visa applikationer i riskzonen" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ av $TOTAL$ kritiska applikationer är i riskzonen på grund av lösenord i riskzonen", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritiska applikationer ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applikationer i riskzonen", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Meddelade medlemmar ($COUNT$)", "placeholders": { @@ -135,10 +163,10 @@ "message": "Riskutsatta medlemmar" }, "membersAtRiskActivityDescription": { - "message": "Members with edit access to at-risk items for critical applications" + "message": "Medlemmar med redigeringsbehörighet till objekt i riskzonen för kritiska applikationer" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ medlemmar i riskzonen", "placeholders": { "count": { "content": "$1", @@ -782,11 +810,11 @@ "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Ny textsändning", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Ny filsändning", "description": "Header for new file send" }, "editItemHeaderLogin": { @@ -810,11 +838,11 @@ "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Redigera textsändning", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Redigera filsändning", "description": "Header for edit file send" }, "viewItemHeaderLogin": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Det finns inga objekt att visa." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Du har inte behörighet att se alla objekt i denna samling." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organisationen är inaktiverad" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Avstängda organisationer kan inte nås. Kontakta din organisationsägare för hjälp." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Servicekonton kan inte skapas i avstängda organisationer. Kontakta din organisationsägare för att få hjälp." }, - "disabledOrganizationFilterError": { - "message": "Det går inte att komma åt objekt i avstängda organisationer. Kontakta din organisationsägare för hjälp." - }, "licenseIsExpired": { "message": "Licensen har upphört att gälla." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-identifierare" }, - "ssoIdentifierHintPartOne": { - "message": "Ge detta ID till dina medlemmar så att de kan logga in med SSO. För att kringgå detta steg, konfigurera ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Avlänka SSO" @@ -6729,7 +6788,7 @@ "message": "SSO inaktiverad" }, "emailMustLoginWithSso": { - "message": "$EMAIL$ must login with Single Sign-on", + "message": "$EMAIL$ måste logga in med Single Sign-on", "placeholders": { "email": { "content": "$1", @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grupp/Användare" }, - "lowKdfIterations": { - "message": "Låga KDF-iterationer" - }, - "updateLowKdfIterationsDesc": { - "message": "Uppdatera dina krypteringsinställningar så att de uppfyller nya säkerhetsrekommendationer och förbättrar kontots skydd." - }, "kdfSettingsChangeLogoutWarning": { "message": "Om du fortsätter loggas du ut från alla aktiva sessioner. Du måste logga in igen och genomföra tvåstegsinloggning, om sådan finns. Vi rekommenderar att du exporterar ditt valv innan du ändrar dina krypteringsinställningar för att förhindra dataförlust." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Misslyckades med att spara integration. Försök igen senare." }, + "mustBeOrgOwnerToPerformAction": { + "message": "Du måste vara organisationens ägare för att utföra denna åtgärd." + }, "failedToDeleteIntegration": { "message": "Misslyckades med att ta bort integrationen. Försök igen senare." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Låga KDF-iterationer. Öka dina iterationer för att förbättra säkerheten för ditt konto." - }, - "changeKDFSettings": { - "message": "Ändra KDF-inställningar" - }, "secureYourInfrastructure": { "message": "Säkra din infrastruktur" }, @@ -11022,16 +11072,21 @@ "message": "Gratisorganisationer kan ha upp till 2 samlingar. Uppgradera till en betald plan för att lägga till fler samlingar." }, "searchArchive": { - "message": "Search archive" + "message": "Sök i arkiv" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Inga objekt i arkivet" }, "archivedItemsDescription": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Arkiverade objekt kommer att visas här och kommer att uteslutas från allmänna sökresultat och förslag för autofyll." }, "businessUnit": { "message": "Affärsenhet" @@ -11370,7 +11425,7 @@ "message": "Additional storage GB" }, "additionalServiceAccountsV2": { - "message": "Additional machine accounts" + "message": "Ytterligare maskinkonton" }, "secretsManagerSeats": { "message": "Secrets Manager seats" @@ -11391,10 +11446,10 @@ "message": "Complete online security" }, "planDescFamiliesV2": { - "message": "Premium security for your family" + "message": "Premiumsäkerhet för din familj" }, "planDescFreeV2": { - "message": "Share with $COUNT$ other user", + "message": "Dela med $COUNT$ annan användare", "placeholders": { "count": { "content": "$1", @@ -11403,37 +11458,37 @@ } }, "planDescEnterpriseV2": { - "message": "Advanced capabilities for any organization" + "message": "Avancerade förmågor för alla organisationer" }, "planNameCustom": { - "message": "Custom plan" + "message": "Anpassad plan" }, "planDescCustom": { - "message": "Bitwarden scales with businesses of all sizes to secure passwords and sensitive information. If you're part of a large enterprise, contact sales to request a quote." + "message": "Bitwarden skalar med företag i alla storlekar för att säkra lösenord och känslig information. Om du är en del av ett stort företag, kontakta vår försäljningsavdelning för att begära en offert." }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "Inbyggd authenticator" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Intrångsmonitorering" }, "andMoreFeatures": { "message": "Och mer!" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Säker fillagring" }, "familiesUnlimitedSharing": { - "message": "Unlimited sharing - choose who sees what" + "message": "Obegränsad delning - välj vem som ser vad" }, "familiesUnlimitedCollections": { - "message": "Unlimited family collections" + "message": "Obegränsade familjesamlingar" }, "familiesSharedStorage": { - "message": "Shared storage for important family info" + "message": "Delad lagring för viktig familjeinformation" }, "limitedUsersV2": { - "message": "Up to $COUNT$ members", + "message": "Upp till $COUNT$ medlemmar", "placeholders": { "count": { "content": "$1", @@ -11442,7 +11497,7 @@ } }, "limitedCollectionsV2": { - "message": "Up to $COUNT$ collections", + "message": "Upp till $COUNT$ samlingar", "placeholders": { "count": { "content": "$1", @@ -11451,13 +11506,13 @@ } }, "alwaysFree": { - "message": "Always free" + "message": "Alltid gratis" }, "twoSecretsIncluded": { - "message": "2 secrets" + "message": "2 hemligheter" }, "projectsIncludedV2": { - "message": "$COUNT$ project(s)", + "message": "$COUNT$ projekt", "placeholders": { "count": { "content": "$1", @@ -11466,13 +11521,13 @@ } }, "secureItemSharing": { - "message": "Secure item sharing" + "message": "Säker objektdelning" }, "scimSupport": { - "message": "SCIM support" + "message": "SCIM-stöd" }, "includedMachineAccountsV2": { - "message": "$COUNT$ machine accounts", + "message": "$COUNT$ maskinkonton", "placeholders": { "count": { "content": "$1", @@ -11481,21 +11536,21 @@ } }, "enterpriseSecurityPolicies": { - "message": "Enterprise security policies" + "message": "Säkerhetspolicyer för företag" }, "selfHostOption": { "message": "Self-host option" }, "complimentaryFamiliesPlan": { - "message": "Complimentary families plan for all users" + "message": "Kostnadsfri familjeplan för alla användare" }, "strengthenCybersecurity": { - "message": "Strengthen cybersecurity" + "message": "Förbättrad cybersäkerhet" }, "boostProductivity": { - "message": "Boost productivity" + "message": "Maximera produktiviteten" }, "seamlessIntegration": { - "message": "Seamless integration" + "message": "Sömlös integration" } } diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json index dc3e32726d4..3534de7e547 100644 --- a/apps/web/src/locales/ta/messages.json +++ b/apps/web/src/locales/ta/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "புதிய உள்நுழைவு உருப்படியை உருவாக்கவும்" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "முக்கியமான பயன்பாடுகள் ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "அறிவிக்கப்பட்ட உறுப்பினர்கள் ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "பட்டியலிட உருப்படிகள் எதுவும் இல்லை." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "இந்தத் தொகுப்பிலுள்ள எல்லா உருப்படிகளையும் பார்க்க உங்களுக்கு அனுமதி இல்லை." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "நிறுவனம் இடைநிறுத்தப்பட்டது" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "இடைநிறுத்தப்பட்ட நிறுவனங்களை அணுக முடியாது. உதவிக்கு உங்கள் நிறுவன உரிமையாளரைத் தொடர்புகொள்ளவும்." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "இடைநிறுத்தப்பட்ட நிறுவனங்களில் சேவை கணக்குகளை உருவாக்க முடியாது. உதவிக்கு உங்கள் நிறுவன உரிமையாளரைத் தொடர்புகொள்ளவும்." }, - "disabledOrganizationFilterError": { - "message": "இடைநிறுத்தப்பட்ட நிறுவனங்களில் உள்ள பொருட்களை அணுக முடியாது. உதவிக்கு உங்கள் நிறுவன உரிமையாளரைத் தொடர்புகொள்ளவும்." - }, "licenseIsExpired": { "message": "உரிமம் காலாவதியாகிவிட்டது." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO அடையாளங்காட்டி" }, - "ssoIdentifierHintPartOne": { - "message": "SSO உடன் உள்நுழைய இந்த ஐடியை உங்கள் உறுப்பினர்களுக்கு வழங்கவும். இந்த படியைத் தவிர்க்க, அமைக்கவும் ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO இணைப்பை நீக்கு" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "குழு/பயனர்" }, - "lowKdfIterations": { - "message": "குறைந்த KDF இட்டரேஷன்ஸ்" - }, - "updateLowKdfIterationsDesc": { - "message": "புதிய பாதுகாப்புப் பரிந்துரைகளை பூர்த்தி செய்யவும் மற்றும் கணக்கு பாதுகாப்பை மேம்படுத்தவும் உங்கள் குறியாக்க அமைப்புகளைப் புதுப்பிக்கவும்." - }, "kdfSettingsChangeLogoutWarning": { "message": "தொடர்வது அனைத்து செயலில் உள்ள அமர்வுகளிலிருந்தும் உங்களை வெளியேற்றும். நீங்கள் மீண்டும் உள்நுழைய வேண்டும் மற்றும் இரண்டு-படி உள்நுழைவை முடிக்க வேண்டும், ஏதேனும் இருந்தால். தரவு இழப்பைத் தடுக்க உங்கள் குறியாக்க அமைப்புகளை மாற்றுவதற்கு முன் உங்கள் பெட்டகத்தை ஏற்றுமதி செய்யுமாறு பரிந்துரைக்கிறோம்." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "ஒருங்கிணைப்பைச் சேமிக்கத் தவறிவிட்டது. பின்னர் மீண்டும் முயற்சிக்கவும்." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "குறைந்த KDF இட்டரேஷன்கள். உங்கள் கணக்கின் பாதுகாப்பை மேம்படுத்த, உங்கள் இட்டரேஷன்களை அதிகரிக்கவும்." - }, - "changeKDFSettings": { - "message": "KDF அமைப்புகளை மாற்றவும்" - }, "secureYourInfrastructure": { "message": "உங்கள் கட்டமைப்பைப் பாதுகாக்கவும்" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 526b7567d99..fa4c124416d 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "There are no items to list." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 0f9c3bea24d..717c78cb3ca 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Create new login item" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Notified members ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "ไม่มีรายการการสำหรับแสดง" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "You do not have permission to view all items in this collection." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Organization suspended" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." }, - "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." - }, "licenseIsExpired": { "message": "License is expired." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO identifier" }, - "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Unlink SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Group/User" }, - "lowKdfIterations": { - "message": "Low KDF Iterations" - }, - "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." - }, - "changeKDFSettings": { - "message": "Change KDF settings" - }, "secureYourInfrastructure": { "message": "Secure your infrastructure" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index f36a336a4d1..5a52f872f57 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Yeni hesap kaydı oluştur" }, - "criticalApplicationsActivityDescription": { - "message": "Uygulamaları kritik olarak işaretlediğinizde, bunlar burada görüntülenir." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Kritik uygulamalar ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Bildirilen üyeler ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Kritik uygulamalar için risk altındaki kayıtlara düzenleme erişimi olan üyeler" }, - "membersAtRisk": { - "message": "$COUNT$ üye risk altında", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Listelenecek kayıt yok." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Bu koleksiyondaki tüm kayıtları görmek için izniniz yok." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Kuruluş askıya alındı" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Askıya alınan kuruluşlara erişilemez. Lütfen yardım için kuruluşunuzun sahibiyle iletişime geçin." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Askıya alınan kuruluşlarda hizmet hesapları oluşturulamaz. Lütfen yardım için kuruluşunuzun sahibiyle iletişime geçin." }, - "disabledOrganizationFilterError": { - "message": "Askıya alınmış kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." - }, "licenseIsExpired": { "message": "Lisans süresi doldu." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO tanımlayıcı" }, - "ssoIdentifierHintPartOne": { - "message": "SSO ile giriş yapmaları için bu kimliği üyelerinize sağlayın. Bu adımı atlamak için kurulum yapın ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "SSO bağlantısını kes" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Grup/Kullanıcı" }, - "lowKdfIterations": { - "message": "Düşük KDF iterasyonu" - }, - "updateLowKdfIterationsDesc": { - "message": "Yeni güvenlik önerilerini karşılamak ve hesap korumasını iyileştirmek için şifreleme ayarlarınızı güncelleyin." - }, "kdfSettingsChangeLogoutWarning": { "message": "Devam ettiğinizde tüm aktif oturumlardan çıkış yapacaksınız. Tekrar oturum açmanız ve varsa iki aşamalı oturum açma işlemini tamamlamanız gerekecektir. Veri kaybını önlemek için şifreleme ayarlarınızı değiştirmeden önce kasayı dışa aktarmanızı öneririz." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Entegrasyon kaydedilemedi. Lütfen daha sonra tekrar deneyin." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Entegrasyon silinemedi. Lütfen daha sonra tekrar deneyin." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Düşük KDF iterasyonları. Hesabınızın güvenliğini artırmak için iterasyonları artırın." - }, - "changeKDFSettings": { - "message": "KDF ayarlarını değiştir" - }, "secureYourInfrastructure": { "message": "Altyapınızı güvence altına alın" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Arşivde ara" }, - "archive": { - "message": "Arşiv" + "archiveNoun": { + "message": "Arşiv", + "description": "Noun" + }, + "archiveVerb": { + "message": "Arşivle", + "description": "Verb" }, "noItemsInArchive": { "message": "Arşivde kayıt yok" diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index f68cf42627d..e1aa1169f43 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Створити новий запис" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Критичні програми ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Сповіщення учасників ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Немає записів." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "У вас немає повноважень на перегляд усіх записів у цій збірці." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Організацію призупинено" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "До призупинених організацій не можна отримати доступ. Зверніться до власника вашої організації для отримання допомоги." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "У призупинених організаціях не можна створювати службові облікові записи. Зверніться до власника вашої організації для отримання допомоги." }, - "disabledOrganizationFilterError": { - "message": "Записи у призупинених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги." - }, "licenseIsExpired": { "message": "Термін дії ліцензії завершився." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO-ідентифікатор" }, - "ssoIdentifierHintPartOne": { - "message": "Надайте цей ID своїм учасникам для входу з використанням SSO. Щоб обійти цей крок, налаштуйте ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Від'єднати SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Група/Користувач" }, - "lowKdfIterations": { - "message": "Низьке значення ітерацій KDF" - }, - "updateLowKdfIterationsDesc": { - "message": "Оновіть свої налаштування шифрування згідно з новими рекомендаціями щодо безпеки для вдосконалення захисту облікового запису." - }, "kdfSettingsChangeLogoutWarning": { "message": "Продовжуючи, ви вийдете з усіх активних сеансів. Необхідно буде повторно виконати вхід і пройти двоетапну перевірку, якщо вона увімкнена. Перед зміною налаштувань шифрування ми рекомендуємо експортувати ваше сховище, щоб запобігти можливій втраті даних." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Низьке значення ітерацій KDF. Збільште значення для посилення безпеки свого облікового запису." - }, - "changeKDFSettings": { - "message": "Змінити налаштування KDF" - }, "secureYourInfrastructure": { "message": "Захистіть свою інфраструктуру" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 9a87b3e2c6c..998fcf560e2 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "Tạo mục đăng nhập mới" }, - "criticalApplicationsActivityDescription": { - "message": "Khi bạn đánh dấu các ứng dụng là quan trọng, chúng sẽ hiển thị tại đây." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "Ứng dụng quan trọng ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "Các thành viên đã được thông báo ($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Thành viên có quyền chỉnh sửa đối với các mục có nguy cơ cho các ứng dụng quan trọng" }, - "membersAtRisk": { - "message": "$COUNT$ thành viên có nguy cơ", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "Chưa có mục nào." }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "Bạn không có quyền xem tất cả mục trong bộ sưu tập này." }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "Tổ chức đã bị tạm ngưng" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "Không thể truy cập các tổ chức đã bị tạm ngưng. Vui lòng liên hệ với chủ sở hữu tổ chức của bạn để được hỗ trợ." }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "Không thể tạo tài khoản dịch vụ trong các tổ chức đã bị tạm ngưng. Vui lòng liên hệ với chủ sở hữu tổ chức của bạn để được hỗ trợ." }, - "disabledOrganizationFilterError": { - "message": "Không thể truy cập các mục trong tổ chức đã bị tạm ngưng. Vui lòng liên hệ với chủ sở hữu tổ chức của bạn để được hỗ trợ." - }, "licenseIsExpired": { "message": "Giấy phép đã hết hạn." }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "Mã định danh SSO" }, - "ssoIdentifierHintPartOne": { - "message": "Cung cấp ID này cho các thành viên của bạn để đăng nhập bằng SSO. Để bỏ qua bước này, hãy thiết lập ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "Hủy liên kết SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "Nhóm/Người dùng" }, - "lowKdfIterations": { - "message": "Số vòng lặp KDF thấp" - }, - "updateLowKdfIterationsDesc": { - "message": "Cập nhật cài đặt mã hóa của bạn để đáp ứng các khuyến nghị bảo mật mới và cải thiện bảo vệ tài khoản." - }, "kdfSettingsChangeLogoutWarning": { "message": "Tiếp tục sẽ đăng xuất bạn khỏi tất cả các phiên hoạt động. Bạn sẽ cần đăng nhập lại và hoàn tất đăng nhập hai bước (nếu có). Chúng tôi khuyến nghị xuất kho mật khẩu của bạn trước khi thay đổi cài đặt mã hóa để tránh mất dữ liệu." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Không thể lưu tích hợp. Vui lòng thử lại sau." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Không thể xóa tích hợp. Vui lòng thử lại sau." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "Số vòng lặp KDF thấp. Tăng số vòng lặp để cải thiện bảo mật cho tài khoản của bạn." - }, - "changeKDFSettings": { - "message": "Thay đổi cài đặt KDF" - }, "secureYourInfrastructure": { "message": "Bảo vệ hạ tầng của bạn" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Tìm kiếm kho lưu trữ" }, - "archive": { - "message": "Lưu trữ" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "Không có mục nào trong kho lưu trữ" diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 38c585142df..e9b81cd5a07 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "创建新的登录项目" }, - "criticalApplicationsActivityDescription": { - "message": "您将应用程序标记为关键后,它们将显示在这里。" + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "您将应用程序标记为关键后,它们将显示在这里" + }, + "viewAtRiskMembers": { + "message": "查看存在风险的成员" + }, + "viewAtRiskApplications": { + "message": "查看存在风险的应用程序" + }, + "criticalApplicationsAreAtRisk": { + "message": "总计 $TOTAL$ 个中的 $COUNT$ 个关键应用程序因密码风险而存在风险", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "关键应用程序 ($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ 个应用程序存在风险", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "已通知的成员 ($COUNT$)", "placeholders": { @@ -137,7 +165,7 @@ "membersAtRiskActivityDescription": { "message": "对关键应用程序中存在风险的项目具有编辑权限的成员" }, - "membersAtRisk": { + "membersAtRiskCount": { "message": "$COUNT$ 个成员存在风险", "placeholders": { "count": { @@ -959,7 +987,7 @@ "message": "卡号" }, "copyFieldCipherName": { - "message": "复制 $CIPHERNAME$ 的 $FIELD$", + "message": "复制 $CIPHERNAME$ 中的 $FIELD$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "没有可列出的项目。" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "密码库中没有项目" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "您没有查看此集合中的所有项目的权限。" }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "组织已暂停" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "无法访问已暂停的组织。请联系您的组织所有者寻求帮助。" }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "无法在已暂停的组织中创建服务账户。请联系您的组织所有者寻求帮助。" }, - "disabledOrganizationFilterError": { - "message": "无法访问已暂停组织中的项目。请联系您的组织所有者寻求帮助。" - }, "licenseIsExpired": { "message": "授权已过期" }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO 标识符" }, - "ssoIdentifierHintPartOne": { - "message": "将此 ID 提供给您的成员以供 SSO 登录使用。要绕过此步骤,请设置 ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "取消链接 SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "群组/用户" }, - "lowKdfIterations": { - "message": "较低的 KDF 迭代" - }, - "updateLowKdfIterationsDesc": { - "message": "更新您的加密设置以满足新的安全建议以及增强账户保护。" - }, "kdfSettingsChangeLogoutWarning": { "message": "接下来将会注销您所有的活动会话。您需要重新登录并完成两步登录(如果有)。我们建议您在更改加密设置前导出密码库,以防止数据丢失。" }, @@ -8760,7 +8813,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "满分 $TOTAL$", + "message": "总计 $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "保存集成失败。请稍后再试。" }, + "mustBeOrgOwnerToPerformAction": { + "message": "您必须是组织所有者才能执行此操作。" + }, "failedToDeleteIntegration": { "message": "删除集成失败。请稍后再试。" }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "KDF 迭代低。请增加迭代次数以提高您账户的安全性。" - }, - "changeKDFSettings": { - "message": "更改 KDF 设置" - }, "secureYourInfrastructure": { "message": "保护您的基础设施" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "搜索归档" }, - "archive": { - "message": "归档" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "归档中没有项目" diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 4f9a78c2c02..78f1665121a 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -59,8 +59,27 @@ "createNewLoginItem": { "message": "新增登入項目" }, - "criticalApplicationsActivityDescription": { - "message": "Once you mark applications critical, they will display here." + "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { + "message": "Once you mark applications critical, they will display here" + }, + "viewAtRiskMembers": { + "message": "View at-risk members" + }, + "viewAtRiskApplications": { + "message": "View at-risk applications" + }, + "criticalApplicationsAreAtRisk": { + "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + }, + "total": { + "content": "$2", + "example": "5" + } + } }, "criticalApplicationsWithCount": { "message": "重要應用程式($COUNT$)", @@ -80,6 +99,15 @@ } } }, + "countOfApplicationsAtRisk": { + "message": "$COUNT$ applications at-risk", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "notifiedMembersWithCount": { "message": "已被通知的成員($COUNT$)", "placeholders": { @@ -137,8 +165,8 @@ "membersAtRiskActivityDescription": { "message": "Members with edit access to at-risk items for critical applications" }, - "membersAtRisk": { - "message": "$COUNT$ members at risk", + "membersAtRiskCount": { + "message": "$COUNT$ members at-risk", "placeholders": { "count": { "content": "$1", @@ -1480,6 +1508,30 @@ "noItemsInList": { "message": "沒有可列出的項目。" }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "noItemsInVault": { + "message": "No items in the vault" + }, + "emptyVaultDescription": { + "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + }, + "emptyFavorites": { + "message": "You haven't favorited any items" + }, + "emptyFavoritesDesc": { + "message": "Add frequently used items to favorites for quick access." + }, + "noSearchResults": { + "message": "No search results returned" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, "noPermissionToViewAllCollectionItems": { "message": "您沒有檢視此集合中所有項目的權限。" }, @@ -4772,6 +4824,12 @@ "organizationIsDisabled": { "message": "組織已停用" }, + "organizationIsSuspended": { + "message": "Organization is suspended" + }, + "organizationIsSuspendedDesc": { + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + }, "secretsAccessSuspended": { "message": "無法存取已停用的組織。請聯絡您組織的擁有者以獲取協助。" }, @@ -4784,9 +4842,6 @@ "serviceAccountsCannotCreate": { "message": "無法在已停用組織中新增服務帳戶。請聯絡您組織的擁有者以獲取協助。" }, - "disabledOrganizationFilterError": { - "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。" - }, "licenseIsExpired": { "message": "授權已逾期。" }, @@ -5160,9 +5215,13 @@ "ssoIdentifier": { "message": "SSO 識別" }, - "ssoIdentifierHintPartOne": { - "message": "將此 ID 提供給您的成員以使用 SSO 登入。若要繞過此步驟,請設定 ", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" + "ssoIdentifierHint": { + "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" + }, + "claimedDomainsLearnMore": { + "message": "Learn more", + "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { "message": "取消連結 SSO" @@ -8376,12 +8435,6 @@ "groupSlashUser": { "message": "群組/使用者" }, - "lowKdfIterations": { - "message": "較低的 KDF 迭代次數" - }, - "updateLowKdfIterationsDesc": { - "message": "更新您的加密設定以滿足新的安全建議以及提升帳號保護。" - }, "kdfSettingsChangeLogoutWarning": { "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, @@ -9755,6 +9808,9 @@ "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." }, + "mustBeOrgOwnerToPerformAction": { + "message": "You must be the organization owner to perform this action." + }, "failedToDeleteIntegration": { "message": "Failed to delete integration. Please try again later." }, @@ -9996,12 +10052,6 @@ } } }, - "lowKDFIterationsBanner": { - "message": "低 KDF 迭代。增加迭代次數以提高帳號的安全性。" - }, - "changeKDFSettings": { - "message": "變更 KDF 設定" - }, "secureYourInfrastructure": { "message": "保護你的基礎設施" }, @@ -11024,8 +11074,13 @@ "searchArchive": { "message": "Search archive" }, - "archive": { - "message": "Archive" + "archiveNoun": { + "message": "Archive", + "description": "Noun" + }, + "archiveVerb": { + "message": "Archive", + "description": "Verb" }, "noItemsInArchive": { "message": "No items in archive" From 4313dd2ecb9c11ecd761bc35f0db96678ce0f75d Mon Sep 17 00:00:00 2001 From: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Date: Thu, 2 Oct 2025 08:55:04 -0400 Subject: [PATCH 13/14] feat(SendAccess): [Auth/PM-22661] SendTokenService + SDK Integration (#16007) * PM-22661 - Start bringing in code from original PR * PM-22661 - SendTokenService - implement and test hash send password * PM-22661 - Starting to pull in SDK state to SendTokenService * PM-22661 - WIP on default send token service * PM-22661 - Build out TS helpers for TryGetSendAccessTokenError * PM-22661 - WIP * PM-22661 - Decent progress on getting _tryGetSendAccessToken wired up * PM-22661 - Finish service implementation (TODO: test) * PM-22661 - DefaultSendTokenService - clear expired tokens * PM-22661 - SendTokenService - tests for tryGetSendAccessToken$ * PM-22661 - DefaultSendTokenService - more tests. * PM-22661 - Refactor to create domain facing type for send access creds so we can internally map to SDK models instead of exposing them. * PM-22661 - DefaultSendTokenService tests - finish testing error scenarios * PM-22661 - SendAccessToken - add threshold to expired check to prevent tokens from expiring in flight * PM-22661 - clean up docs and add invalidateSendAccessToken * PM-22661 - Add SendAccessToken tests * PM-22661 - Build out barrel files and provide send token service in jslib-services. * PM-22661 - Improve credential validation and test the scenarios * PM-22661 - Add handling for otp_generation_failed * PM-22661 - npm i sdk version 0.2.0-main.298 which has send access client stuff * PM-22661 - Bump to latest sdk changes for send access for testing. * PM-22661 - fix comment to be accurate * PM-22661 - DefaultSendTokenService - hashSendPassword - to fix compile time error with passing a Uint8Array to Utils.fromBufferToB64, add new overloads to Utils.fromBufferToB64 to handle ArrayBuffer and ArrayBufferView (to allow for Uint8Arrays). Then, test new scenarios to ensure feature parity with old fromBufferToB64 method. * PM-22661 - Utils.fromBufferToB64 - remove overloads so ordering doesn't break test spies. * PM-22661 - utils.fromBufferToB64 - re-add overloads to see effects on tests * PM-22661 - revert utils changes as they will be done in a separate PR. * PM-22661 - SendTokenService tests - test invalidateSendAccessToken * PM-22661 - DefaultSendTokenService - add some storage layer tests * PM-22661 - Per PR feedback fix comment * PM-22661 - Per PR feedback, optimize writes to state for send access tokens with shouldUpdate. * PM-22661 - Per PR feedback, update clear to be immutable vs delete (mutation) based. * PM-22661 - Per PR feedback, re-add should update for clear method. * PM-22661 - Update libs/common/src/auth/send-access/services/default-send-token.service.ts Co-authored-by: rr-bw <102181210+rr-bw@users.noreply.github.com> * PM-22661 - Update libs/common/src/auth/send-access/services/default-send-token.service.ts Co-authored-by: rr-bw <102181210+rr-bw@users.noreply.github.com> * PM-22661 - Update libs/common/src/auth/send-access/services/default-send-token.service.ts Co-authored-by: rr-bw <102181210+rr-bw@users.noreply.github.com> --------- Co-authored-by: rr-bw <102181210+rr-bw@users.noreply.github.com> --- .../src/services/jslib-services.module.ts | 6 + .../auth/send-access/abstractions/index.ts | 1 + .../abstractions/send-token.service.ts | 57 ++ libs/common/src/auth/send-access/index.ts | 4 + .../src/auth/send-access/models/index.ts | 1 + .../models/send-access-token.spec.ts | 75 ++ .../send-access/models/send-access-token.ts | 46 ++ .../default-send-token.service.spec.ts | 678 ++++++++++++++++++ .../services/default-send-token.service.ts | 316 ++++++++ .../src/auth/send-access/services/index.ts | 1 + .../services/send-access-token-dict.state.ts | 15 + .../types/get-send-access-token-error.type.ts | 12 + .../src/auth/send-access/types/index.ts | 7 + .../types/invalid-grant-errors.type.ts | 62 ++ .../types/invalid-request-errors.type.ts | 62 ++ .../send-access-domain-credentials.type.ts | 11 + .../types/send-hashed-password-b64.type.ts | 3 + .../auth/send-access/types/send-otp.type.ts | 3 + .../try-get-send-access-token-error.type.ts | 7 + libs/state/src/core/state-definitions.ts | 1 + package-lock.json | 8 +- package.json | 2 +- 22 files changed, 1373 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/auth/send-access/abstractions/index.ts create mode 100644 libs/common/src/auth/send-access/abstractions/send-token.service.ts create mode 100644 libs/common/src/auth/send-access/index.ts create mode 100644 libs/common/src/auth/send-access/models/index.ts create mode 100644 libs/common/src/auth/send-access/models/send-access-token.spec.ts create mode 100644 libs/common/src/auth/send-access/models/send-access-token.ts create mode 100644 libs/common/src/auth/send-access/services/default-send-token.service.spec.ts create mode 100644 libs/common/src/auth/send-access/services/default-send-token.service.ts create mode 100644 libs/common/src/auth/send-access/services/index.ts create mode 100644 libs/common/src/auth/send-access/services/send-access-token-dict.state.ts create mode 100644 libs/common/src/auth/send-access/types/get-send-access-token-error.type.ts create mode 100644 libs/common/src/auth/send-access/types/index.ts create mode 100644 libs/common/src/auth/send-access/types/invalid-grant-errors.type.ts create mode 100644 libs/common/src/auth/send-access/types/invalid-request-errors.type.ts create mode 100644 libs/common/src/auth/send-access/types/send-access-domain-credentials.type.ts create mode 100644 libs/common/src/auth/send-access/types/send-hashed-password-b64.type.ts create mode 100644 libs/common/src/auth/send-access/types/send-otp.type.ts create mode 100644 libs/common/src/auth/send-access/types/try-get-send-access-token-error.type.ts diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 3304c54a86f..df135dcc0ef 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -104,6 +104,7 @@ import { UserVerificationService as UserVerificationServiceAbstraction } from "@ import { WebAuthnLoginApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/webauthn/webauthn-login-api.service.abstraction"; import { WebAuthnLoginPrfKeyServiceAbstraction } from "@bitwarden/common/auth/abstractions/webauthn/webauthn-login-prf-key.service.abstraction"; import { WebAuthnLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction"; +import { SendTokenService, DefaultSendTokenService } from "@bitwarden/common/auth/send-access"; import { AccountApiServiceImplementation } from "@bitwarden/common/auth/services/account-api.service"; import { AccountServiceImplementation } from "@bitwarden/common/auth/services/account.service"; import { AnonymousHubService } from "@bitwarden/common/auth/services/anonymous-hub.service"; @@ -1588,6 +1589,11 @@ const safeProviders: SafeProvider[] = [ MessageListener, ], }), + safeProvider({ + provide: SendTokenService, + useClass: DefaultSendTokenService, + deps: [GlobalStateProvider, SdkService, SendPasswordService], + }), safeProvider({ provide: EndUserNotificationService, useClass: DefaultEndUserNotificationService, diff --git a/libs/common/src/auth/send-access/abstractions/index.ts b/libs/common/src/auth/send-access/abstractions/index.ts new file mode 100644 index 00000000000..be8d6282020 --- /dev/null +++ b/libs/common/src/auth/send-access/abstractions/index.ts @@ -0,0 +1 @@ +export * from "./send-token.service"; diff --git a/libs/common/src/auth/send-access/abstractions/send-token.service.ts b/libs/common/src/auth/send-access/abstractions/send-token.service.ts new file mode 100644 index 00000000000..3ecdc101892 --- /dev/null +++ b/libs/common/src/auth/send-access/abstractions/send-token.service.ts @@ -0,0 +1,57 @@ +import { Observable } from "rxjs"; + +import { SendAccessToken } from "../models/send-access-token"; +import { GetSendAccessTokenError } from "../types/get-send-access-token-error.type"; +import { SendAccessDomainCredentials } from "../types/send-access-domain-credentials.type"; +import { SendHashedPasswordB64 } from "../types/send-hashed-password-b64.type"; +import { TryGetSendAccessTokenError } from "../types/try-get-send-access-token-error.type"; + +/** + * Service to manage send access tokens. + */ +export abstract class SendTokenService { + /** + * Attempts to retrieve a {@link SendAccessToken} for the given sendId. + * If the access token is found in session storage and is not expired, then it returns the token. + * If the access token is expired, then it returns a {@link TryGetSendAccessTokenError} expired error. + * If an access token is not found in storage, then it attempts to retrieve it from the server (will succeed for sends that don't require any credentials to view). + * If the access token is successfully retrieved from the server, then it stores the token in session storage and returns it. + * If an access token cannot be granted b/c the send requires credentials, then it returns a {@link TryGetSendAccessTokenError} indicating which credentials are required. + * Any submissions of credentials will be handled by the getSendAccessToken$ method. + * @param sendId The ID of the send to retrieve the access token for. + * @returns An observable that emits a SendAccessToken if successful, or a TryGetSendAccessTokenError if not. + */ + abstract tryGetSendAccessToken$: ( + sendId: string, + ) => Observable<SendAccessToken | TryGetSendAccessTokenError>; + + /** + * Retrieves a SendAccessToken for the given sendId using the provided credentials. + * If the access token is successfully retrieved from the server, it stores the token in session storage and returns it. + * If the access token cannot be granted due to invalid credentials, it returns a {@link GetSendAccessTokenError}. + * @param sendId The ID of the send to retrieve the access token for. + * @param sendAccessCredentials The credentials to use for accessing the send. + * @returns An observable that emits a SendAccessToken if successful, or a GetSendAccessTokenError if not. + */ + abstract getSendAccessToken$: ( + sendId: string, + sendAccessCredentials: SendAccessDomainCredentials, + ) => Observable<SendAccessToken | GetSendAccessTokenError>; + + /** + * Hashes a password for send access which is required to create a {@link SendAccessTokenRequest} + * (more specifically, to create a {@link SendAccessDomainCredentials} for sends that require a password) + * @param password The raw password string to hash. + * @param keyMaterialUrlB64 The base64 URL encoded key material string. + * @returns A promise that resolves to the hashed password as a SendHashedPasswordB64. + */ + abstract hashSendPassword: ( + password: string, + keyMaterialUrlB64: string, + ) => Promise<SendHashedPasswordB64>; + + /** + * Clears a send access token from storage. + */ + abstract invalidateSendAccessToken: (sendId: string) => Promise<void>; +} diff --git a/libs/common/src/auth/send-access/index.ts b/libs/common/src/auth/send-access/index.ts new file mode 100644 index 00000000000..38352451e49 --- /dev/null +++ b/libs/common/src/auth/send-access/index.ts @@ -0,0 +1,4 @@ +export * from "./abstractions"; +export * from "./models"; +export * from "./services"; +export * from "./types"; diff --git a/libs/common/src/auth/send-access/models/index.ts b/libs/common/src/auth/send-access/models/index.ts new file mode 100644 index 00000000000..9748d794715 --- /dev/null +++ b/libs/common/src/auth/send-access/models/index.ts @@ -0,0 +1 @@ +export * from "./send-access-token"; diff --git a/libs/common/src/auth/send-access/models/send-access-token.spec.ts b/libs/common/src/auth/send-access/models/send-access-token.spec.ts new file mode 100644 index 00000000000..6bacac7eb6d --- /dev/null +++ b/libs/common/src/auth/send-access/models/send-access-token.spec.ts @@ -0,0 +1,75 @@ +import { SendAccessTokenResponse } from "@bitwarden/sdk-internal"; + +import { SendAccessToken } from "./send-access-token"; + +describe("SendAccessToken", () => { + const sendId = "sendId"; + + const NOW = 1_000_000; // fixed timestamp for predictable results + + const expiresAt: number = NOW + 1000 * 60 * 5; // 5 minutes from now + + const expiredExpiresAt: number = NOW - 1000 * 60 * 5; // 5 minutes ago + + let nowSpy: jest.SpyInstance<number, []>; + + beforeAll(() => { + nowSpy = jest.spyOn(Date, "now"); + }); + + beforeEach(() => { + // Ensure every test starts from the same fixed time + nowSpy.mockReturnValue(NOW); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + it("should create a valid, unexpired token", () => { + const token = new SendAccessToken(sendId, expiresAt); + expect(token).toBeTruthy(); + expect(token.isExpired()).toBe(false); + }); + + it("should be expired after the expiration time", () => { + const token = new SendAccessToken(sendId, expiredExpiresAt); + expect(token.isExpired()).toBe(true); + }); + + it("should be considered expired if within 5 seconds of expiration", () => { + const token = new SendAccessToken(sendId, expiresAt); + nowSpy.mockReturnValue(expiresAt - 4_000); // 4 seconds before expiry + expect(token.isExpired()).toBe(true); + }); + + it("should return the correct time until expiry in seconds", () => { + const token = new SendAccessToken(sendId, expiresAt); + expect(token.timeUntilExpirySeconds()).toBe(300); // 5 minutes + }); + + it("should return 0 if the token is expired", () => { + const token = new SendAccessToken(sendId, expiredExpiresAt); + expect(token.timeUntilExpirySeconds()).toBe(0); + }); + + it("should create a token from JSON", () => { + const json = { + token: sendId, + expiresAt: expiresAt, + }; + const token = SendAccessToken.fromJson(json); + expect(token).toBeTruthy(); + expect(token.isExpired()).toBe(false); + }); + + it("should create a token from SendAccessTokenResponse", () => { + const response = { + token: sendId, + expiresAt: expiresAt, + } as SendAccessTokenResponse; + const token = SendAccessToken.fromSendAccessTokenResponse(response); + expect(token).toBeTruthy(); + expect(token.isExpired()).toBe(false); + }); +}); diff --git a/libs/common/src/auth/send-access/models/send-access-token.ts b/libs/common/src/auth/send-access/models/send-access-token.ts new file mode 100644 index 00000000000..e237243159d --- /dev/null +++ b/libs/common/src/auth/send-access/models/send-access-token.ts @@ -0,0 +1,46 @@ +import { Jsonify } from "type-fest"; + +import { SendAccessTokenResponse } from "@bitwarden/sdk-internal"; + +export class SendAccessToken { + constructor( + /** + * The access token string + */ + readonly token: string, + /** + * The time (in milliseconds since the epoch) when the token expires + */ + readonly expiresAt: number, + ) {} + + /** Returns whether the send access token is expired or not + * Has a 5 second threshold to avoid race conditions with the token + * expiring in flight + */ + isExpired(threshold: number = 5_000): boolean { + return Date.now() >= this.expiresAt - threshold; + } + + /** Returns how many full seconds remain until expiry. Returns 0 if expired. */ + timeUntilExpirySeconds(): number { + return Math.max(0, Math.floor((this.expiresAt - Date.now()) / 1_000)); + } + + static fromJson(parsedJson: Jsonify<SendAccessToken>): SendAccessToken { + return new SendAccessToken(parsedJson.token, parsedJson.expiresAt); + } + + /** + * Creates a SendAccessToken from a SendAccessTokenResponse. + * @param sendAccessTokenResponse The SDK response object containing the token and expiry information. + * @returns A new instance of SendAccessToken. + * note: we need to convert from the SDK response type to our internal type so that we can + * be sure it will serialize/deserialize correctly in state provider. + */ + static fromSendAccessTokenResponse( + sendAccessTokenResponse: SendAccessTokenResponse, + ): SendAccessToken { + return new SendAccessToken(sendAccessTokenResponse.token, sendAccessTokenResponse.expiresAt); + } +} diff --git a/libs/common/src/auth/send-access/services/default-send-token.service.spec.ts b/libs/common/src/auth/send-access/services/default-send-token.service.spec.ts new file mode 100644 index 00000000000..8db0532911f --- /dev/null +++ b/libs/common/src/auth/send-access/services/default-send-token.service.spec.ts @@ -0,0 +1,678 @@ +import { MockProxy, mock } from "jest-mock-extended"; +import { firstValueFrom } from "rxjs"; + +import { + SendAccessTokenApiErrorResponse, + SendAccessTokenError, + SendAccessTokenInvalidGrantError, + SendAccessTokenInvalidRequestError, + SendAccessTokenResponse, + UnexpectedIdentityError, +} from "@bitwarden/sdk-internal"; +import { FakeGlobalState, FakeGlobalStateProvider } from "@bitwarden/state-test-utils"; + +import { + SendHashedPassword, + SendPasswordKeyMaterial, + SendPasswordService, +} from "../../../key-management/sends"; +import { Utils } from "../../../platform/misc/utils"; +import { MockSdkService } from "../../../platform/spec/mock-sdk.service"; +import { SendAccessToken } from "../models/send-access-token"; +import { GetSendAccessTokenError } from "../types/get-send-access-token-error.type"; +import { SendAccessDomainCredentials } from "../types/send-access-domain-credentials.type"; +import { SendHashedPasswordB64 } from "../types/send-hashed-password-b64.type"; +import { SendOtp } from "../types/send-otp.type"; + +import { DefaultSendTokenService } from "./default-send-token.service"; +import { SEND_ACCESS_TOKEN_DICT } from "./send-access-token-dict.state"; + +describe("SendTokenService", () => { + let service: DefaultSendTokenService; + + // Deps + let sdkService: MockSdkService; + let globalStateProvider: FakeGlobalStateProvider; + let sendPasswordService: MockProxy<SendPasswordService>; + + beforeEach(() => { + globalStateProvider = new FakeGlobalStateProvider(); + sdkService = new MockSdkService(); + sendPasswordService = mock<SendPasswordService>(); + + service = new DefaultSendTokenService(globalStateProvider, sdkService, sendPasswordService); + }); + + it("instantiates", () => { + expect(service).toBeTruthy(); + }); + + describe("Send access token retrieval tests", () => { + let sendAccessTokenDictGlobalState: FakeGlobalState<Record<string, SendAccessToken>>; + + let sendAccessTokenResponse: SendAccessTokenResponse; + + let sendId: string; + let sendAccessToken: SendAccessToken; + let token: string; + let tokenExpiresAt: number; + + const EXPECTED_SERVER_KIND: GetSendAccessTokenError["kind"] = "expected_server"; + const UNEXPECTED_SERVER_KIND: GetSendAccessTokenError["kind"] = "unexpected_server"; + + const INVALID_REQUEST_CODES: SendAccessTokenInvalidRequestError[] = [ + "send_id_required", + "password_hash_b64_required", + "email_required", + "email_and_otp_required_otp_sent", + "unknown", + ]; + + const INVALID_GRANT_CODES: SendAccessTokenInvalidGrantError[] = [ + "send_id_invalid", + "password_hash_b64_invalid", + "email_invalid", + "otp_invalid", + "otp_generation_failed", + "unknown", + ]; + + const CREDS = [ + { kind: "password", passwordHashB64: "h4sh" as SendHashedPasswordB64 }, + { kind: "email", email: "u@example.com" }, + { kind: "email_otp", email: "u@example.com", otp: "123456" as SendOtp }, + ] as const satisfies readonly SendAccessDomainCredentials[]; + + type SendAccessTokenApiErrorResponseErrorCode = SendAccessTokenApiErrorResponse["error"]; + + type SimpleErrorType = Exclude< + SendAccessTokenApiErrorResponseErrorCode, + "invalid_request" | "invalid_grant" + >; + + // Extract out simple error types which don't have complex send_access_error_types to handle. + const SIMPLE_ERROR_TYPES = [ + "invalid_client", + "unauthorized_client", + "unsupported_grant_type", + "invalid_scope", + "invalid_target", + ] as const satisfies readonly SimpleErrorType[]; + + beforeEach(() => { + sendId = "sendId"; + token = "sendAccessToken"; + tokenExpiresAt = Date.now() + 1000 * 60 * 5; // 5 minutes from now + + sendAccessTokenResponse = { + token: token, + expiresAt: tokenExpiresAt, + }; + + sendAccessToken = SendAccessToken.fromSendAccessTokenResponse(sendAccessTokenResponse); + + sendAccessTokenDictGlobalState = globalStateProvider.getFake(SEND_ACCESS_TOKEN_DICT); + // Ensure the state is empty before each test + sendAccessTokenDictGlobalState.stateSubject.next({}); + }); + + describe("tryGetSendAccessToken$", () => { + it("returns the send access token from session storage when token exists and isn't expired", async () => { + // Arrange + // Store the send access token in the global state + sendAccessTokenDictGlobalState.stateSubject.next({ [sendId]: sendAccessToken }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual(sendAccessToken); + }); + + it("returns expired error and clears token from storage when token is expired", async () => { + // Arrange + const oldDate = new Date("2025-01-01"); + const expiredSendAccessToken = new SendAccessToken(token, oldDate.getTime()); + sendAccessTokenDictGlobalState.stateSubject.next({ [sendId]: expiredSendAccessToken }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).not.toBeInstanceOf(SendAccessToken); + expect(result).toStrictEqual({ kind: "expired" }); + + // assert that we removed the expired token from storage. + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).not.toHaveProperty(sendId); + }); + + it("calls to get a new token if none is found in storage and stores the retrieved token in session storage", async () => { + // Arrange + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockResolvedValue(sendAccessTokenResponse); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toBeInstanceOf(SendAccessToken); + expect(result).toEqual(sendAccessToken); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + }); + + describe("handles expected invalid_request scenarios appropriately", () => { + it.each(INVALID_REQUEST_CODES)( + "surfaces %s as an expected invalid_request error", + async (code) => { + // Arrange + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_request", + error_description: code, + send_access_error_type: code, + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: EXPECTED_SERVER_KIND, + error: sendAccessTokenApiErrorResponse, + }); + }, + ); + + it("handles bare expected invalid_request scenario appropriately", async () => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_request", + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: EXPECTED_SERVER_KIND, + error: sendAccessTokenApiErrorResponse, + }); + }); + }); + + it.each(SIMPLE_ERROR_TYPES)("handles expected %s error appropriately", async (errorType) => { + const api: SendAccessTokenApiErrorResponse = { + error: errorType, + error_description: `The ${errorType} error occurred`, + }; + mockSdkRejectWith({ kind: "expected", data: api }); + + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + expect(result).toEqual({ kind: EXPECTED_SERVER_KIND, error: api }); + }); + + it.each(SIMPLE_ERROR_TYPES)( + "handles expected %s bare error appropriately", + async (errorType) => { + const api: SendAccessTokenApiErrorResponse = { error: errorType }; + mockSdkRejectWith({ kind: "expected", data: api }); + + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + expect(result).toEqual({ kind: EXPECTED_SERVER_KIND, error: api }); + }, + ); + + describe("handles expected invalid_grant scenarios appropriately", () => { + it.each(INVALID_GRANT_CODES)( + "surfaces %s as an expected invalid_grant error", + async (code) => { + // Arrange + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_grant", + error_description: code, + send_access_error_type: code, + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: EXPECTED_SERVER_KIND, + error: sendAccessTokenApiErrorResponse, + }); + }, + ); + + it("handles bare expected invalid_grant scenario appropriately", async () => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_grant", + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: EXPECTED_SERVER_KIND, + error: sendAccessTokenApiErrorResponse, + }); + }); + }); + + it("surfaces unexpected errors as unexpected_server error", async () => { + // Arrange + const unexpectedIdentityError: UnexpectedIdentityError = "unexpected error occurred"; + + mockSdkRejectWith({ + kind: "unexpected", + data: unexpectedIdentityError, + }); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: UNEXPECTED_SERVER_KIND, + error: unexpectedIdentityError, + }); + }); + + it("surfaces an unknown error as an unknown error", async () => { + // Arrange + const unknownError = "unknown error occurred"; + + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockRejectedValue(new Error(unknownError)); + + // Act + const result = await firstValueFrom(service.tryGetSendAccessToken$(sendId)); + + // Assert + expect(result).toEqual({ + kind: "unknown", + error: unknownError, + }); + }); + + describe("getSendAccessTokenFromStorage", () => { + it("returns undefined if no token is found in storage", async () => { + const result = await (service as any).getSendAccessTokenFromStorage("nonexistentSendId"); + expect(result).toBeUndefined(); + }); + + it("returns the token if found in storage", async () => { + sendAccessTokenDictGlobalState.stateSubject.next({ [sendId]: sendAccessToken }); + const result = await (service as any).getSendAccessTokenFromStorage(sendId); + expect(result).toEqual(sendAccessToken); + }); + + it("returns undefined if the global state isn't initialized yet", async () => { + sendAccessTokenDictGlobalState.stateSubject.next(null); + + const result = await (service as any).getSendAccessTokenFromStorage(sendId); + expect(result).toBeUndefined(); + }); + }); + + describe("setSendAccessTokenInStorage", () => { + it("stores the token in storage", async () => { + await (service as any).setSendAccessTokenInStorage(sendId, sendAccessToken); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + }); + + it("initializes the dictionary if it isn't already", async () => { + sendAccessTokenDictGlobalState.stateSubject.next(null); + + await (service as any).setSendAccessTokenInStorage(sendId, sendAccessToken); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + }); + + it("merges with existing tokens in storage", async () => { + const anotherSendId = "anotherSendId"; + const anotherSendAccessToken = new SendAccessToken( + "anotherToken", + Date.now() + 1000 * 60, + ); + + sendAccessTokenDictGlobalState.stateSubject.next({ + [anotherSendId]: anotherSendAccessToken, + }); + await (service as any).setSendAccessTokenInStorage(sendId, sendAccessToken); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + expect(sendAccessTokenDict).toHaveProperty(anotherSendId, anotherSendAccessToken); + }); + }); + }); + + describe("getSendAccessToken$", () => { + it("returns a send access token for a password protected send when given valid password credentials", async () => { + // Arrange + const sendPasswordCredentials: SendAccessDomainCredentials = { + kind: "password", + passwordHashB64: "testPassword" as SendHashedPasswordB64, + }; + + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockResolvedValue(sendAccessTokenResponse); + + // Act + const result = await firstValueFrom( + service.getSendAccessToken$(sendId, sendPasswordCredentials), + ); + + // Assert + expect(result).toEqual(sendAccessToken); + + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + }); + + // Note: we deliberately aren't testing the "success" scenario of passing + // just SendEmailCredentials as that will never return a send access token on it's own. + + it("returns a send access token for a email + otp protected send when given valid email and otp", async () => { + // Arrange + const sendEmailOtpCredentials: SendAccessDomainCredentials = { + kind: "email_otp", + email: "test@example.com", + otp: "123456" as SendOtp, + }; + + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockResolvedValue(sendAccessTokenResponse); + + // Act + const result = await firstValueFrom( + service.getSendAccessToken$(sendId, sendEmailOtpCredentials), + ); + + // Assert + expect(result).toEqual(sendAccessToken); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + expect(sendAccessTokenDict).toHaveProperty(sendId, sendAccessToken); + }); + + describe.each(CREDS.map((c) => [c.kind, c] as const))( + "scenarios with %s credentials", + (_label, creds) => { + it.each(INVALID_REQUEST_CODES)( + "handles expected invalid_request.%s scenario appropriately", + async (code) => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_request", + error_description: code, + send_access_error_type: code, + }; + + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + const result = await firstValueFrom(service.getSendAccessToken$("abc123", creds)); + + expect(result).toEqual({ + kind: "expected_server", + error: sendAccessTokenApiErrorResponse, + }); + }, + ); + + it("handles expected invalid_request scenario appropriately", async () => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_request", + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + // Assert + expect(result).toEqual({ + kind: "expected_server", + error: sendAccessTokenApiErrorResponse, + }); + }); + + it.each(INVALID_GRANT_CODES)( + "handles expected invalid_grant.%s scenario appropriately", + async (code) => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_grant", + error_description: code, + send_access_error_type: code, + }; + + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + const result = await firstValueFrom(service.getSendAccessToken$("abc123", creds)); + + expect(result).toEqual({ + kind: "expected_server", + error: sendAccessTokenApiErrorResponse, + }); + }, + ); + + it("handles expected invalid_grant scenario appropriately", async () => { + const sendAccessTokenApiErrorResponse: SendAccessTokenApiErrorResponse = { + error: "invalid_grant", + }; + mockSdkRejectWith({ + kind: "expected", + data: sendAccessTokenApiErrorResponse, + }); + + // Act + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + // Assert + expect(result).toEqual({ + kind: "expected_server", + error: sendAccessTokenApiErrorResponse, + }); + }); + + it.each(SIMPLE_ERROR_TYPES)( + "handles expected %s error appropriately", + async (errorType) => { + const api: SendAccessTokenApiErrorResponse = { + error: errorType, + error_description: `The ${errorType} error occurred`, + }; + mockSdkRejectWith({ kind: "expected", data: api }); + + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + expect(result).toEqual({ kind: EXPECTED_SERVER_KIND, error: api }); + }, + ); + + it.each(SIMPLE_ERROR_TYPES)( + "handles expected %s bare error appropriately", + async (errorType) => { + const api: SendAccessTokenApiErrorResponse = { error: errorType }; + mockSdkRejectWith({ kind: "expected", data: api }); + + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + expect(result).toEqual({ kind: EXPECTED_SERVER_KIND, error: api }); + }, + ); + + it("surfaces unexpected errors as unexpected_server error", async () => { + // Arrange + const unexpectedIdentityError: UnexpectedIdentityError = "unexpected error occurred"; + + mockSdkRejectWith({ + kind: "unexpected", + data: unexpectedIdentityError, + }); + + // Act + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + // Assert + expect(result).toEqual({ + kind: UNEXPECTED_SERVER_KIND, + error: unexpectedIdentityError, + }); + }); + + it("surfaces an unknown error as an unknown error", async () => { + // Arrange + const unknownError = "unknown error occurred"; + + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockRejectedValue(new Error(unknownError)); + + // Act + const result = await firstValueFrom(service.getSendAccessToken$(sendId, creds)); + + // Assert + expect(result).toEqual({ + kind: "unknown", + error: unknownError, + }); + }); + }, + ); + + it("errors if passwordHashB64 is missing for password credentials", async () => { + const creds: SendAccessDomainCredentials = { + kind: "password", + passwordHashB64: "" as SendHashedPasswordB64, + }; + await expect(firstValueFrom(service.getSendAccessToken$(sendId, creds))).rejects.toThrow( + "passwordHashB64 must be provided for password credentials.", + ); + }); + + it("errors if email is missing for email credentials", async () => { + const creds: SendAccessDomainCredentials = { + kind: "email", + email: "", + }; + await expect(firstValueFrom(service.getSendAccessToken$(sendId, creds))).rejects.toThrow( + "email must be provided for email credentials.", + ); + }); + + it("errors if email or otp is missing for email_otp credentials", async () => { + const creds: SendAccessDomainCredentials = { + kind: "email_otp", + email: "", + otp: "" as SendOtp, + }; + await expect(firstValueFrom(service.getSendAccessToken$(sendId, creds))).rejects.toThrow( + "email and otp must be provided for email_otp credentials.", + ); + }); + }); + + describe("invalidateSendAccessToken", () => { + it("removes a send access token from storage", async () => { + // Arrange + sendAccessTokenDictGlobalState.stateSubject.next({ [sendId]: sendAccessToken }); + + // Act + await service.invalidateSendAccessToken(sendId); + const sendAccessTokenDict = await firstValueFrom(sendAccessTokenDictGlobalState.state$); + + // Assert + expect(sendAccessTokenDict).not.toHaveProperty(sendId); + }); + }); + }); + + describe("hashSendPassword", () => { + test.each(["", null, undefined])("rejects if password is %p", async (pwd) => { + await expect(service.hashSendPassword(pwd as any, "keyMaterialUrlB64")).rejects.toThrow( + "Password must be provided.", + ); + }); + + test.each(["", null, undefined])( + "rejects if keyMaterialUrlB64 is %p", + async (keyMaterialUrlB64) => { + await expect( + service.hashSendPassword("password", keyMaterialUrlB64 as any), + ).rejects.toThrow("KeyMaterialUrlB64 must be provided."); + }, + ); + + it("correctly hashes the password", async () => { + // Arrange + const password = "testPassword"; + const keyMaterialUrlB64 = "testKeyMaterialUrlB64"; + const keyMaterialArray = new Uint8Array([1, 2, 3]) as SendPasswordKeyMaterial; + const hashedPasswordArray = new Uint8Array([4, 5, 6]) as SendHashedPassword; + const sendHashedPasswordB64 = "hashedPasswordB64" as SendHashedPasswordB64; + + const utilsFromUrlB64ToArraySpy = jest + .spyOn(Utils, "fromUrlB64ToArray") + .mockReturnValue(keyMaterialArray); + + sendPasswordService.hashPassword.mockResolvedValue(hashedPasswordArray); + + const utilsFromBufferToB64Spy = jest + .spyOn(Utils, "fromBufferToB64") + .mockReturnValue(sendHashedPasswordB64); + + // Act + const result = await service.hashSendPassword(password, keyMaterialUrlB64); + + // Assert + expect(sendPasswordService.hashPassword).toHaveBeenCalledWith(password, keyMaterialArray); + expect(utilsFromUrlB64ToArraySpy).toHaveBeenCalledWith(keyMaterialUrlB64); + expect(utilsFromBufferToB64Spy).toHaveBeenCalledWith(hashedPasswordArray); + expect(result).toBe(sendHashedPasswordB64); + }); + }); + + function mockSdkRejectWith(sendAccessTokenError: SendAccessTokenError) { + sdkService.client.auth + .mockDeep() + .send_access.mockDeep() + .request_send_access_token.mockRejectedValue(sendAccessTokenError); + } +}); diff --git a/libs/common/src/auth/send-access/services/default-send-token.service.ts b/libs/common/src/auth/send-access/services/default-send-token.service.ts new file mode 100644 index 00000000000..4d3376fd5b6 --- /dev/null +++ b/libs/common/src/auth/send-access/services/default-send-token.service.ts @@ -0,0 +1,316 @@ +import { Observable, defer, firstValueFrom, from } from "rxjs"; + +import { + BitwardenClient, + SendAccessCredentials, + SendAccessTokenError, + SendAccessTokenRequest, + SendAccessTokenResponse, +} from "@bitwarden/sdk-internal"; +import { GlobalState, GlobalStateProvider } from "@bitwarden/state"; + +import { SendPasswordService } from "../../../key-management/sends/abstractions/send-password.service"; +import { + SendHashedPassword, + SendPasswordKeyMaterial, +} from "../../../key-management/sends/types/send-hashed-password.type"; +import { SdkService } from "../../../platform/abstractions/sdk/sdk.service"; +import { Utils } from "../../../platform/misc/utils"; +import { SendTokenService as SendTokenServiceAbstraction } from "../abstractions/send-token.service"; +import { SendAccessToken } from "../models/send-access-token"; +import { GetSendAccessTokenError } from "../types/get-send-access-token-error.type"; +import { SendAccessDomainCredentials } from "../types/send-access-domain-credentials.type"; +import { SendHashedPasswordB64 } from "../types/send-hashed-password-b64.type"; +import { TryGetSendAccessTokenError } from "../types/try-get-send-access-token-error.type"; + +import { SEND_ACCESS_TOKEN_DICT } from "./send-access-token-dict.state"; + +export class DefaultSendTokenService implements SendTokenServiceAbstraction { + private sendAccessTokenDictGlobalState: GlobalState<Record<string, SendAccessToken>> | undefined; + + constructor( + private globalStateProvider: GlobalStateProvider, + private sdkService: SdkService, + private sendPasswordService: SendPasswordService, + ) { + this.initializeState(); + } + + private initializeState(): void { + this.sendAccessTokenDictGlobalState = this.globalStateProvider.get(SEND_ACCESS_TOKEN_DICT); + } + + tryGetSendAccessToken$(sendId: string): Observable<SendAccessToken | TryGetSendAccessTokenError> { + // Defer the execution to ensure that a cold observable is returned. + return defer(() => from(this._tryGetSendAccessToken(sendId))); + } + + private async _tryGetSendAccessToken( + sendId: string, + ): Promise<SendAccessToken | TryGetSendAccessTokenError> { + // Validate the sendId is a non-empty string. + this.validateSendId(sendId); + + // Check in storage for the access token for the given sendId. + const sendAccessTokenFromStorage = await this.getSendAccessTokenFromStorage(sendId); + + if (sendAccessTokenFromStorage != null) { + // If it is expired, we clear the token from storage and return the expired error + if (sendAccessTokenFromStorage.isExpired()) { + await this.clearSendAccessTokenFromStorage(sendId); + return { kind: "expired" }; + } else { + // If it is not expired, we return it + return sendAccessTokenFromStorage; + } + } + + // If we don't have a token in storage, we can try to request a new token from the server. + const request: SendAccessTokenRequest = { + sendId: sendId, + }; + + const anonSdkClient: BitwardenClient = await firstValueFrom(this.sdkService.client$); + + try { + const result: SendAccessTokenResponse = await anonSdkClient + .auth() + .send_access() + .request_send_access_token(request); + + // Convert from SDK shape to SendAccessToken so it can be serialized into & out of state provider + const sendAccessToken = SendAccessToken.fromSendAccessTokenResponse(result); + + // If we get a token back, we need to store it in the global state. + await this.setSendAccessTokenInStorage(sendId, sendAccessToken); + + return sendAccessToken; + } catch (error: unknown) { + return this.normalizeSendAccessTokenError(error); + } + } + + getSendAccessToken$( + sendId: string, + sendCredentials: SendAccessDomainCredentials, + ): Observable<SendAccessToken | GetSendAccessTokenError> { + // Defer the execution to ensure that a cold observable is returned. + return defer(() => from(this._getSendAccessToken(sendId, sendCredentials))); + } + + private async _getSendAccessToken( + sendId: string, + sendAccessCredentials: SendAccessDomainCredentials, + ): Promise<SendAccessToken | GetSendAccessTokenError> { + // Validate inputs to account for non-strict TS call sites. + this.validateCredentialsRequest(sendId, sendAccessCredentials); + + // Convert inputs to SDK request shape + const request: SendAccessTokenRequest = { + sendId: sendId, + sendAccessCredentials: this.convertDomainCredentialsToSdkCredentials(sendAccessCredentials), + }; + + const anonSdkClient: BitwardenClient = await firstValueFrom(this.sdkService.client$); + + try { + const result: SendAccessTokenResponse = await anonSdkClient + .auth() + .send_access() + .request_send_access_token(request); + + // Convert from SDK interface to SendAccessToken class so it can be serialized into & out of state provider + const sendAccessToken = SendAccessToken.fromSendAccessTokenResponse(result); + + // Any time we get a token from the server, we need to store it in the global state. + await this.setSendAccessTokenInStorage(sendId, sendAccessToken); + + return sendAccessToken; + } catch (error: unknown) { + return this.normalizeSendAccessTokenError(error); + } + } + + async invalidateSendAccessToken(sendId: string): Promise<void> { + await this.clearSendAccessTokenFromStorage(sendId); + } + + async hashSendPassword( + password: string, + keyMaterialUrlB64: string, + ): Promise<SendHashedPasswordB64> { + // Validate the password and key material + if (password == null || password.trim() === "") { + throw new Error("Password must be provided."); + } + if (keyMaterialUrlB64 == null || keyMaterialUrlB64.trim() === "") { + throw new Error("KeyMaterialUrlB64 must be provided."); + } + + // Convert the base64 URL encoded key material to a Uint8Array + const keyMaterialUrlB64Array = Utils.fromUrlB64ToArray( + keyMaterialUrlB64, + ) as SendPasswordKeyMaterial; + + const sendHashedPasswordArray: SendHashedPassword = await this.sendPasswordService.hashPassword( + password, + keyMaterialUrlB64Array, + ); + + // Convert the Uint8Array to a base64 encoded string which is required + // for the server to be able to compare the password hash. + const sendHashedPasswordB64 = Utils.fromBufferToB64( + sendHashedPasswordArray, + ) as SendHashedPasswordB64; + + return sendHashedPasswordB64; + } + + private async getSendAccessTokenFromStorage( + sendId: string, + ): Promise<SendAccessToken | undefined> { + if (this.sendAccessTokenDictGlobalState != null) { + const sendAccessTokenDict = await firstValueFrom(this.sendAccessTokenDictGlobalState.state$); + return sendAccessTokenDict?.[sendId]; + } + return undefined; + } + + private async setSendAccessTokenInStorage( + sendId: string, + sendAccessToken: SendAccessToken, + ): Promise<void> { + if (this.sendAccessTokenDictGlobalState != null) { + await this.sendAccessTokenDictGlobalState.update( + (sendAccessTokenDict) => { + sendAccessTokenDict ??= {}; // Initialize if undefined + + sendAccessTokenDict[sendId] = sendAccessToken; + return sendAccessTokenDict; + }, + { + // only update if the value is different (to avoid unnecessary writes) + shouldUpdate: (prevDict) => { + const prevSendAccessToken = prevDict?.[sendId]; + return ( + prevSendAccessToken?.token !== sendAccessToken.token || + prevSendAccessToken?.expiresAt !== sendAccessToken.expiresAt + ); + }, + }, + ); + } + } + + private async clearSendAccessTokenFromStorage(sendId: string): Promise<void> { + if (this.sendAccessTokenDictGlobalState != null) { + await this.sendAccessTokenDictGlobalState.update( + (sendAccessTokenDict) => { + if (!sendAccessTokenDict) { + // If the dict is empty or undefined, there's nothing to clear + return sendAccessTokenDict; + } + + if (sendAccessTokenDict[sendId] == null) { + // If the specific sendId does not exist, nothing to clear + return sendAccessTokenDict; + } + + // Destructure to omit the specific sendId and get new reference for the rest of the dict for an immutable update + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { [sendId]: _, ...rest } = sendAccessTokenDict; + + return rest; + }, + { + // only update if the value is defined (to avoid unnecessary writes) + shouldUpdate: (prevDict) => prevDict?.[sendId] != null, + }, + ); + } + } + + /** + * Normalizes an error from the SDK send access token request process. + * @param e The error to normalize. + * @returns A normalized GetSendAccessTokenError. + */ + private normalizeSendAccessTokenError(e: unknown): GetSendAccessTokenError { + if (this.isSendAccessTokenError(e)) { + if (e.kind === "unexpected") { + return { kind: "unexpected_server", error: e.data }; + } + return { kind: "expected_server", error: e.data }; + } + + if (e instanceof Error) { + return { kind: "unknown", error: e.message }; + } + + try { + return { kind: "unknown", error: JSON.stringify(e) }; + } catch { + return { kind: "unknown", error: "error cannot be stringified" }; + } + } + + private isSendAccessTokenError(e: unknown): e is SendAccessTokenError { + return ( + typeof e === "object" && + e !== null && + "kind" in e && + (e.kind === "expected" || e.kind === "unexpected") + ); + } + + private validateSendId(sendId: string): void { + if (sendId == null || sendId.trim() === "") { + throw new Error("sendId must be provided."); + } + } + + private validateCredentialsRequest( + sendId: string, + sendAccessCredentials: SendAccessDomainCredentials, + ): void { + this.validateSendId(sendId); + if (sendAccessCredentials == null) { + throw new Error("sendAccessCredentials must be provided."); + } + + if (sendAccessCredentials.kind === "password" && !sendAccessCredentials.passwordHashB64) { + throw new Error("passwordHashB64 must be provided for password credentials."); + } + + if (sendAccessCredentials.kind === "email" && !sendAccessCredentials.email) { + throw new Error("email must be provided for email credentials."); + } + + if ( + sendAccessCredentials.kind === "email_otp" && + (!sendAccessCredentials.email || !sendAccessCredentials.otp) + ) { + throw new Error("email and otp must be provided for email_otp credentials."); + } + } + + private convertDomainCredentialsToSdkCredentials( + sendAccessCredentials: SendAccessDomainCredentials, + ): SendAccessCredentials { + switch (sendAccessCredentials.kind) { + case "password": + return { + passwordHashB64: sendAccessCredentials.passwordHashB64, + }; + case "email": + return { + email: sendAccessCredentials.email, + }; + case "email_otp": + return { + email: sendAccessCredentials.email, + otp: sendAccessCredentials.otp, + }; + } + } +} diff --git a/libs/common/src/auth/send-access/services/index.ts b/libs/common/src/auth/send-access/services/index.ts new file mode 100644 index 00000000000..f45ffb94bab --- /dev/null +++ b/libs/common/src/auth/send-access/services/index.ts @@ -0,0 +1 @@ +export * from "./default-send-token.service"; diff --git a/libs/common/src/auth/send-access/services/send-access-token-dict.state.ts b/libs/common/src/auth/send-access/services/send-access-token-dict.state.ts new file mode 100644 index 00000000000..77e390768fc --- /dev/null +++ b/libs/common/src/auth/send-access/services/send-access-token-dict.state.ts @@ -0,0 +1,15 @@ +import { Jsonify } from "type-fest"; + +import { KeyDefinition, SEND_ACCESS_DISK } from "@bitwarden/state"; + +import { SendAccessToken } from "../models/send-access-token"; + +export const SEND_ACCESS_TOKEN_DICT = KeyDefinition.record<SendAccessToken, string>( + SEND_ACCESS_DISK, + "accessTokenDict", + { + deserializer: (sendAccessTokenJson: Jsonify<SendAccessToken>) => { + return SendAccessToken.fromJson(sendAccessTokenJson); + }, + }, +); diff --git a/libs/common/src/auth/send-access/types/get-send-access-token-error.type.ts b/libs/common/src/auth/send-access/types/get-send-access-token-error.type.ts new file mode 100644 index 00000000000..224e982c84c --- /dev/null +++ b/libs/common/src/auth/send-access/types/get-send-access-token-error.type.ts @@ -0,0 +1,12 @@ +import { UnexpectedIdentityError, SendAccessTokenApiErrorResponse } from "@bitwarden/sdk-internal"; + +/** + * Represents the possible errors that can occur when retrieving a SendAccessToken. + * Note: for expected_server errors, see invalid-request-errors.type.ts and + * invalid-grant-errors.type.ts for type guards that identify specific + * SendAccessTokenApiErrorResponse errors + */ +export type GetSendAccessTokenError = + | { kind: "unexpected_server"; error: UnexpectedIdentityError } + | { kind: "expected_server"; error: SendAccessTokenApiErrorResponse } + | { kind: "unknown"; error: string }; diff --git a/libs/common/src/auth/send-access/types/index.ts b/libs/common/src/auth/send-access/types/index.ts new file mode 100644 index 00000000000..344ac00abbe --- /dev/null +++ b/libs/common/src/auth/send-access/types/index.ts @@ -0,0 +1,7 @@ +export * from "./try-get-send-access-token-error.type"; +export * from "./send-otp.type"; +export * from "./send-hashed-password-b64.type"; +export * from "./send-access-domain-credentials.type"; +export * from "./invalid-request-errors.type"; +export * from "./invalid-grant-errors.type"; +export * from "./get-send-access-token-error.type"; diff --git a/libs/common/src/auth/send-access/types/invalid-grant-errors.type.ts b/libs/common/src/auth/send-access/types/invalid-grant-errors.type.ts new file mode 100644 index 00000000000..befb869a89e --- /dev/null +++ b/libs/common/src/auth/send-access/types/invalid-grant-errors.type.ts @@ -0,0 +1,62 @@ +import { SendAccessTokenApiErrorResponse } from "@bitwarden/sdk-internal"; + +export type InvalidGrant = Extract<SendAccessTokenApiErrorResponse, { error: "invalid_grant" }>; + +export function isInvalidGrant(e: SendAccessTokenApiErrorResponse): e is InvalidGrant { + return e.error === "invalid_grant"; +} + +export type BareInvalidGrant = Extract< + SendAccessTokenApiErrorResponse, + { error: "invalid_grant" } +> & { send_access_error_type?: undefined }; + +export function isBareInvalidGrant(e: SendAccessTokenApiErrorResponse): e is BareInvalidGrant { + return e.error === "invalid_grant" && e.send_access_error_type === undefined; +} + +export type SendIdInvalid = InvalidGrant & { + send_access_error_type: "send_id_invalid"; +}; +export function sendIdInvalid(e: SendAccessTokenApiErrorResponse): e is SendIdInvalid { + return e.error === "invalid_grant" && e.send_access_error_type === "send_id_invalid"; +} + +export type PasswordHashB64Invalid = InvalidGrant & { + send_access_error_type: "password_hash_b64_invalid"; +}; +export function passwordHashB64Invalid( + e: SendAccessTokenApiErrorResponse, +): e is PasswordHashB64Invalid { + return e.error === "invalid_grant" && e.send_access_error_type === "password_hash_b64_invalid"; +} + +export type EmailInvalid = InvalidGrant & { + send_access_error_type: "email_invalid"; +}; +export function emailInvalid(e: SendAccessTokenApiErrorResponse): e is EmailInvalid { + return e.error === "invalid_grant" && e.send_access_error_type === "email_invalid"; +} + +export type OtpInvalid = InvalidGrant & { + send_access_error_type: "otp_invalid"; +}; +export function otpInvalid(e: SendAccessTokenApiErrorResponse): e is OtpInvalid { + return e.error === "invalid_grant" && e.send_access_error_type === "otp_invalid"; +} + +export type OtpGenerationFailed = InvalidGrant & { + send_access_error_type: "otp_generation_failed"; +}; +export function otpGenerationFailed(e: SendAccessTokenApiErrorResponse): e is OtpGenerationFailed { + return e.error === "invalid_grant" && e.send_access_error_type === "otp_generation_failed"; +} + +export type UnknownInvalidGrant = InvalidGrant & { + send_access_error_type: "unknown"; +}; +export function isUnknownInvalidGrant( + e: SendAccessTokenApiErrorResponse, +): e is UnknownInvalidGrant { + return e.error === "invalid_grant" && e.send_access_error_type === "unknown"; +} diff --git a/libs/common/src/auth/send-access/types/invalid-request-errors.type.ts b/libs/common/src/auth/send-access/types/invalid-request-errors.type.ts new file mode 100644 index 00000000000..57a70e62586 --- /dev/null +++ b/libs/common/src/auth/send-access/types/invalid-request-errors.type.ts @@ -0,0 +1,62 @@ +import { SendAccessTokenApiErrorResponse } from "@bitwarden/sdk-internal"; + +export type InvalidRequest = Extract<SendAccessTokenApiErrorResponse, { error: "invalid_request" }>; + +export function isInvalidRequest(e: SendAccessTokenApiErrorResponse): e is InvalidRequest { + return e.error === "invalid_request"; +} + +export type BareInvalidRequest = Extract< + SendAccessTokenApiErrorResponse, + { error: "invalid_request" } +> & { send_access_error_type?: undefined }; + +export function isBareInvalidRequest(e: SendAccessTokenApiErrorResponse): e is BareInvalidRequest { + return e.error === "invalid_request" && e.send_access_error_type === undefined; +} + +export type SendIdRequired = InvalidRequest & { + send_access_error_type: "send_id_required"; +}; + +export function sendIdRequired(e: SendAccessTokenApiErrorResponse): e is SendIdRequired { + return e.error === "invalid_request" && e.send_access_error_type === "send_id_required"; +} + +export type PasswordHashB64Required = InvalidRequest & { + send_access_error_type: "password_hash_b64_required"; +}; + +export function passwordHashB64Required( + e: SendAccessTokenApiErrorResponse, +): e is PasswordHashB64Required { + return e.error === "invalid_request" && e.send_access_error_type === "password_hash_b64_required"; +} + +export type EmailRequired = InvalidRequest & { send_access_error_type: "email_required" }; + +export function emailRequired(e: SendAccessTokenApiErrorResponse): e is EmailRequired { + return e.error === "invalid_request" && e.send_access_error_type === "email_required"; +} + +export type EmailAndOtpRequiredEmailSent = InvalidRequest & { + send_access_error_type: "email_and_otp_required_otp_sent"; +}; + +export function emailAndOtpRequiredEmailSent( + e: SendAccessTokenApiErrorResponse, +): e is EmailAndOtpRequiredEmailSent { + return ( + e.error === "invalid_request" && e.send_access_error_type === "email_and_otp_required_otp_sent" + ); +} + +export type UnknownInvalidRequest = InvalidRequest & { + send_access_error_type: "unknown"; +}; + +export function isUnknownInvalidRequest( + e: SendAccessTokenApiErrorResponse, +): e is UnknownInvalidRequest { + return e.error === "invalid_request" && e.send_access_error_type === "unknown"; +} diff --git a/libs/common/src/auth/send-access/types/send-access-domain-credentials.type.ts b/libs/common/src/auth/send-access/types/send-access-domain-credentials.type.ts new file mode 100644 index 00000000000..966117dc64e --- /dev/null +++ b/libs/common/src/auth/send-access/types/send-access-domain-credentials.type.ts @@ -0,0 +1,11 @@ +import { SendHashedPasswordB64 } from "./send-hashed-password-b64.type"; +import { SendOtp } from "./send-otp.type"; + +/** + * The domain facing send access credentials + * Will be internally mapped to the SDK types + */ +export type SendAccessDomainCredentials = + | { kind: "password"; passwordHashB64: SendHashedPasswordB64 } + | { kind: "email"; email: string } + | { kind: "email_otp"; email: string; otp: SendOtp }; diff --git a/libs/common/src/auth/send-access/types/send-hashed-password-b64.type.ts b/libs/common/src/auth/send-access/types/send-hashed-password-b64.type.ts new file mode 100644 index 00000000000..9d55bdfb671 --- /dev/null +++ b/libs/common/src/auth/send-access/types/send-hashed-password-b64.type.ts @@ -0,0 +1,3 @@ +import { Opaque } from "type-fest"; + +export type SendHashedPasswordB64 = Opaque<string, "SendHashedPasswordB64">; diff --git a/libs/common/src/auth/send-access/types/send-otp.type.ts b/libs/common/src/auth/send-access/types/send-otp.type.ts new file mode 100644 index 00000000000..b5dfaa95ac5 --- /dev/null +++ b/libs/common/src/auth/send-access/types/send-otp.type.ts @@ -0,0 +1,3 @@ +import { Opaque } from "type-fest"; + +export type SendOtp = Opaque<string, "SendOtp">; diff --git a/libs/common/src/auth/send-access/types/try-get-send-access-token-error.type.ts b/libs/common/src/auth/send-access/types/try-get-send-access-token-error.type.ts new file mode 100644 index 00000000000..e82b426654c --- /dev/null +++ b/libs/common/src/auth/send-access/types/try-get-send-access-token-error.type.ts @@ -0,0 +1,7 @@ +import { GetSendAccessTokenError } from "./get-send-access-token-error.type"; + +/** + * Represents the possible errors that can occur when trying to retrieve a SendAccessToken by + * just a sendId. Extends {@link GetSendAccessTokenError}. + */ +export type TryGetSendAccessTokenError = { kind: "expired" } | GetSendAccessTokenError; diff --git a/libs/state/src/core/state-definitions.ts b/libs/state/src/core/state-definitions.ts index 9968908a06f..e3ffa457e10 100644 --- a/libs/state/src/core/state-definitions.ts +++ b/libs/state/src/core/state-definitions.ts @@ -72,6 +72,7 @@ export const TOKEN_DISK_LOCAL = new StateDefinition("tokenDiskLocal", "disk", { web: "disk-local", }); export const TOKEN_MEMORY = new StateDefinition("token", "memory"); +export const SEND_ACCESS_DISK = new StateDefinition("sendAccess", "disk"); export const TWO_FACTOR_MEMORY = new StateDefinition("twoFactor", "memory"); export const USER_DECRYPTION_OPTIONS_DISK = new StateDefinition("userDecryptionOptions", "disk"); export const ORGANIZATION_INVITE_DISK = new StateDefinition("organizationInvite", "disk"); diff --git a/package-lock.json b/package-lock.json index 1b126255e63..52c156d25eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@angular/platform-browser": "19.2.14", "@angular/platform-browser-dynamic": "19.2.14", "@angular/router": "19.2.14", - "@bitwarden/sdk-internal": "0.2.0-main.296", + "@bitwarden/sdk-internal": "0.2.0-main.311", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "4.0.0", @@ -4688,9 +4688,9 @@ "link": true }, "node_modules/@bitwarden/sdk-internal": { - "version": "0.2.0-main.296", - "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.296.tgz", - "integrity": "sha512-SDTWRwnR+KritfgJVBgWKd27TJxl4IlUdTldVJ/tA0qM5OqGWrY6s4ubtl5eaGIl2X4WYRAvpe+VR93FLakk6A==", + "version": "0.2.0-main.311", + "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.311.tgz", + "integrity": "sha512-zJdQykNMFOyivpNaCB9jc85wZ1ci2HM8/E4hI+yS7FgRm0sRigK5rieF3+xRjiq7pEsZSD8AucR+u/XK9ADXiw==", "license": "GPL-3.0", "dependencies": { "type-fest": "^4.41.0" diff --git a/package.json b/package.json index e94d0e98522..127e375b92c 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "@angular/platform-browser": "19.2.14", "@angular/platform-browser-dynamic": "19.2.14", "@angular/router": "19.2.14", - "@bitwarden/sdk-internal": "0.2.0-main.296", + "@bitwarden/sdk-internal": "0.2.0-main.311", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "4.0.0", From 65d56ca2f3697d89ee4f3a58f2a73b506bc2fd0f Mon Sep 17 00:00:00 2001 From: John Harrington <84741727+harr1424@users.noreply.github.com> Date: Thu, 2 Oct 2025 06:20:21 -0700 Subject: [PATCH 14/14] [PM-25481] Update copy in Admin-Console export-page (#16594) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add support for export-scope-callout.component to conditionally render organizational export message • use config service to capture feature flag status • use platform service and routing to determine admin console context --- apps/browser/src/_locales/en/messages.json | 18 ++ apps/desktop/src/locales/en/messages.json | 18 ++ apps/web/src/locales/en/messages.json | 18 ++ .../export-scope-callout.component.ts | 68 +++--- .../src/components/export.component.html | 5 +- .../src/components/export.component.ts | 211 +++++++++++++++--- 6 files changed, 272 insertions(+), 66 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 4e399a530e1..771759d9f25 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -3198,6 +3198,24 @@ } } }, + "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, "error": { "message": "Error" }, diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index a9b5efda357..b2625bc85f0 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -2654,6 +2654,24 @@ } } }, + "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, "locked": { "message": "Locked" }, diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 50b361f3d5a..c6901a21824 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -7038,6 +7038,24 @@ } } }, + "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, diff --git a/libs/tools/export/vault-export/vault-export-ui/src/components/export-scope-callout.component.ts b/libs/tools/export/vault-export/vault-export-ui/src/components/export-scope-callout.component.ts index 2b03234c5e2..a85048c23fa 100644 --- a/libs/tools/export/vault-export/vault-export-ui/src/components/export-scope-callout.component.ts +++ b/libs/tools/export/vault-export/vault-export-ui/src/components/export-scope-callout.component.ts @@ -5,12 +5,10 @@ import { Component, effect, input } from "@angular/core"; import { firstValueFrom, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { - getOrganizationById, - OrganizationService, -} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { getById } from "@bitwarden/common/platform/misc/rxjs-operators"; import { CalloutModule } from "@bitwarden/components"; @Component({ @@ -30,6 +28,8 @@ export class ExportScopeCalloutComponent { readonly organizationId = input<string>(); /* Optional export format, determines which individual export description to display */ readonly exportFormat = input<string>(); + /* The description key to use for organizational exports */ + readonly orgExportDescription = input<string>(); constructor( protected organizationService: OrganizationService, @@ -37,35 +37,45 @@ export class ExportScopeCalloutComponent { ) { effect(async () => { this.show = false; - await this.getScopeMessage(this.organizationId(), this.exportFormat()); + await this.getScopeMessage( + this.organizationId(), + this.exportFormat(), + this.orgExportDescription(), + ); this.show = true; }); } - private async getScopeMessage(organizationId: string, exportFormat: string): Promise<void> { + private async getScopeMessage( + organizationId: string, + exportFormat: string, + orgExportDescription: string, + ): Promise<void> { const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - this.scopeConfig = - organizationId != null - ? { - title: "exportingOrganizationVaultTitle", - description: "exportingOrganizationVaultDesc", - scopeIdentifier: ( - await firstValueFrom( - this.organizationService - .organizations$(userId) - .pipe(getOrganizationById(organizationId)), - ) - ).name, - } - : { - title: "exportingPersonalVaultTitle", - description: - exportFormat == "zip" - ? "exportingIndividualVaultWithAttachmentsDescription" - : "exportingIndividualVaultDescription", - scopeIdentifier: await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.email)), - ), - }; + + if (organizationId != null) { + // exporting from organizational vault + const org = await firstValueFrom( + this.organizationService.organizations$(userId).pipe(getById(organizationId)), + ); + + this.scopeConfig = { + title: "exportingOrganizationVaultTitle", + description: orgExportDescription, + scopeIdentifier: org?.name ?? "", + }; + } else { + this.scopeConfig = { + // exporting from individual vault + title: "exportingPersonalVaultTitle", + description: + exportFormat === "zip" + ? "exportingIndividualVaultWithAttachmentsDescription" + : "exportingIndividualVaultDescription", + scopeIdentifier: + (await firstValueFrom(this.accountService.activeAccount$.pipe(map((a) => a?.email)))) ?? + "", + }; + } } } diff --git a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.html b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.html index b33b01d3b13..c638e5d7dde 100644 --- a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.html +++ b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.html @@ -8,6 +8,7 @@ <tools-export-scope-callout [organizationId]="organizationId" [exportFormat]="format" + [orgExportDescription]="orgExportDescription" ></tools-export-scope-callout> <form [formGroup]="exportForm" [bitSubmit]="submit" id="export_form_exportForm"> @@ -19,10 +20,10 @@ [label]="'myVault' | i18n" value="myVault" icon="bwi-user" - *ngIf="!(organizationDataOwnershipPolicy$ | async)" + *ngIf="!(organizationDataOwnershipPolicyAppliesToUser$ | async)" /> <bit-option - *ngFor="let o of organizations$ | async" + *ngFor="let o of organizations" [value]="o.id" [label]="o.name" icon="bwi-business" diff --git a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts index f2caf4fe3f4..567480ac1bd 100644 --- a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts +++ b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts @@ -10,14 +10,20 @@ import { OnInit, Output, ViewChild, + Optional, } from "@angular/core"; import { ReactiveFormsModule, UntypedFormBuilder, Validators } from "@angular/forms"; +import { Router } from "@angular/router"; import { + BehaviorSubject, combineLatest, firstValueFrom, + from, map, merge, Observable, + of, + shareReplay, startWith, Subject, switchMap, @@ -36,10 +42,13 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { EventType } from "@bitwarden/common/enums"; +import { ClientType, EventType } from "@bitwarden/common/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { getById } from "@bitwarden/common/platform/misc"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { pin } from "@bitwarden/common/tools/rx"; @@ -84,11 +93,9 @@ import { ExportScopeCalloutComponent } from "./export-scope-callout.component"; ], }) export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { - private _organizationId: OrganizationId | undefined; - - get organizationId(): OrganizationId | undefined { - return this._organizationId; - } + private _organizationId$ = new BehaviorSubject<OrganizationId | undefined>(undefined); + private createDefaultLocationFlagEnabled$: Observable<boolean>; + private _showExcludeMyItems = false; /** * Enables the hosting control to pass in an organizationId @@ -96,29 +103,57 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { */ @Input() set organizationId(value: OrganizationId | string | undefined) { if (Utils.isNullOrEmpty(value)) { - this._organizationId = undefined; + this._organizationId$.next(undefined); return; } if (!isId<OrganizationId>(value)) { - this._organizationId = undefined; + this._organizationId$.next(undefined); return; } - this._organizationId = value; + this._organizationId$.next(value); getUserId(this.accountService.activeAccount$) .pipe( - switchMap((userId) => - this.organizationService.organizations$(userId).pipe(getById(this._organizationId)), - ), + switchMap((userId) => this.organizationService.organizations$(userId).pipe(getById(value))), ) .pipe(takeUntil(this.destroy$)) .subscribe((organization) => { - this._organizationId = organization?.id; + this._organizationId$.next(organization?.id); }); } + get organizationId(): OrganizationId | undefined { + return this._organizationId$.value; + } + + get showExcludeMyItems(): boolean { + return this._showExcludeMyItems; + } + + get orgExportDescription(): string { + if (!this._showExcludeMyItems) { + return "exportingOrganizationVaultDesc"; + } + return this.isAdminConsoleContext + ? "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc" + : "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc"; + } + + private get isAdminConsoleContext(): boolean { + const isWeb = this.platformUtilsService.getClientType?.() === ClientType.Web; + if (!isWeb || !this.router) { + return false; + } + try { + const url = this.router.url ?? ""; + return url.includes("/organizations/"); + } catch { + return false; + } + } + /** * The hosting control also needs a bitSubmitDirective (on the Submit button) which calls this components {@link submit}-method. * This components formState (loading/disabled) is emitted back up to the hosting component so for example the Submit button can be enabled/disabled and show loading state. @@ -143,7 +178,7 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { /** * Emits when the creation and download of the export-file have succeeded * - Emits an undefined when exporting from an individual vault - * - Emits the organizationId when exporting from an organizationl vault + * - Emits the organizationId when exporting from an organizational vault * */ @Output() onSuccessfulExport = new EventEmitter<OrganizationId | undefined>(); @@ -162,7 +197,10 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { } disablePersonalVaultExportPolicy$: Observable<boolean>; - organizationDataOwnershipPolicy$: Observable<boolean>; + // detects if policy is enabled and applies to the user, admins are exempted + organizationDataOwnershipPolicyAppliesToUser$: Observable<boolean>; + // detects if policy is enabled regardless of admin exemption + organizationDataOwnershipPolicyEnabledForOrg$: Observable<boolean>; exportForm = this.formBuilder.group({ vaultSelector: [ @@ -203,14 +241,46 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { protected organizationService: OrganizationService, private accountService: AccountService, private collectionService: CollectionService, + private configService: ConfigService, + private platformUtilsService: PlatformUtilsService, + @Optional() private router?: Router, ) {} async ngOnInit() { - // Setup subscription to emit when this form is enabled/disabled + this.observeFeatureFlags(); + this.observeFormState(); + this.observePolicyStatus(); + this.observeFormSelections(); + + // order is important below this line + this.observeMyItemsExclusionCriteria(); + this.observeValidatorAdjustments(); + this.setupPasswordGeneration(); + + if (this.organizationId) { + // organization vault export + this.initOrganizationOnly(); + return; + } + + // individual vault export + this.initIndividual(); + this.setupPolicyBasedFormState(); + } + + private observeFeatureFlags(): void { + this.createDefaultLocationFlagEnabled$ = from( + this.configService.getFeatureFlag(FeatureFlag.CreateDefaultLocation), + ).pipe(shareReplay({ bufferSize: 1, refCount: true })); + } + + private observeFormState(): void { this.exportForm.statusChanges.pipe(takeUntil(this.destroy$)).subscribe((c) => { this.formDisabled.emit(c === "DISABLED"); }); + } + private observePolicyStatus(): void { this.disablePersonalVaultExportPolicy$ = this.accountService.activeAccount$.pipe( getUserId, switchMap((userId) => @@ -218,13 +288,42 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { ), ); - this.organizationDataOwnershipPolicy$ = this.accountService.activeAccount$.pipe( + // when true, html template will hide "My Vault" option in vault selector drop down + this.organizationDataOwnershipPolicyAppliesToUser$ = this.accountService.activeAccount$.pipe( getUserId, switchMap((userId) => this.policyService.policyAppliesToUser$(PolicyType.OrganizationDataOwnership, userId), ), ); + /* + Determines how organization exports are described in the callout. + Admins are exempted from organization data ownership policy, + and so this needs to determine if the policy is enabled for the org, not if it applies to the user. + */ + this.organizationDataOwnershipPolicyEnabledForOrg$ = combineLatest([ + this.accountService.activeAccount$.pipe(getUserId), + this._organizationId$, + ]).pipe( + switchMap(([userId, organizationId]) => { + if (!organizationId || !userId) { + return of(false); + } + return this.policyService.policies$(userId).pipe( + map((policies) => { + const policy = policies?.find( + (p) => + p.type === PolicyType.OrganizationDataOwnership && + p.organizationId === organizationId, + ); + return policy?.enabled ?? false; + }), + ); + }), + ); + } + + private observeFormSelections(): void { this.exportForm.controls.vaultSelector.valueChanges .pipe(takeUntil(this.destroy$)) .subscribe((value) => { @@ -236,15 +335,50 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { this.formatOptions.push({ name: ".zip (with attachments)", value: "zip" }); } }); + } + /** + * Determine value of showExcludeMyItems. Returns true when: + * CreateDefaultLocation feature flag is on + * AND organizationDataOwnershipPolicy is enabled for the selected organization + * AND a valid OrganizationId is present (not exporting from individual vault) + */ + private observeMyItemsExclusionCriteria(): void { + combineLatest({ + createDefaultLocationFlagEnabled: this.createDefaultLocationFlagEnabled$, + organizationDataOwnershipPolicyEnabledForOrg: + this.organizationDataOwnershipPolicyEnabledForOrg$, + organizationId: this._organizationId$, + }) + .pipe(takeUntil(this.destroy$)) + .subscribe( + ({ + createDefaultLocationFlagEnabled, + organizationDataOwnershipPolicyEnabledForOrg, + organizationId, + }) => { + if (!createDefaultLocationFlagEnabled || !organizationId) { + this._showExcludeMyItems = false; + return; + } + + this._showExcludeMyItems = organizationDataOwnershipPolicyEnabledForOrg; + }, + ); + } + + // Setup validator adjustments based on format and encryption type changes + private observeValidatorAdjustments(): void { merge( this.exportForm.get("format").valueChanges, this.exportForm.get("fileEncryptionType").valueChanges, ) .pipe(startWith(0), takeUntil(this.destroy$)) .subscribe(() => this.adjustValidators()); + } - // Wire up the password generation for the password-protected export + // Wire up the password generation for password-protected exports + private setupPasswordGeneration(): void { const account$ = this.accountService.activeAccount$.pipe( pin({ name() { @@ -255,6 +389,7 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { }, }), ); + this.generatorService .generate$({ on$: this.onGenerate$, account$ }) .pipe(takeUntil(this.destroy$)) @@ -264,23 +399,29 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { confirmFilePassword: generated.credential, }); }); + } - if (this.organizationId) { - this.organizations$ = this.accountService.activeAccount$.pipe( - getUserId, - switchMap((userId) => - this.organizationService - .memberOrganizations$(userId) - .pipe(map((orgs) => orgs.filter((org) => org.id == this.organizationId))), - ), - ); - this.exportForm.controls.vaultSelector.patchValue(this.organizationId); - this.exportForm.controls.vaultSelector.disable(); + /* + Initialize component for organization only export + Hides "My Vault" option by returning immediately + */ + private initOrganizationOnly(): void { + this.organizations$ = this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.organizationService + .memberOrganizations$(userId) + .pipe(map((orgs) => orgs.filter((org) => org.id == this.organizationId))), + ), + ); + this.exportForm.controls.vaultSelector.patchValue(this.organizationId); + this.exportForm.controls.vaultSelector.disable(); - this.onlyManagedCollections = false; - return; - } + this.onlyManagedCollections = false; + } + // Initialize component to support individual and organizational exports + private initIndividual(): void { this.organizations$ = this.accountService.activeAccount$ .pipe( getUserId, @@ -296,18 +437,18 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { const managedCollectionsOrgIds = new Set( collections.filter((c) => c.manage).map((c) => c.organizationId), ); - // Filter organizations that exist in managedCollectionsOrgIds const filteredOrgs = memberOrganizations.filter((org) => managedCollectionsOrgIds.has(org.id), ); - // Sort the filtered organizations based on the name return filteredOrgs.sort(Utils.getSortFunction(this.i18nService, "name")); }), ); + } + private setupPolicyBasedFormState(): void { combineLatest([ this.disablePersonalVaultExportPolicy$, - this.organizationDataOwnershipPolicy$, + this.organizationDataOwnershipPolicyAppliesToUser$, this.organizations$, ]) .pipe(