diff --git a/.eslintrc.json b/.eslintrc.json index bbce098f65a..3a4306c330a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -100,6 +100,11 @@ "error", { "zones": [ + { + "target": ["libs/**/*"], + "from": ["apps/**/*"], + "message": "Libs should not import app-specific code." + }, { // avoid specific frameworks or large dependencies in common "target": "./libs/common/**/*", diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 14bc578bef1..3c99f610cec 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -179,12 +179,12 @@ jobs: path: browser-source/apps/browser/dist/dist-opera.zip if-no-files-found: error - # - name: Upload Opera MV3 artifact - # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - # with: - # name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip - # path: browser-source/apps/browser/dist/dist-opera-mv3.zip - # if-no-files-found: error + - name: Upload Opera MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: DO-NOT-USE-FOR-PROD-dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-opera-mv3.zip + if-no-files-found: error - name: Upload Chrome MV3 artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 @@ -207,6 +207,13 @@ jobs: path: browser-source/apps/browser/dist/dist-firefox.zip if-no-files-found: error + - name: Upload Firefox MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: DO-NOT-USE-FOR-PROD-dist-firefox-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-firefox-mv3.zip + if-no-files-found: error + - name: Upload Edge artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: @@ -214,12 +221,12 @@ jobs: path: browser-source/apps/browser/dist/dist-edge.zip if-no-files-found: error - # - name: Upload Edge MV3 artifact - # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - # with: - # name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip - # path: browser-source/apps/browser/dist/dist-edge-mv3.zip - # if-no-files-found: error + - name: Upload Edge MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: DO-NOT-USE-FOR-PROD-dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-edge-mv3.zip + if-no-files-found: error - name: Upload browser source uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 diff --git a/.storybook/main.ts b/.storybook/main.ts index 0dd7094fac0..28bc2aa085c 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,3 +1,4 @@ +import { dirname, join } from "path"; import { StorybookConfig } from "@storybook/angular"; import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; import remarkGfm from "remark-gfm"; @@ -20,11 +21,11 @@ const config: StorybookConfig = { "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", ], addons: [ - "@storybook/addon-links", - "@storybook/addon-essentials", - "@storybook/addon-a11y", - "@storybook/addon-designs", - "@storybook/addon-interactions", + getAbsolutePath("@storybook/addon-links"), + getAbsolutePath("@storybook/addon-essentials"), + getAbsolutePath("@storybook/addon-a11y"), + getAbsolutePath("@storybook/addon-designs"), + getAbsolutePath("@storybook/addon-interactions"), { name: "@storybook/addon-docs", options: { @@ -37,7 +38,7 @@ const config: StorybookConfig = { }, ], framework: { - name: "@storybook/angular", + name: getAbsolutePath("@storybook/angular"), options: {}, }, core: { @@ -53,9 +54,12 @@ const config: StorybookConfig = { } return config; }, - docs: { - autodocs: true, - }, + docs: {}, }; export default config; + +// Recommended for mono-repositories +function getAbsolutePath(value: string): any { + return dirname(require.resolve(join(value, "package.json"))); +} diff --git a/.storybook/manager.js b/.storybook/manager.js index 89a69bf9421..409f93ec505 100644 --- a/.storybook/manager.js +++ b/.storybook/manager.js @@ -1,4 +1,4 @@ -import { addons } from "@storybook/addons"; +import { addons } from "@storybook/manager-api"; import { create } from "@storybook/theming/create"; const lightTheme = create({ diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index af20dcad74e..d1ba27e108d 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -92,7 +92,6 @@ const preview: Preview = { }, }, parameters: { - actions: { argTypesRegex: "^on[A-Z].*" }, controls: { matchers: { color: /(background|color)$/i, @@ -107,6 +106,7 @@ const preview: Preview = { }, docs: { source: { type: "dynamic", excludeDecorators: true } }, }, + tags: ["autodocs"], }; export default preview; diff --git a/apps/browser/gulpfile.js b/apps/browser/gulpfile.js index 77396b9df1c..80d4738900f 100644 --- a/apps/browser/gulpfile.js +++ b/apps/browser/gulpfile.js @@ -8,6 +8,8 @@ const jeditor = require("gulp-json-editor"); const replace = require("gulp-replace"); const manifest = require("./src/manifest.json"); +const manifestVersion = parseInt(process.env.MANIFEST_VERSION || manifest.version); +const betaBuild = process.env.BETA_BUILD === "1"; const paths = { build: "./build/", @@ -48,7 +50,7 @@ function buildString() { if (process.env.MANIFEST_VERSION) { build = `-mv${process.env.MANIFEST_VERSION}`; } - if (process.env.BETA_BUILD === "1") { + if (betaBuild) { build += "-beta"; } if (process.env.BUILD_NUMBER && process.env.BUILD_NUMBER !== "") { @@ -76,12 +78,17 @@ async function dist(browserName, manifest) { function distFirefox() { return dist("firefox", (manifest) => { + if (manifestVersion === 3) { + const backgroundScript = manifest.background.service_worker; + delete manifest.background.service_worker; + manifest.background.scripts = [backgroundScript]; + } delete manifest.storage; delete manifest.sandbox; manifest.optional_permissions = manifest.optional_permissions.filter( (permission) => permission !== "privacy", ); - if (process.env.BETA_BUILD === "1") { + if (betaBuild) { manifest = applyBetaLabels(manifest); } return manifest; @@ -91,7 +98,16 @@ function distFirefox() { function distOpera() { return dist("opera", (manifest) => { delete manifest.applications; - if (process.env.BETA_BUILD === "1") { + + // Mv3 on Opera does seem to have sidebar support, however it is not working as expected. + // On install, the extension will crash the browser entirely if the sidebar_action key is set. + // We will remove the sidebar_action key for now until opera implements a fix. + if (manifestVersion === 3) { + delete manifest.sidebar_action; + delete manifest.commands._execute_sidebar_action; + } + + if (betaBuild) { manifest = applyBetaLabels(manifest); } return manifest; @@ -103,7 +119,7 @@ function distChrome() { delete manifest.applications; delete manifest.sidebar_action; delete manifest.commands._execute_sidebar_action; - if (process.env.BETA_BUILD === "1") { + if (betaBuild) { manifest = applyBetaLabels(manifest); } return manifest; @@ -115,7 +131,7 @@ function distEdge() { delete manifest.applications; delete manifest.sidebar_action; delete manifest.commands._execute_sidebar_action; - if (process.env.BETA_BUILD === "1") { + if (betaBuild) { manifest = applyBetaLabels(manifest); } return manifest; @@ -234,11 +250,16 @@ async function safariCopyBuild(source, dest) { gulpif( "manifest.json", jeditor((manifest) => { + if (manifestVersion === 3) { + const backgroundScript = manifest.background.service_worker; + delete manifest.background.service_worker; + manifest.background.scripts = [backgroundScript]; + } delete manifest.sidebar_action; delete manifest.commands._execute_sidebar_action; delete manifest.optional_permissions; manifest.permissions.push("nativeMessaging"); - if (process.env.BETA_BUILD === "1") { + if (betaBuild) { manifest = applyBetaLabels(manifest); } return manifest; diff --git a/apps/browser/package.json b/apps/browser/package.json index a210b6353c4..07fb9deb26f 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -4,7 +4,10 @@ "scripts": { "build": "cross-env MANIFEST_VERSION=3 webpack", "build:mv2": "webpack", - "build:watch": "cross-env MANIFEST_VERSION=3 webpack --watch", + "build:watch": "npm run build:watch:chrome", + "build:watch:chrome": "cross-env MANIFEST_VERSION=3 BROWSER=chrome webpack --watch", + "build:watch:firefox": "cross-env MANIFEST_VERSION=3 BROWSER=firefox webpack --watch", + "build:watch:safari": "cross-env MANIFEST_VERSION=3 BROWSER=safari webpack --watch", "build:watch:mv2": "webpack --watch", "build:prod": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" webpack", "build:prod:beta": "cross-env BETA_BUILD=1 NODE_ENV=production webpack", @@ -17,7 +20,8 @@ "dist:chrome:beta": "cross-env MANIFEST_VERSION=3 npm run build:prod:beta && cross-env MANIFEST_VERSION=3 BETA_BUILD=1 gulp dist:chrome", "dist:firefox": "npm run build:prod && gulp dist:firefox", "dist:opera": "npm run build:prod && gulp dist:opera", - "dist:safari": "npm run build:prod && gulp dist:safari", + "dist:safari": "cross-env MANIFEST_VERSION=3 BROWSER=safari npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist:safari", + "dist:safari:mv3": "npm run build:prod && gulp dist:safari", "dist:safari:mas": "npm run build:prod && gulp dist:safari:mas", "dist:safari:masdev": "npm run build:prod && gulp dist:safari:masdev", "dist:safari:dmg": "npm run build:prod && gulp dist:safari:dmg", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 0373055d1bf..d57fed94c12 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "نسخ مفتاح المصادقة (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين المملوكة لجهات اخرى مثل YubiKey و Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "يمكنك شراء العضوية المتميزة على bitwarden.com على خزانة الويب. هل تريد زيارة الموقع الآن؟" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "أنت عضو مميز!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 7f62c82ae24..0c181277ce2 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -305,22 +305,22 @@ "message": "Qovluğa düzəliş et" }, "newFolder": { - "message": "New folder" + "message": "Yeni qovluq" }, "folderName": { - "message": "Folder name" + "message": "Qovluq adı" }, "folderHintText": { "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Heç bir qovluq əlavə edilmədi" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Anbar elementlərinizi təşkil etmək üçün qovluq yaradın" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Bu qovluğu həmişəlik silmək istədiyinizə əminsiniz?" }, "deleteFolder": { "message": "Qovluğu sil" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden, 2 addımlı doğrulama kodlarını saxlaya və doldura bilər. Bu veb sayt kimlik doğrulayıcı QR kodunun ekran şəklini çəkmək üçün kamera ikonunu seçin, ya da açarı kopyalayıb bu xanaya yapışdırın." }, + "learnMoreAboutAuthenticators": { + "message": "Kimlik doğrulayıcılar haqqında daha ətraflı" + }, "copyTOTP": { "message": "Kimlik doğrulayıcı açarını kopyala (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi" }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "YubiKey və Duo kimi mülkiyyətçi iki addımlı giriş seçimləri." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Premium üzvlüyü bitwarden.com veb anbarında satın ala bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Premium üzvsünüz!" }, @@ -1822,26 +1831,26 @@ "message": "Bir və ya daha çox təşkilat siyasəti yaradıcı ayarlarınıza təsir edir." }, "passwordGenerator": { - "message": "Password generator" + "message": "Parol yaradıcı" }, "usernameGenerator": { - "message": "Username generator" + "message": "İstifadəçi adı yaradıcı" }, "useThisPassword": { - "message": "Use this password" + "message": "Bu parolu istifadə et" }, "useThisUsername": { - "message": "Use this username" + "message": "Bu istifadəçi adını istifadə et" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Güvənli parol yaradıldı! Həmçinin veb saytdakı parolunuzu güncəlləməyi unutmayın." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Yaradıcı istifadə et", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "Daha unikal parollar yarat", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2042,10 +2051,10 @@ "message": "Hesablar uyuşmur" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Biometrik kilidini açma uğursuz oldu. Biometrik sirr açarı anbarın kilidini aça bilmədi. Lütfən biometriki yenidən qurmağa çalışın." }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Biometrik açarı uyuşmazlığı" }, "biometricsNotEnabledTitle": { "message": "Biometriklər qurulmayıb" @@ -2295,6 +2304,24 @@ "message": "Send yaradıldı", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "\"Send\" saxlanıldı", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Veb sayt (URI)" }, + "websiteUriCount": { + "message": "Veb sayt (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Veb sayt əlavə edildi" }, @@ -3945,15 +3982,15 @@ "message": "Data" }, "passkeys": { - "message": "Passkeys", + "message": "Keçid açarı", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Parollar", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Keçid açarı ilə giriş et", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4151,10 +4188,10 @@ "message": "Element yeri" }, "fileSends": { - "message": "File Sends" + "message": "Fayl \"Send\"ləri" }, "textSends": { - "message": "Text Sends" + "message": "Mətn \"Send\"ləri" }, "bitwardenNewLook": { "message": "Bitwarden-in yeni bir görünüşü var!" @@ -4166,9 +4203,12 @@ "message": "Hesab fəaliyyətləri" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Uzantı ikonunda giriş üçün avto-doldurma təklif sayını göstər" }, "systemDefault": { - "message": "System default" + "message": "İlkin sistem" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 4e78a92e8e1..dcf5c21eed2 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашыфраванага сховішча для далучаных файлаў." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Вы можаце купіць прэміяльны статус на bitwarden.com. Перайсці на вэб-сайт зараз?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "У вас прэміяльны статус!" }, @@ -2295,6 +2304,24 @@ "message": "Створаны Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send адрэдагаваны", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 454988dda71..87f0a53a3e1 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -305,22 +305,22 @@ "message": "Редактиране на папка" }, "newFolder": { - "message": "New folder" + "message": "Нова папка" }, "folderName": { - "message": "Folder name" + "message": "Име на папката" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Можете да вложите една папка в друга като въведете името на горната папка, а след това „/“. Пример: Социални/Форуми" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Няма добавени папки" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Създавайте папки, за да организирате елементите в трезора си" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Наистина ли искате да изтриете тази папка окончателно?" }, "deleteFolder": { "message": "Изтриване на папка" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Битуорден може да съхранява и попълва кодовете за 2-стъпково потвърждаване. Изберете иконката с камера, за да направите екранна снимка на QR-кода от този уеб сайт или копирайте ключа в това поле." }, + "learnMoreAboutAuthenticators": { + "message": "Научете повече за средствата за удостоверяване" + }, "copyTOTP": { "message": "Копиране на удостоверителния ключ (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB пространство за файлове, които се шифрират." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Частно двустепенно удостоверяване чрез YubiKey и Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Може да платите абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Честито, ползвате платен абонамент!" }, @@ -2295,6 +2304,24 @@ "message": "Създадено изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Изпращането е създадено успешно!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Изпращането ще бъде достъпно за всеки с връзката през следващите $DAYS$ дни.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Връзката към Изпращането е копирана", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Редактирано изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Уеб сайт (адрес)" }, + "websiteUriCount": { + "message": "Уеб сайт (адрес) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Уеб сайтът е добавен" }, @@ -4166,9 +4203,12 @@ "message": "Действия по регистрацията" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Показване на броя предложения за автоматично попълване на данни за вписване върху иконката на добавката" }, "systemDefault": { - "message": "System default" + "message": "По подразбиране за системата" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Изискванията на политиката за големи компании бяха приложени към тази настройка" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index d6bc891a172..7881e0658d9 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।" }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "আপনি bitwarden.com ওয়েব ভল্টে প্রিমিয়াম সদস্যতা কিনতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "আপনি প্রিমিয়াম সদস্য!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 198874339e9..0a72dbfa476 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index fe0ec495b8a..3b961fa0042 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copia la clau de l'autenticador (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Opcions propietàries de doble factor com ara YubiKey i Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Podeu comprar la vostra subscripció a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Sou un membre premium!" }, @@ -2295,6 +2304,24 @@ "message": "Send creat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send guardat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Lloc web (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Lloc web afegit" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index c7afbeeac61..b22f6ff55f4 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -305,22 +305,22 @@ "message": "Upravit složku" }, "newFolder": { - "message": "New folder" + "message": "Nová složka" }, "folderName": { - "message": "Folder name" + "message": "Název složky" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Vnořit složku přidáním názvu nadřazené složky následovaného znakem \"/\". Příklad: Sociální/Fóra" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Nebyly přidány žádné složky" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Vytvořte složky pro organizaci Vašich položek trezoru" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Opravdu chcete trvale smazat tuto složku?" }, "deleteFolder": { "message": "Smazat složku" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden umí ukládat a vyplňovat dvoufázové ověřovací kódy. Vyberte ikonu fotoaparátu a pořiďte snímek obrazovky ověřovacího QR kódu této webové stránky nebo klíč zkopírujte a vložte do tohoto pole." }, + "learnMoreAboutAuthenticators": { + "message": "Zjistěte více o autentizátorech" + }, "copyTOTP": { "message": "Kopírovat autentizační klíč (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB šifrovaného úložiště pro přílohy." }, + "premiumSignUpEmergency": { + "message": "Nouzový přístup" + }, "premiumSignUpTwoStepOptions": { "message": "Volby proprietálních dvoufázových přihlášení jako je YubiKey a Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Prémiové členství můžete zakoupit na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?" }, + "premiumPurchaseAlertV2": { + "message": "Premium si můžete zakoupit v nastavení účtu ve webové aplikaci Bitwarden." + }, "premiumCurrentMember": { "message": "Jste prémiovým členem!" }, @@ -1822,26 +1831,26 @@ "message": "Jedna nebo více zásad organizace ovlivňují nastavení generátoru." }, "passwordGenerator": { - "message": "Password generator" + "message": "Generátor hesla" }, "usernameGenerator": { - "message": "Username generator" + "message": "Generátor uživatelského jména" }, "useThisPassword": { - "message": "Use this password" + "message": "Použít toto heslo" }, "useThisUsername": { - "message": "Use this username" + "message": "Použít toto uživatelské jméno" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Bezpečné heslo bylo vygenerováno! Nezapomeňte také aktualizovat heslo na webu." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Použijte generátor", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "pro vytvoření silného jedinečného hesla", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2042,10 +2051,10 @@ "message": "Neshoda účtů" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Biometrické odemknutí se nezdařilo. Zkuste znovu nastavit biometrické prvky." }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Neshoda biometrického klíče" }, "biometricsNotEnabledTitle": { "message": "Biometrie není nastavena" @@ -2295,6 +2304,24 @@ "message": "Send vytvořen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send byl úspěšně vytvořen!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Send bude k dispozici na příštích $DAYS$ dnů každému, kdo má odkaz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Odkaz Send byl zkopírován", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send upraven", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Ověřovací klíč" }, "autofillOptions": { - "message": "Nastavení automatického vyplňování" + "message": "Volby automatického vyplňování" }, "websiteUri": { "message": "Webová stránka (URI)" }, + "websiteUriCount": { + "message": "Webová stránka (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Webová stránka přidána" }, @@ -3945,15 +3982,15 @@ "message": "Data" }, "passkeys": { - "message": "Passkeys", + "message": "Přístupové klíče", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Hesla", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Přihlásit se pomocí přístupového klíče", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4151,10 +4188,10 @@ "message": "Umístění položky" }, "fileSends": { - "message": "File Sends" + "message": "Sends se soubory" }, "textSends": { - "message": "Text Sends" + "message": "Sends s texty" }, "bitwardenNewLook": { "message": "Bitwarden má nový vzhled!" @@ -4166,9 +4203,12 @@ "message": "Činnosti účtu" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Zobrazit počet návrhů automatického vyplňování přihlášení na ikoně rozšíření" }, "systemDefault": { - "message": "System default" + "message": "Systémový výchozí" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Na toto nastavení byly uplatněny požadavky podnikových zásad" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 857dcc13642..4d3f9a9b490 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "Storfa 1GB wedi'i hamgryptio ar gyfer atodiadau ffeiliau." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Dewisiadau mewngofnodi dau gam perchenogol megis YubiKey a Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Mae gennych aelodaeth uwch!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 22032050711..8f35a21bb11 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -305,22 +305,22 @@ "message": "Redigér mappe" }, "newFolder": { - "message": "New folder" + "message": "Ny mappe" }, "folderName": { - "message": "Folder name" + "message": "Mappenavn" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Indlejr en mappe ved at tilføje den overordnede mappes navn efterfulgt af en “/”. F.eks.: Social/Fora" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Ingen mapper tilføjet" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Opret mapper for at organisere boks-emner" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Sikker på, at denne mappe skal slettes permanent?" }, "deleteFolder": { "message": "Slet mappe" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kan gemme og udfylde 2-trinsbekræftelseskoder. Vælg kameraikonet for at tage et skærmfoto af dette websteds godkendelses-QR-kode, eller kopiér og indsæt nøglen i dette felt." }, + "learnMoreAboutAuthenticators": { + "message": "Læs mere om autentifikatorer" + }, "copyTOTP": { "message": "Kopiér godkendelsesnøgle (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB krypteret lager til vedhæftede filer." }, + "premiumSignUpEmergency": { + "message": "Nødadgang" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietære totrins-login muligheder, såsom YubiKey og Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Du kan købe premium-medlemskab i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, + "premiumPurchaseAlertV2": { + "message": "Der kan købes Premium fra kontoindstillingerne via Bitwarden web-appen." + }, "premiumCurrentMember": { "message": "Du er premium-medlem!" }, @@ -2295,6 +2304,24 @@ "message": "Send oprettet", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send er hermed oprettet!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Denne Send vil være tilgængelig for alle med linket i de næste $DAYS$ dage.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send-link kopieret", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send gemt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Godkendelsesnøgle" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Websted (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4166,9 +4203,12 @@ "message": "Kontohandlinger" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Vis antal login-autoudfyldningsforslag på udvidelsesikon" }, "systemDefault": { - "message": "System default" + "message": "Systemstandard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Virksomhedspolitikkrav er anvendt på denne indstilling" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index dc2e2d34bdd..2c68a9e6db2 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kann Zwei-Faktor-Authentifizierungsscodes speichern und ausfüllen. Wähle das Kamerasymbol aus, um einen Screenshot des Authenticator-QR-Codes dieser Website zu machen oder kopiere und füge den Schlüssel in dieses Feld ein." }, + "learnMoreAboutAuthenticators": { + "message": "Erfahre mehr über Authenticator-Apps" + }, "copyTOTP": { "message": "Authentifizierungsschlüssel kopieren (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietäre Optionen für die Zwei-Faktor Authentifizierung wie YubiKey und Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Website jetzt besuchen?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Du bist jetzt Premium-Mitglied!" }, @@ -2295,6 +2304,24 @@ "message": "Send erstellt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send gespeichert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website hinzugefügt" }, @@ -4166,9 +4203,12 @@ "message": "Konto-Aktionen" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Anzahl der Vorschläge zum Auto-Ausfüllen von Zugangsdaten auf dem Erweiterungssymbol anzeigen" }, "systemDefault": { - "message": "System default" + "message": "Systemstandard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Unternehmens-Richtlinienanforderungen wurden auf diese Einstellung angewandt" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 1e898f7e0bf..2811dcf1b56 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -305,22 +305,22 @@ "message": "Επεξεργασία φακέλου" }, "newFolder": { - "message": "New folder" + "message": "Νέος φάκελος" }, "folderName": { - "message": "Folder name" + "message": "Όνομα φακέλου" }, "folderHintText": { "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Δεν προστέθηκαν φάκελοι" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Δημιουργήστε φακέλους για να οργανώσετε τα στοιχεία του θησαυ/κίου σας" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Είστε σίγουροι ότι θέλετε να διαγράψετε μόνιμα αυτόν το φάκελο;" }, "deleteFolder": { "message": "Διαγραφή φακέλου" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Το Bitwarden μπορεί να αποθηκεύσει και να συμπληρώσει τους κωδικούς επαλήθευσης 2 βημάτων. Επιλέξτε το εικονίδιο της κάμερας για λήψη στιγμιότυπου του κωδικού QR του αυθεντικοποιητή αυτής της ιστοσελίδας, ή αντιγράψτε και επικολλήστε το κλειδί σε αυτό το πεδίο." }, + "learnMoreAboutAuthenticators": { + "message": "Μάθετε περισσότερα για της εφαρμογές αυθεντικοποίησης" + }, "copyTOTP": { "message": "Αντιγραφή κλειδιού Αυθεντικοποιητή (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία." }, + "premiumSignUpEmergency": { + "message": "Πρόσβαση έκτακτης ανάγκης" + }, "premiumSignUpTwoStepOptions": { "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Μπορείτε να αγοράσετε συνδρομή Premium στο διαδικτυακό θησαυ/κιο του bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" }, + "premiumPurchaseAlertV2": { + "message": "Μπορείτε να αγοράσετε το Premium από τις ρυθμίσεις λογαριασμού σας στην διαδικτυακή εφαρμογή Bitwarden." + }, "premiumCurrentMember": { "message": "Είστε Premium μέλος!" }, @@ -1822,26 +1831,26 @@ "message": "Μία ή περισσότερες πολιτικές του οργανισμού επηρεάζουν τις ρυθμίσεις της γεννήτριας." }, "passwordGenerator": { - "message": "Password generator" + "message": "Γεννήτρια κωδικού πρόσβασης" }, "usernameGenerator": { - "message": "Username generator" + "message": "Γεννήτρια ονόματος χρήστη" }, "useThisPassword": { - "message": "Use this password" + "message": "Χρήση αυτού του κωδικού πρόσβασης" }, "useThisUsername": { - "message": "Use this username" + "message": "Χρήση αυτού του ονόματος χρήστη" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Δημιουργήθηκε ασφαλής κωδικός πρόσβασης! Μην ξεχάσετε να ενημερώσετε επίσης τον κωδικό πρόσβασής σας στην ιστοσελίδα." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Χρήση της γεννήτριας", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "για να δημιουργήσετε έναν ισχυρό μοναδικό κωδικό πρόσβασης", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2295,6 +2304,24 @@ "message": "Το Send δημιουργήθηκε", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Το Send δημιουργήθηκε επιτυχώς!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Ο σύνδεσμος Send αντιγράφηκε", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Το Send αποθηκεύτηκε", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Ιστοσελίδα (URI)" }, + "websiteUriCount": { + "message": "Ιστοσελίδα (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Η ιστοσελίδα προστέθηκε" }, @@ -3945,15 +3982,15 @@ "message": "Δεδομένα" }, "passkeys": { - "message": "Passkeys", + "message": "Κλειδιά πρόσβασης", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Κωδικοί πρόσβασης", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Σύνδεση με κλειδί πρόσβασης", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4151,10 +4188,10 @@ "message": "Τοποθεσία Αντικειμένου" }, "fileSends": { - "message": "File Sends" + "message": "Send αρχείων" }, "textSends": { - "message": "Text Sends" + "message": "Send κειμένων" }, "bitwardenNewLook": { "message": "Το Bitwarden έχει μια νέα εμφάνιση!" @@ -4166,9 +4203,12 @@ "message": "Ενέργειες λογαριασμού" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Εμφάνιση αριθμού προτάσεων αυτόματης συμπλήρωσης σύνδεσης στο εικονίδιο επέκτασης" }, "systemDefault": { - "message": "System default" + "message": "Προεπιλογή συστήματος" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index c65535e2e50..b0df5fadd44 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1082,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1103,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2298,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 624e715926f..5146e6151d7 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 65b347eacbc..8cb0875739a 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -317,7 +317,7 @@ "message": "No folders added" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Create folders to organise your vault items" }, "deleteFolderPermanently": { "message": "Are you sure you want to permanently delete this folder?" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Created Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Edited Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index fc501882ca0..2ab34997843 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copiar clave de autenticador (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB de espacio cifrado en disco para adjuntos." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Opciones de inicio de sesión con autenticación de dos pasos propietarios como YubiKey y Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Puedes comprar la membresía Premium en la caja fuerte web de bitwarden.com. ¿Quieres visitar el sitio web ahora?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "¡Eres un miembro Premium!" }, @@ -2295,6 +2304,24 @@ "message": "Envío creado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Envío editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index bdceb79217e..d707cd5108f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ulatuses krüpteeritud salvestusruum." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Bitwardeni premium versiooni saab osta bitwarden.com veebihoidlas. Avan veebihoidla?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Oled premium kasutaja!" }, @@ -2295,6 +2304,24 @@ "message": "Send on loodud", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Muudetud", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 6dc87cff44c..c407fcd74ea 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "Eranskinentzako 1GB-eko zifratutako biltegia." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Zure premium bazkidetza bitwarden.com webguneko kutxa gotorrean ordaindu dezakezu. Orain bisitatu nahi duzu webgunea?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Premium bazkide zara!" }, @@ -2295,6 +2304,24 @@ "message": "Send-a sortua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send-a editatua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index cbbb6cff3e4..fa178ccbd82 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey و Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "شما می‌توانید عضویت پرمیوم را از گاوصندوق وب bitwarden.com خریداری کنید. مایلید اکنون از وب‌سایت بازید کنید؟" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "شما یک عضو پرمیوم هستید!" }, @@ -2295,6 +2304,24 @@ "message": "ارسال ساخته شد", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "ارسال ذخیره شد", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 0f5d9ff1623..5aa1a0d1388 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -305,22 +305,22 @@ "message": "Muokkaa kansiota" }, "newFolder": { - "message": "New folder" + "message": "Uusi kansio" }, "folderName": { - "message": "Folder name" + "message": "Kansion nimi" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Luo alikansioita lisäämällä olemassa olevan kansion nimi merkin “/” jälkeen. Esim: Some/Foorumit" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Kansioita ei ole lisätty" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Luo kansioita järjestääksesi holvisi kohteita" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Haluatko varmasti poistaa kansion pysyvästi?" }, "deleteFolder": { "message": "Poista kansio" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden voi säilyttää ja täyttää kaksivaiheisen kirjautumisen koodit. Kamerakuvakkeella voit kaapata todennusavaimen avoimen sivun QR-koodista automaattisesti, tai voit kopioida ja liittää sen tähän kenttään manuaalisesti." }, + "learnMoreAboutAuthenticators": { + "message": "Lue lisää todentajista" + }, "copyTOTP": { "message": "Kopioi todennusavain (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 Gt salattua tallennustilaa tiedostoliitteille." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvista. Haluatko avata sivuston nyt?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Olet Premium-jäsen!" }, @@ -1834,14 +1843,14 @@ "message": "Käytä tätä käyttäjätunnusta" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Turvallinen salasana luotu! Muista myös päivittää salasana verkkosivustolla." }, "useGeneratorHelpTextPartOne": { "message": "Käytä generaattoria", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "luodaksesi vahvan ainutlaatuisen salasanan", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2295,6 +2304,24 @@ "message": "Send luotiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send tallennettiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Verkkosivusto (URI)" }, + "websiteUriCount": { + "message": "Verkkosivusto (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Verkkosivusto lisättiin" }, @@ -4166,9 +4203,12 @@ "message": "Tilitoiminnot" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Näytä kirjautumisen automaattitäytön ehtotusten määrä laajennuksen kuvakkeessa" }, "systemDefault": { - "message": "System default" + "message": "Järjestelmän oletus" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index ee909343087..e2f32ae5d9a 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage para sa mga file attachment." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Pagmamay-ari na dalawang hakbang na opsyon sa pag-log in gaya ng YubiKey at Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Maaari kang mamili ng membership sa Premium sa website ng bitwarden.com. Gusto mo bang bisitahin ang website ngayon?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ikaw ay isang Premium na miyembro!" }, @@ -2295,6 +2304,24 @@ "message": "Ipadala na nilikha", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Ipadala na nai-save", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index ace9915f1d7..bd799815c35 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden peut stocker et remplir des codes de vérification en 2 étapes. Sélectionnez l'icône caméra pour prendre une capture d'écran du code QR de l'authentificateur de ce site Web, ou copiez et collez la clé dans ce champ." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copier la clé Authenticator (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 Go de stockage chiffré pour les fichiers joints." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Options de connexion propriétaires à deux facteurs telles que YubiKey et Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Vous pouvez acheter une adhésion Premium sur le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Vous êtes un membre Premium !" }, @@ -2295,6 +2304,24 @@ "message": "Send créé", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send sauvegardé", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 59e10828b19..6084adadfe2 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copiar clave de autenticación (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send creado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send gardado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 498f46447da..82a1c59f7f7 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "באפשרותך לרכוש מנוי פרימיום בכספת באתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "אתה מנוי פרימיום!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 5dce5f7ff82..3ec9630e470 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "आप bitwarden.com वेब वॉल्ट पर प्रीमियम सदस्यता खरीद सकते हैं।क्या आप अब वेबसाइट पर जाना चाहते हैं?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "आप एक प्रीमियम सदस्य हैं!" }, @@ -2295,6 +2304,24 @@ "message": "नया सेंड बनाया गया", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "सेंड एडिट किया गया", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "इस सेटिंग पर एंटरप्राइज़ नीति आवश्यकताएँ लागू की गई हैं" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index fb61827321c..857310e21b4 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -305,22 +305,22 @@ "message": "Uredi mapu" }, "newFolder": { - "message": "New folder" + "message": "Nova mapa" }, "folderName": { - "message": "Folder name" + "message": "Naziv mape" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Ugnijezdi mapu dodavanjem naziva roditeljske mape i znaka kroz. Npr. Mreže/Forumi" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Mapa nije dodana" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Za organiziranje stavki u trezoru, stvori mape" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Sigurno želiš trajno izbrisati ovu mapu?" }, "deleteFolder": { "message": "Izbriši mapu" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden može pohraniti i ispuniti kodove za dvostruku autentifikaciju. Odaberi ikonu kamere i označi QR kôd za provjeru autentičnosti ove web stranice ili kopiraj i zalijepi ključ u ovo polje." }, + "learnMoreAboutAuthenticators": { + "message": "Više o autentifikatorima" + }, "copyTOTP": { "message": "Kopiraj ključ autentifikatora (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB šifriranog prostora za pohranu podataka." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Mogućnosti za prijavu u dva koraka kao što su YubiKey i Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Možeš kupiti premium članstvo na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ti si premium član!" }, @@ -1822,26 +1831,26 @@ "message": "Jedno ili više pravila organizacije utječe na postavke generatora." }, "passwordGenerator": { - "message": "Password generator" + "message": "Generator lozinki" }, "usernameGenerator": { - "message": "Username generator" + "message": "Generator korisničkih imena" }, "useThisPassword": { - "message": "Use this password" + "message": "Koristi ovu lozinku" }, "useThisUsername": { - "message": "Use this username" + "message": "Koristi ovo korisničko ime" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Sigurna lozinka generirana! Ne zaboravi ažurirati lozinku na web stranici." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Koristi generator", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "za stvaranje snažne, jedinstvene lozinke", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2295,6 +2304,24 @@ "message": "Send stvoren", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send je uspješno stvoren!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Send će biti dostupan svakome s poveznicom ovoliko dana: $DAYS$.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Kopirana poveznica Senda", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send spremljen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Web stranica (URI)" }, + "websiteUriCount": { + "message": "Broj URI-ja: $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Web stranica dodana" }, @@ -3945,15 +3982,15 @@ "message": "Podaci" }, "passkeys": { - "message": "Passkeys", + "message": "Pristupni ključevi", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Lozinke", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Prijava pristupnim ključem", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4151,10 +4188,10 @@ "message": "Lokacija stavke" }, "fileSends": { - "message": "File Sends" + "message": "Send datoteke" }, "textSends": { - "message": "Text Sends" + "message": "Send tekstovi" }, "bitwardenNewLook": { "message": "Bitwarden ima novi izgled!" @@ -4166,9 +4203,12 @@ "message": "Radnje na računu" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Prikaži broj prijedloga auto-ispune na ikoni proširenja" }, "systemDefault": { - "message": "System default" + "message": "Zadano sustavom" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Pravila tvrtke primijenjena su na ovu postavku" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index ecd5284d2ab..3cdbadfffdf 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -305,22 +305,22 @@ "message": "Mappa szerkesztése" }, "newFolder": { - "message": "New folder" + "message": "Új mappa" }, "folderName": { - "message": "Folder name" + "message": "Mappanév" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Mappa beágyazása a szülőmappa nevének hozzáadásával, majd egy “/” karakterrel. Példa: Közösségi/Fórumok" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Nem lett mappa hozzáadva." }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Hozzunk létre mappákat a széfelemek rendszerezéséhez" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Biztosan véglegesen törlésre kerüljön ez a mappa?" }, "deleteFolder": { "message": "Mappa törlése" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "A Bitwarden képes tárolni és kitölteni a kétlépcsős ellenőrző kódokat. Válasszuk a kamera ikont, hogy képernyőképet készítsünk a webhely hitelesítő QR kódjáról vagy másoljuk ki és illesszük be a kulcsot ebbe a mezőbe." }, + "learnMoreAboutAuthenticators": { + "message": "További információ a hitelesítőkről" + }, "copyTOTP": { "message": "Hitelesítő kód másolása (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB titkosított tárhely a fájlmellékleteknek." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Saját kétlépcsős bejelentkezési lehetőségek mint a YubiKey és a Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "A prémium tagság megvásárolható a bitwarden.com webes széfben. Szeretnénk felkeresni a webhelyet most?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Prémium tag vagyunk!" }, @@ -1822,26 +1831,26 @@ "message": "Egy vagy több szervezeti szabály érinti a generátor beállításokat." }, "passwordGenerator": { - "message": "Password generator" + "message": "Jelszó generátor" }, "usernameGenerator": { - "message": "Username generator" + "message": "Felhasználónév generátor" }, "useThisPassword": { - "message": "Use this password" + "message": "Jelszó használata" }, "useThisUsername": { - "message": "Use this username" + "message": "Felhasználónév használata" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "A biztonságos jelszó generálásra került! Ne felejtsük el frissíteni a jelszót a webhelyen is." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Generátor használata", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "erős egyedi jelszó létrehozásához", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2042,10 +2051,10 @@ "message": "A fiók nem egyezik." }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "A biometrikus feloldás nem sikerült. A biometrikus titkos kulcs nem tudta feloldani a széfet. Próbáljuk újra beállítani a biometrikus adatokat." }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "A biometrikus kulcs nem egyezik." }, "biometricsNotEnabledTitle": { "message": "A biometrikus adatok nincsenek beüzemelve." @@ -2295,6 +2304,24 @@ "message": "A Send létrejött.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "A Send sikeresen létrejött!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "A Send bárki számára elérhető a hivatkozással a következő $DAYS$ napban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "A Send hivatkozás másolásra került.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "A Send mentésre került.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Webhely (URI)" }, + "websiteUriCount": { + "message": "Webhely (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "A webhely hozzáadásra került." }, @@ -3945,15 +3982,15 @@ "message": "Adat" }, "passkeys": { - "message": "Passkeys", + "message": "Hozzáférési kulcsok", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Jelszavak", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Bejelentkezés hozzáférési kulccsal", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4151,10 +4188,10 @@ "message": "Elem helyek" }, "fileSends": { - "message": "File Sends" + "message": "Fájl küldés" }, "textSends": { - "message": "Text Sends" + "message": "Szöveg küldés" }, "bitwardenNewLook": { "message": "Bitwarden has a new look!" @@ -4166,9 +4203,12 @@ "message": "Fiókműveletek" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Az automatikus bejelentkezési kitöltési javaslatok számának megjelenítése a bővítmény ikonján" }, "systemDefault": { - "message": "System default" + "message": "Rendszer alapértelmezett" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Erre a beállításra a vállalkozás rendszabály követelmények lettek alkalmazva." } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 05dc4ed1a7b..2eb1c089b97 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Salin kunci Autentikator (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB penyimpanan berkas yang dienkripsi." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Anda dapat membeli keanggotaan premium di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Anda adalah anggota premium!" }, @@ -2295,6 +2304,24 @@ "message": "Send Dibuat ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send diedit", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 447cdcae573..0c1eb9ef4f2 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copia la chiave di autenticazione (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB di spazio di archiviazione crittografato per gli allegati." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Opzioni di verifica in due passaggi proprietarie come YubiKey e Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Puoi acquistare il un abbonamento Premium dalla cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Sei un membro Premium!" }, @@ -2295,6 +2304,24 @@ "message": "Send creato", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send salvato", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 3781e3afbd0..9cf7d556a0e 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden は2段階認証コードを保存・入力できます。 カメラアイコンを選択して、このウェブサイトの認証 QR コードのスクリーンショットを撮るか、キーをコピーしてこのフィールドに貼り付けてください。" }, + "learnMoreAboutAuthenticators": { + "message": "認証方法の詳細" + }, "copyTOTP": { "message": "認証キーのコピー (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1GB の暗号化されたファイルストレージ" }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "YubiKey、Duo などのプロプライエタリな2段階認証オプション。" }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "プレミアム会員権は bitwarden.com ウェブ保管庫で購入できます。ウェブサイトを開きますか?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "あなたはプレミアム会員です!" }, @@ -2295,6 +2304,24 @@ "message": "作成した Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "編集済みの Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "ウェブサイト (URI)" }, + "websiteUriCount": { + "message": "ウェブサイト (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "ウェブサイトを追加しました" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "システムのデフォルト" + }, + "enterprisePolicyRequirementsApplied": { + "message": "エンタープライズポリシー要件がこの設定に適用されました" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 898742626b3..a55860c8ff9 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 49c37c0cf5b..6c398b6aeb7 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "ನೀವು ಬಿಟ್ವಾರ್ಡೆನ್.ಕಾಮ್ ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವವನ್ನು ಖರೀದಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ನೀವು ಪ್ರೀಮಿಯಂ ಸದಸ್ಯರಾಗಿದ್ದೀರಿ!" }, @@ -2295,6 +2304,24 @@ "message": "ಕಳುಹಿಸು ರಚಿಸಲಾಗಿದೆ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "ಕಳುಹಿಸಿದ ಸಂಪಾದನೆ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index bd94d590c2f..3b07fa86073 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "인증서 키 (TOTP) 복사" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1GB의 암호화된 파일 저장소." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "bitwarden.com 웹 보관함에서 프리미엄 멤버십을 구입할 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "프리미엄 사용자입니다!" }, @@ -2295,6 +2304,24 @@ "message": "Send 생성함", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send 수정함", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 13d0652f47c..ac58c6df12a 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Kopijuoti Autentifikatoriaus raktą (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB užšifruotos vietos diske bylų prisegimams." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Patentuotos dviejų žingsnių prisijungimo parinktys, tokios kaip YubiKey ir Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Galite įsigyti „Premium“ narystę „bitwarden.com“ žiniatinklio saugykloje. Ar norite apsilankyti svetainėje dabar?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Tu esi Premium narys!" }, @@ -2295,6 +2304,24 @@ "message": "Siuntinys sukurtas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Siuntinys išsaugotas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index f954248d30e..f43955f7a6e 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -23,7 +23,7 @@ "message": "Jāiestata droša parole" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Jāpabeidz sava konta izveida ar paroles iestatīšanu" + "message": "Sava konta izveidošana jāpabeidz ar paroles iestatīšanu" }, "login": { "message": "Pieteikties" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Uzzināt vairāk par autentificētājiem" + }, "copyTOTP": { "message": "Ievietot starpliktuvē autentificētāja atslēgu (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB šifrētas krātuves datņu pielikumiem." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Tādas slēgtā pirmavota divpakāpju pieteikšanās iespējas kā YubiKey un Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Premium dalību ir iespējams iegādāties bitwarden.com tīmekļa glabātavā. Vai tagad apmeklēt tīmekļvietni?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Tu esi Premium dalībnieks!" }, @@ -2295,6 +2304,24 @@ "message": "Send izveidots", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saglabāts", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Tīmekļvietne (URI)" }, + "websiteUriCount": { + "message": "Tīmekļvietne (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Tīmekļvietne pievienota" }, @@ -4166,9 +4203,12 @@ "message": "Konta darbības" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Paplašinājuma ikonā rādīt pieteikšanās automātiskās aizpildes ieteikumu skaitu" }, "systemDefault": { - "message": "System default" + "message": "Sistēmas noklusējums" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Šim iestatījumam tika piemērotas uzņēmējdarbības nosacījumu prasības" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index db36de26433..aa9247fb37a 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്‌ത സംഭരണം." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "നിങ്ങൾക്ക് bitwarden.com വെബ് വാൾട്ടിൽ പ്രീമിയം അംഗത്വം വാങ്ങാം. നിങ്ങൾക്ക് ഇപ്പോൾ വെബ്സൈറ്റ് സന്ദർശിക്കാൻ ആഗ്രഹമുണ്ടോ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "തങ്ങൾ ഒരു പ്രീമിയം അംഗമാണ്!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index f415cf6d332..0dd108a577a 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 69e17a7d6d5..6f9a8eacb27 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB med kryptert fillagring for filvedlegg." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Du kan kjøpe et Premium-medlemskap på bitwarden.com. Vil du besøke det nettstedet nå?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Du er et Premium-medlem!" }, @@ -2295,6 +2304,24 @@ "message": "Opprettet Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Redigerte Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index bff29a5e01e..9f4cfc9888a 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Thuis, op werk of onderweg. Bitwarden beveiligt makkelijk all je wachtwoorden, passkeys en gevoelige informatie", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -502,7 +502,7 @@ "message": "Stel een ontgrendelingsmethode in om je kluis time-out actie te wijzigen." }, "unlockMethodNeeded": { - "message": "Set up an unlock method in Settings" + "message": "Stel je ontgrendelingsmethode in in de instellingen" }, "sessionTimeoutHeader": { "message": "Sessietime-out" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kan tweestapsaanmeldingscodes opslaan en invullen. Selecteer het camerapictogram om een schermafbeelding van de QR-code van deze website te maken of kopieer en plak de sleutel in dit veld." }, + "learnMoreAboutAuthenticators": { + "message": "Meer informatie over authenticatoren" + }, "copyTOTP": { "message": "Authenticatie-sleutel (TOTP) kopiëren" }, @@ -697,7 +700,7 @@ "message": "Uitgelogd" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Je bent uitgelogd van je account." }, "loginExpired": { "message": "Je inlogsessie is verlopen." @@ -829,7 +832,7 @@ "message": "\"Melding bij nieuwe login\" vraagt automatisch om nieuwe sites in de kluis op te slaan wanneer je ergens voor de eerste keer inlogt." }, "addLoginNotificationDescAlt": { - "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + "message": "Vraag om een item toe te voegen als het niet is gevonden is je kluis. Dit geld voor alle ingelogde accounts." }, "showCardsInVaultView": { "message": "Kaarten als Autofill-suggesties in de kluisweergave weergeven" @@ -870,7 +873,7 @@ "message": "Vraag om bijwerken van het wachtwoord van een login zodra een wijziging op een website is gedetecteerd." }, "changedPasswordNotificationDescAlt": { - "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + "message": "Vraag om het wachtwoord bij te werken als er een wijziging is gedetecteerd op een website. Geldt voor alle ingelogde accounts." }, "enableUsePasskeys": { "message": "Vragen om opslaan en gebruiken van passkeys en wachtwoorden" @@ -900,7 +903,7 @@ "message": "Gebruik de tweede klikfunctie voor toegang tot wachtwoordgeneratie en het matchen van logins voor de website." }, "contextMenuItemDescAlt": { - "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + "message": "Gebruik de tweede klikfunctie voor toegang tot wachtwoordgeneratie en het matchen van logins voor de website." }, "defaultUriMatchDetection": { "message": "Standaard URI-overeenkomstdetectie", @@ -916,7 +919,7 @@ "message": "Het kleurenthema van de toepassing wijzigen." }, "themeDescAlt": { - "message": "Change the application's color theme. Applies to all logged in accounts." + "message": "Verander het kleurenthema van de applicatie. Geldt voor alle ingelogde accounts." }, "dark": { "message": "Donker", @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB versleutelde opslag voor bijlagen." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Je kunt een Premium-abonnement aanschaffen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Je bent Premium-lid!" }, @@ -1236,7 +1245,7 @@ "message": "Geef de basis-URL van jouw zelfgehoste Bitwarden-installatie." }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "Specificeer de basis-URL van je zelfgehoste Bitwarden-installatie. Bijvoorbeeld: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { "message": "For advanced configuration, you can specify the base URL of each service independently." @@ -1795,7 +1804,7 @@ "message": "Ongeldige PIN-code." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Too many invalid PIN entry attempts. Logging out." + "message": "PIN te vaak verkeerd ingevuld. Bezig met uitloggen." }, "unlockWithBiometrics": { "message": "Biometrisch ontgrendelen" @@ -2000,7 +2009,7 @@ "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "Fout bij vernieuwen toegangstoken" }, "errorRefreshingAccessTokenDesc": { "message": "No refresh token or API keys found. Please try logging out and logging back in." @@ -2103,7 +2112,7 @@ "message": "Bitwarden zal voor deze domeinen niet vragen om inloggegevens op te slaan. Je moet de pagina vernieuwen om de wijzigingen toe te passen." }, "excludedDomainsDescAlt": { - "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + "message": "Bitwarden zal voor deze domeinen niet vragen om de wachtwoorden op te slaan voor alle ingelogde accounts. Je moet de pagina verversen om de wijzigingen op te slaan." }, "websiteItemLabel": { "message": "Website $number$ (URI)", @@ -2295,6 +2304,24 @@ "message": "Send aangemaakt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send bewerkt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website toegevoegd" }, @@ -4166,9 +4203,12 @@ "message": "Accountacties" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Aantal login-autofill-suggesties op het extensie-pictogram weergeven" }, "systemDefault": { - "message": "System default" + "message": "Systeemstandaard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Bedrijfsbeleidseisen zijn op deze instelling toegepast" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 8ee343b65d1..482f07671c1 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden może przechowywać i wypełniać kody weryfikacyjne. Wybierz ikonę aparatu, aby zrobić zrzut ekranu z kodem QR lub skopiuj i wklej klucz do tego pola." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Kopiuj klucz uwierzytelniający (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB miejsca na zaszyfrowane załączniki." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Konto Premium możesz zakupić na stronie sejfu bitwarden.com. Czy chcesz otworzyć tę stronę?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Posiadasz konto Premium!" }, @@ -2295,6 +2304,24 @@ "message": "Wysyłka została utworzona", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Wysyłka została zapisana", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Strona internetowa (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Strona dodana" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 69ed6479536..e7d20057c92 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Selecione o ícone de câmera para tirar uma captura da tela do código QR de autenticador deste site, ou copie e cole a chave neste campo." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copiar chave de Autenticação (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Opções de login em duas etapas como YubiKey e Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Você pode comprar a assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Você é um membro premium!" }, @@ -1309,7 +1318,7 @@ "message": "Preenchimento automático ao carregar a página" }, "enableAutoFillOnPageLoad": { - "message": "Ativar o Autopreenchimento ao Carregar a Página" + "message": "Auto-preencher ao carregar a página" }, "enableAutoFillOnPageLoadDesc": { "message": "Se um formulário de login for detectado, realizar automaticamente um auto-preenchimento quando a página web carregar." @@ -2295,6 +2304,24 @@ "message": "Send Criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send Editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Site (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Site adicionado" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index fc4ca1c3a5c..f08f0875a98 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -305,22 +305,22 @@ "message": "Editar pasta" }, "newFolder": { - "message": "New folder" + "message": "Nova pasta" }, "folderName": { - "message": "Folder name" + "message": "Nome da pasta" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Aninhe uma pasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Nenhuma pasta adicionada" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Crie pastas para organizar os itens do seu cofre" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Tem a certeza de que pretende eliminar permanentemente esta pasta?" }, "deleteFolder": { "message": "Eliminar pasta" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de dois passos. Selecione o ícone da câmara para tirar uma captura de ecrã do código QR do autenticador deste site ou copie e cole a chave neste campo." }, + "learnMoreAboutAuthenticators": { + "message": "Saiba mais sobre os autenticadores" + }, "copyTOTP": { "message": "Copiar Chave de autenticação (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, + "premiumSignUpEmergency": { + "message": "Acesso de emergência" + }, "premiumSignUpTwoStepOptions": { "message": "Opções proprietárias de verificação de dois passos, como YubiKey e Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Pode adquirir uma subscrição Premium no cofre web em bitwarden.com. Pretende visitar o site agora?" }, + "premiumPurchaseAlertV2": { + "message": "Pode adquirir o Premium a partir das definições da sua conta na aplicação Web do Bitwarden." + }, "premiumCurrentMember": { "message": "É um membro Premium!" }, @@ -2295,6 +2304,24 @@ "message": "Send criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send criado com sucesso!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "O Send estará disponível para qualquer pessoa que tenha o link durante os próximos $DAYS$ dias.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Link do Send copiado", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Site (URI)" }, + "websiteUriCount": { + "message": "Site (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Site adicionado" }, @@ -4166,9 +4203,12 @@ "message": "Ações da conta" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Mostrar o número de sugestões de preenchimento automático de credenciais no ícone da extensão" }, "systemDefault": { - "message": "System default" + "message": "Predefinição do sistema" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Os requisitos da política empresarial foram aplicados a esta definição" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index c0a343477b5..2359101274d 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden poate stoca și completa coduri de verificare în doi pași. Selectați pictograma camerei foto pentru a face o captură de ecran a codului QR de autentificare al acestui site, sau copiați și lipiți cheia în acest câmp." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copiați cheia de autentificare (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Opțiuni brevetate de conectare cu doi factori, cum ar fi YubiKey și Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Puteți achiziționa un abonament Premium pe website-ul bitwarden.com. Doriți să vizitați site-ul acum?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Sunteți un membru Premium!" }, @@ -2295,6 +2304,24 @@ "message": "Send creat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send salvat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 0890273f1ca..67bbdb3f43b 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -682,7 +682,7 @@ "message": "Сканировать QR-код аутентификатора с текущей веб-страницы" }, "totpHelperTitle": { - "message": "Сделать двухэтапную аутентификацию бесшовной" + "message": "Сделайте двухэтапную аутентификацию простой и удобной" }, "totpHelper": { "message": "Bitwarden может хранить и заполнять коды двухэтапной аутентификации. Скопируйте и вставьте ключ в это поле." @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden может хранить и заполнять коды двухэтапной аутентификации. Выберите значок камеры, чтобы сделать скриншот QR-кода этого сайта, или скопируйте и вставьте ключ в это поле." }, + "learnMoreAboutAuthenticators": { + "message": "Узнайте больше об аутентификаторах" + }, "copyTOTP": { "message": "Скопировать ключ аутентификатора (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованного хранилища для вложенных файлов." }, + "premiumSignUpEmergency": { + "message": "Экстренный доступ" + }, "premiumSignUpTwoStepOptions": { "message": "Проприетарные варианты двухэтапной аутентификации, такие как YubiKey или Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Вы можете купить Премиум на bitwarden.com. Перейти на сайт сейчас?" }, + "premiumPurchaseAlertV2": { + "message": "Премиум можно приобрести в настройках аккаунта в веб-версии Bitwarden." + }, "premiumCurrentMember": { "message": "У вас есть Премиум!" }, @@ -2295,6 +2304,24 @@ "message": "Send создана", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send успешно создана!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Send будет доступна всем, кто получит ссылку в течение следующих дней: $DAYS$.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Ссылка на Send скопирована", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send сохранена", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Сайт (URI)" }, + "websiteUriCount": { + "message": "Веб-сайт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Сайт добавлен" }, @@ -4166,9 +4203,12 @@ "message": "Действия с аккаунтом" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Показывать количество вариантов автозаполнения логина на значке расширения" }, "systemDefault": { - "message": "System default" + "message": "Системный" + }, + "enterprisePolicyRequirementsApplied": { + "message": "К этой настройке были применены требования корпоративной политики" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index fecfdfe8240..5c5cb238ab2 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "ගොනු ඇමුණුම් සඳහා 1 GB සංකේතාත්මක ගබඩා." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "ඔබට bitwarden.com වෙබ් සුරක්ෂිතාගාරයේ වාරික සාමාජිකත්වය මිලදී ගත හැකිය. ඔබට දැන් වෙබ් අඩවියට පිවිසීමට අවශ්යද?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ඔබ වාරික සාමාජිකයෙක්!" }, @@ -2295,6 +2304,24 @@ "message": "නිර්මාණය යවන්න", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "සංස්කරණය යවන්න", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 21e48ce3ded..85e80156e69 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -305,22 +305,22 @@ "message": "Upraviť priečinok" }, "newFolder": { - "message": "New folder" + "message": "Nový priečinok" }, "folderName": { - "message": "Folder name" + "message": "Názov priečinka" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Vnorte priečinok pridaním názvu nadradeného priečinka a znaku \"/\". Príklad: Sociálne siete/Fóra" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Neboli pridané žiadne priečinky" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Vytvorte priečinky na usporiadanie položiek trezoru" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Naozaj chcete natrvalo odstrániť tento priečinok?" }, "deleteFolder": { "message": "Odstrániť priečinok" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden umožňuje uložiť a vyplniť kódy dvojstupňového overenia. Vyberte ikonu fotoaparátu a zosnímajte obrazovku QR kódu overovacej aplikácie tejto webovej stránky alebo skopírujte a vložte kľúč do tohto poľa." }, + "learnMoreAboutAuthenticators": { + "message": "Viac informácií o overovateľoch" + }, "copyTOTP": { "message": "Kopírovať kľúč overovateľa (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB šifrovaného úložiska." }, + "premiumSignUpEmergency": { + "message": "Núdzový prístup" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietárne možnosti dvojstupňového prihlásenia ako napríklad YubiKey a Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Svoje prémiové členstvo môžete zakúpiť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?" }, + "premiumPurchaseAlertV2": { + "message": "Prémiové členstvo si môžete zakúpiť v nastaveniach svojho účtu vo webovej aplikácii Bitwarden." + }, "premiumCurrentMember": { "message": "Ste prémiovým členom!" }, @@ -1831,17 +1840,17 @@ "message": "Použiť toto heslo" }, "useThisUsername": { - "message": "Použit toto používateľské meno" + "message": "Použiť toto používateľské meno" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Bezpečné heslo vygenerované! Nezabudnite tiež aktualizovať heslo na stránke." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Použite generátor", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "na vytvorenie silného, unikátneho hesla.", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2295,6 +2304,24 @@ "message": "Send vytvorený", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send bol úspešne vytvorený!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Send bude k dispozícii každemu s odkazom po dobu $DAYS$ dní.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Skopírovaný odkaz na Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send upravený", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Webová stránka (URI)" }, + "websiteUriCount": { + "message": "Webová stránka (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Webová stránka pridaná" }, @@ -3945,15 +3982,15 @@ "message": "Údaje" }, "passkeys": { - "message": "Passkeys", + "message": "Prístupové kľúče", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Heslá", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Prihlásiť sa s prístupovým kľúčom", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4166,9 +4203,12 @@ "message": "Operácie s účtom" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Zobraziť počet odporúčaných prihlasovacích údajov na ikone rozšírenia" }, "systemDefault": { - "message": "System default" + "message": "Predvolené systémom" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Na toto nastavenie boli uplatnené požiadavky pravidiel spoločnosti" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 540b0a3239a..19fb63eca78 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB šifriranega prostora za shrambo podatkov." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Premium članstvo lahko kupite na spletnem trezoju bitwarden.com. Želite obiskati spletno stran zdaj?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ste premium član!" }, @@ -2295,6 +2304,24 @@ "message": "Pošiljka ustvarjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Pošiljka shranjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 7e0f6fba670..ec6b5e98b88 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -305,22 +305,22 @@ "message": "Уреди фасциклу" }, "newFolder": { - "message": "New folder" + "message": "Нова фасцикла" }, "folderName": { - "message": "Folder name" + "message": "Име фасцикле" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Угнездите фасциклу додавањем имена надређене фасцкле праћеног знаком „/“. Пример: Друштвени/Форуми" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Нису додате фасцикле" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Креирајте фасцикле да бисте организовали своје ставке у сефу" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Да ли сте сигурни да желите да трајно избришете ову фасциклу?" }, "deleteFolder": { "message": "Избриши фасциклу" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden може да чува и попуњава верификационе кодове у 2 корака. Изаберите икону камере да бисте направили снимак екрана QR кода за аутентификацију ове веб локације или копирајте и налепите кључ у ово поље." }, + "learnMoreAboutAuthenticators": { + "message": "Сазнајте више о аутентификаторима" + }, "copyTOTP": { "message": "Копирати једнократни кôд (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1ГБ шифровано складиште за прилоге." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Приоритарне опције пријаве у два корака као што су YubiKey и Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Можете купити премијум претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ви сте премијум члан!" }, @@ -1822,26 +1831,26 @@ "message": "Једна или више смерница организације утичу на поставке вашег генератора." }, "passwordGenerator": { - "message": "Password generator" + "message": "Генератор Лозинке" }, "usernameGenerator": { - "message": "Username generator" + "message": "Генератор корисничког имена" }, "useThisPassword": { - "message": "Use this password" + "message": "Употреби ову лозинку" }, "useThisUsername": { - "message": "Use this username" + "message": "Употреби ово корисничко име" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Сигурна лозинка је генерисана! Не заборавите да ажурирате и своју лозинку на веб локацији." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Употребити генератор", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "да креирате јаку јединствену лозинку", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -2042,10 +2051,10 @@ "message": "Неподударање налога" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Биометријско откључавање није успело. Биометријски тајни кључ није успео да откључа сеф. Покушајте поново да подесите биометрију." }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Неподударање биометријског кључа" }, "biometricsNotEnabledTitle": { "message": "Биометрија није омогућена" @@ -2295,6 +2304,24 @@ "message": "Креирано слање", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Измењено слање", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3191,7 +3218,7 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Add new vault identity item, opens in a new window", + "message": "Додај нов идентитет у сеф, отвара се у новом прозору", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { @@ -3311,7 +3338,7 @@ "message": "Неважећа лозинка за датотеку, користите лозинку коју сте унели када сте креирали датотеку за извоз." }, "destination": { - "message": "Destination" + "message": "Одредиште" }, "learnAboutImportOptions": { "message": "Сазнајте више о опцијама увоза" @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Вебсајт (URI)" }, + "websiteUriCount": { + "message": "Сајт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Вебсајт додат" }, @@ -3945,15 +3982,15 @@ "message": "Подаци" }, "passkeys": { - "message": "Passkeys", + "message": "Приступачни кључеви", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Лозинке", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Пријавите се са приступачним кључем", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4067,7 +4104,7 @@ "message": "1 ставка биће трајно пребачена у изабрану организацију. Више нећете имати ову ставку." }, "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$ ставке биће трајно пребачени у изабрану организацију. Више нећете имати ове ставке.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4151,10 +4188,10 @@ "message": "Смештај ставке" }, "fileSends": { - "message": "File Sends" + "message": "Датотека „Send“" }, "textSends": { - "message": "Text Sends" + "message": "Текст „Send“" }, "bitwardenNewLook": { "message": "Bitwarden има нови изглед!" @@ -4166,9 +4203,12 @@ "message": "Акције везане за налог" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Прикажи број предлога за ауто-попуњавање пријаве на икони додатка" }, "systemDefault": { - "message": "System default" + "message": "Системски подразумевано" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Захтеви политике предузећа су примењени на ово подешавање" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 5b62f6d45fe..e0265494f1b 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Kopiera autentiseringsnyckel (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB lagring av krypterade filer." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Premium-alternativ för tvåstegsverifiering, såsom YubiKey och Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Du kan köpa premium-medlemskap i Bitwardens webbvalv. Vill du besöka webbplatsen nu?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Du är en premium-medlem!" }, @@ -2295,6 +2304,24 @@ "message": "Ny Send har skapats", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send har sparats", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Autentiseringsnyckel" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Webbplats (URI)" }, + "websiteUriCount": { + "message": "Webbplats (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 4b4cec42bba..5503227cbaf 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 9bff3c0e79d..3ce8155e8e6 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Copy Authenticator key (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, @@ -2295,6 +2304,24 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 69acc9ba9b9..045ca1057fc 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Kimlik doğrulama anahtarını kopyala (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "Dosya ekleri için 1 GB şifrelenmiş depolama." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "YubiKey ve Duo gibi marka bazlı iki aşamalı giriş seçenekleri." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Premium üyeliği bitwarden.com web kasası üzerinden satın alabilirsiniz. Şimdi siteye gitmek ister misiniz?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Premium üyesiniz!" }, @@ -2295,6 +2304,24 @@ "message": "Send oluşturuldu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send başarıyla oluşturuldu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "$DAYS$ gün boyunca bu bağlantıya sahip olan herkes bu Send'e ulaşabilir.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send bağlantısı kopyalandı", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send kaydedildi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Web sitesi (URI)" }, + "websiteUriCount": { + "message": "Web sitesi (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Web sitesi eklendi" }, @@ -3945,15 +3982,15 @@ "message": "Veri" }, "passkeys": { - "message": "Passkeys", + "message": "Geçiş Anahtarları", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Parolalar", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Geçiş anahtarıyla giriş yap", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "Sistem varsayılanı" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Bu ayara kurumsal ilke gereksinimleri uygulandı" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 2f26091d8a6..b351a39bfa0 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden може автоматично заповнювати одноразові коди двоетапної перевірки. Відкрийте камеру, щоб сканувати QR-код на цьому вебсайті, або скопіюйте і вставте ключ у це поле." }, + "learnMoreAboutAuthenticators": { + "message": "Докладніше про програми автентифікації" + }, "copyTOTP": { "message": "Скопіюйте ключ автентифікації (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованого сховища для файлів." }, + "premiumSignUpEmergency": { + "message": "Екстрений доступ" + }, "premiumSignUpTwoStepOptions": { "message": "Додаткові можливості двоетапної авторизації, як-от YubiKey та Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Ви можете передплатити преміум у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, + "premiumPurchaseAlertV2": { + "message": "Ви можете придбати Преміум у налаштуваннях облікового запису вебпрограмі Bitwarden." + }, "premiumCurrentMember": { "message": "Ви користуєтеся передплатою преміум!" }, @@ -2295,6 +2304,24 @@ "message": "Відправлення створено", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Відправлення успішно створено!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "Це відправлення буде доступним будь-кому за посиланням протягом $DAYS$ днів.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Посилання на відправлення скопійовано", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Відправлення збережено", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "Вебсайт (URI)" }, + "websiteUriCount": { + "message": "Вебсайт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Вебсайт додано" }, @@ -4166,9 +4203,12 @@ "message": "Дії з обліковим записом" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Показувати кількість пропозицій автозаповнення на піктограмі розширення" }, "systemDefault": { - "message": "System default" + "message": "Типово (система)" + }, + "enterprisePolicyRequirementsApplied": { + "message": "До цього налаштування застосовано вимоги політики компанії" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 38230fa91b0..d61e8941ee0 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden có thể lưu trữ và điền mã xác minh 2 bước. Hãy chọn biểu tượng máy ảnh để chụp mã QR xác thực của trang web, hoặc sao chép và dán khoá vào ô này." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "Sao chép khóa Authenticator (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1GB bộ nhớ lưu trữ được mã hóa cho các tệp đính kèm." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Các tùy chọn xác minh hai bước như YubiKey và Duo." }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "Bạn có thể nâng cấp làm thành viên cao cấp trong kho bitwarden nền web. Bạn có muốn truy cập trang web bây giờ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Bạn là một thành viên cao cấp!" }, @@ -2295,6 +2304,24 @@ "message": "Đã tạo mục Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Đã lưu mục Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Khóa xác thực" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 1e4a9c964c2..5ae7d2cd2dc 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -305,22 +305,22 @@ "message": "编辑文件夹" }, "newFolder": { - "message": "New folder" + "message": "新增文件夹" }, "folderName": { - "message": "Folder name" + "message": "文件夹名称" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "通过在父文件夹名后面跟随一个「/」来嵌套文件夹。例如:Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "未添加文件夹" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "创建文件夹以整理你的密码库项目" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "您确定要永久删除这个文件夹吗?" }, "deleteFolder": { "message": "删除文件夹" @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden 可以存储并填充两步验证码。选择相机图标来截取此网站的验证器二维码,或者手动复制并粘贴密钥到此字段。" }, + "learnMoreAboutAuthenticators": { + "message": "了解更多关于验证器的信息" + }, "copyTOTP": { "message": "复制验证器密钥 (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "1 GB 文件附件加密存储。" }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "专有的两步登录选项,如 YubiKey 和 Duo。" }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "您可以在 bitwarden.com 网页版密码库购买高级会员。现在要访问吗?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "您目前是高级会员!" }, @@ -1837,7 +1846,7 @@ "message": "安全密码生成好了!别忘了也在网站上更新一下您的密码。" }, "useGeneratorHelpTextPartOne": { - "message": "使用此生成器", + "message": "使用生成器", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { @@ -2295,6 +2304,24 @@ "message": "Send 已创建", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send 已保存", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3883,6 +3910,16 @@ "websiteUri": { "message": "网站 (URI)" }, + "websiteUriCount": { + "message": "网站 (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "网址已添加" }, @@ -4166,9 +4203,12 @@ "message": "账户操作" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "在扩展图标上显示自动填充建议的登录的数量" }, "systemDefault": { - "message": "System default" + "message": "跟随系统" + }, + "enterprisePolicyRequirementsApplied": { + "message": "企业策略要求已应用于此设置" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 7e1a4bff408..945b712eef7 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -690,6 +690,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "copyTOTP": { "message": "複製驗證器金鑰 (TOTP)" }, @@ -1079,6 +1082,9 @@ "ppremiumSignUpStorage": { "message": "用於檔案附件的 1 GB 加密儲存空間。" }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "專有的兩步驟登入選項,例如 YubiKey 和 Duo。" }, @@ -1100,6 +1106,9 @@ "premiumPurchaseAlert": { "message": "您可以在 bitwarden.com 網頁版密碼庫購買進階會員資格。現在要前往嗎?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "您目前為進階會員!" }, @@ -2295,6 +2304,24 @@ "message": "Send 已建立", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendAvailability": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send 已儲存", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3878,11 +3905,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -4170,5 +4207,8 @@ }, "systemDefault": { "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" } } diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 2ca0920a38f..b2ad7128b65 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -1299,7 +1299,11 @@ describe("OverlayBackground", () => { beforeEach(() => { jest.useFakeTimers(); - sender = mock({ tab: { id: 1 } }); + sender = mock({ + tab: { id: 1 }, + url: "https://top-frame-test.com", + frameId: 0, + }); openAddEditVaultItemPopoutSpy = jest .spyOn(overlayBackground as any, "openAddEditVaultItemPopout") .mockImplementation(); @@ -1482,10 +1486,15 @@ describe("OverlayBackground", () => { describe("pulling cipher data from multiple frames of a tab", () => { let subFrameSender: MockProxy; + let secondSubFrameSender: MockProxy; const command = "autofillOverlayAddNewVaultItem"; beforeEach(() => { subFrameSender = mock({ tab: sender.tab, frameId: 2 }); + secondSubFrameSender = mock({ + tab: sender.tab, + frameId: 3, + }); }); it("combines the login cipher data from all frames", async () => { @@ -1494,9 +1503,15 @@ describe("OverlayBackground", () => { "buildLoginCipherView", ); const addNewCipherType = CipherType.Login; + const topLevelLoginCipherData = { + uri: "https://top-frame-test.com", + hostname: "top-frame-test.com", + username: "", + password: "", + }; const loginCipherData = { uri: "https://tacos.com", - hostname: "", + hostname: "tacos.com", username: "username", password: "", }; @@ -1507,11 +1522,56 @@ describe("OverlayBackground", () => { password: "password", }; - sendMockExtensionMessage({ command, addNewCipherType, login: loginCipherData }, sender); + sendMockExtensionMessage( + { command, addNewCipherType, login: topLevelLoginCipherData }, + sender, + ); + sendMockExtensionMessage( + { command, addNewCipherType, login: loginCipherData }, + subFrameSender, + ); sendMockExtensionMessage( { command, addNewCipherType, login: subFrameLoginCipherData }, + secondSubFrameSender, + ); + jest.advanceTimersByTime(100); + await flushPromises(); + + expect(buildLoginCipherViewSpy).toHaveBeenCalledWith({ + uri: "https://top-frame-test.com", + hostname: "top-frame-test.com", + username: "username", + password: "password", + }); + }); + + it("sets the uri to the subframe of a tab if the login data is complete", async () => { + const buildLoginCipherViewSpy = jest.spyOn( + overlayBackground as any, + "buildLoginCipherView", + ); + const addNewCipherType = CipherType.Login; + const loginCipherData = { + uri: "https://tacos.com", + hostname: "tacos.com", + username: "username", + password: "password", + }; + const topLevelLoginCipherData = { + uri: "https://top-frame-test.com", + hostname: "top-frame-test.com", + username: "", + password: "", + }; + + sendMockExtensionMessage( + { command, addNewCipherType, login: loginCipherData }, subFrameSender, ); + sendMockExtensionMessage( + { command, addNewCipherType, login: topLevelLoginCipherData }, + sender, + ); jest.advanceTimersByTime(100); await flushPromises(); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 2cef0b0e788..6e7db21a6d4 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -1589,7 +1589,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { } if (login && this.isAddingNewLogin()) { - this.updateCurrentAddNewItemLogin(login); + this.updateCurrentAddNewItemLogin(login, sender); } if (card && this.isAddingNewCard()) { @@ -1629,22 +1629,56 @@ export class OverlayBackground implements OverlayBackgroundInterface { * login data is already present, the data will be merged with the existing data. * * @param login - The login data captured from the extension message + * @param sender - The sender of the extension message */ - private updateCurrentAddNewItemLogin(login: NewLoginCipherData) { + private updateCurrentAddNewItemLogin( + login: NewLoginCipherData, + sender: chrome.runtime.MessageSender, + ) { + const { username, password } = login; + + if (this.partialLoginDataFoundInSubFrame(sender, login)) { + login.uri = ""; + login.hostname = ""; + } + if (!this.currentAddNewItemData.login) { this.currentAddNewItemData.login = login; return; } const currentLoginData = this.currentAddNewItemData.login; + if (sender.frameId === 0 && currentLoginData.hostname && !username && !password) { + login.uri = ""; + login.hostname = ""; + } + this.currentAddNewItemData.login = { uri: login.uri || currentLoginData.uri, hostname: login.hostname || currentLoginData.hostname, - username: login.username || currentLoginData.username, - password: login.password || currentLoginData.password, + username: username || currentLoginData.username, + password: password || currentLoginData.password, }; } + /** + * Handles verifying if the login data for a tab is separated between various + * iframe elements. If that is the case, we want to ignore the login uri and + * domain to ensure the top frame is treated as the primary source of login data. + * + * @param sender - The sender of the extension message + * @param login - The login data captured from the extension message + */ + private partialLoginDataFoundInSubFrame( + sender: chrome.runtime.MessageSender, + login: NewLoginCipherData, + ) { + const { frameId } = sender; + const { username, password } = login; + + return frameId !== 0 && (!username || !password); + } + /** * Updates the current add new item data with the provided card data. If the * card data is already present, the data will be merged with the existing data. diff --git a/apps/browser/src/autofill/deprecated/overlay/pages/list/autofill-overlay-list.deprecated.ts b/apps/browser/src/autofill/deprecated/overlay/pages/list/autofill-overlay-list.deprecated.ts index 6cee7ded275..bb0642f84ab 100644 --- a/apps/browser/src/autofill/deprecated/overlay/pages/list/autofill-overlay-list.deprecated.ts +++ b/apps/browser/src/autofill/deprecated/overlay/pages/list/autofill-overlay-list.deprecated.ts @@ -395,6 +395,16 @@ class AutofillOverlayList extends AutofillOverlayPageElement { try { const url = new URL(cipher.icon.image); cipherIcon.style.backgroundImage = `url(${url.href})`; + + const dummyImageElement = globalThis.document.createElement("img"); + dummyImageElement.src = url.href; + dummyImageElement.addEventListener("error", () => { + cipherIcon.style.backgroundImage = ""; + cipherIcon.classList.add("cipher-icon"); + cipherIcon.append(buildSvgDomElement(globeIcon)); + }); + dummyImageElement.remove(); + return cipherIcon; } catch { // Silently default to the globe icon element if the image URL is invalid @@ -402,7 +412,9 @@ class AutofillOverlayList extends AutofillOverlayPageElement { } if (cipher.icon?.icon) { - cipherIcon.classList.add("cipher-icon", "bwi", cipher.icon.icon); + const iconClasses = cipher.icon.icon.split(" "); + cipherIcon.classList.add("cipher-icon", "bwi", ...iconClasses); + return cipherIcon; } diff --git a/apps/browser/src/autofill/deprecated/overlay/pages/list/legacy-list.scss b/apps/browser/src/autofill/deprecated/overlay/pages/list/legacy-list.scss index 4d70bcb9d67..e42d53316c6 100644 --- a/apps/browser/src/autofill/deprecated/overlay/pages/list/legacy-list.scss +++ b/apps/browser/src/autofill/deprecated/overlay/pages/list/legacy-list.scss @@ -1,5 +1,4 @@ -@import "../../../../../../../../libs/angular/src/scss/webfonts.css"; -@import "../../../../../../../../libs/angular/src/scss/bwicons/styles/style"; +@import "../../../../shared/styles/webfonts"; @import "../../../../shared/styles/variables"; @import "../../../../../../../../libs/angular/src/scss/icons"; diff --git a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts index 71ed5dc000e..30dbd0b025e 100644 --- a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts +++ b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts @@ -36,10 +36,13 @@ export class WebauthnUtils { extensions: { credProps: keyOptions.extensions?.credProps, }, - pubKeyCredParams: keyOptions.pubKeyCredParams.map((params) => ({ - alg: params.alg, - type: params.type, - })), + pubKeyCredParams: keyOptions.pubKeyCredParams + .map((params) => ({ + // Fix for spec-deviation: Sites using KeycloakJS send `kp.alg` as a string + alg: Number(params.alg), + type: params.type, + })) + .filter((params) => !isNaN(params.alg)), rp: { id: keyOptions.rp.id, name: keyOptions.rp.name, diff --git a/apps/browser/src/autofill/overlay/inline-menu/pages/list/__snapshots__/autofill-inline-menu-list.spec.ts.snap b/apps/browser/src/autofill/overlay/inline-menu/pages/list/__snapshots__/autofill-inline-menu-list.spec.ts.snap index 93d757fc51e..3339781fabf 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/pages/list/__snapshots__/autofill-inline-menu-list.spec.ts.snap +++ b/apps/browser/src/autofill/overlay/inline-menu/pages/list/__snapshots__/autofill-inline-menu-list.spec.ts.snap @@ -226,8 +226,22 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f > diff --git a/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts b/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts index b5dc76f2226..da8cbdd200f 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts +++ b/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts @@ -7,7 +7,9 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { InlineMenuCipherData } from "../../../../background/abstractions/overlay.background"; import { buildSvgDomElement, throttle } from "../../../../utils"; import { + creditCardIcon, globeIcon, + idCardIcon, lockIcon, plusIcon, viewCipherIcon, @@ -747,8 +749,8 @@ export class AutofillInlineMenuList extends AutofillInlineMenuPageElement { dummyImageElement.src = url.href; dummyImageElement.addEventListener("error", () => { cipherIcon.style.backgroundImage = ""; - const iconClasses = cipher.icon.icon.split(" "); - cipherIcon.classList.add("cipher-icon", "bwi", ...iconClasses); + cipherIcon.classList.add("cipher-icon"); + cipherIcon.append(buildSvgDomElement(globeIcon)); }); dummyImageElement.remove(); @@ -758,13 +760,23 @@ export class AutofillInlineMenuList extends AutofillInlineMenuPageElement { } } - if (cipher.icon?.icon) { - const iconClasses = cipher.icon.icon.split(" "); - cipherIcon.classList.add("cipher-icon", "bwi", ...iconClasses); + if (!cipher.icon?.icon) { + cipherIcon.append(buildSvgDomElement(globeIcon)); return cipherIcon; } - cipherIcon.append(buildSvgDomElement(globeIcon)); + if (cipher.icon.icon.includes("bwi-credit-card")) { + cipherIcon.append(buildSvgDomElement(creditCardIcon)); + return cipherIcon; + } + + if (cipher.icon.icon.includes("bwi-id-card")) { + cipherIcon.append(buildSvgDomElement(idCardIcon)); + return cipherIcon; + } + + const iconClasses = cipher.icon.icon.split(" "); + cipherIcon.classList.add("cipher-icon", "bwi", ...iconClasses); return cipherIcon; } diff --git a/apps/browser/src/autofill/overlay/inline-menu/pages/list/list.scss b/apps/browser/src/autofill/overlay/inline-menu/pages/list/list.scss index fe38ce9933f..9cd8ae1a73c 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/pages/list/list.scss +++ b/apps/browser/src/autofill/overlay/inline-menu/pages/list/list.scss @@ -1,5 +1,4 @@ -@import "../../../../../../../../libs/angular/src/scss/webfonts.css"; -@import "../../../../../../../../libs/angular/src/scss/bwicons/styles/style"; +@import "../../../../shared/styles/webfonts"; @import "../../../../shared/styles/variables"; @import "../../../../../../../../libs/angular/src/scss/icons"; diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts index bd03be3fccc..9b4bb6e1e5f 100644 --- a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts @@ -290,7 +290,7 @@ export class InlineMenuFieldQualificationService return ( !this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues) && - this.keywordsFoundInFieldData(field, this.identityFieldKeywords) + this.keywordsFoundInFieldData(field, this.identityFieldKeywords, false) ); } diff --git a/apps/browser/src/autofill/shared/styles/webfonts.scss b/apps/browser/src/autofill/shared/styles/webfonts.scss new file mode 100644 index 00000000000..d0bc054ff88 --- /dev/null +++ b/apps/browser/src/autofill/shared/styles/webfonts.scss @@ -0,0 +1,416 @@ +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAABwgAA8AAAAANIQAABvCAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGj4bhy4cglgGYD9TVEFUXgCBIhEQCsMstmQLgh4AATYCJAOENgQgBYR4B4lSGxEsBdwY6hnjAIMHmYyRCGHjQMS8ieT/UwI3ZGKX8VdVpiFJR1AXRm1AXRg1YNkF3bn3IqtbNBrES/LsySlfe/N1DHb/t+dMGSHJLPx/v8bOvfv+38UkW4ZKqGrTzSshQYPphEwKhEpiyGR8xaJx/M/u3bNUhSTyQw1sEBPUAAzP69nLQpVWK9KJWLMRWq4oMb+VbQclhFiJxGjMWDsxUkoXmqBDrRixVvfWMeYtHv7b73975py5930FTy+jUTS5hiLilRJoNA3NIovEImQP9TW5V+cryTLo7mQZCkTb8IkLvKFyi/26Oa8jIEztxJikWttKilqMVkMzeopu28MXkH33y+RkcrA5IAdAfqz6mzE8fxBlZ2XSjmCY3nEnDw0CgptIvm4dpnffkRNbg3YNTahS5UrGlOMS4x/eh59Lbf4ASN217E7oyRk7Y5KXf5f/84+LyRXT0RUYfIWckJtsOe2Y5RwAOTs/bzbFdkLrwT+1pjZ7L0RbQCFjTKwk+EFQ1TfVwDK6wlVZBlWtiIi59fGXxofYBgPBuBAt1dqt2jQV8EjHpsi52JfxrLqZqppJ2maop2NkmIYpmOIAp5Tx6nit6ggzNxmDqERAJfLJ7vwKbBmDcVEAZkD5nawlCFNqFW5Pr2BUqH3z/nSAvSjgJQPsVV5cEsBei4vhAeyt6PRUgIUE6P4HA8IbzQPo20nvvWAdkGGOmiMlK9QGowoHI1GVsC4UtQlINP7IuqxREMqgDvGiwtq/gIU+asrrC6/6rq/7olc85wlw8XKfdq+7fMgtbnCNyyx0ttOd6gTHmOGgOnavyfa1h/fYwfh0p1va2FhvNdrrWJmZ/uiHPumNnumhbuuqzmtJMxrXkE6pWx1ql0QiValE+donnpLFEkt7FSa6iILkJiftEk7mMpSONruxUWp6skoE/IFv4EOV88oT99102dlbFFZYJoe6nP/rNSLJ7WTWcxK2QlVplrDHUqU1z0/VjbakqCZdXG0G7EausFlY4a55oZetfrU6SjttymjyHK5XgxXJ0aFe+aDUlpxmzimO1HYM9ZhKpM4LpQlso5MKxnhPKm5adkEbJDzkLQnKlPGVdFuadeohtDmmuukjhMvncB0PR1W4noqko2MTqYeVicNbC638QNQZ4Asb3GZn0qQURMKSZBV31OtkRzVzNDLM60r7ITmVXER78aBzTkSKAQnM1qpxofoh17sE4GSVAkCJUZ/E1HLNDAKq6ULFLh8sgANkkuiLfHQX5d2bZAjk7yXQscD68NIeJ0CT4yT/YE8QguwZUkCutvNaCuK2JGGZLl5nzuDHVzywYOtZqhsWaBwJrfw4n1QOgvLiYQoX+Aq4pvumOtziMJMBXpa9uDWib1OskKe8LXjToUoVHSEzRSHmt3Jgl7mC89hQepQQq8aGbkucfpU1y4LMcxKBgrQpLgB46ir28/jawJT0bmKV7y2cJHnDZgDTq1Vqm25ANXE1QG8AEPkkcHi2yBCNC5+ZBX96lJ4AgwG3VxPSYQD6Tb8ebPsBajA7BcbFwvkMMpSUNDfwV9h1MSUWhQsaRKJFmplM0IBG82cHWAdMQs5LDZkV5GBEVIijfxrz//8AxhSjmUqJiBDF6X+q6fdujpu6qNarM2tsbVfrAv4//HffEgHMFO/l3smVF9fHlanSoDT9H4YAmRk9wwu5B6qfgIGPABfP0Cuv59w6/d2wj8Szj8twsZMwP98XujwyD4RBBbiY/5CHFK9NFGqvkwhCUAQwGFFoC03TMIquS/PQawr9pVyjoN1TIFgJlgaWEeliXuEsbEvILsEl8xJNORVufraRlhDZlVEy35jlq9bCLJhFKWRJsXUOLllCsyhLgUATrJqXOViZFcZELi62lTh3NiXJHJPgXJ2xRluzbG5Fs235MjPbpFs5S6eU5XN0viItR9IhYPT7Rs4pdT3DOvbZnhhQwYLouL+anIht21iLQOtRLjbcwAyq6ty2iMFb3/xvWGf+5zaLvq7a2zgXqXIi1Y4hzDQw6jxEZPRDjQbwpnIo4xyrDmjY3oKLdIhAgRoP4tq5n45xFeuHlUZFs8Zr47bb3vF4i+BFzVW4iqCBp0Evw0R5Kx32rmCHp40Uu6+9WDsbKTOwgrFlnddF1YBJloJK2LcH9u/DvftxDz+krwO83Jg5glyrgYYBeEVdGet5NShrmkphoOeHvvWgLRcPNjfastn3Bedfa1t8Mm3TQaQd5lYoJSkaBNedXxMwo+0C1UPNi/V3wBY589FgkpliP2NgKUbtpqO8UdkcouaRVkveGH+CLhIUMPbjc3+Ti7q1jj4TewMd6KAN2nAZT/tw527csxd27QDG8af0Xr5umcRjG/JsuXmeFa5vbl/b7X+1NFTcGc9bIvmYnHBShRUkKvTwWzvAtAi55dbYGJAoWaQeGLkMslosOr+ZCSvSQYa1JItU/0KaxVGPhf7NVEO8wqQjLeVNlG0TRIU8DgcXk2F5Lvcr7GJydry/i9NqbbByDtO/iQdPU+wPAcioXYjIUWGqEYINgKOBwCjGeQIIiNE7Rqwcj3q/AdWQx3XlMwUh9vLlkGn6F6cY3NEjeDhEfRQPHYYjGsJDwFX1Yqj9Q42i/BxXk0A64slc70/OTcXIo4GOygvm7hKGckXB1Kkl2IphUPJIWs6h37GAL2gnLfQn95Nb8PRyeBNz8hbWFfgSQnQRhqgrxq0QuXUBnYFvf6qOt0zSMjlghuOuJJLXvXShlfpiGya2GEO14a9QhWcwIHPCqaw8kfYaRJ/HvwKiwXo7jlm3NBbV98D+7gFQo2I9hGGFz8k4WWeW3pT+dzCbYywNH+e0r6rTwA3/IRt7Co+VZ5fVjen6cVZwZf7TV4dRQREYjuKPAUM53rMX9mlMj6yiEPV+vqX76O5qF6RJ0O7gOjPV1XrdOhQTCGvn7gYYRuImBnUOMf33TdFhLE9unBW8i+MrlvUT9m0dHm08s3IBJhCkCsxQOE4Nb0kRxCRzVlsKBmW0ZOW8y0Cz5sBkmcHIxRghqyRRaWnisODJWyPEyk690h5CWbnZZPFD8jQDGFPtpDQrlHyQN5jsv0oGfu/zKheNtuRnztTsgLdyNwa+xtLzzmJFUrD+0L2Dd68x7D5AP8cmENCuimwDatDc0QeJ97nB8SBEYXb1dqLuWNpLB9e7DFiWBxX0DhergSpF5YK9iNQaeT8vIQUTdlzLBayyz7QB1tZ415QwRg8tuLq9olI6sWv0sCMiFX2nSNN/nvLisVrZBiStbL2t6sdsNRUfE3Q4J+d3M95hgT3LpAWD73h5/f+6ZVY4La1plypdMfXf94yRS+6j4FsZMXjJd+DSCYPFiVaD0gkJq/c8ZStlW3BVC4as5ZF18jxQK5Uf2qjZuRjoWpYTHKahGrWukUSr55Tnjj2NbP+p2um+ebohT5B3KmX6nzQD3PzRliIalNGxpwLYNu8UzFDL2r0fVI/y1j1rPBFzAkvZ3ETS7tsueGQ+2kR5IWVsHFhGJvdwLlhQTd3rPXWl1uCHNUDJrSUld6KaorRLAGUG9PaD/t6FvF4O4CR95V7xf7lAVYj3Uz8u/u2jauEQYWHPjgCoU8cB6mhl2KA0BPjpDK9TcUBlIKqg9kMAJf9n+7cZZe3YmT8AJe/uJiCKUOnmKrpaaiB87kFPILp76XfSsd5/kqTLVK2e1UaKpeLpHdOxFjI083ycvf5uY0/v7cb49ePb3u35u/eeOFENGMbJtyHvX4xwkpbn34eODLj0ApQ8RbRAP1wz7hhRxm0YqwOuG0qLhPKXUQdpjetztJ93+urcsstM3b+bmEr0I8S2UIutGdhaYhQTVxyYkSm9GlKZsWRBNbQTE7GnLSIjhbvcmZ4BrnF1xAxzofVgQoQEVB4HKOx5CUFyFrTMVhWLiodf/F5QTCZ7pXoNzY+CDWV6eV5cYiJqc5oTnUQLcSdbooFhU9jCZN/sa4HuUZV7THKRaVTsAc+Q2pQuRN8a5Qll9zpBGieozcZTD5/nYzS909tZqnReWZaRHJkWGtkwdrQDxGk2PRbk/Z5aLvnntaCZ2oJVsanSLNL9iyeJ9p2sLoUUopiU4GrDiqakMm1gRGfULOewHzbHf4fPjJ3pSThsFGjYQDXs0OMceiMs/D3cnwm/XS0qLz14cl2bB4je3ZRFBVp0CJJC9FazLgf7Y2YWpfYOJcD8ra3furHy139MPWh+sb+l32Nd6or9wM9ohxIL7A8p8IIbl3teKxaP+2emyv1LxNC18iHBP09KDkpWS3P/scMOlnjOitl8XgPbc7ak2HNKHJ9+/NBjYGHIuPB1yzYF59+zhVXBxVYRAe/VjFVSzOZkQAlfqXVU5XM4tQTnXM2rCnY5BSvGVjtN1zCzWOUpbgvCOckzYE+wZCfUzXmX82UGq61u2LGd0XUF4SQrvEeWK9s4waSFSE0Lr15tGmGeMPbF2pe4b281IfOz/dxsHQh5f7GMWUbNZDIPDOKyMVPYY7rHJrIx9bgp/JTd1AQAHhr4nONtwNoWkaN8xbZDm/4se1D7+muj2NjmejJrh7eqpJT+Un9PmDUhNM+xFWjG8fDOxiYBeBtXE2NcAW5mnZFxxD1HNjbCAZ1MPbSTB5kWQic5cTZ/90v05uYBrSC0Yix/bNIUQSSs3ZJALDPzL+6jh5yukXa1VeaWF2aLGHsGirZK77XltymAyw15SzVA6VQdyo8Qot0Ahf3oTwVw2Hlu6CViQ33W59YEl/n69k+Rp+GPux8PwT9H1x50mo3lEOYamj4GnYAPeRxDLMUE9+3L3ytfiT2AVC22tj6MXI6PGMkVBJ9a2gucsegdFDVB02uPNdb4CBNnVmR5tiBTLHyl75bSJYuSMx115+5MDIvPXFgEdlo7uXKXsnzK6FrB9aY7yBLPi0V1074FrEEs/Yh5nma2p7+1UoioT7oZ6KGlNUknhCs7aKYeYh/DXitQhDFwV++pZ9di90DR5u0agepeepeNkKYW6MOy1OrL39jsMcHC/y82UAEKy1kbsnl229y28a3H1N22VvnN5bMcXHsaZ+VVdcwQ/qBNReaeNEFqUeqJ1MrLX9mJ6pOsDxwoGsCvNjROXywN3JwM4Dosb/m3Y//KtbGRtT0/c/j8mqoXvQClQ20BZBG4mN+Xv7AfQP7RRffqvyPhkv7bT6+9j987lnP20+qmf8Rvl7qq6pgk/nGbmovAJ04OUDpDmM78X/mdGK5vQdEeFsM1SuXo5xaGSo4zbq9LphEhbRIEfnRcnLSdX+hasJ2fdFwgf1ogPHve9dzt2QIgXI9qHjnRukV5cItisKFQOAdLmsm6ZRhqfvBBvUUTxmPpfEt1/buim1frz4km3SKz6XxpTln1sFegPYXf2ugxaJrQdo2R0gnUjskPB+BgXEQSMniTCv7ZWQVAyQ+770RkIjmoEOU1+G+XJ8DqxcPPX+zmDRbq5ufLFsHtfKrYu+oc3a96n/VuadC2VPnP5bMSDDzUW2P0JXGBYs3b1lPU3PUuGamYWmke3ghIWnLtBUPn6gJFX0T57hiN5B4eA20XkGJNYxnRDTxcx7cibPIxm5nKkS9/RmD49iBcKEF35gewi+S9+vmeyHSzK7bCS/enBj16LQXC7IacOcssszM9IIsLEj+Bq0gwRBJinQDCmRXTEzUQxJecIH6wJwRiv64uUPJf6sfl14ms8ayFny+UlcXf5cer6pg0freN8G7KBN8sMSTO9ccLFSD6NNxb3ZrKk+IKbjk/GXiLo2gnZulDYqIr7IWypXibfLjqng3ln7ApgAHtYzvjeq08dD3r6KY3LHh98MSeedqaw+/bwh0m3xac3k7TbqJjTuvHlp31qayHLsFLr0muqPAD5MUFA24gH/+gh4w+uvwp8fDlraea9ijfYJ2Ozm3lstXnJfqah89c0xlvpHiKVhUxGheajnRdaoxePz6+V/2CuLPjooipBrgxOTHLLYWkzVUMeqdwRePKOjHFfwWZc48FUvvArOjqkabJJyBD/CbUd2KlybBAXxmfu3G7+FUlpnKzYOt7OiY7zWtZab/avfjAeoewusnsqAfNg9lfH2RL0uWh+Sfd/v4tiKog+Z6oPlWy0BDe6B/HZrO0p31ai0IBgbkzPosXqanCUm/KzI4MrZ+mHLgNXc8csovPKg+Lbgis2cLVrhLRsZ7ENP8iA0el8soAYFcC1X5RyCDgbAgpDqoczVHJOawSFFGYs9OFDju5vxipInazStGA4pRBuB20jP6An3pkYdlm+dBi6gN+BT0yrYluQ89qgu1NjJxBt+gCBjMpI3KLituGZDfXZAqD2XCO1h5QqcHRbd7vqaewTaGXGhODvAme9CrTxMYKQa2MFEUtJAvCKg1JertLAo0URgB9HepH6yC84K5oI+bR81DbESyMidirauR+5AIE8M+gkdsa/+2a/2xhKYNkaPC8ZzJAE+7EDXslTA7d9l0pf35ew8rX12n/jleGTuorZYDmAUGSs5bIMGclzHxBLca2QMkKHoZf2A89whgIMXwh0IqFzjPPSyHpR+ZHGQQ86BAkG4PGZBD4q1PBVnQpYmvTAH4JPdGh/rmm9LOsS/j1U223+v2O+x1rP9WUfpXJhF8+1xxXm/DKV+1kE4cLCkjyTnbe2jXX6PQ8tY4k4nDe1PBNEHA0pyOnEpIpPBXSyVaARkJV8dzo5IQel6Bd96WQ9G347n733J7RPokEsK5DUPgqgKSK5wqZ4oUCsBagyYNImSAcd+am6sdCC86N054RlSxWaPMMpe2hIqzWNoa8K81BKA5hxVYEgD5ItmBZM+QZPHaxQc2jlCZs2YbcxuD4uEpiIcb+6B9ICoHAYnLNmCcjP55hzROU5veQzHAeHldHFDrz9+xrDgHRmhEV2sfFt2sNQrhHKGFSpVzLSnO1EzJpl2MNNt2qvPWIPrXtNb/o15npyn+/5QIm3HiQ97+XNVdfzMp8rtJl8FEKSc8bqe/PunEurUp0vSz9H9zqQNWembLY5KQyZixfXekyWRqT1LIY/U6DZ3OOFzzWZUBQQdShq10nn0PSUYyyX0x1ZJFGtpWQywL4x++sCOsqK3sSsbt9/WKIlTmlQoGI4TJQtLX7QVtum0KqaM5tnjZBEPXXbGETy8z8Sk7TQk5X0+Kc67P9wD7NA6+zin7NrlT8+yGrhdau24qrKCvf7pjS7EeVqHLNKy1R2QHSZho3rN5gRdxWpQ12G0ILqrVyz5BKFiukeYpy4KBCfSPciRP2siA5WOe5Um7HQto5nVt2vDY6ZfwT8tu0D3nNIazY2gDgSoeWlEQjHiEVQWCTO9h3fQFfeqHes8izEtLXtK/5TaxUdRY7hJBM4a+QQlmCDuC69HTxwGcMu2NWwG64cv77kgz6QwCLcOwJ82fzyppKlYgKvO/+elGjFvRlFSOlamSVvTuuWKkYsSGknOR/gCvr7Bc1X6kCWrjdxwaqOOG0LH46NY0RHpiWzqdnASfjtSqx1PLDHnmF7W6+5UqsdtWUKFLy3hSaKhu8YuEleFud4vLxovsl90d0+AWOOAmOBVy+QVuHoC3CbcnSZG3htq1dUNSdfJusF4rfr+ZarY+ea9cLfx4HAt9C0o+rd7rbEx1N8ZXNO8w73F0tJwoILJsSV0VTzFRha+7tJ7wD4sfJBVdac8ImT5XmGXoZ8vzcY7wpDO480c7uak+o1pGI2K7i1pODLUdPyDvj/cSViUBpDcpAyZxe4YBsdK1F6U4qQTMbjIpZk8f2JpelUoUbuxW0qo77Yj8HpBQErKSk1nBAchM1lFGXdYcGimhhgza60qc0IZ5cOwXK6BFj9DCTKRp013y0bNCMlwNGJoIMkI0KV9UPy7CXpbQRpqZkoL5N99wnHhd1ilbDoWPOix54Y3BBftAZED0sxtaPjPXGTZ+e+T5EegdK9lwHfdudtgPAC1CMSoJocbxxKYI9fZcwhWuQpQdJzlTQu5gqHeO/AiW+1RsgfrEE4/hcZgMK0oLCcZn+tQeVWyQjftbYcRatL1MkScMkJ4+1LQsurEozqXFFViHPpXNsROSsxF7evhMl8lqKrBDnIgwe69QMBn2RS3ltu2Bv3gQT/IR2eTQ0hE/GAi6TMUl8JqqqK9LVCsWhrEe8kXTXI4CupSfdy6CHjNWJWjQElq3YndEqy2NOpUxVVHNxdSnyiqgVoyZV12uEcafTgiydD6iDGBz6/3UU2+F3WvP/nEmL/8nL86s/OBz/wjfX0GdR650+VdYqo3W+/pj7Ka7i/eW9nn+FrWalpjQHIGMABD/MZBeIZd1rgB37ZA95gVmpXjkvT0sabmSlqaI7eZG90OXVqaFxx1DGs9L91ZMu2yYTdiawMQ+jVIOh8vaRcQNe5sOrKGyvqP8iVkan85y+uEx84jBJODh3aZfKfK9Apxkr7Ror3V7Y+iIP2Qib2uTpgG7FhZL+khxg/W6c9NjKz2DUYfKy+A+z1c4UoEY3bqcAmbshdWjOzlCz2hFgbsAtuAIKuAN30YIW5sAt4JK0GmQDwvKBXzSP9d2VyDd60VpEDWL0656uz5lzZGYLfcGnL1sx4WHc9hhkPMG9Yejrl6d+XhPqDa871TRUfqQf4AjcWbGAWWu1I3D5kprct7/HgV6Hvt6avlaAcWeE+eiW6FcIXUdrpqKvD3xCvxVf4PHtjoH+Mg5J8gjqvQVwMEPt+M/osGcl9jUZGLOYh7jDm/KrQKmaPJEAUEwBbjgQz8oX4AKNEJKrmktNH9lCCoZs203C0NEG7YdAqQLwXHSW8US3qHHmFv+LFwKtxEu2pPEKTNXEK7KWHKfJn0MNAvq5t/EEVbb9pI4QmdpiQ25ui1W5Rb1csI0jRbRUPtJFS8bGRMTBkwLxYMhj+zwhOeOwxYv0Wa5Ort12RPmYeMngSm/XW+Pz5AgiHs8kJ/Hij1QUJxVNZ0U+K1RxyjN4Hm08CAieOucwM2HZsoaDY/sYwHY7wbbHG468t3BSGJmj1o5AV5oMdxycK8BzvQgLDzcbWHRI4ro0kJO3GRyJPcF8ihBkMAdWgAmYsujj30fisVFGhhgTzNhAwjlvHm+ROCxuwHL2Dhy9Pv5dgRm4abddO3gn+wiokoBgz4gxUxYsWSWC//vdxZ4jdx68QPwFoKIJEo6hTm1BkgIpktKmhVTaWOf5AAjBCIrhBEnRDMsJhCIxL5HK5AqlSq3R6vQGo8lssdrsDqfL7fH6/AAIwQiK4QRJ0QzL8YKoUKrUGq1ObzCazBarZJPtDqfL7fH6/EhSuFVSxRFXaeIFcc/fH+6+jUw4iOahvPdTUqLh5HME+YytnHHzFjZOAMWzCBPKuJBKG5srAkSYUMaFVNp4NlcCiDChjAuptPFsrgwQYUIZF1Jp49lcBSDChDIupNLGs7kqIkwo40IqbWyuCQNfeET75CbvX6U6zJj/bnIhDkCbdytE9Wybh9i/kbx+PyH3TaO6rUlXGelxfyDsv8Yfi822AQT+56T/KvI+SQEA) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAQMAA8AAAAAB5AAAAO0AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVReAFQREAqBbIFxCxAAATYCJAMcBCAFhHgHSBt+Bgi+DJhjiLKs+yJRTbogxxKbIXMfd0QzZTgfG/4m7I5QyXmefr9nv/a59hCX5N7MGqWZZbHGdNHMEC2qJIYS8P99yO7zzZ5RaY5w9DELzTJiB9bp4s6oXDRxnS6deHj+Xj33Z04PxhOKT4tHx2qL3YItLpKSLbFqXmPkfLHLUtNxxzgbJx/MRlr0azc4z1cfBD8efNCGcbETQdU21zRR+5+znr1PfyonGzyahyn2vFeyiuxhYyywKVbCNWjTv2LPa90gBbZlO7OT9i1J2kwmY7kBAS9eFOMBDBRBT0QrGkVUgr6WWRQ1HZ1eBt3sc3TQg8M00CMLOqDXAc8EFQn/IyBKKonMG40fDMmIIChmitYajOiL2GYWsUGiqCU719aJQ/REjZ6YLRsxPn1k/mDUAyEaQSvZ7sjxHubruXbtihOgAYXtdf58zivQjPOfwHVrL1q1MbsIausg8Ee2rubGyCuY9Bd75t/0LsIp8gn1MuoBJosU0VNhuAjMJ9yHPZkQDh9kj0BOXkAnOQQzZYtWKUpMAASVKFHnMuULQYmxwoBCiSsgjbQO9NdT1Bhg8mAm/3tvm/uSSLr38OdsEAAQlZ6+BugSKYgODESNNeAQGAz6A4CSELqthKHPR/XuXd+THz58ybGv3/ud+vb5yNF5j+LHrznxJZ7x7tNxcvfj/gTcS4urlvVk/0if9Lmjb1E4+nrv1pu9vZJ5I780fPWurJu7tlD99J9nP7aPv7pHSsrnl5vUNSnlybh7//d9RU3ErNeO0Vouc/ih2csm5J1HUnmC7MstrQN1VZfE79fZhWP9UaiHImMV6LSXC6lIIGn4E/WpiqDyrPfXrfJSuv8l9MDnj49/AN8OfMmlrdF1oFVA+Iim7hbEyVQfBLGqyz/3GqD0dbqdOERS/kaswTpTCNaIPEFWBAM9kJN8H9yLPA8xNBJRDPQfKku8RW2qa2iMdRqtyXR5oEXaFaG/+Yi+pqI20H8YK9FIajzX97wTxGMXzhBgmuAJ0ClCZnEOQ4BujSLMI1vDKCQyT1+nx9KpTh1XiENh8bhquRS6WpxDUmfOqGlzLIxpSYDJVWMRI/HpAhyrGAeHOBPVpFa9ek3so0MTte28nS5j5swZ01Xc6fYqax3CWfZx+leoRvV6eGqZjKFXnj7PwamYEA81wOeRcQ4XVf5IjzsjEiUZ8gVRCeGMkJTjJDpGxJk8rjq82uNypoJA6Pw/jKztSJZKZUFEpql34auEocUY31QaRpuHbXB4BA==) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} + +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAPwAA8AAAAAB6wAAAOWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVRaAFQREAqBbIFwCxAAATYCJAMcBCAFhRYHSBuXBhAeibGthq3ESc/J4sXi4T89+O6bTPBpLoiK6kR2sKs9Wwn5ce339j/qyYa55zPdzRDPWgmVrBlPhEoDBNntJzniBYIHBWIJZ8SpnGzwaF5zoQCFLCKjc+jeVA11gZZwDepFQ8XppZIWzJd5plal33KmajsVEx1Tkfeerz29kAwGoKsQaIRQCaUkFAIdzbchcfXapS3A65D5gIcZHuBtqAzwUUQIWAK0rYSQnstDwfWkBFmsEAiXHytJpTukI8JWK5CVMoQs0olVu1SERsjg4HhFkMGslE8rXyxEaaUSaVNe8XHvYPrUVeWALQT7nC+LX5WUs/KbuAb9CaQz8xJQLAcBf2Jdr86iV4b95vz/7qL5P51L3Ah5ffmC4RKE0CjQWxyTxY4/UNgIcfzYAoE47BjFR8ViRiqSpJCkGAIQCEEMil8RSDGQDpAwhQLfmWA50FkjyehieG0p+6ptOb5itL+133/z1DfjIQAQCo2OuqjbVjeEGnRFxlJgH6A70BkApLaVenbr1PPki08++KDjOR999Fmc+fn3nc799tMTzvj0w1T/+PM4+7OzLR98cnI8frxLJ7iP8Yt31Iv/4/JB33TGdXc91vGMd9fsyX7v3qn3XS/9e8Td9/1/xJ0vb9/n7m8v3W7qMz99NenpK7ddN/b/yP7p57wbb379vH3SQ9fPp/9y05vnHADGvq8G7NZ1e9e1b/RZsNxacJdvexyTGp2o9y5c0zXlgen9v3tij36jjvmTx0mIvYBa9f/d7dUZov25HlW+2VGg8OI2+989tE+3od+aTg349I3n/oBvT/787mvbagZQSSD4iL76RuHk8QxIc6zOb3oWUm8oViudcCHfFrvOVxshZqmEW86SQHffCpE74L4Y3SEMj4ykq99RmO19Mk9QGugelaEu0dVsO+guz5TYQ4b5iZCYyQgdjcRAGfpODpoTg5mOxJBz2R4RUITmCQqfQ7OCYIL+srscOsG2y+Cw2IRlBp1DCqyKGELYpjrEyaOFyIBWrTgN44gIXAvO4WtBMJZWq2Ysab0y3bzY2mFgqhAx93dq0aYNJ1T5oFmrVs0Ooyc2FrNIPgXzmcbcOomIHGIxWliHNlgc22IzYO2hNQzhMmia1DgZNkTcclhduAivKYtD8pIqtzREMHJKEBafwUSEBK4VeSHCpVQvptFsrzPTyZpIUSjMjBxl/j/8WGxy+2R5tNO+tms1JqemAQAA) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAADHIAA8AAAAAWhwAADFoAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk4biCgchgQGYD9TVEFUWgCCFBEQCoGEKOwiC4NUAAE2AiQDhyQEIAWFFgeKDxs8S1VGho0DAHqcJ5Ps/0/JjTGhA7H7ErPN2pUe6aS6/PYVsUigDdP3c8Q+r8y2Ax3TkUqjimgEwQ4YTWZ9iEvslh4/WmoweNo2/H/eYOhVmXinO1S7jZBklgdxv6iXNP1zDOwIQTO6tecBWIFcdcTTIZhbt1EhMaLHiKpBb6xYM0YtqG0MxkYIkiVVUiGK5BTFQhAxqv5R//X/ff/bIzf7nwFiM7sQ3veqENEOu+TEY9+EZRq41yVPxSrVI7v3ZxPfRlbHixcB1D1M2wTs5O527guGbds+NEf8ENOIiTpbzqxIIXSRp/YBj801A15TRydRSxa/mbe39jb/5i8A7///388PNhoOd7yBhjqR5kodRdaNF6ug2Yg4xT+i0Oc55P+3aW/73lzPHo3hHOsDYtHYJ1um4z5dimrm3jfwdKW1RkCzMkhL+mjZnxQcfZRC6N2EKyDXv7Ic9P6QHZQDzF0qKpoUbZo2bQncAhVtz74u9ftsA0nHshAd0GKGcrj8cT909TekbYnXY3m5rBcjkpEgGSEFVrxS/b/fUICCe/3pWwoEBLAIKIiLdgFJgaUgEBESQeQqBLHfGIhTzoLadIGTZQTXWIwvMrkDDsLE0+BnFon4x50r4vKOO4/LEh13Uao4u0T2TxtMsBICO3wagF3ME6TVt4pA/eFkLEBSJE8DhHK20E60E/zBaqVKljFdGpRBxvduQID+I8j/9/b3ICCTGTmEdkWQVomJrdGpkhPMnTVVqmTAqDeF0/RkDVIPmZVqLShL8tP8uAR9eGao5rsGF0QpImaBRSWhdiRxUhV6zsrXw6flQs7meA5lT7ZlY1ZnaRamKPmZlinJSLJuHpcxGZaB6Z2uaZ+WaZr6qZWqUHltB5B/4mv87DfzY7yOp3E/bsbl2IozcSKWi+0diekYjYHoyoVojfq0z540zepkpCgq8bNR4tsiP8mRg4plZGHo4ERS0IMYmIgKZPiHZziHbSDCOHRDI5R3HyhZ8L8//eqT91567G5Mu+46SGgUDqQZTlog6V/m89fCKMzHN4AyVccCxstbyU8TDPxEDUbWZG645wMGwIUh/oUXPJO8SZ8NGR+in0uVqJp3aYQIAzmWGPgM/pAPRcahfLzFYG1gS2CX0lA7LtA9Zix+5g91XBTBFGQb5aPtwfGhMcFAO6nRP7OW0qDDCoqy7RbE8nQJkUxhgDPSxtppkPBvAAEQCXVcz8WIArSNqXzYAq9EbMXYcYv/iRQGsEAI71mZwaDsjqDkpj4AMARPDpz0zBniegOVa8lVUstNwtEaHq2jqJQQ36G4LuLor9EGt+E2nDTHD5tNYd9jCDGAvn8oGQ4iDmXHOx8ZGlM9Eo+JyaNCqcnj8FhyJrL6ijt5CpQoU6Fac3QFxE/jXNMVp8vWZYG6nZHZGeh0sFztzDMFOaCngOapPW9+9VmTUABKzxGlsoH4osz0VJB9kZDNBxlFB+sSiUAEmJe5GqBeBUwgkFUBVEAWoCAj1dJNN6pKuUJ6PdGQGdqXipjwD/1DC4BfPI/Vh9Xj5vuxmJJ1Z+y96pRjzZQ+LbSfBoW3cUxinDod5SyZCO8MOx0DAjIDEY/kR8ggOPquZ6puZbPzldODxyfy7cmaMhmWWhlnbl4sn7zsDtVLY1MLFk0+94OMvkm5eR3bU7UOhjneyFdEV2ozVqwFpU42XH3Olm2aVxep1WhEqGovH6qiqO81lhIf9kTTUizZCo+v5ji+b1/X0o+vVs8PuWeH1ze/DXgdWKf6UTv4aHw05Byw4XuLtPy/B1hknk1APANQh3QpYB2yIErwCsWGW4Bee5Y4AwIB4NpzM8QQ0M+Fvl0QY1AIuuTJgIKGCaA17lFfPb5WbTsyxMlkeqgMWSVlA/AeUpG0T+iSSo2accSSB/5oMjKKMmNtru22W+3+Oh4giAmxNGI5SJhwUeJHpCC4VpfHd0BwOvzKUBkFmfY20ZZM9+nLAudnajh+H//H5tgY62NtdA3Jt953cyW83Zdjwqg+ve48b9OiAhdObD8AiNdRkHEgVTUKnr0t3vuo/kxFJJY7J7Hm2la80v+OGGf+4MuQIwPSA11RRAbyKr4YwW0v1JudhcxAUUyIn92xyARdzTtk9LhiPQ8osKuqpDS+6FbCx/A43MJv6FaO0Lsk+5iEFadLQGfGa0/Jx2bAbZL/6AesKRUEjNhYR4SQ3Ya1LcuFAsLaKcdboOVKzFwYdseWigGyL3T6ZxsK5+fBk18SctFtmUviG0nd3ZZyJOctrEESQ8OxTVrb3VMaQBkV2Ne5dGnD9alr+UTRb7Htn0KkQcMxsgrfBEVBvdYBuQgAW3TOxT1vu7bdyOXYsjHZNf/q6mSXS91G2s0fALBLLcENRLHUCG5meqZPGjuiGUfeVc4jy5njNYRTktnmyEiLMk4L5gOEHKw+4TCNenolSTSohJpjqMc4CSHN1/gVn5LCJyjt1EmsYFcjA3RQExYiVQQEImTFRyWyH1+zkFMGj4HcOdl/muOD3S8RpiQj9ekBUjAjVc2PU0NF94FHHTN9jbEPHffPT2QHWvIZncrCWKG/n1+7gFx+lfRUffPk4ougZ0aWFVlF8ZPD0JhMheNDQSOJmpPxREM0KItshdrmqbcegzNpX1fRTdQQ00QKR5KLjohvKV3b+OrNpQKIu2Wy+vAlmioFu9l7di1B1OJXlsHWM6WwviGiR8yPbdlZYxqiZcVQRTykVuk/Txbh0xM50rGjwUgW2S4Kl1nZdPfcdDoAFW0ZCHtsQEM05oGbnOaFQWJRI5zq4Jzg40pQv9ZpbcDIZI9oIqWOvlQ6SsaNG2DkKXvJJ3Prd4TRCJhQ4gxTFjXhyf6Z03TgcJJcMusmJ/E+6une0DJujr5RUyzNUODwT1HS0Ydq/v0XGvC2OhfvcYopDu7rQQCJsH1SlDE9uirt7082xOOs+lflmyXpvx85DXvxw/DBfyfvCJGOd9H2Fsc33ISETbexjihtAzgpieiFdzCxm+RdeelI3bH0udZyCh34Gd0GPk2vxZiLP5aS0ej+VdjGulVe+I2tiw+u5b0raSrnxHNEvRjN7SK/5b22Eiq5Dgk7XolZ2Fh9KsKdujp5JQenO9YNljziiRb/c7+RB35GG9FAmUQbVmXl85QKVcVWKQXfZBMRq/AYoYR6yYfcfBUxEuL0b0wOyQQ55ne24GR/5mf7+QM9m9zfoa56RbGS2DMwBeqknlpqjAY1QNd/giaaROErlJSjGy34sAqXz/otKpJSxuYoZTM356P1ojcdK2lr4MoZ9WIjJXU3Wz4Q27eVL69Qt029Lnd63P6/x6lDpYxfWQ7FtdKa/6eaaxYbLYayMHYq1EaNCZsNmzB19G88iKYT6BwRlaHwdQ5FdGXKrHiuxDZd2grc31ImVg4ZrJ+WT2XPrYCk0//R+U61Z2/czfUHN3vBacwPwgu4hgqcr8fkOpW8jpjNhqLRGqiWkod7EukrwH0yRC0inL2rwnuKNlWmCuGwcjUQNAH0zMTK63OF14Xl48dCDcHBkfjQp9xXPcjbho/M/G3ZcPUDWQoGyH4H1InydXSkhksf1c5zVZEq1ZpeJTVl19bJ8QKrcVV6/RMfDT44h/dzdYunOzQbWJQlcT2DFtXaa7te4/CYdrKlm8ff4c0nMQdX8uaWSK3M4PnppCraiGCRbBLHM/JMeXtmffaes2clSwWSxIWYTffYfTYahcGuSefiyaNCb6IH/wCK/dgR2AcHvd3FcOIs/qAlwjhm0KCcHLFqdfUSO1MiW9I+GJHJXN5+5hinMsoEcjgc2YqQ1yObPpYZG/VmOGPOOTHTWtSh2WmSs3G0up21iWSR+zHGe+tjvz5Sct6fXU7ZvZZCZ04UpOA0C1b+rJmyJjFOnF1DOwsa9yfNFbNppJ93PHpHo/iIBCImmoAbS7D3j36kf2ieYbug/uw/m6S07MLb553MLW4AFkc+2I+J3RMeVsrvFR2y68Hoy8KMFeKilzrWjh5FgZZNSYDM4gDG6rLA53/Ce2yiZhetRWuKGeqdlTKVCnbT96xKgmhKwumZYHY6as3GM2Pomx4hSmLvfJnBqdCosfV4fNSP5S2X9H3dpfH7YBNeZrc6sMtgcIEK1o/5bP82b22XIxBlSMRAHIrJthFlbZg9ndpTheYZAt1j+hh3syYloS5ETzfwsbxiSFzD2Ovm9+j2fVTUaT9j7oGAuVPocNHCuR9HTNF6PO8Xxpw+jwitsRpZZN/nbbaVWoXLeckWP9GAKNRNroJkHq0rLkL/wXjcJWfR5ZI3czlvsLtgX7ZVk2FF6ez3Q3Oqev7qvvTb45AUc8CTgnIQSOEyKq6pm9fZxKEJtrJ+TIYq4G0FaXpuW3xeKXlg5vddOM3KGUy62sOLgZqgyyJzHVI9qVecV1Hoeyx8KekTValGQvdcJERtgQq8XA4WymEGesZ9IbEvJr2XCr0tup+RHY0KSXTcJaMC3F19HkwvKM3R/nXf7aa6hrsJjuyLw+JeMLBnDvG5eWXiqhjqHRIReroiO4gzeP8Z0AuKdRxMlSiykh+70StATr53pulhZ52pzevB8mEOrAdXLZ5PjSP39ZBGfrIHDXP9f+6B8g4Yp8ahABFjd6bZJQvV8+scTPvlFLe+d+6FoSb5UtGdFARPuy2yJe3f6wMMc6Tx1Q31uD10FD/5oNrfFdVoO6MhSxGj4cXWsSX4o+SSm2U5qa5LZkroky31Uo0hL3QeoITbJD1uK8XrJ1SBuhg7UNlbc32K0X3FxvNfPGcsQiMbzkyN9nWHUDJ8Rf3f1Af39YgTGaEeEU49nt8mpVTwLlMtpQ9CJ1JtZirotUXxFgohiB8AJgcMAw1Kz+8mUaxQD+153R532lFrdloICBX22GGFBeevgZJARsu7pxcX+9vwDrrpdQqipvQUepCC50+8bubb716q7D+zOmJcbna31H/rE+J2IxlobYb84IKGlf3eN0uIznuOIuSfijazafTYnZGDEQffoREs01F8vcLY1Ml+LoYMA7IX/UKfugiLUVUXfHhn7IwGU1bPDYI723X7+UNqOvDJf9+9nZ6Wdp7g65SpSI1Ra9RwG59WrVAWZTuc56+pxkGgd30Sv47Pzkkp6sC4LzK+tw1rwG3AbUBaQCb6rgFkNeDnKjueUE9HeP+vniCutuozNKd/BU93sODNY3fOVfwO+cGY2RsO+NPP9MTz00+fvPfuz5/89MPPX7773k9fQuLbp6zRuTX6u2JN+Hi5N/C915bZxvfGl2HNo3sj9pzRYel8r77M+dE+buEQYUGfsNAftyDT4frKT3foawjI5d/Mh9y0ijI7FWP+1DMD2tvgsMimNLLT2O2rpAL52dIpvsyaHcE8eDzKeMQKK9deZrMez67hdd47saP1oEKgkkWJdrNHJrnidA/8khIqy7B1CnX2sImMdwcGOleGRn9+/Hjg1/Ge4V/TED0/DzejIg4Nj0SMoGJjRkYORQ973yx0X5PO6eJ6j4Gxz48ezc2P9R76lQZ0fx5uRYUPDQ+H47sLdWh0OGYI2FhdE46jGc3smllpGSqf54EMm9RLvGZWlvEDnmENV5gcvXcw7ogjr/NeUt5KeRaqp0Gc7PU7LsspP5qbfPAIFlJlFm6bSnBnR2b3VJbkz8feh8HU43gkYiS6ICwqLySrIA7NovbmbxwQ5zqHDK5BcIukB0+33/h9BOlTbpZYtsotqDFC+gO4+wwyoNo4LX81qbTMHOk9OhEaUGaRXCpN219tjgwGdlEwq5rqHKPNHMTPQUspC/Rh2onkT0ECC5PzpTnWNcAuD9491D0yPNIz1DM2DMp/uqgZ4z0VOgVHdcHw1kvweaVogLm+8PcCaMnFYIJ9fM1t+fr8qdolUoqQk55H6EhBOOLZspee+PxJTvX0g6VMws8fkgn3V5dmHy5nEFzLP13wkTlQnpFRWuYjs3XOB1pSmZVVUukNBZ93nnkBugxBZ6AcN12bVjUcOgOcrw+X1wqy26ZRQ4mimgIhZzSGEs6rGWsgTLhwGi4m847lS5gX5y7kZRsbKN0AIdVcNratIYGhpXBUZ3Gpo6xg+0/hBcmOVbzdcYbTHXfW2enOSmo8f9GjumG6qXgYiZXg02tzijEl8CwvTVYjIeg9rfvV3jaIuoW+id5GL4zYT9zZ3b7ZPekOYcjEyUSpKto4U7q6woGlTH37Q07h+aa+iid/SBZF2zYRNuso+5ueqVlDoZSa9Pq5TmlQC+xxoq/Pxo8r/uYd0YJ9IENYZfkX/dHg5F7ilGOWgt1cQqKKy/qtnnio/LjKzUR8tXN8+emM9J2DfbnPbhd08I8T6kZjv3wNONAzOlVXM1THrMeixUEhFqWoLCESaFluyyivvGqz7LYGlt1XSi/hRQN5dHR1KQtrHW/XyaO1c/YXLj9K6Rh+whQtFHNJXQ1ZcVZRNmJuRD0jRzywS1DeImd01HS19lULImPSy4kkc2OyRQEVma3F5vPr01OjwlJyo6JMwk34UcGsCFZ9Ggh7E11l+Tf98eDkx8RJB6GS32FmqprLyVvdDKjchOqLBHyNS2LpqYz0ndb+vOd3CtoE3X9L0F9+9y/uHZ2srxyqT6rHoCXBwS9uw4YKy9iqwMrQLYeCvJ/ua0b7TCOn4KhubbzNovkRpWiTjxyWH+YITKjf4rCbe4FjR3m64av5r+yvIUD+AnboxFBARVfoAKyOb8HfOPMNzRv4VALjOT+sWQ6GFe6FCqBSrCmBSSXs3JQhd7Rl1ADF6bJf8cVH56cS/Mr5PEzA1wicPsHP9roPBh3s793FP9K9/dHhgLf8JNl+jd5eTU2gC1lqkcrW0W0pGRPHbi3UCW7s5DckLJq6a/cAPeW0yEjXYBLX4XDGyW55hYbDRxR4a1uJquM7LbpabReL9rwSLToYVi9cqr8yVo+Tfj5bEPbqp9Cq3YfYxdNRyFuccq4kISdtRqFB5e8ZjLJ9WnGSTzcgjy0HjSzfQ7zbuI1Y21ji9C9wjWnGia19Bgx9XMHgAlCNlM7qGUzsUIJqJDTKPuV49SYsoTWn9sDJ9ykjUNU7+O/HdXnCvDHO4nvOX3prXS2FmDB+t18Z8Ig0zF3GFfeE3qlZyoDcaRpLWUBQjRZJZsumhS9t19sJ76YTtJYuQflz2TedaXaxh2Pg026AMr73xxqaPv2tHchJz7yMHF8Kvv9lo+i3j/nzr5injQyMwF9e5kCvxYyV8IXwrxmg7WouPD93voQdCwPu4aoat0TWv9n0vfZaGcV/erMUR1r/UvjUiWmLOoJFbLhyZ7+0lEOWjvIg7w6uJZRrJw5FAuIX8Dlxa+IakJNeY91iJb0VsPLBAs1eeLWTR/9Eqdj7Jjh48VKAXP91IHewO+XcEhMQNMDnDwvdZS4HvZrLDhmSgPEnHz1KDt1YtngZhBpX7ynaypfL9qCSN2qdNkawGQWjrRmr95t6kRcm0ypfbqdk4vkDoMLBNxfygqKVwlyjGUQjkuO+uljOfsHJVci2hdqeAUzRszkKbPbiv7y5I//zZnaIOnOvOuOcT75/7rDeS4hGvltmQa82j4xdaU6GLqs/cf159FojG4CNRGok++pmUsBsbfkT9OiMm6KHqZyXOraXzfvSDqTXz9W0+8NykWly4lKDa3yOoS5KNU4VfUvrXxiSE605cf3VqbFGfU0f2RQ1qoxfLjVH1xV2jo7UVjfMiQAyt6Gy/MRe6lhch8YBM5tNovkjfzG33juSHRUVntSBz3ckmtRhWGyvWnpR/vw9Rov4khPDBjlHRsw7MClit8CEkOiQxIbYbPsSlwVeQi8Yvw7k5DaWIpdOAeKadHmg9Jfvg01tuPXvC9en10+cOl46wsBM500DnI4UzpXe09+Yd2GkIxpmfCNec7MhzzwbAgufA/leUn0r6SONlfFJHQqMrBZurqkapknSoU5rkMYe6stJb6n9VjAPY2gy1MiUqH10rQSd+BP7JiTXNDz2r+smaCWok0ipsDyj4idqv+WDSx9K+BX8x+/+2Dr9JsU32ffJ9lmA/Ut46qkpu9T3motpXt1LQFDqcLkrerv8tMPlrUgL8MOvAfm/rw1qAbkLWkDNS4qw8nt595mn4eD1ls1/Uow2Mcob55tqj89n3Ii4AXxyfYrLioH2RfNDqBxCppxBHSYeH09HEZgwYAVLvbq7emGvzXpE8QkbX2mTxBmMprflzEKOyimcVgiuEGWmUwZdo81D2rE2F70CUP3yZ+QHcrj0zDha7ZGeLqAXBSsNkz9gruwYPcmp3P3F1PBk9veXor5iJMkxdJ9VczeQh32mCcopPkdB1b6tshuzja13ti+17AKudt+bopK/z12q+f9TUT9jyAIdMC4pN/fPamRGrlSXRyzWJnDjW2zOLI00mQEb7ctfTAyMvyKuUMqcmLGfVXFKQvuJXSAPG4H3Kb1g4sqdbCYmak+BE2bb5bePNLc83jzXch1YrbLaru0XvOgTfYIuHtsYyZywoVnPEa2mEeLRL2U1f5+QFkGfNXQN7u8cVu00BQyfhhwscAhf2beyu3Iq9WQgpokyO4rNixTpDXv0G5K0XGhEYS52H3j98dmnsfb0ilax/kow0TMogh5hR7XInM4p4MycptWbfu2HlRRcMNm2SA+efbt5+eW32ZPWJmyUhte51bO9HesuO7odFUc8aMlhga1CHaI0Kt3BjxhEaqWpyHCFArFAIpRk83IKxbxcce/aU9uUS3VVtUvDVFqjKpZICYst13dWqvOqC0V1DL9j5W598HEAehE43C6OO+oa4RMSEuHr6hbmGxIS5gPcPnqQ1ffGlP6yDSehOO93f+aEdbfGARqn0eu257aAnjdM1VleDFcQYFJvJRf8uP7wofhn0bdqScUl7FByOdr6aafJso6fPHP71s6JyqyKrJ7q1WP0SydoLqJEv5j0/XTvo6U+u7gR414VRU5ssXVkyVy8TYKaJ/MkHTh+ZZ29evau0lfN1++ec+f6h4cBFTsettoaRL22q4+6W9txGlOYcxJT14G6W79W/P/76tG+dzVl/3m4rpUhpbWpvMy61BBpWWnISm0yf7jjNnDsYu1+MTbayP7/UmUdpcyRgf6g5q2YZrd5Gcj7ThkeUn7JIFS42E1llRL9JyDF8Gqf1Yqk7KQSbuB68amGu8Bn7MM9W9nUSBVH1BSn6uIXE6OT2d9f52orxjnOMYoG/RNA3vdTIb88LmASUmxxqfr6bGvj43PnG28Ch7ss00j5athJyQ9GyDwXGsOtkhx9GTeud1HJKIVd6g98zT15GR07qGbxDCIcvhyDOOvFrBDFRdk9FwVn2WbYdsVh85gH3/ZscBZtCBbIgWjTXlt8Oj/U38mhwJdrzbHqiMNLgH2rA039nwHTHFgAoz2I2l2T3Z84gor6qeTvkMEQXiI9AUR64nBjRj0q+rzYGqvYskUSY7H51uW1GlFVfl4tw3+hzAtMGHri7n1o00U69ucqdLj0J++13TeMwIGwl9CZkGn9RL1ELUKMYowmQTdJP1l6LPC5tiX2Wg9yz6hYWxCliFLHaJJh+Jb11MfLKVeM+DqZXopuOjyj0n/6kJe1I7BgxkNi8E69W737Tb5Bo8c7+AJi4Q0Aa9yjvf0apkxdaqbCskO7AfpF0UOTrQ/WGdk9vYQM1xjlnlHyD4gQhisyPsGtApR6lluGu8OHoK0WK1YocCG8HqyF0RsyPSN9ydnWcRMEkG3lS4ryzmTWrYXVDEdAUi098KGOaYKibC3VHC1eUZpbqDsu1SISgOitPQIU/hkBUeGj/rwpFh64UOf0ikBTdW3x93NdwvCL3zICDNeD1VB6faZnlC9ZaB03ESe09iVF+mQw61fDgW1dtBlbz8WvNNzisGWxFzpIYhBvjTJl6TsFlIRrz/5W7BsbKNEHink2rJSSl9HWcUJS8e3209njthhTv4MRxs12TBEryN/GKNcnCcGx6qLjJaR0WuVmpBWGh2v9ceRGzqxVqNnoO4ntAb2gNgHF33a/wD/dOt2mm0woGOe7+2D2h7Oszj6OpYe5exEqoySWQko80Hon8Vl2cNj08d6KB1arvXzGXXA7E3d/ApMgrBNuMljhMATYQ1eGDPI8rqf+ILFlk0mFe28xaGKyGdYxIDI40JfliCZk3GkLZlb2lueFeQgzRNiY/vZmoHP/TmPPAQ6BmhEBU6RoJPEIBfPtq7GVRs+bwszrbZCcRFxkeGZEZn5BbgYVG+QfGxgUkGHHjuU+bfEBkVs43IhJr7I8DSO2iSXkeSQq2MigIQy32F0g7797vEJSUyiuZvgeK/UCZtLzgjF9BCQCijTQsm/nxGC42tvA72svX0ChkMj8bCqRECcUEMkkojCHRAGsqqErQ+9a3cICwyLDfNxc1Gb7/aScN558ikF4NW7ywzbrU+rbVpHoFu4WHGBku0NlS50EhesAQYUPMXLYWVS9pjgxi0rNTSHV69FSsuKFR4Cq5LOLKyy6uM+cH3w5yydySEt2YDgB4epERMQ6RSMQDvSnQtXS/S2pjgSLWMcYC0vHmKcg1Eu6XAnkZMPAWzrJnTCRCynKL44/tQcZrylo3NH/As80ZNXUGLBM037SlDEFEXeCF+IXglxTQ7QP8lVHCu+W3oNpT8Is8syEGy0mQguRNkxm6h5cIgXRS2+XvDsmj/18zBPKWuxYDC81UcUVS+7k/4kE6Om31IfaU7eWoOZ0MmTsttKPRBSkE4rVXAL+OldW92RgHYW/9KSFbLYd+jVlBfrqwisp9Cu7dTjwHCs77Hxn9y+0Begq85DsRiJxUihJmD+d3Cm7+e9/vbIbqfQjYiFx4hQTpNZIX0qCttoO/kpYPbV5au2XuJb2gM3cN5deVMSPnYrtxG3iOjcwjJGy18Bdx7j/qiTtyWB96Pv28wVxR2jL+Qxk+xnSX70XRy2cRu7edx4eQez0kf5qO8NE5i/TjxQROjZDf6wdSn9yXQyoB3nlZP+joGbfxfKrs22Nty7tNOymTVz+amKg97v1k6JRqjtZTQwnJY//pN+ybwLfHqVjqRFV1ded9UCXlIbWZe17QcdVOAO792ZN96hFRyo7hxY69BRXYGcvrDcXbD1NG8ydsAozN78M5L0mym+8YjVOEKr9cI3FtDCrfqfE6cG+pjRSRU9QGmc6rquxraiwqxCEreIMOG5mRMcNvaXoBwEGC84bJkSjLuSt54EeDhWIfJJisqnYphx+KwrY1eo3XELS7Um9BIfDvuxEKsHX1QdbREz13I+c7aKt5U+Xvf5BNNT9NqvyansNf/NMVREC7ZCbGlyAaX3UubRLgE0xsicqadHVtegkdgM2uodfUzsHPjUN9mU12ITFBQZFYSos6HnHPSLM5kPhJ23Lvr1fbdrfVpRpqJxqyC9hpeaWX0CWiI/bxllGDoSbdtilFBfHoqhj6HYQQMDS8WNuYbtOASzLRAsTE5YVR7NKb43HPF7bkfjXzMvH90oEv9Bl8qC+qiMqTTcX/tYpf+FwgpiDy+/yzdDhwypDAxjA8Sur/BgpYan15M5Itai6KLc2PuBYuef/J7rIC4r/clnPN6Tg63jhP1zW01PLkL8Oma383ddmKmdKlzFqNFda/bu7UV1Jlaqo2qIOdO/i5BOxCXinxH17A//navsntQUSu2uVgIJJl7v7QcskIo2CSI+YhL231OfXxsR32+bqkNY1fQsN9lkv970feK/nh7fyxSe0DSwb4gyw2lHxCuqeHcaRf4UCsMbdeCf+wToXwa9SFBXWwvxRly49xuWfIc/OXAZZhzm4vsp0vIFKhCY7ypOPTcAW1cdSdX+lyTKhNr4jD7uDqFOW1Wi8CJvRwVue7jpcPBNLrmNw49J73dN1+Drl4T6MABpu3Clsy9mPZc60MvqXY83VqtGVpifNADSy1dTJbiA2TttDXFrXeHR9fmf+dfwQKmvi2WgEHURt2q6Lvpu5LsqAS79qtNxBks0V+Hr+t+cHBg4+qir6b+9xe/O57dCcDjd8X93utWvV28DWkkUeQ3wMHFsrg4fP9Ty7mxdU1RlTZsTXrQj3SQiMx8/c2HL2Y1skWRubsG3YWgzN3iiBOOBw/oNq5c8HQDTk1y7J3ru6wwPvSkt+W7ra9q/6cQo6qobDsR97IMW5wfN1qfyx9t1RuuVAdI1f8M7ZDeC/hZuYjOex4kkuSWr2vWoiHWTqsH9iT32aZfwQChRoSa/Xkj90JezGH6lf7x7sffGlyfyd2YHLOkTjAfVJdpC8E4B5MnvSMNyExwcb4+f7yUnKlFNr5wcrT9awf53c7Id8r+1VenLuyaDyL0X1XzfnCnR+sQkhsYpomYrj6Ymnags9DqcwgaosLYbhgxSYECtJnuG3jv2/+WOWC/qOk8Fd0tBsqIoLLQ+J2W9GaylN6HhgUkWcOmKMi8C5w2qsR2bCVIDPNy0gV5avNJsUf7y12fI3eNMF8wb47/U3uyGQ4jHFJ+eejMr9ntfwbddqy76ddngIny4P5CoAjYyzTfJcMVjnj8f/tdRcm9/KRjCV4Mw2trhqpZHx5xTfYN1z2Tb5UkhLoOLY6bzdzHBSmE0B3vu0N8UunxQUEsNieCyUjAYqI1uAzj3pNkqtGhi/mVVS20ar/a/4L7+ugC1F6vVOOu11Twpsp3YPzFDZffYXc0scFRK/dW5fyatuGc8JX8vEWhyNnS2uPxYnJtfF2YZqKe0DhQHjeXHkoDaXnlPsZJMMTZsMemlyXK/NLJpDKE3AHGAmDyLPqKdqY7LTwJm3QGGQTyfcAPJ7bxkIfVtkPVFn1YkoIh7zd3pvyaa0L3rkP6GCT2qa4TKr/Tbv2s3eLQxbUU8AEvQGLbajlpbA6OUgBYGs3iwKo56APZgSH9vWQEmg9LKCBf6pfVlJtdOL842uTC45DEtLw8SQMogh6VQ0DcPgYILSyB4JLvGZNGRsPBcc+miHV3883R+hYUlDi7hATrsybqw3NsMmVuXwTEPoPoRPlKdZSjiQ0948cRS4TCm2hmQ9Vx+iSP64MgSr0G8JSn+sNkQR/XFpSAPYbz7ffEXafLX53Pa98x/Ofzr+CSrIsLJz0+dacg6GTXiWWW05QjPhc37J+MkvoOj++dJ8zRtVxy3rV1sqDy4OzUY0Gu61EeqtfRKy8BRsWlyKC0rtQbS1+TxQ1iYn/rhdncnX6YQA3fu3JFOCbAyZ9QWHYPPIoiNNzZyWgBghxs+eFBN88X0kEyuYy2N8Xjnz0doXF4OPw0X7+ZBiMfqQyuAIPzcvTGhvT1Sot1ukH7CuNRcvx5X1ER5p1rWNV2krGA0iVep3Hgh7crp86WzLAxGeqhwVhrmzBdzA/E+nmhq+aXAylUt0VuGqCQIoqfuFkkNleJkLMB2tf6Fc0rhVSMe2jJNKRinkOExsSuHD6GWICtdvhCTI8gECWdz4P6YoxyH9EcJw/KPlnBpJO9ucqYgYwv/i0IVr334lGI+6D5nFaNL60JEvx61NIlz7TYYJx0W9PFZCR8H6mXWKQz45KCQrp38Vrzds3w90J8JHRz8+e9L/cWZsfO/Zo/7Pcy3E2IHRkdh+Ih7dPzaMGgCm0tumUQqSmoxQZQthKd6nQY6quMsLJBV1HKxKjG1oRiendFMpC9Vcm3XWwaNkrdPeBNuzlq7WDKyfH4rBoKPxZKBz/15yD4V6pJZrczKl4wi5xjxGgVtL/+ggLCH5NMmQlI6nhcSVd7bX1MzNtZVGJdCoaCyd4I23uWHhY0XHeAE1ylV8smeoEE4591Rw/omZRa/OBDzWLS7bWit6bfhvlJoDjR9F6HSUbP9k3Bn0yLJL82OIZVIAwweWoTz8T6Q2UJWTLhsrLW9QQ6rzKSR1paR9dYSYJl5z1alPiaNmn66p3vP7d64zL1c8k3X4hwyI5txIQyUBxe/1KQTiXdzup+q5iLCvbExKzq9voVTKKTzvp7vyMRl/b3V59sFyZtZhVYEYGqwytz7OH6jMzNJ5LyiY358fQocSrAbaktyqQ88rJwXY7Ixs7lgM+Tz1hEkXbj1kyVlhkr254laP4HYfXqozSsc282XCaqllh8JiSqhgjiwqEc1Got35qLigd++Dp+hjI/Yrdy5t3zx6E33h25kwkCFDMleM8mdW13gBiwv1HQsUiG/3Ki+xFjx+Oek4eLt39kiu0T/qnHleporriVvdCSdPqN1kygyZ531DwAaUPPJgLUgAddhYSXb2Lcs1GaXdydqHvnUhiVOJy3cIJWWX8Lnf7pAlU+kfwe6h5KqACD4qEpVeRiSbG5MsCqkh2ahIJK8yMP1amDE/KoQVyapLy+F9jSMC4R7R6Y8Gpz4yH1jR7jDGusFMMMtEWnIg71mGfwLH+Zf0jiSqBq5JaohFJwriR5FzlfwELBVgBbYQBA7gCM7gCm7gDh7gA4EQAALIBKIUT24steHtVMhuOQKwNTPaCjFn/X/TFHNRSRRwLiqvANMxU/G8MRfW3CdM7xF4UoEbCzGyrGYgex6VHZnz74kjhSNgkvP/rJgcDv9bADPLTDczzGVzxVw3V801OElYY/M/FJjpZoa5bK6Y6+aquQYnn5880PL6dZ57MQPYgfbyteX7l/a9vGbdvnnfsAXUe13KrPa3ji5Hjin0raEY98FITEx3yTOWl4xPfadfw5DXan2SJ0sgH5dy8h05P3l84Y6fvwpmINhyvsouFvu359l+Ajsqy6ksscf3qqrf4YLmQP91MpuoY0f2mZitIRYnzOA0rPHjx19QtHlfPYqsCf6fl30y5IP3RksH4Jr+eU4pQ+z7C3bjcy60MgQg/m0CHkDe08o5jF+y1xLabflmyxMxowd7nY7jSy62Uv7QL5TSvTXdDrBKwx9uFezSLxf6LkKi459+nEeis7Zf5pAB2WsJ7bbc7qdFsB7sdTqmfy72S/yhJ0rp3pruO6xSdLhfkf0Cv3Xp0t9ff4l8N/ruf2ncH//9U/b9F2Pff4AANNuf6JZ5JO8L/N2qKAKAbz/Y/MMA/HDj5k7/L2/Y0z3ABAoIqF/4C2cvd8QdhwARnW9hXXNeMVd4N+wmWhtVXXfgXp0k0wXM/kJGPFKXeYjaCi4ukj2InXC47IRN6/mqAtD+1inIzK1kvLSXJTJTkmVyKonXIR0KyU7xoyFaE4OZI1F3Avoutro6KOn3bZVYtXspb4qvYdLQihrJQSwRnp3FwJqsrglTUs9XiS7/ASmOtCqg39+Q1itgdj29ukauBoB6VHSOGlXXgfbA5mJa3vg32YjVhFlfzLcfCGCraHmteYV5sRnUd7A/4Q5pYzQVt7SRmNVY9Z0f8ep5fPD5jWm+PcFtUGBZ38HWsgCmk+kVBrysQNtl6KYMPCot3jRlEE3jejCglgL5tRTOVWTH50MeLYeuCOaTJrCsTrHlLmr5iNHCiTbq0RVWMGpX2APqh1QhFRgRO+Yj0CyRaJrkU/0cR/RAIzWN6TZpbGFqIOxvFlXfCLqO+fKkUA/w2t+o7TWhzksv4edj0+o0Knf8pWarckDbDNIxoLMY1EP97e1s62+C9qE8/TfD/c128saPk4fhKZko/kNuBcih8P/tNSFBh4fqe852ZRCm73ocVn2SuMEpsO5355+Tng9pywjpX3Hvdjh+pgZMpJ12xEWteg/z+jg+W3uIHjD2uqNzZkSToo6o0kBg/ijw32IAjJZ35iuMXQRzxGXtcpSH+JuoNaI2xqmyYasJpQ69N2pSWKNEZUa71onfjxMOFg5PmrB3byECOWFkpy+3am0ZFzdhKYWjF4Tl2RDwkD0bSt23s2V42uyVbT5bjqHZs+WZatTqsyb1bA1aIs7SpMo3hAAyHc+GAGUIbUimbq8Rk8amsjTZCDiOkECqbCji1M6XiQ1naFHAqqYFzbF1xlNzg05HVQwLzQnnlxDAy8HbADAJhfMatdho+XPhUp7OJpKpxe+kszzNT4iv03vX40XBIHhpv1OkqZ5FQiyU0u7BmSvXFMsuGyAaHl70HUGSRJ0Oze88OpHq/XDOajhhd66ISPOr4dy5vqvCkb8k9zYRNGG+KpRlMXsRhZKQiFpj04wtSZm8TKcfsbEqwWJmGwZrWkJC6Yi40rRHErULK3mZvLRpB+r1gxxD3L2mhUAkRAbIkL2pQkYp+0uhGnX7aNCkRRuMDl169BkwZMSYCVNm4MwhWLBkxZoNW3bsOXDkxJkLV27cefDkxZsPX378BQgUJFgIpFBhwkWIFCVaDBS0WBhYOHgEcYhIyCioaOiuPWXajFlz5i1YtBSyqdVqUmcoVdPzxVW4PHQiwzJMy3ZcFMMJkqLRGUwWm8Pl8QUgFIklUplcoVSpNVpdYvEwGE1mi9VmdzjT0hefier3WUGHITMO6tJtPb48Xp9QYcJFiBSVG/3oFQMFHTcGYWDh4BHEISIho6CioYvHkIApUZJkKVKxsHFwpUmXIVMWHj6BbEI5BfdtOyD8gRLJBJT6dDURcFOYKvJ+/e2I3P9toXyB/kS2lPUnzS1D0dk4ZhyDhSdJvOwwzJPFqIdmZCskt8+qhZpdT+z/WFQWY2bvIS8zA3sauNOgA8H/3qu3aDIIYBLbGZGgGTOTnJ2E0k7FJLSmDteAkKtjNH0PZbINlpHO6GZdRcJNjf2SC2IjE3jAVxivJAiN7NMoBCI8ftYUsapthhztKkixKZE5ki1yAjS9p2oy/Luu0vh2TyjU5Jzaq6OpI01lOmkXvRgx8HhN6lXbPLNOaqT5BLLUEO31nUAsWIrWuXCqrJgtaYFpm6/ifcBQVsU85lsZB3Lu++/Yhr+VZM9LOFXrgviO+HPzKspS799r5W6KcPEclQcP/RYv9Ui35FKPR2XDxAS/OtTY4xJzG/zKnROTHFf2kZqcIwLluKYcd1JuQ6mLvysFgdYIBApoQUAPBAQI9KCAFgoICOhBGS/HFAAA) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} + +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAC9sAA8AAAAAX/wAAC8QAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk4bingcOgZgP1NUQVRaAHQREAqBjyDzIQuDOAABNgIkA4ZkBCAFhGAHkCEbPU9VRoaNAyAwtx0wEiFsHCDijWkUJYwzNfj/WwInQyy4h6q6vUghoSJIRpJqqg2AzEoKZiR0ISBRarEteArXg6lpU8ucrCuv4l9kYSfS2lcjeWbueQyMXiyJB/fhIquIR7+WT/8/vPcx3Rba5fEjtPQRL5T82L8/STbJeQUCV6NbScISKGJVIyp0jagtS1Rlx/+rSwb/XjkPye3BOYA5aI+okDqFtgK+rlunVkp7d3jI2z+zMUTKKMc1Y1jDsDHu7baZjZmNGXNstmGYa9w5ylXIGUlIkXRpdf8c3d//X8fv+PV16f9+/fq/4/6+IWNrhJoJDdapYlXU/09QGZhnCG2xyz6JsA1kiJ1nx/unSfmsfwE4VcvaH/3L5Dr1/253pRwU9BvXmqMQVPhR59uTZDu29J7d8trDCWiYb73JcfgDsPyW+Lol1+2gSBBoQACC6mqzrKgyuapcMCC4H1ky4sYYPIQkWKoIJv9PZ9mObO+dHLZDB+QLcdEdvT5FnxZL6c/ImtHIJNkbyVoveI/sQx+hpd1D3wUIK8SFEFHH3HGVok9FfcFcpejaXBX4L5dKT/sk29GmVcrCsEv72jShjAgKYQdD4Nro7sCyEIP4X8QhCG8wGAyG1LT93mwH1BynQR6d0H6uyV59ezLOWpQQGROQFULo278dexlOZ0xuWsSqWIDQybgYKII5KKwCARF7gJbITe6A07NBFBHooQKGCdWiNDSUytAoWnMzuRzEWZSzXoYsYoGVHq7VCE4ntX27S6ezBR27dTqX2a5vp0vS/j2rgf7iQREuYpB9LyAuq3pwMw8nABl2PgYdc1HNbp4UHORigvBXOIDDHyvMMQb5/6MkE36V54PVVHjDjaJlDSBpwW7gFzRWH/5rccBi5UmpDEkkVKzYoilCQfKXl9yFlJ2sZC5jzpklfsWXeBcv4lHciWtxIU7FkdgXujgckzEWQ9EXndEajVETZVEYuZEVq42lxaXiEAQ3onD2lAiLwPCNTeEWTmETCHvaZrw84IzyNP/uPxhJuvonf9PSM3/gt/yKn/MTURr9gu9h3hMzPu37fcQHvcfbvdnrvcpLvcCzXeapnuh85zjDSR7iBPdxT0e5g5Jr7N7u4Ot9DRUpyB/7Zh/slT2xe3bDLtkZO6bmbrXzdtKO2pSN27DttC7bZlttc3Ctwootz5SWYRITWmzUGNtoFoEefS4VPVaeOq8YG9fpJw8GrYalVnbReQIHLKzTi9CwAFaft9bzh23HD/nn6nQGVC+N1hPV+hB216mgd1qL9dpvBZVqlb5+o5XlPFa3loBu4DmVoMVhEvww2ep0WAKTO33c5Vqe6xNUjRKjYjRzZ6PCOCmVcvkazurcqRV+Z+o+rfdz8dwVTo+qK5ejtt15hP6AXnrtojmLJruNFMLXMSht5d3G0ssAxaHtir0Bo5SqjwaqReIuNAuobJbzMXIBK+UEO91JaiXZrLUsRBmBWcfjKciPyT5V8stpHlM0DhoQm0F6rPW3sjuAj+mVr3ehUj2agIdqDlZvmw/5rnmtb2MkXmTG7aT6p3KzCz1sVGeZadhKhGZB7/zMIuZuZaK1lTQtRro8KMSXVQA22MGktlq8bJ127bHl+O869P5/kWp4ll4cXqwPL78l0DMNGAoB9SUYu85TOOhnEYBM1SLgsU0d+0zxTg427ASX+sjRuhVkGKT7aJutBsPi04AtHh0qwPFiz8nLMGPgG6yzPQRk0Kn+JqIH3Dhr6k+Av1LxchE7IAjFCgMwUFASANCnGQ0yke5zD3PiSwYLuZqAE9uBok3JHHP0u/ZXIlib1ajtOpQWysG3wVTVaas6dfTCRWP9sPj/+wP+Pv/e/14xJOxmpbe5w01uMXZgxPZK9A94CeMfMwbdr80L4P4SBDYFdCmQZ7fRhB0l/Njl0GPu1VUOQJjfPAgZs5YUAdUlHyQNDzcBG507QhlUthfDJSLKJZYnlMQKn1DT8D5QAlVg9izDHeKSLMGlpmlSyVWJh4uBDtmbkRgoJJ5QNRIYU29nht44h93QHAI4Rt6m5mgdx29DtV054vBmyThjjjs2eIXXaTfaf0uDkayXB5pRALXmaP/c49cInJjVE4IxLjEhSQXliMdaghdiMQ5ByjfanaPlXCkh1tMv/RSMKbokKbXOrfES7fAabcfjmvPZRxfkDsOAkCGAMYwM+ILfr6vFYVVhOonleFw5l5Dg3FofrVVRDovIZFfK+6W89kK4FLkBIRBKs2kuWzAazzecnbQ2m6RxR9Z1vB5CSYAyMt8ocH0vfj7WVE//UfN4XRilk8bZ8RJBwCStOeimxE2i6UQ/HF2UKjEviExskiQpYzC+PhgDT7OkEwwqhQtdmUlnw9Fu+6mdtow0u4UVWZ3oszHjFx4XBjGQGpQYzEGNT62ONkCoMzbIOlzME3XDJBq6IzDhJJkJnKkqpXxiOKvzsKfarpj0NEfs3Utrg/JB4tjo0nz875yFGoh37m5Xi7BOYRF5I4QyOt6PlFwtdogUa90mdw/3QTKJgWJJNb6oqQRCwbAzX5+ixYW2jWj9WZOlLkeiWmYVyU02R94ypBiGPCC7XIy/n3eIi41Se6W0jSbbbnXPglH7gOCHSFSd54teLjl1Fnh1gsa9kkkaW8YJtcaQaZtA+5/Aj4rD1Kspw+RMLUidJvR5CeRkrdnay0Y3C0c46zXkUrOi7wDOPTql8V2UrmaPtXsvo8vCYrCaepcMQ3LGfUjk7pBcWa6abVr1psJUUvufL6SZqrKEfCiiTlkzY+PTiE1ODNcLTwn3mMwyAehJXw4T5HQKTD6qQt1bTcAyS035SOa9lAlIKmMTuWCkcITf3xBL08hRUCViJfLlkhPQemh0aiGJpMcbxcPC4VVSkzUrHY40Fl5bOL1j+mv/QrDjzVW5tatjRRwuFXoAZnQBiqnnFOB1ZAQBAUJRdfbrO1QYYS6kxmrJm2Kx8Xxj2sF6bKPrdppJCBLJsM0va21xOlktsSQkYNnS+PUgQoAzBC2DxR7toKuryPk2py6ckey+b1mL5cc8pYsfMF2ZDei/8oFmL+a0vah3BLOCmaSpMlL4B/NTCob2JC3R8qvJihx0n0KQAhMr4SPCYokMvGrrcv800oLq6vI85hMtL7trGvNj1VxxeG7zi+L1fTi3pxCeIS9HHaM5coT/xg+b0pbYAApYhh3gHNO4rCucVsGkcjfynhm/LxUmzD3WPrBW0TEHE7IdEMrnKzwHAn2j/vP+W00UCm3Gv8EZDGj4hZSBrlKRTXL7rwQoYLw91Z1FYyli1jAle4jS90Ct0d69TjM0EI6P4YkSxygbjeqyS+dk7VIZyxxxfKVrBDFb3XqB+vYXQKgdZvw6UnTu0L3bj1ckfxFNF/4xI7tSDXZWRCwqj0I+McjBk+53MviBE/VESnYsrLKzW5h/UTwWvbAhCqvIrqG0QMD7UwbGAEvb7PqUxIt/nNV3D3FZoT/mXijOB6+Mb8so3qPSFcl7fQWSS0k+pD4yKZBtdBA4N9Ex3yYDuLYrsVASVZ1wBCLml3PnVpc7dQcH9aCmgLJizp2sRIQn/juqB6GYHKayhnyxPx743DupDBT6Ofc/TPXhbfqs/dr3cN9p35WKlqZp/nPjfAsVydY71gv5TTcByHSoXAUKmyRmN7dAdNd89rtzlLFxR3mphnPj7+kzJ1UKxhBp5+SWI5MTbysFjvkbkveYj9mHT9U0rct7mS8o6l1CAUnqUfrjzQsgfTAMtDBgzBVVWa6ZT/gMWXqsfJxchQHY1o7HRDxOxpkV8mdgAwB6aJTeR7T0ZpM3F9IHC3P26HAphPHMkZ3vgA4IEcDXFsZ1ChCSqMZWqw0EOFhFxl94ZQBKhlds7xbCDStUvlvYz9oeBkgMeGyYHFS6VFetevzbYTKwxFdA11y1dDzAKtMPG2dWB8YizWS0xJ7ODdKHAEK7DxYRUGkwQH3ylUx4lpeWt/UBqmhS6oe2cigiZ9IqdEOgt1zyjeyOqZRuKfLADQWNDs2n5+b/fATovexedrrTBJ6pJeg+anxklicqEyaGDCuH3g5wxDNArTEZjg67z/M0Me6DifH1KLUizqeMAkc4ZdEnmNX1TkbknYwRYWp8XFEf4JtcijkW+Tfl5CfJcFSVWXU1uWOhDb2N6nrglJl3jLP86eTr6LWwUaJHDgM6SwUTOME8qpRKadygtWUjswrP0omsUS7+LpYqvlJsg7x0FIx3cV1Oi/WStdzWZF+DN1I02fs/oJZTJLOKLY9TIDVMEcYiVUa+uFC/0ZvMwUCLo0XuaZWBG05XTLOnthSMmHGaj1eUAUxHl8tsaLwxGa1kjjb/AOmZdZLeiI+2M1NjIFXyVh9udkaT/pbazniq4sDmC6H3BRgVPh/TCBAZZ33OUjOcn5rnmrzA6Qc9cf5oSedlTqnmWx4QBM4oDdX7VhUrYwNbdrky77T/mh+xfufrKVGO5C2eRKVvztzqiVpSjVW4pdmPBr2sQ4LHHRZaHpYxE434b5nNeLnrrlGrCZP9DvMVzpJfn+p9YwJydZvEdUzuSe1eY/wj5Y3qF/ioBW6seZgnm6I+TDd/FGTiF/VYbOzc+AIyEurVMLRuQnK3Gs5oqKiaRwYKlqGDJzi4qoPhcRzY2MICkPX18GyAKS/xRTpxod1RF31RpbhiEL+kgXiKBDiOT3nsNSN0JUMG9DAOc0Z11FhO/28al+yAUfneBP+CJxeGtEXeQ2zJ9JC5PVRA8eavIxFt0Y2su98T39sBwn692qySF4+V2zZ5odRQ6l0hCrErkg+9m3u+Pe0VVM3r5k2jwGVWlagc3nI9J6iocA4PRsx2Ch+yHVy3djtdHT/KZPoUHOdiEQRhUckRqIlQMjjyWb+AwuFdtzVohqtcPzqqqtf4cLgYWaJnCR7gYSoGlH0xUEwb0UgOpoFfVMDDSvE1C0LcDt18kKngu3gzIId73p6k2cbNEqoit9lpjB6uBHNAY/q+j46IOguLRGxwNTseQKwT/fmViPQcZSTo21LKTegfc2EivXk0WXV7H9kVwtltLtURO9A5S3u3UF//b9KBfqrmDsneGClUN0YO9wu74oz/otDJ45XN45U/t/1xNzgcvhvoHXeJi+twUjrl9vUhSx1Vsqw44Mu/KtpKEdd6n9AMsO/vKagRHUVnoaCp6DPIoifI0y3cx+Mii4NX/8/Jcu4T0r3Tv/Hc9hIBrQFgetQqIvLN6hstAuwCTCcAQQeSgocTcYjJyzDlsWMw5eTlOMvJp11c/Kk3r31PdfFIh5/1sx+MFm+uHy2OetD//IDhxXFjxewHAP1O7CPiOMRVEv29HeK2cIHbWNHjN/NXXtwO6oV/S2fVuiSnD7JEg9qjX/Z/gc8KOGESL5Y3gI1GZiwKvR7gN+QW6e/QL5ByabwgUlqjRgUyLcZflGr/u7TYDPmoHS3cv+m16CXdrhwVxlVE+XXnqwM6FDR2yg5fKhZGxfS5AeJ+5i+UnePfbhe4WoyQ+bdxinkFSeYLROmvoHbTRSWqBGP9tlLWBel2Hk2f2pqZf3BsrGAvcLulGVgu1j4e7VqC1rR31qqOYJIxr2LdZ1xr90PKO/+bXaiH/j12911RYT5cOwXIXgpxKAiwQoTGGXd7mRPT6CXOVO0xfvpM+z1cW2mCVixW8DFjJWY4IEqgajOuNerOtq4rrKriBVZ7F+dO6+k6vXcNE7veNjTr+XBP53p3Z7JieRksr+5ctVdnJjNWm70XSDg3Cnc9NIp0MYhHJP/3UyHdvutvT03TzqPRKn+W8d63lE8uEUn40ERLK+BaVEnnhgcR48Lp5LhIYhA3spNE54aHEPnhdDI/khjCjQQFXKAQv+xOCnb/oOtZ9Ys0WzXT+nFwqWWcahCL0LT9Wlz6eLTr5jh0yjyFEQtxH1P1SXs21Sd6U4NpJUmDnoWpe1jSQW2Jqu/X6N2w8zA+VRgZze32iEKmXU3wuocvzJ+MIEZGRkyFH87O02/Wz5Zyaeyg8PB0P2I6HflGVpYP104D8iZFfCiQG6Zujt8EIR+dLb9yYjJE6bykEdtLDAU1Jyf1H4H2OVwJFJm65a2kH7u3fqGcmLGaOfOVtqMp7FrdU+RyaXT1kE8Z3AquHvYSVJY+Bf6bD9/cr6hxmMK60oscpZV38VTH92zkbx5NznpHe8q7ysqsjJUbFfUZqrrqh8TGwhfYeNfkB0z7QR95Xi6OQGogbAPhBuuBYMw2bqGTu2u2bDJAttmit7sabF3avWpWMg6/73d/AmZQ0PVx0c8luJDQUk1WGYLMATY//zoXfnd+wXnhYUW8PHeOxv7z2YrzCr7m2SBqLHXH0rFhK4PL7neOd9a0LKzLvTYO3JNdof8NeY5a0eam1XLFfyl3mt6WT1/YxOaHsBqE9QUXI+LxjT9F+UzSr7tV7X2RXDECTCboNsz5QyqhpfoiBwNPf4EGwHTE+UD9OoNyWKIZ3DMjtQjwV3R2fOOQlqYrN5VThEozifH6QnN/ShwWF73WccyGYV5aZ0eyo2hNSm1o9lHn/ssEvMOAgK/B3Mbm/LRy6aQYD1VKlUWCAygFajsBHi4aLuM6NL/ySu09hzdE0X+8pl2JeRz6UWKfTiaQtlzI8Mf/zANk19W0CwFJbtIvSu9/Cc17vmdMzyZuOPa4h0s8/b7qCjILDS1EXUKnSdq9MsSBzfristVSSLxffXJyjTfowZcMbJij0iYIAXYBEwTaHHVgQ3Cbg6OdY5sDCCvUaJfCajfLM7XFGdbGNPMCIjkzLrlo8G3K+cShtXUOsO8Ux2t4TVzjBk6gD5YS1GqXXXwzr28vjkxQ4MtizqFinUW3UlFPvIB/oeQ0EiozVBjGOTiRzdUS9PkAw3qjInsnF7NcCbBZkPQzaYwIYQ+a7fgUJ8GdZbjqwosO/Xz0+DAYVnGHdxz4na7qVGen776TcGjXjTZRfgQ7Uk6UN/ke+U2Ck4A97sq9jnTUa6bzGFZIk/mF5MESx6+PG5QryzIZda6l8b9E2J3yVe14kbn1429XK2H/VAMyIdxYId3zs+jw8auC+GF4zjp4XgpDKVTHGCvAcsKWXQmltZT2WYrhER8WzY330V1iYszxOW0dXVa6hmGxxaRFj0OG9WOCqN6JFv4a04huQQJmaJXkFLs6calu0cMjMnoHvT+kdwN1Ihpk8yXw+dqZ/Vnl18xdItnNlLaNpBu7zMhZmw2U6DDfHX6GxyMoCcYeKfDNbiwsx63oxUaB7X29DD/4fn9nlplnCzygIMbAx99YB4ACL8AF/AXtc21L+U/w/Kortfec3gQX/qdo25OYx+HwOu1lXOCCR1+Vr8iv34F8GtmXnb77bsJhSy1khV4NdmEvwW+P4zmAJj6I3z2Gh1BrFy6UEDzvN0ToHURD/r3jgx/4/UXPCRne6d+EbseJgthGTEZ8WIURNwMig8UFbJcqWoMSpRfQ+SioDH0RCWpxEQNP5I231o0+XMRJcNMP10+2LdyPbVSd8f0e/0tWvSuTnOSHS4cxxp+OGySFqGU4qmgMy3R+zUCNOYLshrPID2exvxRnlKwrkf1U7I28ffb8KX+HOHQGKnESJSIiRYNIESrNPg74Z0jsuySuvXs54/Bxbs9eV/tCyYlD8N2oNCRfjIozRcXkoBPc00HycdEh8xJ57k0xfqC77L1PUrK8s2hq8fhni6yPXCNdh18v3nsNNfuj3yJcAp/u0B08dQg+5JbhHB/FeZVb7RqPTgXieF1L1a0Eq3pp+rBbce9CYFmNFdMvlRxoku+Xj6EF+KZuiCqrCehdsBNSG+JTlWGR64pvtQTyIF+/BYKqBYkSlTuTFE0vsuVpRJBkN0jY7MosfD4dyNBkN/1CkU0sozglesYpW3ntJ9mRR6DqotrxexaAl/S1cMi1ZNGR98W7jgnisA2vMPyWsxSKAAUI0nho2Rf7bv/8P3kvyD+ihBD+8f5tobeLYIOTxruTx51PnqjZceFYl5XBSYurxztTebt3a16GD2SkWXxFuj2OZRdDM6G+LK7ljRW/VAQGW68/pB9XO8GPaxel8Xfc5v8A/QE6nZqffIWFz5q2/BSL17GL1xrxk2Pir9suLeWq/FMS5UV0EHA8w/v0+74FQxtPXvD6HLvuhpzM/GKJtTHJXEWMyIxLVg5+SLmRkGB119Y/ykMUlQhlQXFRHMu5FRcJwgObo9+gH1s9wKI1JWfF9/4Ydzix0L7JI21dnPoKF7rR0QhmKLnJduFnhWxAkiRlVuq0a3riF81AYsKEScmfpiXCicFEQ7/fcvpiE3euy3m0cfTwCVxyrqfr9N837t/1trFZ/7SVC+Y/RLKorp0ROcmPIIOz54zYAbJkv4iBjJw8M/UcPIqQLsaBRqhZdLBbnNiqHhrrCNMR11u0fbdMWSfSUE0Z5nTLqCsThh7VgmMVyekkyca2t4HRgHxLZh2/hvOquWSdfeXgFguyWYDNgiT8x/xwp+pIKM+2VF2WgJIzNueFgmZpDycYiMHLn5VHjnxWDlxmWE4+3cx1PvXqpcOpOl4YeNYf+qCzuHpzR3Hwg/6dQQ86imtrdhSHPqAM/1EvhRPxYVc1fbgyiBn4onf979qOWRroP1dFNJg/a70uko4JwNMx9ipftYYtjAr6sY/23/YLD8u6EfAo4lyFkOrgjaU6CFOty5gfPPPV5+o+bEO7MlE+OAaKKrEuqwmaraoOnq+oBjwkbo/6xVJb54Y6ehCBSAtqaNrwS0vRiz3vPtsvO05TkDgsFXm+DXG7rfQvwgjPcTM5kWJ6JT/8imm0M32itIJ1iOfo1kwMrHCLdeAcBl4buLhkP1Wcn9QMS8xDFXk1oDhmc67qXieFR6yTh9fIpG2p4Ie2jQjca6IdnkOkR8eJGHokgaotYt3tN3cRP9ZnPBlnGmw/tSRt4h4KnVb96pZJCAlND6IVuU4XjXCfD5eV+sS6RbcSWklCZ4J2dxnn+YiRrkdQWlBYSCbBTfXr+UOhMU1L0u2nmAbjk0yH/lsvi0Y0R+nsKFbUNB0E9uCi+UImIPGUrRECfcH5SmsL3O9Bdv4copFTkBpV7FVvechF3TcVz8nTa3RS5zuw/5GlmsFPyCpnyQ0tlDvdi2WQ34a0i2txzsW3Glm2rsKE/RN8p7JwrghNxLDdPfRMfKH9YR2ObBnNv0M9kbBf6Ma221L6a2QdTtxxX1sGWTyh/e/P0n15e/mhkrD0kRiAb7he9IKg8s74JnI7TRRl9FHktf4nNAOC+7qCdsYEgmG2ir/b/4YyXVtwIuD5lvEUizNX1+cA9xmNWOfBc034g2XXhArnK6Jw3fnZIR1qJktQaMl5j3tQCD8bVd9MW2xdbv7/b1dAtDSuYhwPdhhlltmMXhbZ7qWV2Y0eC6xhHguyGaWWOYxeFNmO0irsRkH8/FGoMEMhT8vOhsVzhSwHv9BI2yT2zd/+Tf5rWVaXniVPV6k6xchZjiURdkq/Y8ZDhCyfKsx28N2uzOdytpMcJz1d8G4rgRpg8SzW3lX+N6E6Za8MCZcRyP1HKGQGdlR1Rip1vJ+DL/Alaf7/6Ymcj+NTyEzsiOqIL9/iBzeGcct9tsUMORoZ8UR40IJNnkFGSy346B+MGCb3yUF8Di7fn0TFMrNHzoS8H/FiKEevS6V6aErMtAOH02m3SYMuxAZI+Rbn0UyjFvubDAu+23ljZsvBG24ar8J0ELtu8swE4jwZ1mO4PQDhtgLTN8yFQbbBWqIw8OFPcY4c8yu5XT0FE/J0RF11LoC5p2NrO/q8H6wGXkLGeRb6tM8wa1wuRIBjV2M61F5WSjHrN8wxN5JLeErhMkYKS1/acTms6Hoxq5jBsirnTCedm1abejfGecc0ZaEdaApbWdZe0s7emVqm52BEek82H6EevDS47IQi/oqtMfq6SPBTBjmholddMHo63SiwAU4Agn7TVv/tmbNlJnnDrOy+nIxtRATNK7skq6oN+KQieBp3XsQtc55Riv8RHBBrfPZsN38QzyrZFHPuT1e7IfZzMjO5bFeRqrmnz1Czg5sc6Vmnl+Gc7d6dGh0PN6+p2rWvTLF5r4k4YCxzL6DCdKtpso7VDj6B37TalAGCn0k+g3vsl+wR3EjTy6Yl0O3tIzYaMyYAQe9bTeuWbzak5T4lzw4UQ2eXJrzvG5mLVeW2WdI2mt+u2siMUgewZG7NcVtV0/N8EIqQfAb/mg1z6fpU07N67lLjt+WSxogqqwhbw5Mldn6ZLR37m9r3TZpD0jQ4CSj+oHt5jvd36Axmcv+aybWaImuDI4+QGeet72hfH5xbI6oOcS77b/oMZvLkumcrNceHccFkHiRcR0fTFUIAToJzPODAPb3BXfY1D7w516hqRMM8UllOtwbiHMDofxzcPpgkX+QeUxPZnyNAryWvMlY3oXBssOjD9gRfDs5RoDBOOjV4eXAPSLbUcTbukxQR/AwNUj45BPWSUxseUans0ey1GSu1ju9nAIp0chJfQq6RWg/FT2FmQNTjjg6/xUn0Ot3kNK7aMg+cpMuXQ2gzfCYYpil0r2RocQGvCPCouh0c43YoUXGPfHIgb6b8arSyegYpNyBGhjnnBv5QI6d/IwUZY9IHxc/8O2NDu4DeJXmMy0e0va7ZvmiBLejKYr6yPzvq99Wt2bBGi9OWaHESIL4x3syYT6uRZd6z9SSbWP8b8I0EtRXs9qH7hNevi9zzKWv/rGDN3rdbhXYnH5LabTnRbzz563yFFRROneuZkrHUW5PyHPg/ae7hW9wPpBQS9mVmb/cTyY8J1VcQ0wwrOdzd7tBva/n+POs6z/Qas9B0dB1wy9D4lmyoIT09wTZHl6TMTGiIrWnhYSa+3D/QlXI1s29HTI6wm57UX7FVeigS827O2v7ExpsnY0x9mG3Yfb9nr48eetFWrXeoMvRm1dBCwswH+zYihuyuQL8KUMa4eeSBlxOThJk2CBfSNomZAeRbkpXcnevz1nfgtOoV8Oyl3ytblIR76JMYNTqyZgQ1Kj7yiWPrLwHMx5OTk3Huce7sZ/9enBcEmfqbcq7dCv7VdQaE63V0HP+r6mVVYlmQHJl4N/1+eqIK+TwJkgekS5OTDTNqSDCk96jNDMEBxFjeaXzWrq4IVtBdPdo/tN7mHdcxthdmcnVeBFFQSbWtrjZ1blwDC5LAia49PtKyCKmiNOCyTyNb42J2FIjx0CyJUq3HaAijFzuRrES2L8Gd9RWgTd9W3kNGIEiLMdEkNqj8d3+83cjT2w+qSUtfPPVfRxeF63YCKDm++BU325zyNx1jWCY5dDi5Lv+p/xmWt1Ui3kzw4EHA8BHU+oXw0bFmbbCtvOmvRATLyaU+wGNds/LBwZ2vuN16nFpMqiCwEsZdGR49AghQzdBKcfnj0a4/oDXdnY25JzCpmFd895Ou9drrIf3l4nPG1bLOTZw07iZLoffi73s3uJ70X2fVs+3K7xnb7krK8+HaeUDGKaShFr41sbE32btNBj1GJmz/mWwyWXvAzBfQA7186+myrIvGTcZUauvHsyU5dyCTYLUW8HiMpReowHQRRwxMDdPvB55vKflwNpD7yL1UOd7cFMw2SUPi0HbOyEame6qpMUggX5UXLBjygsZ/AMcn9mIjZHlEY3yG1TrIbDOrIEpOWESDUsXobGMpQ4RrM/NxEtzLfX/lPvvScC+/9i8Qt2TMOXJMeGYCPyMzSbZ9aP/Y6fpatnW18GhfcrlHlMmX1b4gR3eKRw0iv9Ze5/rR3WX9rgHAaF/GtKtdtrbjtNaID0SR6G5DehqBv9b7vdDGxj4Um+d+2RlndrcOEGTqAKzl4c1r3/bvz+jr0XE0bBTXbb00/hX6bgCosSChH655sVywnV288bVBUom9f1ppg/7OoVSYAwKpuW7IzAAtURKjSEI8CQ4DyFrMzCdM2GgEsvFIoB0Wec8fXicXK2i5kYdBDawZonXZbwkEfdxyTGJg9V4yPmXMTxnnGTSkBtoCLbQ12tClBYUXljvUyK3t9q482AAs0sAijr9iMSqAG5Jg/WJ7O8lhyw82H4argZ//9ZpnAdOsv9cc20W9i+08Zq46dUlieWBahDg8py+b+Ooz25zyioExLEs5dDgZNn9fsTs6pcdQ9VxJ6xmJAaRu3aVDA5+MPi9fqKm/aqG5Xf3ELRVtmOn9p4+0uj0gOC0iNCZhxntn+T15kjXAX5fk0qldxyxut4lv17TWLZvW/lKxjJagDaReT30kFa3MoBIKi6o9SB8svtdVxXkBqFQdkEEOzgzDgyiSlZsgeN4S0H/Dh2dqd5vuaYO8mI6twwk6DjV8kOdX04oju2vogOr8yifTzPqfFwwkssKJSWb3QuOzj3wE18po+3emg5B1d0RXmkyWsacKxjF0z/Ioi5Y1VWE0ehW7S5H2Om2rwg503HfH8TjvVKjj91aWsHNJIr8iPed+BidznN7cq62+As9fLMfhgaAP/pfVxM3stOfwOHnDiYDcraNDImMi4kUcWV4b7uZN/XP3suZZVdMHmZW7llTy6+1S0r7mqlu0Tg3Om5FU50oTx9K8EmLRBG5mWCgoc0P0smKoQgFLlvcFG66I6NVKp7Cq+BJbUYjasCC0Gkl4b4qyc3zqdjK6EBPPXDRWmtV7yy71yaUHx8bS9maVSB5E3GDxFHCCXZ+zzKvYqe47PtPgaFBoulvAa011XUNBkRzwVt43eufuFB4lluaFjmdj0RwRsd1JMXlvsqE7MERC5CgT8rN6IyN3Lm5tjzjqCoIXNEXXwio2y29OPCOWSVZQQFKkK4FpH2T2HV8qncQqFQdRFQxKLpNOFVV5xO+8uaO1D0cmZOAL2EdRHGfRrWTUfS8QQr2+6wWv1s6xDlnqDrQP+8ztMon15KQQB5wKdPd0HXsCIyVETkFCee7eyPydiyd7Ik66gtD3127dV0o0uYs99x40fzKp2VE1dnOod+RGLaCbscL16BxSwkQgXwR5W2j9laM9uC00tMq8zaLLotuyFVE1AlsnGND2aJlccsLwT1JMRTKlJxt8TWVtyqDhbR2RxaDGxzNmo91v5242LXGKp0ArtdkimxYDEJLp7mnfPxgxJB4H6NtgeG+JdAKrkE9+LZC7VYLuRZwE+MXhz5T3kaH98/9ln/4j6sDhmA/Pp2MYJ/4Y+zdY6qX8QnL+IaKn+Wid4FHb9oQHZyt6N29PD+jRYxaB7jni5CL8rZq9jyUHThrVbl89fWEHbEPDxeKHPjxU0gvFSW9hRVNCwIBse5lup6w0zD8NjwIV3TpIWwCLRY0XsobR5uq5Wy23OKVTbeFtkFpnvt99+ZE+gVUqpjCVyZRuFUS9AjwbrldecNwdHoVrfBaPvxhRUN/AZYWw+bObpsveNv26mqKQj6dOCI5Yjni+tkhy/X+ZXbXIbVuo6bx2/ISFQdranaKEjjTllpEPyYDr/MpbliqQ0Je9ZfnlH8kqENKJ5nzHe/lNtxMWwrsYZaq/w8kN/fGJf3Q2NfJYFCGrVJDZWKPBRZl+Pop/6eRyGVx56WOgryKHADlarwESodkPqej4PjdfD301dmjn4yLtk5GuJf2ajjuFYU/xpqvktnluCpCwyuQQhqgwH4StPBbyDgT6yPpxsgAj7vS5+DEHhMBe55wclBOh0NmO2CbzkkVRMV8tUz0rhisu3QTGliDBUsfkC6Pp0US8bdDvOAvryvOCWP3WCL4SWF/UkTdpJI2nFZxvs7bAvQ6yvfXzSBACr657yjTvAD96QGAI8Tor3zuQTXDTAjfg24jASs3i/PxUybgTO495efKcFJ59TmrzeTNOvUuxtzq5umAgwhMoS/BeJpLgyWjcSB8TuoGQXjoLlMlac5kK9Lhu1QHhDgVwsBlXbBGKM8kZ5m4ME0iTIlsLJ9nwsB6RVpssnJxzPDNDncpkPNXsIOO9K/wf12kEucXBvRjgkk3PW3lci55oLOdbs58SH11NuHO2NYXYBeORne0Vtg+SzQaSFIpiy8eMtCsBZ2zR1uK8QqyMmsgOIvvuojUoQeuuOOLSXLd9UR0cdlJknqKZO/8zxnl0hbaNPHu/efSw0G3XWaKwDyY2u9j+5tC5YQPF11cidlzlnTI5WMZlvDh42NrER+ApKZAf9n/ThfXrGAjAZUBVp45Zc6lotR4AubK1ANDlCkE8l5aE0oAB9IAmggbU8XyMOpd0J89SxzIXjpWALfmopRgPcZyCJXU06bW6EJxM2QdByPe07sU+6l8V+IM5IaIs3qkpIb84nFPQLh2RutWVRQNoSUnJCS2FdkyovVRpGBtYbi2mTEHTVoltDlXZTWEc0DCADCvvtxW0XFhOkb8l8OggTeVLgXRxM5bI8xlpeB0VXplGEhQVjH1MElZHIphLaiMUEKvk125wuJzJAaSfXQ4AlpmuSbKClcBk3uGmDk6fQugpRkiz+v8DyzJkyOPcCxbnF+dRvygDVoxcWKyP6n0OgeO/nBr+ae0c8j/c3mAivH955Oe14dOdU/m3qwV2M0YbBCIoABjw1a1yLFGi9T143AfFtzrPYaRd2gdzwvp9KFE5J308VRLvtFeBrqPIHnGaQ9TpkiQxrPdgbcy9c9e8egi0giCiiJUzsQ1BD+XDqaPM6haQMpLqYVdyQORNenQ4ioz6DvgPk5xHy3DKaxFN1kRpCFMPE9cI0JkGyFqAnseukjGcd0AGAYYddnUAw6XGQ9+RRo+PjINpls3HUQrIAC0gOZhnIYZiJ5fNiMUlYbIOQ0y1OGaG9CSD0jNlHuFOR8uY+gUxPd6fNZ+TpWQ4bfHWC7gg+mKai9IG4zV6KGppnBEM6Cn6cTnYGh7FpjKV4+9tG6uPOXafLcwCtUfRW7GmxDJPLgER236KCqAkwxHXBuowlUaIkQxv2GaQhZJYxjZ9YrH4Mkpz8meG5U3rD9d21Wx13QNyVxRQY6gP1CFVEigRxZrBJV/EWJAvsNlDi95HY4ojSuwsiJHOhtaIdtE2yKucljZpqCaWS4emSkq1LHJUNGocY2tAC6i2UjNPQMtAe0AbQet524pUUZVi3IQ223ot1ofdZYsxGAvKk1O2ul9LpzqrF9LuDQ7W9RFjDuKTUXAGBfMuB4ymnOwhtJJRkhzEZY5HLiOnN8L6nlMLLnkd2ErsqIK55g+YhtgIJl3/yzPsNHwqgB7AR3oDRyWwpyJ3N1uVbI+BcFuAJ2bgWoXAjferUBjwbhWGJM6uwuHP8CoCfGkUxKrslZ2QRuA6CLAC8asQ2CF0LjFNiviyVZ7MX6rsWEC7+OAEanKQkguTQqRkoyAdTsgL5pLPEiaWwbAsJ5KJAjkvPJZaJI8gvG0N6Tmm8FmhF/JCw7ItRGNybo0x0GATMyyTXOLSlmrAQkI92RkIYl4QzNSH7YTfL5hPl/ALTTjNOziVs+1g6AkWYxY0OJliNxWbkduoPLQU6BzmhC8+x7YT/ABlNi3J5lIwMWXM04OdSIqKBAUAXsK9YDHN3JGjYNpFpAlPrwN4mbpjcnEykRUDCprzRp06ppk1egDBwUYuHKTQ4kdglDAwhPNxlm3i/7ALgQINOgxYxCJmG7PRuMPgQ5OabpiW7bie8mmG5XhBlGRF1XTAwNDI2MTUzNzC0sraxtbO3kF1PJouDNMC2/Hpy7cfv/78i0RCRkFFQ8fAFIWFLRpHDC6eWHH44gkkEBJJlEQsmUSKVFJp0mXIJCOXRUFJJVuOXGp58hXQKFSkWIlSWmXKVahUpVoNEASGQGFwBBKFxmBxeAKRRKZQaXQGk8XmcHl8gVAklkhlcoVSpdZodXqD0WS2WG129g6OTs4urm7uHp5e3j6+fv4Bms2GkEufewrDzNUostW5+s/pDItG4TPa6m+F2NkDMFQRLsQYAP7plf4FiuxsRXra/7GgbcZ6oOnCMC2wHRclcVRBBgAAAAAAAABMe4Gm246LkjgqTxeGaYHtuCiJo/I+mi4M0wLbcVESdxTTIiIiIiIiYqVuKaWUUkoppZRSloiIiIiIiIiImJmZmZmZmZmVUkoppZRSSikVNc+n2ZouDNMC23FREndomva0+HixfbPUatWPvDvWPf+eCrlvj7/G1+d5M+4UdeEPpFvpiuc5yrTENgA=) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAABtAAA8AAAAANOAAABrjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGj4bhxwcglgGYD9TVEFUWgCBIhEQCsQ4tkQLgh4AATYCJAOENgQgBYRgB4lSG8MrVUaFjQMACu2AIypHq5D8/ymBzuHgsQNRLzLIkcvdshxsCFu0yu1oIGw3lQ0H7datDiCXVddbx4l1MkR8mkM4BKe9q1kM8e0FAsSd33X8abI3M8RamPxPmVVGSDIL3//vx2/PvDnnPkSsEwpZNUSTTP2hwOqEzOqkSiQ0lfsDze3fbsnAgTCiYsSo3qDXMhhHbGQ76VCwUFBHfsRCnFiRfCMSbAB+PoQBMLTmZilcHdohvYqsFFJmYNvISHt85+KpSbeDJwkYAwksjIKg3W41+e39eP/8LuYlF2fe+4AXqgqAwUrJNEmbvyzFUqyk+qMrF2Eb6Ihv73/lLOko8u2cg+LMqfjDsgYnQKgjBagqYpWfs53AOA/hk/Z/a5W2av7MAvfhvFVHFBDyrOz+VZOu7j/VvNhz1Hs8u4fYQVQEKkICHfIESN2pINqonFABoeIjhMqpyOPh+WMv/zg/ahtgpdJEIu+q34IqQStZR7MSlOkmIlXr9o9+Bwmts16+v5/VA7zSp3FulslgBiPGiFjefl353S0RIKDH56HtgOkpsPqNdYIAHkywAAPW1IKBBlpDJo1hoYvuiBNvBg844EMusOrF6N5rbqH8aM6a8uMsnsvPo7U/JDgAmBMGSIs9XXqhvmjYGho+4XWNwQICOyrskuEA60oWNGaFEmAAB5i5j22IAgACEuiCvwxLQZ7TJ4GAEkh83Rd92ke93zOe8qQvetTr3e8+d7nFdV7iUuc706kWWRCtYTnCIfTL8rOHnW1nCxtZx1RTEBKCYP66S9/1Ua/1VA91W1d1Xid1WFe1V3Jt1YSGNahVWqYONalGi1WsXKUrWfGKF08xClOQfESXk2xkJgNpSVVK5hD08tsI4Dcmna/wHl7C/3AfbsJlTBNn4SxgMJ5BwSC1NQMGmW1jMAjqlbFRQ9qOZBpK+KUGr98aYe1Plbjh7qAkceMsp9I8IWmH6JVxhhvSOrjGk80iNNIlNJWBlGrpVhtmC93tyBTFGAqiojBD7h5EwW4YhEoat5AMq2CYZtnTLAIqAYUJohlqdkZ1G1K2dSfFiXBhXhvi2IYdbENetePKiGXhCBjT5jYUkdwAB3CwVhKSiqUTIXhroKOfJCD00ykLmUApDLYje6EbjsFfd4IkQqb0i3EIywK0YXjtCKM6Q4W4Vqwn6l0XgQCuJgEAT6JqhFS3K6QvaAXL+pw4JYC1UA7ZJfS0dIiBt0TyUnMWUoHD5bZxHSKHrgssGDcg3bgjcFjJIon0CVeFsr0w9vwIWIFEX0WBzl0ZBiobgN/f71kxuwNDfK8bLxEeBCwcMb/H8yFpL85k5wgxHJsYTl0LnE8ABJwwgAxkwGwYKQE8+ftsuI6ADYiMmgAS1ne0CFR9Sfp2ESijAhzexPvBA5RLLgC8scr2Qmf38bnHgXSu8JEu3hSIqww4tX/d/yZgnXcnoA0AlDHBVuljmNBer5HTIBX31/KKAXj5qFyvAPq/vvd41QMBEzQgABYQQDD6ALAeAxGQ/VDdGB0kjtkmJ4xv4KBn6DgmUMXl6R+7AIYWTYqUiGktraNdtJdujO2b9n8KDMfwdP71tJuuj6m/qX/f5vrXUUPGlRfkmiH48/7PzUc3CgMnn2zrzXi1pqdzEIAh/296oADDcU7A6CmAlt9DuggWtAGmDzBNcITklfvGTUmTuZaMDVcsWf7CSYtICbQh4Urpg0ZE/iShfEpuC1oQMntbFHbLTvTAir1tfujsiHtS2KaQ9lewbPVhCKCWrpaMw0oHHogDXY7QjJasu2kJBgAezblu74fHJkNbaEMamlzLio44MIA2NKUBgRDGupqyMNrU4n0uy7esbI2d7XCuwzvczTPPntgPdW7sVw4P+XbPg22U6vtt7qDmkbR1R7oNwpULO+65it4x4d8mfKXQxrSWqBuUzZGNqcRZ4bobAxlj9kFp2DdAGylrGXJzDzb6TQdTa+0h3XQZXE3SDBSEFZBMkKQEYcoSjsKV7Q3P2qfRocYrVfvDpo5quEuJ7nQrn0+NpC4dC5ekFuLH2GhFr/6lVq+b55Y1rv81E8B3SBhDvbY/mNeVV5HViKuZjRD9Dtg/W6JwnaWZkYMI6Dx/IBs8bKuBoFRAucTFMhfkGWVFkfcWB4tadDMU8pbwhRq7yvhWXf+8GdmyqOtN3aE8dBzh5pNK07xQCoLlEkGBSAlXUHPQhhFeWA0OfmcuQhuJLFELSLv6XedLPbsaq52vTRgxUPTtp+ZHSCTfDGY/Qy3uO2A13CWyksTN8cUZkcYUywfyYxYz3ZjCDtnYjSVwfozbEm/fyYUidmyD5903d0biY8X28qUeZVn99CJ+fGuN9Pdep30P1UQ/aD/oz9I1UQsAUeqP3ycHyyBJ6r8OZCUfdNRiUkeHjNIqhU+dqBvVGQ5ikRJmYVrHNNdmbkrTMi0OLFDb0xjaT+ruqFcfSOndDM8SUWdlHJFMk9su5dK/R4el3p3NH0u/82ZcXzfdmGZ4zJ2cuHlQGy8TojBxwsjHJSAECQORqc2qMYGBhbDLPEdpRlITZyv+HltiN3SRYJuM7B4X9f7OT2OOf0MXS1xMmMpcOI8SISlAatVrCS6elNm/wxMVTNrahSskHwamEfXdlRdoXx+B4MKiXXGRz8lQiWh8myOiK6e+d2T/8gC1KhdvUgbi7XnL0F4h2JbBjThBgq7jhKkm+LKEpbrBGK+It18S1vQeOyMxUOLbC7DKA6gESQYsGvVKUfyUesFi4QynOptHuNYI9WOGoT8mL644sprXrgso/yu6aFkE00mFH9QU99bzny+Kb//xcdsWl5qcB7JOB96e5Q+F/9ZSK4EZSn22717pxI178BtXu4BSIsBLTn9ILYn2h2YFS6Goui6XAckz7a1broLNWs6CfBODUd8Uw8GqkCo/S+LdPVMr8pgLIurqXn0+u65QFNc0VEPFKs9ry2LYEoUwp4mUZx4idy3XrWIW7aY/xMAu9McX/eeWGrXdOFKT5xznORfFzBJBK1jUsRVXvQevclTykG/Erqd56MpIMqxMqVzQ21IJL6l4duWHTMcrSu8fr4N1zaFZdz0pH0v6BKyoGQsG3ctl9Fivd4WSWnC02UWmzMGGHbPEsY/eVszHEl7n7ps3Qqffj33fOLIckvVvHCD53J8C+TBh9mjk75YTtY4N2yIisUFMx4WR0IobZBZRRxPdWFvRI6/ctRVUw8NpH12oM3WEX6VrzeYWTquGnSlhzHVTtrCsq/vqYS6pBQiMXGK16V19zVXe/oqJ+FitnQzPB94K2Dw3j2l7XotxSfg/v/a/cZWdrkJZ8f+97lkJ6lkJMUah+yuN0vZjkrK4vUbZRvn9/SaLDXPSM7mg2Dxzysx25CLXtVnMZyqRwyhlYYyOkub6Ax8l46Zq4hJ5awaPy1sS1jziXX22Ky8nge7ILrQXgzPvjLAtRFTvuKtkIOruUHGdcNoy0wyXbLnPpOx/k72drNlxodqWM/+68by7dLGj+A/bYswTkAjAz0TMUwM/zH+QUkGQDG4VwRV0wM/QfYN93WB3y7JPDAy2+MQr/US+hylZ0/lWtKIcwMfTAR+3v/T55Uww1cBVKmiRRol7IifUAT8zrj6KEjS+ouPj/RjLQ3E7iMNaCporpIAWP9jIpU6ewmfv2IHPxgvmqk8+WcFy2/PhvfOeFeygqadrou6PlDc00YeMuL/m+SbiicbR8qj7YLVzRhf7+Uay59aG1jsxsmYSr+spR+e6p9MX1dqHpkTnVmRCYNGqhupDHzM2Ry1Ta7LYb5Rh/yg8P0pkaR1q7x4eXRfMsrCsCMkRh/RIGiv2PEztL77oWkgTf5RYbbDjerHNrIPsXH0YSwITbAtc1xfz18JburwbYSHdwE+GVK4V1yrq6acTxwReC1wXxJy9Djotxg94BYsyv+mezc5g5cYlss+pg8Vo2eyHY6df3fBaTfojjqw3TRQPRgoHpdO/Jn6RjuBpcQlsDnvAPtpEciHO4b6bZn4Zdjm2OIXFYHsFpbaU5ECa2virxdK5kxc6kO/SkdIJu/fCN0y9SjM/VlaEy8qiAvfeLEZU0nLnUHt8qG2/BVhcLxl4VC6dHVlxBVe3rK8+Z7ttou1bjpXcvH4CqeybO3K8CfeuYcNtYWkRSboZgh2yRL6gT0VRGtq/MyTFT8BPCQgJTQ7gC5L9IPSNawEl/GN4AMnajx+SNkm7lR49sUWMs8xJ3DM04n8ohDfQuiJu9aw4HVlTfjxy2YqYW117GzFfmjeu+9zcgXFi7c13XJkWyWFLIh1W5hc49KWFc6S5Y+D0tOTAS3O9g3nIkcYadokVO+C6SgWRa3WMBoSInzbLKPf5kYvtFn5hJQbaNGIkxrlWK5Oj+QxhtN2qvNG0MfA6ElWcPXiNtb5sXJ9n8jfe6rJrrDDK1VbvbZpHrn2mbYswYEnSwMfBs5n7rcX2Cfc4pn32UcHBpua61hLnFEvUopMXWQVNXhkm8bfFd8XxOSZVXgmva97UxAMac7V03QOFQFMCn5o4d7GUqb/inU1J+9rp6BzXSPLY55AfpgEJbr7x6hqwsKyayfL38uT6M4O5gZ5erMC+oKXh48ljPObz/QFrurH6uUR2TlwGK/ucLl6QyS+4APoa1CHvU96qXPIqB1XPFGaFMUM6zUuVLx2ksRYvkopEWXzbkYortM2DpwaHIDR0BtIXIFYib/56uMl15OB/4pz8PV53TfXnnkT/QyuGfqXtwc5qzu7H/k7vG/Y9lJATcqh/1Q/hNE4+3oQfjA1u4Iki2tfHVuI1MrOq8OtiF4GI92A+XouBcVnVNVP1KlyN0zQ36TULZNQKOYwk1rCbvACJR2ZURM+/XtpXf/nCHXAdPcPtdMgU+TbjBdL5SnycR7skaakTmnrSstQMl2l5xqTmi+feVazZ8SS1fWdU86Yb79FzHPP/xFuMesKImnWE4q/5fi9DqxDrOmpRvf6M+XcrU9V1cbSSY7+KKk7X39H44LhabkqKVN+sKdfaqj1wQbs2bro/0Xe7KlrTG18Yw2A36ieEwe61iT249cMbVDyooBnNb/O+IrORMLcZZEal/tLzS/u03RBhKIOVm9mu8L0MmydtJ7d2VpPryLe4ixqEdNqSi6SimtP1d4w+eJfMZXYP3QeOYffpp8cCV31GfmxzTa2oXks3F3kUZc0lmIbztc4YYKwpWS4fGD8Fn5xyvYH44/UB/9vHjhsfv30s4M0B4o+ol0+fGT97+TQKIkaTl1/ZIdMgnFK7tbOvrvP4wvyz42CVaI6bW28zosE4urUgI2su6Vb758qth+2ieD6RzXFNxScC+G4tFyOcJpnnLGrGXiVWDYNi84zmUVekGrcYKzQg2LgKSgA/Qz3ogW0kVOLjKSQbSXIZCACSFz59tolvclzxWAT1wMCP7CZPV0zUfaA/a3ROOWqEH0ilMl/mAPCezejxyD6d7aevZW+mV1NQsmqpimsI154WrWw4qhOmsrhRL0gvRKq4WIehH3FgLg1SCr/LbCddhb0yh4E9BXS3Otsb9nkXn53cLXLDZadklwk2mWWZLaVDTSEUf4QHhk7KPSxzgy6VTh6d9zjwjg9DgbwAGaVVXiQW1Z6uv2P8wat0LrNHpk+SxpoVG9Ek53BF1ZndDD54CufY7etKYeN2fXEwPaj18tyq6IHSlf7Bmaw4k3rYPcEi5Ve24yd6x9BfydYj8Zo7ZlexPPd+rTltkmmJKzU7aZmKLnOQiDw6sKIl84sRvktTYmKdI9T3PdgYQ91w6lv2f+epspVmyse19tH3Z6C+c40ipff4Q8M9nWxf1tM1ofd7y4vK+sqD769ZaxssKy8pWV7uNwIjTnynuA0NE+VJ0bKKc8Y3Cfc5X69vXcMqNPdiBafUFjT1QsK6H1KhwsVbZjmqD7UqlE3IbtIFlZQSyvM05dZg5nJih3LZoph6V37Lsbzs28MHO+a/1Q5XnRL2bIsEJ7XAZA96Q0FL3GBOYKFfNOtNrNYK94rkUGB+8YwvrMlbSCpZ0N2UlixedUcwRUWpjZfoFbVaYUHpXmlnSJcEBf66C1zZNNatB/IUsTt4haDPrklpKIRdR2tHC1V7P/aqFqLhhRJjv5AF40+fPlOudHrOvO6SMgx5PHRA82goYyPdXc99I51xNHRA07vbwFDPsNsATEtLpFf86hsy0qTlEm0yQ6XYMziNm1g2+DnpYPx65UYD/N8Qw7NuJdwWzRgPJ/sQry693PJrhf1jtGB6ltuS2ANmHGPh9WSz/x1ArxTda4JLJ2YRuQZGwSoFqOVBd2KTQpm+kSklHwX36yhrr+ZsaPxpujsNpRlCO02qTf3mKRTebhan0nnKjl/jdHT0fe0LrU4Z0yi3YyCViqL65mz8AD6QoMblPVMbEZCIQfg1In09dEr9m8430KeiWye30lDahckLNBTCm1DUWbpSSkMh+Jo0X0qTFjyjwFODOnVEWWFF++d1g01fSCtPqTzVfXp4oeKqrs8Dsvqv5L7zSlMr4xTrEkJ7hAlBPXXCBEWdgcF4xRphUE9CS78cBIG9qr3TKE16UOpcOwI6x9E14YywgLhVllGGT2gobX+Y+Yx/2bZL0ztlUExF0UwV+CGqkDpriRo9X603xeiVK2otQadubX7EzO0ryBVvuL1oSl0qeUZPbbxMui4sCogKTPcEGUqbWr7pITPnvs1uLdq27mp3eMMMz4x25+33XhkKl7d0BHnsjqL60YY5zNAV0o39rxsMqWWPGTLN3ocbj9rHMdJdfArx8ePnxgmV2UvSwhrNF/MvB+jtcc5Z/iqt7fu9M9X4j7WQ3UDbW4N93TLccSej/brayJkLNJS29QK1t+308sRdq182N2Pu7sm3WSmKjIxIiMSN8gts+kThswrHfyZERNjtaRXzfOsT/vs7fZqE0mQTp1MY+TFxkzpXONEx4HLlrWM6RfvjqzgT57CQtOn8xDzBrvsAaMfzv6/q6cyJ9WLoUtv8p7zt75lHHf/+ZE+IZizYJotuR+q1m/qHptA9cxU4Y+fGSAJ6IeoekrrejmPymmm21hRCn6JTPeM3mVl9BbnJG64t2nxC+r7wfjuvoMZ6UjM3JyAqMMWzg/iCSJTni7Zub8Amlq0Fchi0rVcVmDff0pe+cTjFHjr4fFuqMS+loXo02AwPHmE4qqIaSO4irvSrJnu/lDDDp5oUJrmfuNqz7NT+2v0BC1P7+YKRki279q9P7ufFyUq37Dm0ZoTpL5FI/FOZ4QGpEkmABILp/uSslKFLwqmdZwR8GSlvIakwKSw7riCWnAXPKP6Iv6EBt5XlIHQSxhhwq627S6mQnXVdUdNnpkQXIhxQ1wxlbfshMhsZVhqW10m0/QdcoaG0N6HfWGCkGxr9e6Ca6i+zsDBiOLb7iN0KvUa6hQcaZV23vuduGPyU03FtoDl1el2+wICcxQjPil2UUn1TkORBWa4QmBPLlLKLyxuz85c0lcX65qRFA8ECiADYGuffb0ycA4aGi+ldQwAOAIhIwBYV4vlnQaJg7RVBs/EQPP6CAkAI9cAnPK7qgWzHGAINBDAUWGABAx5CEEAihbIYF8OgBR0MkMk2ZOE5NSOA87GtufzJ0oJJKlK3ZUvnHGjg6fg46gdIl3DgQoTsBRGWJuBh2zGdRWoCzZylacGQRnFEcOcyh1/8h1PDtiflsW+hKeg6bPPw0asSwDsgCFHkH4o3pKDzbTTrHHQAva+Z+Rc8mclm5jzHYCis5CyjblQxYzVAaXPtp3C+ZtAv8YpIbz0Yq/v6mnXS0alo6Yu6AGnfmOpkaKNcqXNYE5cyUWs3M2gtARNk8U6ZmSupKUGWmra/KfTP85+Kk6ekdXnAAf8kvoYMkFUoYtsaN7LsbWMs33zi5YAeNXX+D3hZ4/5VN4RawIWZQC5zvlYEZdL+OXYSpVpKrY05bWn8D82duQHKdCUoJfrBjn/fH4ydYf7lWXmgnqxTxx4DBoAFTnxq5+VA2ecbSZEEALw/f/QHgA+V9zb+Q/9TSUfGajBAAAQAEMAfKtWrRMucRfDWbq5XucARSEy9tlbzgZPZXdpUpJLdbWhtHl82M4md3hSUiiK8j2SCZhjrEgB+Bic3EEQfUfa2sotY/iFmNe4rolJBtvxGFBlkXDeQe9KMOW0FgcNVs7u+s7tnEaVLi7CGh7OpSFFJTX/Tj86jsuJwguNwDNR4wZnpIow2a33IdOHojKY4gvYqvCLGqpBKHtowF6SoEvLFfJAW+WBeqOAcdY28VRaur2Z1xS8M0k1vhK1LU878njv7vUGRQLZcs6xY6MtwyP4LpIiYOobMhPmKU62BPkJRkFlj7iiRkG44D0eTdKNcIb4+XuZP5aiEY3aeshXoCy15NVe0iRi44YNAOpQT02ehIZK7ooHzv02tJuoCrgyHPDBNWMk4ZZzd0T7C6klr1pOZSqmQUnCeMg+kv8VFt+iZAf9QyNSrBBgAXuMCDjzAFRbZnm07bAULGJwCAG9FaM/EgCpfZyJAgrczseDE/pk40EM2Ew9LdVqADEFuBwVXj0EClLDrFGRMXnSKZR3O0YijhBzH9KcAnKGLemqN2irhh7mDwjgijaPk1qwqZtfrsLaOP46pJKlE5cU6t3yVRIujRFFkesfirHCe9UrK0+UzaJy2qR7NzpExjARc6tdOTi5xi8AVwQ1k8mamQ4AP/iaa8u+hDUSvx9ec4zlwdromI56bye7lk1jzEXU0m0TuBG4CjWY/ilm0Emt++bSTUaHSFtOsWIPRQBoGGKadLBdiVMy974K088vH/SfCach/g85f7QGMtYDFzNzCytbOPqN/oAvd3TsYxUmWkxXdcf+66UTVdMO0pO24nk8kkSlUGp3BZLE5XB5fIBSJJVKZXKFUqTVand5gNJktVpvd4XRz9/D08vYBgSFQGByBRKExWByeQCSRKVQancFksTlcHl8gFIklUplcoVSpNVpdSG8wmsDMj3eI9jcEkXFlnFKMJ6K8vBRErLBimUXc+iwnRH3GIaQyTEvbbv7VVSjjEFIZpqVtx82/ugllHEIqw7S07bj5V3ehjENIZZiWth03/+bhAAAAAAAA1kN9xiGkMkxL227+1adk9RNn1fwkr+Ks3Nwscer7kRx36yJ+/swHJHS1aYfm9VVy5vdXbt/gcoIUoqSsNE1ckJeq8peelUUTFf8vKP3n4akXBQ==) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAPgAA8AAAAAB3gAAAOFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVRaAFQREAqBcIFwCxAAATYCJAMcBCAFhGAHSBthBlFUTDYjfHFgG7MOeULKalqtE4ejm8yPYamkLBqeP4dyFA//7fev+8ydC0EEFdZA7ONYEjmQUeG2rn/5Ajli2bwjO5uNVKXPxKiSEnqpPnFu8UIY3ookxASCDj+gfmJdHcC+/WA+0k8HXQU1J8BR7P/UetT/cy5eC0z3ccMBjWwifVXWIZBiR3iUVMX3PIoqRQ6QDp52fhmYSL2ki5t0UZLMfxz/wQvJQEBnIdAIoRJKSSgE2ptrk+zK1ffvgPMvQsAVVgB4LF0AXk3FgDK0WhJCWheB+gt8HGrMIBCbHa1S6Sq0R1jnEbNcRcgiba1maYfQCBmNMFZvYaAWz7+XLy1IWUgl0oy89Y52gpgrrBPGEUTvnJ+nV0rKGbkNt2hK4E7Pm8BbCgL+xJp+OrMHDPnNlf9H8zFVEfchry1fYqgshEaBngpMlM7tVi4Lzq2rGHHgtBaygZLheqsUkhSDQCAEUaVXCKTobzdAwmQN/jJbCnTUSDI6GVoPjasWymOM1t1/P//9WAEAQqHRXid1iy4INeiMjMXYBnRFRwCQWqQ2hYilZOWfHNxgKu+OzsAF5/fYqtvT9PzDQ7qOj6PprFXn4CALPHUchgcNFxFl8OgomY6bI+6C8pv7p4H8TVNE4uVAgDa4AY+cmoLEkQP0wftqr2jh5Zm/UO3Tjz80OC+6UguLUcd+0fA0hFwr6k4VrggEmKdsGm+E6MDQHcYYd4x8iZoPqSgJV1u8WuE7h7lSTDvwXyxfHiPHG9Sqj3+qzaD1a/20bGsvUPjs27LeP24jLvyvwTbgi8+Xf+CHS+f1+1azhEoCwUdkBuGcXEXI2tW5zXtIPRGrtvrV6XwvutZWGyZZLA/NlwQ6e6EQuR2eRVVB6O5fSBq/QmGqV5AN9ABK/V1GKuIw09lMc1lBRxMhtDccKo1fob+OeiMDifbLHaQ9NiERTexK0YQ8hkdEiGhCXzwmxfXF4nG4FB5BSWxNMcUpBsGTUKSZUzyhmWMEx9x6J/eeJCyxN5qYNLUcCZk+WQTJQ2JohsmmmmrGgBMDhUbtay2wxpMnZzurzkoThXsk8U/czaPppsI71BYBsSpuW3wDgfgsBgUt801xEUFCY5+zy+Dfx1O833SX34VE0ryEOEIWG4kp0tyxDXbp40NJJtq6Y7qONZGiUJgeOcr8R3i71IpN+TNHvaV5Y6TncAQAAAA=) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} diff --git a/apps/browser/src/autofill/utils/svg-icons.ts b/apps/browser/src/autofill/utils/svg-icons.ts index eec5aaae078..f9cf2ae0796 100644 --- a/apps/browser/src/autofill/utils/svg-icons.ts +++ b/apps/browser/src/autofill/utils/svg-icons.ts @@ -7,6 +7,12 @@ export const logoLockedIcon = export const globeIcon = ''; +export const creditCardIcon = + ''; + +export const idCardIcon = + ''; + export const lockIcon = ''; diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 33a18fbad2a..b667936581f 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -33,7 +33,6 @@ export default class RuntimeBackground { private pageDetailsToAutoFill: any[] = []; private onInstalledReason: string = null; private lockedVaultPendingNotifications: LockedVaultPendingNotificationsData[] = []; - private extensionRefreshIsActive: boolean = false; constructor( private main: MainBackground, @@ -90,10 +89,6 @@ export default class RuntimeBackground { return false; }; - this.extensionRefreshIsActive = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); - this.messageListener.allMessages$ .pipe( mergeMap(async (message: any) => { @@ -234,7 +229,7 @@ export default class RuntimeBackground { await this.main.refreshBadge(); await this.main.refreshMenu(false); - if (this.extensionRefreshIsActive) { + if (await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh)) { await this.autofillService.setAutoFillOnPageLoadOrgPolicy(); } break; @@ -257,7 +252,7 @@ export default class RuntimeBackground { await this.configService.ensureConfigFetched(); await this.main.updateOverlayCiphers(); - if (this.extensionRefreshIsActive) { + if (await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh)) { await this.autofillService.setAutoFillOnPageLoadOrgPolicy(); } } diff --git a/apps/browser/src/billing/popup/settings/premium-v2.component.html b/apps/browser/src/billing/popup/settings/premium-v2.component.html new file mode 100644 index 00000000000..2a98cffb0e0 --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium-v2.component.html @@ -0,0 +1,60 @@ + + + + + + + +
+

{{ "premiumFeatures" | i18n }}

+ + +
+
    +
  • + {{ "ppremiumSignUpStorage" | i18n }} +
  • +
  • + {{ "ppremiumSignUpTwoStepOptions" | i18n }} +
  • +
  • + {{ "premiumSignUpEmergency" | i18n }} +
  • +
  • + {{ "ppremiumSignUpReports" | i18n }} +
  • +
  • + {{ "ppremiumSignUpTotp" | i18n }} +
  • +
  • + {{ "ppremiumSignUpSupport" | i18n }} +
  • +
  • + {{ "ppremiumSignUpFuture" | i18n }} +
  • +
+
+

{{ priceString }}

+
+
+ + +
+
diff --git a/apps/browser/src/billing/popup/settings/premium-v2.component.ts b/apps/browser/src/billing/popup/settings/premium-v2.component.ts new file mode 100644 index 00000000000..456aa6dc9ac --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium-v2.component.ts @@ -0,0 +1,86 @@ +import { CommonModule, CurrencyPipe, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.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 { + ButtonModule, + CardComponent, + DialogService, + ItemModule, + SectionComponent, +} from "@bitwarden/components"; + +import { CurrentAccountComponent } from "../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + selector: "app-premium", + templateUrl: "premium-v2.component.html", + standalone: true, + imports: [ + ButtonModule, + CardComponent, + CommonModule, + CurrentAccountComponent, + ItemModule, + JslibModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + RouterModule, + SectionComponent, + ], +}) +export class PremiumV2Component extends BasePremiumComponent { + priceString: string; + + constructor( + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + apiService: ApiService, + configService: ConfigService, + logService: LogService, + private location: Location, + private currencyPipe: CurrencyPipe, + dialogService: DialogService, + environmentService: EnvironmentService, + billingAccountProfileStateService: BillingAccountProfileStateService, + ) { + super( + i18nService, + platformUtilsService, + apiService, + configService, + logService, + dialogService, + environmentService, + billingAccountProfileStateService, + ); + + // Support old price string. Can be removed in future once all translations are properly updated. + const thePrice = this.currencyPipe.transform(this.price, "$"); + // Safari extension crashes due to $1 appearing in the price string ($10.00). Escape the $ to fix. + const formattedPrice = this.platformUtilsService.isSafari() + ? thePrice.replace("$", "$$$") + : thePrice; + this.priceString = i18nService.t("premiumPrice", formattedPrice); + if (this.priceString.indexOf("%price%") > -1) { + this.priceString = this.priceString.replace("%price%", thePrice); + } + } + + goBack() { + this.location.back(); + } +} diff --git a/apps/browser/src/billing/popup/settings/premium.component.ts b/apps/browser/src/billing/popup/settings/premium.component.ts index dcfbc84aec8..ed64574d17d 100644 --- a/apps/browser/src/billing/popup/settings/premium.component.ts +++ b/apps/browser/src/billing/popup/settings/premium.component.ts @@ -4,11 +4,11 @@ import { Component } from "@angular/core"; import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.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 { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { DialogService } from "@bitwarden/components"; @Component({ @@ -22,7 +22,7 @@ export class PremiumComponent extends BasePremiumComponent { i18nService: I18nService, platformUtilsService: PlatformUtilsService, apiService: ApiService, - stateService: StateService, + configService: ConfigService, logService: LogService, private location: Location, private currencyPipe: CurrencyPipe, @@ -34,8 +34,8 @@ export class PremiumComponent extends BasePremiumComponent { i18nService, platformUtilsService, apiService, + configService, logService, - stateService, dialogService, environmentService, billingAccountProfileStateService, diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 81f43ff82ad..84d17eb2345 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -134,7 +134,8 @@ "sidebar_action": { "default_title": "Bitwarden", "default_panel": "popup/index.html?uilocation=sidebar", - "default_icon": "images/icon19.png" + "default_icon": "images/icon19.png", + "browser_style": false }, "storage": { "managed_schema": "managed_schema.json" diff --git a/apps/browser/src/platform/browser/browser-api.spec.ts b/apps/browser/src/platform/browser/browser-api.spec.ts index adf248707c2..a5948f49596 100644 --- a/apps/browser/src/platform/browser/browser-api.spec.ts +++ b/apps/browser/src/platform/browser/browser-api.spec.ts @@ -424,7 +424,6 @@ describe("BrowserApi", () => { target: { tabId: tabId, allFrames: injectDetails.allFrames, - frameIds: null, }, files: [injectDetails.file], injectImmediately: true, @@ -450,7 +449,6 @@ describe("BrowserApi", () => { expect(chrome.scripting.executeScript).toHaveBeenCalledWith({ target: { tabId: tabId, - allFrames: injectDetails.allFrames, frameIds: [frameId], }, files: [injectDetails.file], @@ -477,7 +475,6 @@ describe("BrowserApi", () => { target: { tabId: tabId, allFrames: injectDetails.allFrames, - frameIds: null, }, files: null, injectImmediately: true, diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 0d461a69830..ee4368eda73 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -522,12 +522,20 @@ export class BrowserApi { }, ): Promise { if (BrowserApi.isManifestVersion(3)) { + const target: chrome.scripting.InjectionTarget = { + tabId, + }; + + if (typeof details.frameId === "number") { + target.frameIds = [details.frameId]; + } + + if (!target.frameIds?.length && details.allFrames) { + target.allFrames = details.allFrames; + } + return chrome.scripting.executeScript({ - target: { - tabId: tabId, - allFrames: details.allFrames, - frameIds: details.frameId ? [details.frameId] : null, - }, + target, files: details.file ? [details.file] : null, injectImmediately: details.runAt === "document_start", world: scriptingApiDetails?.world || "ISOLATED", diff --git a/apps/browser/src/platform/popup/browser-popup-utils.ts b/apps/browser/src/platform/popup/browser-popup-utils.ts index a2249d466cb..fb53d3451f2 100644 --- a/apps/browser/src/platform/popup/browser-popup-utils.ts +++ b/apps/browser/src/platform/popup/browser-popup-utils.ts @@ -86,7 +86,7 @@ class BrowserPopupUtils { * Identifies if the background page needs to be initialized. */ static backgroundInitializationRequired() { - return !BrowserApi.getBackgroundPage(); + return !BrowserApi.getBackgroundPage() || BrowserApi.isManifestVersion(3); } /** diff --git a/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts b/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts index 52b08ac09ab..8876ac44d59 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts @@ -7,7 +7,7 @@ import { Router, UrlSerializer, } from "@angular/router"; -import { filter, first, firstValueFrom, map, Observable, of, switchMap } from "rxjs"; +import { filter, first, firstValueFrom, map, Observable, of, switchMap, tap } from "rxjs"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -29,16 +29,25 @@ export class PopupRouterCacheService { private state = inject(GlobalStateProvider).get(POPUP_ROUTE_HISTORY_KEY); private location = inject(Location); + private hasNavigated = false; + constructor() { // init history with existing state this.history$() .pipe(first()) - .subscribe((history) => history.forEach((location) => this.location.go(location))); + .subscribe( + (history) => + Array.isArray(history) && history.forEach((location) => this.location.go(location)), + ); // update state when route change occurs this.router.events .pipe( filter((event) => event instanceof NavigationEnd), + tap(() => { + // `Location.back()` can now be called successfully + this.hasNavigated = true; + }), filter((_event: NavigationEnd) => { const state: ActivatedRouteSnapshot = this.router.routerState.snapshot.root; @@ -77,7 +86,7 @@ export class PopupRouterCacheService { /** * If in browser popup, push new route onto history stack */ - private async push(url: string): Promise { + private async push(url: string) { if (!BrowserPopupUtils.inPopup(window) || url === (await firstValueFrom(this.last$()))) { return; } @@ -88,11 +97,10 @@ export class PopupRouterCacheService { * Navigate back in history */ async back() { - await this.state.update((prevState) => prevState.slice(0, -1)); + await this.state.update((prevState) => (prevState ? prevState.slice(0, -1) : [])); - const url = this.router.url; - this.location.back(); - if (url !== this.router.url) { + if (this.hasNavigated) { + this.location.back(); return; } diff --git a/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts b/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts index dde7f10500b..465a6e6c69c 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts @@ -65,6 +65,16 @@ describe("Popup router cache guard", () => { expect(response).toBe(true); }); + it("returns true if the history stack is null", async () => { + await service.setHistory(null); + + const response = await firstValueFrom( + testBed.runInInjectionContext(() => popupRouterCacheGuard()), + ); + + expect(response).toBe(true); + }); + it("redirects to the latest stored route", async () => { await router.navigate(["a"]); await router.navigate(["b"]); diff --git a/apps/browser/src/platform/services/popup-view-cache-background.service.ts b/apps/browser/src/platform/services/popup-view-cache-background.service.ts index 3427a02d3fa..09099b08c8c 100644 --- a/apps/browser/src/platform/services/popup-view-cache-background.service.ts +++ b/apps/browser/src/platform/services/popup-view-cache-background.service.ts @@ -6,6 +6,7 @@ import { GlobalStateProvider, } from "@bitwarden/common/platform/state"; +import { BrowserApi } from "../browser/browser-api"; import { fromChromeEvent } from "../browser/from-chrome-event"; const popupClosedPortName = "new_popup"; @@ -27,7 +28,7 @@ export class PopupViewCacheBackgroundService { merge( // on tab changed, excluding extension tabs fromChromeEvent(chrome.tabs.onActivated).pipe( - switchMap(([tabInfo]) => chrome.tabs.get(tabInfo.tabId)), + switchMap(([tabInfo]) => BrowserApi.getTab(tabInfo.tabId)), map((tab) => tab.url || tab.pendingUrl), filter((url) => !url.startsWith(chrome.runtime.getURL(""))), ), diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 5c4c01bfc16..688e7e72a07 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -46,6 +46,7 @@ import { ExcludedDomainsV1Component } from "../autofill/popup/settings/excluded- import { ExcludedDomainsComponent } from "../autofill/popup/settings/excluded-domains.component"; import { NotificationsSettingsV1Component } from "../autofill/popup/settings/notifications-v1.component"; import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; +import { PremiumV2Component } from "../billing/popup/settings/premium-v2.component"; import { PremiumComponent } from "../billing/popup/settings/premium.component"; import BrowserPopupUtils from "../platform/popup/browser-popup-utils"; import { popupRouterCacheGuard } from "../platform/popup/view-cache/popup-router-cache.service"; @@ -54,6 +55,7 @@ import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/pass import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component"; import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component"; import { SendTypeComponent } from "../tools/popup/send/send-type.component"; +import { SendCreatedComponent } from "../tools/popup/send-v2/send-created/send-created.component"; import { SendV2Component } from "../tools/popup/send-v2/send-v2.component"; import { AboutPageV2Component } from "../tools/popup/settings/about-page/about-page-v2.component"; import { AboutPageComponent } from "../tools/popup/settings/about-page/about-page.component"; @@ -336,12 +338,12 @@ const routes: Routes = [ canActivate: [authGuard], data: { state: "excluded-domains" }, }), - { + ...extensionRefreshSwap(PremiumComponent, PremiumV2Component, { path: "premium", component: PremiumComponent, canActivate: [authGuard], data: { state: "premium" }, - }, + }), ...extensionRefreshSwap(AppearanceComponent, AppearanceV2Component, { path: "appearance", canActivate: [authGuard], @@ -370,6 +372,12 @@ const routes: Routes = [ canActivate: [authGuard], data: { state: "edit-send" }, }, + { + path: "send-created", + component: SendCreatedComponent, + canActivate: [authGuard], + data: { state: "send" }, + }, { path: "update-temp-password", component: UpdateTempPasswordComponent, diff --git a/apps/browser/src/popup/extension-refresh-route-utils.ts b/apps/browser/src/popup/extension-refresh-route-utils.ts index 6960b650fa7..3c2ca33f86e 100644 --- a/apps/browser/src/popup/extension-refresh-route-utils.ts +++ b/apps/browser/src/popup/extension-refresh-route-utils.ts @@ -27,30 +27,6 @@ export function extensionRefreshSwap( ); } -/** - * Helper function to swap between two components based on the UnauthenticatedExtensionUIRefresh feature flag. - * We need this because the auth teams's authenticated UI will be refreshed as part of the MVP but the - * unauthenticated UIs will not necessarily make the cut. - * @param defaultComponent - The current non-refreshed component to render. - * @param refreshedComponent - The new refreshed component to render. - * @param options - The shared route options to apply to both components. - */ -export function unauthExtensionRefreshSwap( - defaultComponent: Type, - refreshedComponent: Type, - options: Route, -): Routes { - return componentRouteSwap( - defaultComponent, - refreshedComponent, - async () => { - const configService = inject(ConfigService); - return configService.getFeatureFlag(FeatureFlag.UnauthenticatedExtensionUIRefresh); - }, - options, - ); -} - /** * Helper function to redirect to a new URL based on the ExtensionRefresh feature flag. * @param redirectUrl - The URL to redirect to if the ExtensionRefresh flag is enabled. diff --git a/apps/browser/src/safari/mv3/fake-background.html b/apps/browser/src/safari/mv3/fake-background.html new file mode 100644 index 00000000000..afc33653c0a --- /dev/null +++ b/apps/browser/src/safari/mv3/fake-background.html @@ -0,0 +1,4 @@ + diff --git a/apps/browser/src/safari/mv3/fake-vendor.js b/apps/browser/src/safari/mv3/fake-vendor.js new file mode 100644 index 00000000000..a915519c38f --- /dev/null +++ b/apps/browser/src/safari/mv3/fake-vendor.js @@ -0,0 +1,2 @@ +// Empty file set for the Safari build process for mv3 to ensure backwards compatibility with mv2. +// Will be removed once we fully migrate Safari to mv3. diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html new file mode 100644 index 00000000000..9b56fa74d91 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html @@ -0,0 +1,28 @@ +
+ + + + + + + +
+ +

{{ "createdSendSuccessfully" | i18n }}

+

{{ "sendAvailability" | i18n: daysAvailable }}

+ +
+ + + + +
+
diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts new file mode 100644 index 00000000000..413f22565e1 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts @@ -0,0 +1,140 @@ +import { CommonModule, Location } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ActivatedRoute, RouterLink } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; +import { MockProxy, mock } from "jest-mock-extended"; +import { of } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { ButtonModule, IconModule, ToastService } from "@bitwarden/components"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { SendCreatedComponent } from "./send-created.component"; + +describe("SendCreatedComponent", () => { + let component: SendCreatedComponent; + let fixture: ComponentFixture; + let i18nService: MockProxy; + let platformUtilsService: MockProxy; + let sendService: MockProxy; + let toastService: MockProxy; + let location: MockProxy; + let activatedRoute: MockProxy; + let environmentService: MockProxy; + + const sendId = "test-send-id"; + const deletionDate = new Date(); + deletionDate.setDate(deletionDate.getDate() + 7); + const sendView: SendView = { + id: sendId, + deletionDate, + accessId: "abc", + urlB64Key: "123", + } as SendView; + + beforeEach(async () => { + i18nService = mock(); + platformUtilsService = mock(); + sendService = mock(); + toastService = mock(); + location = mock(); + activatedRoute = mock(); + environmentService = mock(); + Object.defineProperty(environmentService, "environment$", { + configurable: true, + get: () => of(new SelfHostedEnvironment({ webVault: "https://example.com" })), + }); + + activatedRoute.snapshot = { + queryParamMap: { + get: jest.fn().mockReturnValue(sendId), + }, + } as any; + + sendService.sendViews$ = of([sendView]); + + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + RouterTestingModule, + JslibModule, + ButtonModule, + IconModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + RouterLink, + PopupFooterComponent, + SendCreatedComponent, + ], + providers: [ + { provide: I18nService, useValue: i18nService }, + { provide: PlatformUtilsService, useValue: platformUtilsService }, + { provide: SendService, useValue: sendService }, + { provide: ToastService, useValue: toastService }, + { provide: Location, useValue: location }, + { provide: ActivatedRoute, useValue: activatedRoute }, + { provide: ConfigService, useValue: mock() }, + { provide: EnvironmentService, useValue: environmentService }, + { provide: PopupRouterCacheService, useValue: mock() }, + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SendCreatedComponent); + component = fixture.componentInstance; + }); + + it("should create", () => { + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); + + it("should initialize send and daysAvailable", () => { + fixture.detectChanges(); + expect(component["send"]).toBe(sendView); + expect(component["daysAvailable"]).toBe(7); + }); + + it("should navigate back on close", () => { + fixture.detectChanges(); + component.close(); + expect(location.back).toHaveBeenCalled(); + }); + + describe("getDaysAvailable", () => { + it("returns the correct number of days", () => { + fixture.detectChanges(); + expect(component.getDaysAvailable(sendView)).toBe(7); + }); + }); + + describe("copyLink", () => { + it("should copy link and show toast", async () => { + fixture.detectChanges(); + const link = "https://example.com/#/send/abc/123"; + + await component.copyLink(); + + expect(platformUtilsService.copyToClipboard).toHaveBeenCalledWith(link); + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "success", + title: null, + message: i18nService.t("sendLinkCopied"), + }); + }); + }); +}); diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts new file mode 100644 index 00000000000..92339774d05 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts @@ -0,0 +1,82 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { ActivatedRoute, RouterLink } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { ButtonModule, IconModule, ToastService } from "@bitwarden/components"; +import { SendCreatedIcon } from "@bitwarden/send-ui"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +@Component({ + selector: "app-send-created", + templateUrl: "./send-created.component.html", + standalone: true, + imports: [ + ButtonModule, + CommonModule, + JslibModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + RouterLink, + PopupFooterComponent, + IconModule, + ], +}) +export class SendCreatedComponent { + protected sendCreatedIcon = SendCreatedIcon; + protected send: SendView; + protected daysAvailable = 0; + + constructor( + private i18nService: I18nService, + private platformUtilsService: PlatformUtilsService, + private sendService: SendService, + private route: ActivatedRoute, + private toastService: ToastService, + private location: Location, + private environmentService: EnvironmentService, + ) { + const sendId = this.route.snapshot.queryParamMap.get("sendId"); + this.sendService.sendViews$.pipe(takeUntilDestroyed()).subscribe((sendViews) => { + this.send = sendViews.find((s) => s.id === sendId); + if (this.send) { + this.daysAvailable = this.getDaysAvailable(this.send); + } + }); + } + + getDaysAvailable(send: SendView): number { + const now = new Date().getTime(); + return Math.max(0, Math.ceil((send.deletionDate.getTime() - now) / (1000 * 60 * 60 * 24))); + } + + close() { + this.location.back(); + } + + async copyLink() { + if (!this.send || !this.send.accessId || !this.send.urlB64Key) { + return; + } + const env = await firstValueFrom(this.environmentService.environment$); + const link = env.getSendUrl() + this.send.accessId + "/" + this.send.urlB64Key; + this.platformUtilsService.copyToClipboard(link); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("sendLinkCopied"), + }); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts index 1c4519f4307..6cf2ba0e7d9 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts @@ -1,4 +1,4 @@ -import { CommonModule, Location } from "@angular/common"; +import { CommonModule } from "@angular/common"; import { Component, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormsModule } from "@angular/forms"; @@ -27,6 +27,7 @@ import { PopOutComponent } from "../../../../../platform/popup/components/pop-ou import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; import { PopupCloseWarningService } from "../../../../../popup/services/popup-close-warning.service"; import { BrowserCipherFormGenerationService } from "../../../services/browser-cipher-form-generation.service"; import { BrowserTotpCaptureService } from "../../../services/browser-totp-capture.service"; @@ -150,11 +151,11 @@ export class AddEditV2Component implements OnInit { constructor( private route: ActivatedRoute, - private location: Location, + private popupRouterCacheService: PopupRouterCacheService, private i18nService: I18nService, private addEditFormConfigService: CipherFormConfigService, - private router: Router, private popupCloseWarningService: PopupCloseWarningService, + private router: Router, ) { this.subscribeToParams(); } @@ -200,13 +201,7 @@ export class AddEditV2Component implements OnInit { return; } - if (history.length === 1) { - await this.router.navigate(["/view-cipher"], { - queryParams: { cipherId: this.originalCipherId }, - }); - } else { - this.location.back(); - } + await this.popupRouterCacheService.back(); } async onCipherSaved(cipher: CipherView) { diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html index b14e222bda3..58ad816bfc5 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html @@ -1,10 +1,5 @@ - + @@ -12,7 +7,7 @@ *ngIf="cipherId" [cipherId]="cipherId" [submitBtn]="submitButton" - (onUploadSuccess)="navigateToEditScreen()" + (onUploadSuccess)="navigateBack()" > diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts index a6258eaede1..ef430bbc176 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts @@ -10,12 +10,12 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CipherType } from "@bitwarden/common/vault/enums"; import { ButtonComponent } from "@bitwarden/components"; import { CipherAttachmentsComponent } from "@bitwarden/vault"; import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; import { AttachmentsV2Component } from "./attachments-v2.component"; @@ -44,16 +44,10 @@ describe("AttachmentsV2Component", () => { const queryParams = new BehaviorSubject<{ cipherId: string }>({ cipherId: "5555-444-3333" }); let cipherAttachment: CipherAttachmentsComponent; const navigate = jest.fn(); - - const cipherDomain = { - type: CipherType.Login, - name: "Test Login", - }; - - const cipherServiceGet = jest.fn().mockResolvedValue(cipherDomain); + const back = jest.fn().mockResolvedValue(undefined); beforeEach(async () => { - cipherServiceGet.mockClear(); + back.mockClear(); navigate.mockClear(); await TestBed.configureTestingModule({ @@ -62,6 +56,8 @@ describe("AttachmentsV2Component", () => { { provide: LogService, useValue: mock() }, { provide: ConfigService, useValue: mock() }, { provide: PlatformUtilsService, useValue: mock() }, + { provide: CipherService, useValue: mock() }, + { provide: PopupRouterCacheService, useValue: { back } }, { provide: I18nService, useValue: { t: (key: string) => key } }, { provide: Router, useValue: { navigate } }, { @@ -70,12 +66,6 @@ describe("AttachmentsV2Component", () => { queryParams, }, }, - { - provide: CipherService, - useValue: { - get: cipherServiceGet, - }, - }, ], }) .overrideComponent(AttachmentsV2Component, { @@ -115,9 +105,6 @@ describe("AttachmentsV2Component", () => { tick(); - expect(navigate).toHaveBeenCalledWith(["/edit-cipher"], { - queryParams: { cipherId: "5555-444-3333", type: CipherType.Login }, - replaceUrl: true, - }); + expect(back).toHaveBeenCalledTimes(1); })); }); diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts index 8e6b09bceda..09762767c81 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts @@ -1,12 +1,11 @@ -import { CommonModule, Location } from "@angular/common"; +import { CommonModule } from "@angular/common"; import { Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { ActivatedRoute, Router } from "@angular/router"; +import { ActivatedRoute } from "@angular/router"; import { first } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { CipherId } from "@bitwarden/common/types/guid"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { ButtonModule } from "@bitwarden/components"; import { CipherAttachmentsComponent } from "@bitwarden/vault"; @@ -14,6 +13,7 @@ import { PopOutComponent } from "../../../../../platform/popup/components/pop-ou import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; @Component({ standalone: true, @@ -38,9 +38,7 @@ export class AttachmentsV2Component { cipherId: CipherId; constructor( - private router: Router, - private cipherService: CipherService, - private location: Location, + private popupRouterCacheService: PopupRouterCacheService, route: ActivatedRoute, ) { route.queryParams.pipe(takeUntilDestroyed(), first()).subscribe(({ cipherId }) => { @@ -48,30 +46,8 @@ export class AttachmentsV2Component { }); } - /** - * Navigates to previous view or edit-cipher path - * depending on the history length. - * - * This can happen when history is lost due to the extension being - * forced into a popout window. - */ - async handleBackButton() { - if (history.length === 1) { - await this.navigateToEditScreen(); - } else { - this.location.back(); - } - } - /** Navigate the user back to the edit screen after uploading an attachment */ - async navigateToEditScreen() { - const cipherDomain = await this.cipherService.get(this.cipherId); - - void this.router.navigate(["/edit-cipher"], { - queryParams: { cipherId: this.cipherId, type: cipherDomain.type }, - // "replaceUrl" so the /attachments route is not in the history, thus when a back button - // is clicked, the user is taken to the view screen instead of the attachments screen - replaceUrl: true, - }); + async navigateBack() { + await this.popupRouterCacheService.back(); } } diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts index d819392e678..b028ffe5831 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts @@ -102,11 +102,10 @@ describe("OpenAttachmentsComponent", () => { await component.openAttachments(); - expect(router.navigate).not.toHaveBeenCalled(); - expect(openCurrentPagePopout).toHaveBeenCalledWith( - window, - "http:/localhost//attachments?cipherId=5555-444-3333", - ); + expect(router.navigate).toHaveBeenCalledWith(["/attachments"], { + queryParams: { cipherId: "5555-444-3333" }, + }); + expect(openCurrentPagePopout).toHaveBeenCalledWith(window); }); it("opens attachments in same window", async () => { diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts index 89d483c1d01..03c29d3f9fe 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts @@ -94,16 +94,13 @@ export class OpenAttachmentsComponent implements OnInit { return; } + await this.router.navigate(["/attachments"], { queryParams: { cipherId: this.cipherId } }); + + // Open the attachments page in a popout + // This is done after the router navigation to ensure that the navigation + // is included in the `PopupRouterCacheService` history if (this.openAttachmentsInPopout) { - const destinationUrl = this.router - .createUrlTree(["/attachments"], { queryParams: { cipherId: this.cipherId } }) - .toString(); - - const currentBaseUrl = window.location.href.replace(this.router.url, ""); - - await BrowserPopupUtils.openCurrentPagePopout(window, currentBaseUrl + destinationUrl); - } else { - await this.router.navigate(["/attachments"], { queryParams: { cipherId: this.cipherId } }); + await BrowserPopupUtils.openCurrentPagePopout(window); } } } diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index 04c4f554f38..8d0b695f7a4 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -13,6 +13,52 @@ if (process.env.NODE_ENV == null) { } const ENV = (process.env.ENV = process.env.NODE_ENV); const manifestVersion = process.env.MANIFEST_VERSION == 3 ? 3 : 2; +const browser = process.env.BROWSER; + +function modifyManifestV3(buffer) { + if (manifestVersion === 2 || !browser) { + return buffer; + } + + const manifest = JSON.parse(buffer.toString()); + + if (browser === "chrome") { + // Remove unsupported properties + delete manifest.applications; + delete manifest.sidebar_action; + delete manifest.commands._execute_sidebar_action; + + return JSON.stringify(manifest, null, 2); + } + + // Update the background script reference to be an event page + const backgroundScript = manifest.background.service_worker; + delete manifest.background.service_worker; + manifest.background.scripts = [backgroundScript]; + + // Remove unsupported properties + delete manifest.content_security_policy.sandbox; + delete manifest.sandbox; + delete manifest.applications; + + manifest.permissions = manifest.permissions.filter((permission) => permission !== "offscreen"); + + if (browser === "safari") { + delete manifest.sidebar_action; + delete manifest.commands._execute_sidebar_action; + delete manifest.optional_permissions; + manifest.permissions.push("nativeMessaging"); + } + + if (browser === "firefox") { + delete manifest.storage; + manifest.optional_permissions = manifest.optional_permissions.filter( + (permission) => permission !== "privacy", + ); + } + + return JSON.stringify(manifest, null, 2); +} console.log(`Building Manifest Version ${manifestVersion} app`); @@ -133,7 +179,11 @@ const plugins = [ new CopyWebpackPlugin({ patterns: [ manifestVersion == 3 - ? { from: "./src/manifest.v3.json", to: "manifest.json" } + ? { + from: "./src/manifest.v3.json", + to: "manifest.json", + transform: (content) => modifyManifestV3(content), + } : "./src/manifest.json", { from: "./src/managed_schema.json", to: "managed_schema.json" }, { from: "./src/_locales", to: "_locales" }, @@ -362,6 +412,20 @@ if (manifestVersion == 2) { plugins: [...requiredPlugins], }; + // Safari's desktop build process requires a background.html and vendor.js file to exist + // within the root of the extension. This is a workaround to allow us to build Safari + // for manifest v2 and v3 without modifying the desktop project structure. + if (browser === "safari") { + backgroundConfig.plugins.push( + new CopyWebpackPlugin({ + patterns: [ + { from: "./src/safari/mv3/fake-background.html", to: "background.html" }, + { from: "./src/safari/mv3/fake-vendor.js", to: "vendor.js" }, + ], + }), + ); + } + configs.push(mainConfig); configs.push(backgroundConfig); } diff --git a/apps/cli/package.json b/apps/cli/package.json index cb0c2a01678..00c810e0cc4 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -80,7 +80,7 @@ "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "6.1.38", + "tldts": "6.1.40", "zxcvbn": "4.4.2" } } diff --git a/apps/cli/stores/snap/snapcraft.yaml b/apps/cli/stores/snap/snapcraft.yaml index c79d8fc399c..adb35a66b1a 100644 --- a/apps/cli/stores/snap/snapcraft.yaml +++ b/apps/cli/stores/snap/snapcraft.yaml @@ -35,7 +35,7 @@ apps: command: bw environment: XDG_CONFIG_HOME: $SNAP_USER_DATA - plugs: [network, network-bind] + plugs: [network, network-bind, desktop] parts: bw: plugin: dump diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index e98aba8622d..0cc31277cee 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -282,6 +282,12 @@ dependencies = [ "piper", ] +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + [[package]] name = "cbc" version = "0.1.2" @@ -933,7 +939,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.48.5", ] [[package]] diff --git a/apps/desktop/desktop_native/core/Cargo.toml b/apps/desktop/desktop_native/core/Cargo.toml index bd95f1132a6..d8859208837 100644 --- a/apps/desktop/desktop_native/core/Cargo.toml +++ b/apps/desktop/desktop_native/core/Cargo.toml @@ -17,13 +17,13 @@ arboard = { version = "=3.4.0", default-features = false, features = [ ] } base64 = "=0.22.1" cbc = { version = "=0.1.2", features = ["alloc"] } -libc = "0.2.155" +libc = "=0.2.155" rand = "=0.8.5" retry = "=2.0.0" scopeguard = "=1.2.0" sha2 = "=0.10.8" thiserror = "=1.0.61" -tokio = { version = "1.38.0", features = ["io-util", "sync", "macros"] } +tokio = { version = "=1.38.0", features = ["io-util", "sync", "macros"] } typenum = "=1.17.0" [target.'cfg(windows)'.dependencies] @@ -51,5 +51,5 @@ security-framework-sys = "=2.11.0" [target.'cfg(target_os = "linux")'.dependencies] gio = "=0.19.5" libsecret = "=0.5.0" -zbus = "4.3.1" -zbus_polkit = "4.0.0" +zbus = "=4.3.1" +zbus_polkit = "=4.0.0" diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 71328fea199..15139a99296 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -25,7 +25,7 @@ "**/node_modules/argon2/package.json", "**/node_modules/argon2/build/Release/argon2.node" ], - "electronVersion": "31.3.1", + "electronVersion": "31.4.0", "generateUpdatesFilesForAllChannels": true, "publish": { "provider": "generic", diff --git a/apps/desktop/native-messaging-test-runner/package-lock.json b/apps/desktop/native-messaging-test-runner/package-lock.json index 0e3614f0782..14323142727 100644 --- a/apps/desktop/native-messaging-test-runner/package-lock.json +++ b/apps/desktop/native-messaging-test-runner/package-lock.json @@ -13,12 +13,12 @@ "@bitwarden/node": "file:../../../libs/node", "module-alias": "2.2.3", "node-ipc": "9.2.1", - "ts-node": "10.9.1", - "uuid": "9.0.0", + "ts-node": "10.9.2", + "uuid": "10.0.0", "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "20.14.8", + "@types/node": "20.16.1", "@types/node-ipc": "9.2.3", "typescript": "4.7.4" } @@ -98,12 +98,12 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/node": { - "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-ipc": { @@ -323,9 +323,10 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -377,14 +378,20 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", + "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==", + "license": "MIT" }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } diff --git a/apps/desktop/native-messaging-test-runner/package.json b/apps/desktop/native-messaging-test-runner/package.json index 95796591373..757ce74b59f 100644 --- a/apps/desktop/native-messaging-test-runner/package.json +++ b/apps/desktop/native-messaging-test-runner/package.json @@ -18,12 +18,12 @@ "@bitwarden/node": "file:../../../libs/node", "module-alias": "2.2.3", "node-ipc": "9.2.1", - "ts-node": "10.9.1", - "uuid": "9.0.0", + "ts-node": "10.9.2", + "uuid": "10.0.0", "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "20.14.8", + "@types/node": "20.16.1", "@types/node-ipc": "9.2.3", "typescript": "4.7.4" }, diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 923b1c54006..de0522d0e47 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -1511,13 +1511,13 @@ "message": "Əlavə Windows Hello ayarları" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Sistem kimlik doğrulaması ilə kilidi aç" }, "windowsHelloConsentMessage": { "message": "Bitwarden üçün doğrula." }, "polkitConsentMessage": { - "message": "Authenticate to unlock Bitwarden." + "message": "Bitwarden kilidini açmaq üçün kimliyi doğrula." }, "unlockWithTouchId": { "message": "Touch ID kilidini aç" @@ -1532,7 +1532,7 @@ "message": "Açılışda Windows Hello-nu soruşun" }, "autoPromptPolkit": { - "message": "Ask for system authentication on launch" + "message": "Açılışda sistem kimlik doğrulamasını tələb et" }, "autoPromptTouchId": { "message": "Açılışda Touch ID-ni soruşun" @@ -1814,10 +1814,10 @@ "message": "Brauzer biometrikləri, əvvəlcə ayarlarda masaüstü biometriklərinin qurulmasını tələb edir." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Avtomatik quraşdırma mövcud deyil" }, "biometricsManualSetupDesc": { - "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" + "message": "Quraşdırma üsuluna görə, biometrik dəstəyi avtomatik fəallaşdırıla bilmədi. Bunun necə manual edildiyi ilə bağlı sənədləşdirmələri açmaq istəyirsiniz?" }, "personalOwnershipSubmitError": { "message": "Müəssisə Siyasətinə görə, elementləri şəxsi anbarınızda saxlamağınız məhdudlaşdırılıb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mövcud kolleksiyalar arasından seçim edin." @@ -3045,9 +3045,9 @@ "message": "Data" }, "fileSends": { - "message": "File Sends" + "message": "Fayl \"Send\"ləri" }, "textSends": { - "message": "Text Sends" + "message": "Mətn \"Send\"ləri" } } diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 2ab8dfa806c..1c0854108e9 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -1511,13 +1511,13 @@ "message": "Další nastavení Windows Hello" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Odemknout pomocí systémového ověření" }, "windowsHelloConsentMessage": { "message": "Ověřte se pro Bitwarden." }, "polkitConsentMessage": { - "message": "Authenticate to unlock Bitwarden." + "message": "Ověřte se pro odemknutí Bitwardenu." }, "unlockWithTouchId": { "message": "Odemknout pomocí Touch ID" @@ -1532,7 +1532,7 @@ "message": "Požádat o Windows Hello při spuštění aplikace" }, "autoPromptPolkit": { - "message": "Ask for system authentication on launch" + "message": "Požádat o systémové ověření při spuštění" }, "autoPromptTouchId": { "message": "Požádat o Touch ID při spuštění aplikace" @@ -1814,10 +1814,10 @@ "message": "Biometrické prvky v prohlížeči vyžadují, aby byla nastavena biometrie nejprve v aplikaci pro počítač." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatické nastavení není k dispozici" }, "biometricsManualSetupDesc": { - "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" + "message": "Kvůli metodě instalace nelze automaticky povolit podporu biometrických prvků. Chcete otevřít dokumentaci o tom, jak to provést ručně?" }, "personalOwnershipSubmitError": { "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." @@ -3045,9 +3045,9 @@ "message": "Data" }, "fileSends": { - "message": "File Sends" + "message": "Sends se soubory" }, "textSends": { - "message": "Text Sends" + "message": "Sends s texty" } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 2026cfa9720..014d597113b 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -3045,9 +3045,9 @@ "message": "Δεδομένα" }, "fileSends": { - "message": "File Sends" + "message": "Send αρχείων" }, "textSends": { - "message": "Text Sends" + "message": "Send κειμένων" } } diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 14bd61a0922..c0f98f17535 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -1174,6 +1174,9 @@ "premiumPurchaseAlert": { "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a premium member!" }, diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 4180773f2b9..081d975c003 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -3045,9 +3045,9 @@ "message": "Podaci" }, "fileSends": { - "message": "File Sends" + "message": "Send datoteke" }, "textSends": { - "message": "Text Sends" + "message": "Send tekstovi" } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 12c0ae560a8..56062cd38b7 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -1511,13 +1511,13 @@ "message": "Kiegészítő Windows Hello beállítások" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Feloldás rendszer hitelesítéssel" }, "windowsHelloConsentMessage": { "message": "Bitwarden ellenőrzés." }, "polkitConsentMessage": { - "message": "Authenticate to unlock Bitwarden." + "message": "Hitelesítés a Bitwarden feloldásához." }, "unlockWithTouchId": { "message": "Feloldás Touch ID segítségével" @@ -1532,7 +1532,7 @@ "message": "Windows Hello kérése indításkor" }, "autoPromptPolkit": { - "message": "Ask for system authentication on launch" + "message": "Rendszer hiteletesítés bekérése indításkor" }, "autoPromptTouchId": { "message": "Érintés AZ kérése indításkor" @@ -1814,10 +1814,10 @@ "message": "A böngésző biometrikus adataihoz először az asztali biometrikus adatokat kell engedélyezni a beállításokban." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Az automatikus beüzemelés nem érhető el." }, "biometricsManualSetupDesc": { - "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" + "message": "A telepítési mód miatt a biometrikus adatok támogatása nem volt automatikusan engedélyezhető. Szeretnénk megnyitni a dokumentációt arról, hogyan kell ezt manuálisan megtenni?" }, "personalOwnershipSubmitError": { "message": "Egy vállalati házirend miatt korlátozásra került az elemek személyes tárolóba történő mentése. Módosítsuk a Tulajdon opciót egy szervezetre és válasszunk az elérhető gyűjtemények közül." @@ -3045,9 +3045,9 @@ "message": "Adat" }, "fileSends": { - "message": "File Sends" + "message": "Fájl küldés" }, "textSends": { - "message": "Text Sends" + "message": "Szöveg küldés" } } diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 6480f8dadae..79d33226692 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -503,7 +503,7 @@ "message": "Jāiestata droša parole" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Jāpabeidz sava konta izveida ar paroles iestatīšanu" + "message": "Sava konta izveidošana jāpabeidz ar paroles iestatīšanu" }, "logIn": { "message": "Pieteikties" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 13ec3acf231..d21a17c0359 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -1511,13 +1511,13 @@ "message": "Додатна подешавања Windows Hello" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Откључати системском аутентификацијом" }, "windowsHelloConsentMessage": { "message": "Потврди за Bitwarden." }, "polkitConsentMessage": { - "message": "Authenticate to unlock Bitwarden." + "message": "Аутентификујте се да бисте откључали Bitwarden." }, "unlockWithTouchId": { "message": "Откључај са Touch ID" @@ -1532,7 +1532,7 @@ "message": "Захтевај Windows Hello при покретању" }, "autoPromptPolkit": { - "message": "Ask for system authentication on launch" + "message": "Затражите аутентификацију система при покретању" }, "autoPromptTouchId": { "message": "Захтевај Touch ID при покретању" @@ -1814,10 +1814,10 @@ "message": "Биометрија прегледача захтева да у поставкама прво буде омогућена биометрија desktop-а." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Аутоматско подешавање није доступно" }, "biometricsManualSetupDesc": { - "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" + "message": "Због начина инсталације, подршка за биометрију није могла бити аутоматски омогућена. Да ли желите да отворите документацију о томе како то да ручно урадите?" }, "personalOwnershipSubmitError": { "message": "Због смерница за предузећа, ограничено вам је чување предмета у вашем личном трезору. Промените опцију власништва у организацију и изаберите из доступних колекција." @@ -3045,9 +3045,9 @@ "message": "Подаци" }, "fileSends": { - "message": "File Sends" + "message": "Датотека „Send“" }, "textSends": { - "message": "Text Sends" + "message": "Текст „Send“" } } diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index 77528994a41..deb370201ff 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -120,13 +120,15 @@ export class WindowMain { } } - this.logService.info( - "Disabling external memory dumps & debugger access in main process", - ); - try { - await processisolations.disableMemoryAccess(); - } catch (e) { - this.logService.error("Failed to disable memory access", e); + // this currently breaks the file portal, so should only be used when + // no files are needed but security requirements are super high https://github.com/flatpak/xdg-desktop-portal/issues/785 + if (process.env.EXPERIMENTAL_PREVENT_DEBUGGER_MEMORY_ACCESS === "true") { + this.logService.info("Disabling memory dumps in main process"); + try { + await processisolations.disableMemoryAccess(); + } catch (e) { + this.logService.error("Failed to disable memory dumps", e); + } } } diff --git a/apps/desktop/src/services/native-messaging.service.ts b/apps/desktop/src/services/native-messaging.service.ts index 5980fade839..4137c4e680f 100644 --- a/apps/desktop/src/services/native-messaging.service.ts +++ b/apps/desktop/src/services/native-messaging.service.ts @@ -3,6 +3,7 @@ import { firstValueFrom, map } from "rxjs"; 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"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -177,7 +178,17 @@ export class NativeMessagingService { }, appId, ); - await ipc.platform.reloadProcess(); + + const currentlyActiveAccountId = ( + await firstValueFrom(this.accountService.activeAccount$) + ).id; + const isCurrentlyActiveAccountUnlocked = + (await this.authService.getAuthStatus(userId)) == AuthenticationStatus.Unlocked; + + // prevent proc reloading an active account, when it is the same as the browser + if (currentlyActiveAccountId != message.userId || !isCurrentlyActiveAccountUnlocked) { + await ipc.platform.reloadProcess(); + } } else { await this.send({ command: "biometricUnlock", response: "canceled" }, appId); } diff --git a/apps/desktop/src/vault/app/accounts/premium.component.ts b/apps/desktop/src/vault/app/accounts/premium.component.ts index 8b3d9e11f02..373e5d88177 100644 --- a/apps/desktop/src/vault/app/accounts/premium.component.ts +++ b/apps/desktop/src/vault/app/accounts/premium.component.ts @@ -3,6 +3,7 @@ import { Component } from "@angular/core"; import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -19,6 +20,7 @@ export class PremiumComponent extends BasePremiumComponent { i18nService: I18nService, platformUtilsService: PlatformUtilsService, apiService: ApiService, + configService: ConfigService, logService: LogService, stateService: StateService, dialogService: DialogService, @@ -29,8 +31,8 @@ export class PremiumComponent extends BasePremiumComponent { i18nService, platformUtilsService, apiService, + configService, logService, - stateService, dialogService, environmentService, billingAccountProfileStateService, diff --git a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html index 11c1ab2d2e3..ec1728c8836 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html @@ -42,6 +42,7 @@ rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" href="https://bitwarden.com/help/user-types-access-control/" + slot="end" > diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts index f44b5d251ec..3e551a84753 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts @@ -1,7 +1,7 @@ import { importProvidersFrom } from "@angular/core"; import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; import { action } from "@storybook/addon-actions"; -import { applicationConfig, Meta, moduleMetadata, Story } from "@storybook/angular"; +import { applicationConfig, Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { @@ -55,6 +55,9 @@ export default { }, } as Meta; +// TODO: This is a workaround since this story does weird things. +type Story = StoryObj; + const actionsData = { onValueChanged: action("onValueChanged"), onSubmit: action("onSubmit"), @@ -99,9 +102,8 @@ const itemsFactory = (n: number, type: AccessItemType) => { const sampleMembers = itemsFactory(10, AccessItemType.Member); const sampleGroups = itemsFactory(6, AccessItemType.Group); -const StandaloneAccessSelectorTemplate: Story = ( - args: AccessSelectorComponent, -) => ({ +// TODO: These renders are badly handled but storybook has made it more difficult to use multiple renders in a single story. +const StandaloneAccessSelectorRender = (args: any) => ({ props: { items: [], valueChanged: actionsData.onValueChanged, @@ -109,25 +111,23 @@ const StandaloneAccessSelectorTemplate: Story = ( ...args, }, template: ` - -`, + + `, }); -const DialogAccessSelectorTemplate: Story = ( - args: AccessSelectorComponent, -) => ({ +const DialogAccessSelectorRender = (args: any) => ({ props: { items: [], valueChanged: actionsData.onValueChanged, @@ -164,7 +164,7 @@ const DialogAccessSelectorTemplate: Story = ( aria-label="Delete"> -`, + `, }); const dialogAccessItems = itemsFactory(10, AccessItemType.Collection); @@ -190,153 +190,115 @@ const memberCollectionAccessItems = itemsFactory(3, AccessItemType.Collection).c }, ]); -export const Dialog = DialogAccessSelectorTemplate.bind({}); -Dialog.args = { - permissionMode: "edit", - showMemberRoles: false, - showGroupColumn: true, - columnHeader: "Collection", - selectorLabelText: "Select Collections", - selectorHelpText: "Some helper text describing what this does", - emptySelectionText: "No collections added", - disabled: false, - initialValue: [], - items: dialogAccessItems, -}; -Dialog.story = { - parameters: { - docs: { - storyDescription: ` - Example of an access selector for modifying the collections a member has access to inside of a dialog. - `, - }, +export const Dialog: Story = { + args: { + permissionMode: "edit", + showMemberRoles: false, + showGroupColumn: true, + columnHeader: "Collection", + selectorLabelText: "Select Collections", + selectorHelpText: "Some helper text describing what this does", + emptySelectionText: "No collections added", + disabled: false, + initialValue: [] as any[], + items: dialogAccessItems, }, + render: DialogAccessSelectorRender, }; -export const MemberCollectionAccess = StandaloneAccessSelectorTemplate.bind({}); -MemberCollectionAccess.args = { - permissionMode: "edit", - showMemberRoles: false, - showGroupColumn: true, - columnHeader: "Collection", - selectorLabelText: "Select Collections", - selectorHelpText: "Some helper text describing what this does", - emptySelectionText: "No collections added", - disabled: false, - initialValue: [], - items: memberCollectionAccessItems, -}; -MemberCollectionAccess.story = { - parameters: { - docs: { - storyDescription: ` - Example of an access selector for modifying the collections a member has access to. - Includes examples of a readonly group and member that cannot be edited. - `, - }, +export const MemberCollectionAccess: Story = { + args: { + permissionMode: "edit", + showMemberRoles: false, + showGroupColumn: true, + columnHeader: "Collection", + selectorLabelText: "Select Collections", + selectorHelpText: "Some helper text describing what this does", + emptySelectionText: "No collections added", + disabled: false, + initialValue: [], + items: memberCollectionAccessItems, }, + render: StandaloneAccessSelectorRender, }; -export const MemberGroupAccess = StandaloneAccessSelectorTemplate.bind({}); -MemberGroupAccess.args = { - permissionMode: "readonly", - showMemberRoles: false, - columnHeader: "Groups", - selectorLabelText: "Select Groups", - selectorHelpText: "Some helper text describing what this does", - emptySelectionText: "No groups added", - disabled: false, - initialValue: [{ id: "3g" }, { id: "0g" }], - items: itemsFactory(4, AccessItemType.Group).concat([ - { - id: "admin", - type: AccessItemType.Group, - listName: "Admin Group", - labelName: "Admin Group", - }, - ]), -}; -MemberGroupAccess.story = { - parameters: { - docs: { - storyDescription: ` - Example of an access selector for selecting which groups an individual member belongs too. - `, - }, +export const MemberGroupAccess: Story = { + args: { + permissionMode: "readonly", + showMemberRoles: false, + columnHeader: "Groups", + selectorLabelText: "Select Groups", + selectorHelpText: "Some helper text describing what this does", + emptySelectionText: "No groups added", + disabled: false, + initialValue: [{ id: "3g" }, { id: "0g" }], + items: itemsFactory(4, AccessItemType.Group).concat([ + { + id: "admin", + type: AccessItemType.Group, + listName: "Admin Group", + labelName: "Admin Group", + }, + ]), }, + render: StandaloneAccessSelectorRender, }; -export const GroupMembersAccess = StandaloneAccessSelectorTemplate.bind({}); -GroupMembersAccess.args = { - permissionMode: "hidden", - showMemberRoles: true, - columnHeader: "Members", - selectorLabelText: "Select Members", - selectorHelpText: "Some helper text describing what this does", - emptySelectionText: "No members added", - disabled: false, - initialValue: [{ id: "2m" }, { id: "0m" }], - items: sampleMembers, -}; -GroupMembersAccess.story = { - parameters: { - docs: { - storyDescription: ` - Example of an access selector for selecting which members belong to an specific group. - `, - }, +export const GroupMembersAccess: Story = { + args: { + permissionMode: "hidden", + showMemberRoles: true, + columnHeader: "Members", + selectorLabelText: "Select Members", + selectorHelpText: "Some helper text describing what this does", + emptySelectionText: "No members added", + disabled: false, + initialValue: [{ id: "2m" }, { id: "0m" }], + items: sampleMembers, }, + render: StandaloneAccessSelectorRender, }; -export const CollectionAccess = StandaloneAccessSelectorTemplate.bind({}); -CollectionAccess.args = { - permissionMode: "edit", - showMemberRoles: false, - columnHeader: "Groups/Members", - selectorLabelText: "Select groups and members", - selectorHelpText: - "Permissions set for a member will replace permissions set by that member's group", - emptySelectionText: "No members or groups added", - disabled: false, - initialValue: [ - { id: "3g", permission: CollectionPermission.EditExceptPass }, - { id: "0m", permission: CollectionPermission.View }, - ], - items: sampleGroups.concat(sampleMembers).concat([ - { - id: "admin-group", - type: AccessItemType.Group, - listName: "Admin Group", - labelName: "Admin Group", - readonly: true, - }, - { - id: "admin-member", - type: AccessItemType.Member, - listName: "Admin Member (admin@email.com)", - labelName: "Admin Member", - status: OrganizationUserStatusType.Confirmed, - role: OrganizationUserType.Admin, - email: "admin@email.com", - readonly: true, - }, - ]), -}; -GroupMembersAccess.story = { - parameters: { - docs: { - storyDescription: ` - Example of an access selector for selecting which members/groups have access to a specific collection. - `, - }, +export const CollectionAccess: Story = { + args: { + permissionMode: "edit", + showMemberRoles: false, + columnHeader: "Groups/Members", + selectorLabelText: "Select groups and members", + selectorHelpText: + "Permissions set for a member will replace permissions set by that member's group", + emptySelectionText: "No members or groups added", + disabled: false, + initialValue: [ + { id: "3g", permission: CollectionPermission.EditExceptPass }, + { id: "0m", permission: CollectionPermission.View }, + ], + items: sampleGroups.concat(sampleMembers).concat([ + { + id: "admin-group", + type: AccessItemType.Group, + listName: "Admin Group", + labelName: "Admin Group", + readonly: true, + }, + { + id: "admin-member", + type: AccessItemType.Member, + listName: "Admin Member (admin@email.com)", + labelName: "Admin Member", + status: OrganizationUserStatusType.Confirmed, + role: OrganizationUserType.Admin, + email: "admin@email.com", + readonly: true, + }, + ]), }, + render: StandaloneAccessSelectorRender, }; const fb = new FormBuilder(); -const ReactiveFormAccessSelectorTemplate: Story = ( - args: AccessSelectorComponent, -) => ({ +const ReactiveFormAccessSelectorRender = (args: any) => ({ props: { items: [], onSubmit: actionsData.onSubmit, @@ -344,30 +306,32 @@ const ReactiveFormAccessSelectorTemplate: Story = ( }, template: `
- - + +
`, }); -export const ReactiveForm = ReactiveFormAccessSelectorTemplate.bind({}); -ReactiveForm.args = { - formObj: fb.group({ formItems: [[{ id: "1g" }]] }), - permissionMode: "edit", - showMemberRoles: false, - columnHeader: "Groups/Members", - selectorLabelText: "Select groups and members", - selectorHelpText: - "Permissions set for a member will replace permissions set by that member's group", - emptySelectionText: "No members or groups added", - items: sampleGroups.concat(sampleMembers), +export const ReactiveForm: Story = { + args: { + formObj: fb.group({ formItems: [[{ id: "1g" }]] }), + permissionMode: "edit", + showMemberRoles: false, + columnHeader: "Groups/Members", + selectorLabelText: "Select groups and members", + selectorHelpText: + "Permissions set for a member will replace permissions set by that member's group", + emptySelectionText: "No members or groups added", + items: sampleGroups.concat(sampleMembers), + }, + render: ReactiveFormAccessSelectorRender, }; diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html index 1e61585e422..293c5051ce9 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html @@ -23,6 +23,7 @@ linkType="primary" appA11yTitle="{{ 'learnMore' | i18n }}" href="https://bitwarden.com/help/emergency-access/#user-access" + slot="end" > diff --git a/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html b/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html index 4442310faca..478cd77eb6c 100644 --- a/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html +++ b/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html @@ -22,6 +22,7 @@ target="_blank" rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" + slot="end" > @@ -57,6 +58,7 @@ target="_blank" rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" + slot="end" > diff --git a/apps/web/src/app/billing/organizations/download-license.component.html b/apps/web/src/app/billing/organizations/download-license.component.html index 33a534bacf7..b54cdda1f78 100644 --- a/apps/web/src/app/billing/organizations/download-license.component.html +++ b/apps/web/src/app/billing/organizations/download-license.component.html @@ -14,6 +14,7 @@ rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" href="https://bitwarden.com/help/licensing-on-premise/#organization-account-sharing" + slot="end" > diff --git a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html index 383013dd563..0a029de79dc 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html @@ -82,6 +82,8 @@ href="https://bitwarden.com/help/families-for-enterprise-self-hosted/" target="_blank" rel="noreferrer" + slot="end" + bitLink > {{ "billingSyncHelp" | i18n }} diff --git a/apps/web/src/app/settings/preferences.component.html b/apps/web/src/app/settings/preferences.component.html index 876c5d3bdea..ffd55e69c88 100644 --- a/apps/web/src/app/settings/preferences.component.html +++ b/apps/web/src/app/settings/preferences.component.html @@ -57,6 +57,7 @@ target="_blank" rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" + slot="end" > @@ -76,6 +77,7 @@ target="_blank" rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" + slot="end" > diff --git a/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts b/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts index 4088b7335cd..b9f65f2339e 100644 --- a/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts +++ b/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts @@ -1,6 +1,6 @@ import { importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; import { delay, of, startWith } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -26,60 +26,61 @@ export default { ], }), ], + render: (args) => ({ + props: { + createServiceAccount: false, + importSecrets$: of(false), + createSecret: false, + createProject: false, + ...args, + }, + template: ` + + + + {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} + + + + + + + `, + }), } as Meta; -const Template: Story = (args) => ({ - props: { - createServiceAccount: false, - importSecrets$: of(false), - createSecret: false, - createProject: false, - ...args, +type Story = StoryObj; + +export const Empty: Story = {}; + +export const Partial = { + args: { + createServiceAccount: true, + createProject: true, }, - template: ` - - - - {{ "downloadThe" | i18n }} {{ "smCLI" | i18n }} - - - - - - - `, -}); - -export const Empty = Template.bind({}); - -export const Partial = Template.bind({}); -Partial.args = { - ...Template.args, - createServiceAccount: true, - createProject: true, }; -export const Full = Template.bind({}); -Full.args = { - ...Template.args, - createServiceAccount: true, - createProject: true, - createSecret: true, - importSecrets$: of(true).pipe(delay(0), startWith(false)), +export const Full = { + args: { + createServiceAccount: true, + createProject: true, + createSecret: true, + importSecrets$: of(true).pipe(delay(0), startWith(false)), + }, }; diff --git a/apps/web/src/app/tools/reports/pages/breach-report.component.html b/apps/web/src/app/tools/reports/pages/breach-report.component.html index f975d9fd2af..fcfd37fef3f 100644 --- a/apps/web/src/app/tools/reports/pages/breach-report.component.html +++ b/apps/web/src/app/tools/reports/pages/breach-report.component.html @@ -12,25 +12,25 @@ {{ "checkBreaches" | i18n }} -
+

{{ "reportError" | i18n }}...

- + {{ "breachUsernameNotFound" | i18n: checkedUsername }} - - + + {{ "breachUsernameFound" | i18n: checkedUsername : breachedAccounts.length }} - +
  • -
    +
    -

    {{ a.title }}

    +

    {{ a.title }}

    -

    {{ "compromisedData" | i18n }}:

    +

    {{ "compromisedData" | i18n }}:

    • {{ d }}
    diff --git a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts index b6a34cf2518..7d4309b7bc6 100644 --- a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts @@ -98,15 +98,13 @@ export class CipherReportComponent implements OnDestroy { async filterOrgToggle(status: any) { this.currentFilterStatus = status; - await this.setCiphers(); if (status === 0) { - return; + this.dataSource.filter = null; } else if (status === 1) { - this.ciphers = this.ciphers.filter((c: any) => c.orgFilterStatus == null); + this.dataSource.filter = (c: any) => c.orgFilterStatus == null; } else { - this.ciphers = this.ciphers.filter((c: any) => c.orgFilterStatus === status); + this.dataSource.filter = (c: any) => c.orgFilterStatus === status; } - this.dataSource.data = this.ciphers; } async load() { diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html index fd9fc71c07f..09c717e9131 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html @@ -5,7 +5,7 @@ -
    +
    {{ "noExposedPasswords" | i18n }} @@ -26,20 +26,21 @@ - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} + + + {{ "name" | i18n }} + {{ "owner" | i18n }} + - + - + {{ r.subTitle }} - + - + {{ "exposedXTimes" | i18n: (exposedPasswordMap.get(r.id) | number) }} diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html index ef003287d1f..ae2f0988e5b 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html @@ -4,13 +4,13 @@

    {{ "inactive2faReportDesc" | i18n }}

    {{ "loading" | i18n }}
    -
    +
    {{ "noInactive2fa" | i18n }} @@ -31,21 +31,22 @@ - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} + + + {{ "name" | i18n }} + {{ "owner" | i18n }} + - + - + {{ r.subTitle }} - + - + {{ "reusedPasswordsReportDesc" | i18n }}

    {{ "loading" | i18n }}
    -
    +
    {{ "noReusedPasswords" | i18n }} @@ -33,20 +33,21 @@ - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} + + + {{ "name" | i18n }} + {{ "owner" | i18n }} + - + - + {{ r.subTitle }} - + - + {{ "reusedXTimes" | i18n: passwordUseMap.get(r.login.password) }} diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html index 2f4bdd6a1d4..2d4a4f0d445 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html @@ -4,13 +4,13 @@

    {{ "unsecuredWebsitesReportDesc" | i18n }}

    {{ "loading" | i18n }}
    -
    +
    {{ "noUnsecuredWebsites" | i18n }} @@ -32,20 +32,21 @@ - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} + + + {{ "name" | i18n }} + {{ "owner" | i18n }} + - + - + {{ r.name }} @@ -70,7 +71,7 @@
    {{ r.subTitle }} - + {{ "weakPasswordsReportDesc" | i18n }}

    {{ "loading" | i18n }}
    -
    +
    {{ "noWeakPasswords" | i18n }} @@ -31,20 +31,21 @@ - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} + + + {{ "name" | i18n }} + {{ "owner" | i18n }} + - + - + {{ r.subTitle }} - + - + {{ passwordStrengthMap.get(r.id)[0] | i18n }} diff --git a/apps/web/src/app/tools/reports/reports-layout.component.html b/apps/web/src/app/tools/reports/reports-layout.component.html index 7d8988c8287..e011d47d7aa 100644 --- a/apps/web/src/app/tools/reports/reports-layout.component.html +++ b/apps/web/src/app/tools/reports/reports-layout.component.html @@ -1,9 +1,8 @@ -
    +
    diff --git a/apps/web/src/app/tools/reports/shared/report-card/report-card.stories.ts b/apps/web/src/app/tools/reports/shared/report-card/report-card.stories.ts index 7f7d0ae9780..8048d0dcefa 100644 --- a/apps/web/src/app/tools/reports/shared/report-card/report-card.stories.ts +++ b/apps/web/src/app/tools/reports/shared/report-card/report-card.stories.ts @@ -1,6 +1,6 @@ import { importProvidersFrom } from "@angular/core"; import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { BadgeModule, IconModule } from "@bitwarden/components"; @@ -32,18 +32,18 @@ export default { }, } as Meta; -const Template: Story = (args: ReportCardComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Enabled = Template.bind({}); +export const Enabled: Story = {}; -export const RequiresPremium = Template.bind({}); -RequiresPremium.args = { - variant: ReportVariant.RequiresPremium, +export const RequiresPremium: Story = { + args: { + variant: ReportVariant.RequiresPremium, + }, }; -export const RequiresUpgrade = Template.bind({}); -RequiresUpgrade.args = { - variant: ReportVariant.RequiresUpgrade, +export const RequiresUpgrade: Story = { + args: { + variant: ReportVariant.RequiresUpgrade, + }, }; diff --git a/apps/web/src/app/tools/reports/shared/report-list/report-list.stories.ts b/apps/web/src/app/tools/reports/shared/report-list/report-list.stories.ts index 7eba2c0300a..196c0994cd9 100644 --- a/apps/web/src/app/tools/reports/shared/report-list/report-list.stories.ts +++ b/apps/web/src/app/tools/reports/shared/report-list/report-list.stories.ts @@ -1,6 +1,6 @@ import { importProvidersFrom } from "@angular/core"; import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { BadgeModule, IconModule } from "@bitwarden/components"; @@ -34,8 +34,6 @@ export default { }, } as Meta; -const Template: Story = (args: ReportListComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/apps/web/src/app/tools/send/add-edit.component.html b/apps/web/src/app/tools/send/add-edit.component.html index 500100afd49..7eade18a7c6 100644 --- a/apps/web/src/app/tools/send/add-edit.component.html +++ b/apps/web/src/app/tools/send/add-edit.component.html @@ -39,6 +39,7 @@ @@ -196,6 +197,7 @@ (click)="clearExpiration()" *ngIf="!disableSend" class="tw-ml-auto" + slot="end" > {{ "clear" | i18n }} diff --git a/apps/web/src/app/vault/components/premium-badge.stories.ts b/apps/web/src/app/vault/components/premium-badge.stories.ts index c61bbb46a5e..17622dbbd5f 100644 --- a/apps/web/src/app/vault/components/premium-badge.stories.ts +++ b/apps/web/src/app/vault/components/premium-badge.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { of } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -47,9 +47,6 @@ export default { ], } as Meta; -const Template: Story = (args: PremiumBadgeComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Primary = Template.bind({}); -Primary.args = {}; +export const Primary: Story = {}; diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index 0e515a307c6..524d9dff20b 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -19,11 +19,12 @@ class="tw-overflow-hidden tw-text-ellipsis tw-text-start tw-leading-snug" [disabled]="disabled" [routerLink]="[]" - [queryParams]="{ itemId: cipher.id }" + [queryParams]="{ itemId: cipher.id, action: extensionRefreshEnabled ? 'view' : null }" queryParamsHandling="merge" title="{{ 'editItemWithName' | i18n: cipher.name }}" type="button" appStopProp + aria-haspopup="true" > {{ cipher.name }} diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts index db6d04c2373..72d6a57aad4 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts @@ -1,6 +1,9 @@ -import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { firstValueFrom } from "rxjs"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; @@ -12,9 +15,14 @@ import { RowHeightClass } from "./vault-items.component"; selector: "tr[appVaultCipherRow]", templateUrl: "vault-cipher-row.component.html", }) -export class VaultCipherRowComponent { +export class VaultCipherRowComponent implements OnInit { protected RowHeightClass = RowHeightClass; + /** + * Flag to determine if the extension refresh feature flag is enabled. + */ + protected extensionRefreshEnabled = false; + @Input() disabled: boolean; @Input() cipher: CipherView; @Input() showOwner: boolean; @@ -36,6 +44,18 @@ export class VaultCipherRowComponent { protected CipherType = CipherType; + constructor(private configService: ConfigService) {} + + /** + * Lifecycle hook for component initialization. + * Checks if the extension refresh feature flag is enabled to provide to template. + */ + async ngOnInit(): Promise { + this.extensionRefreshEnabled = await firstValueFrom( + this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), + ); + } + protected get showTotpCopyButton() { return ( (this.cipher.login?.hasTotp ?? false) && diff --git a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts index c7cc85a37b7..bf0fa3aaef4 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts @@ -1,6 +1,6 @@ import { importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { applicationConfig, Meta, moduleMetadata, Story } from "@storybook/angular"; +import { applicationConfig, Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { BehaviorSubject, of } from "rxjs"; import { OrganizationUserType } from "@bitwarden/common/admin-console/enums"; @@ -118,138 +118,136 @@ export default { argTypes: { onEvent: { action: "onEvent" } }, } as Meta; -const Template: Story = (args: VaultItemsComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Individual = Template.bind({}); -Individual.args = { - ciphers, - collections: [], - showOwner: true, - showCollections: false, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: true, - showBulkTrashOptions: false, - useEvents: false, - cloneableOrganizationCiphers: false, +export const Individual: Story = { + args: { + ciphers, + collections: [], + showOwner: true, + showCollections: false, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: true, + showBulkTrashOptions: false, + useEvents: false, + }, }; -export const IndividualDisabled = Template.bind({}); -IndividualDisabled.args = { - ciphers, - collections: [], - disabled: true, - showOwner: true, - showCollections: false, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: true, - showBulkTrashOptions: false, - useEvents: false, - cloneableOrganizationCiphers: false, +export const IndividualDisabled: Story = { + args: { + ciphers, + collections: [], + disabled: true, + showOwner: true, + showCollections: false, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: true, + showBulkTrashOptions: false, + useEvents: false, + }, }; -export const IndividualTrash = Template.bind({}); -IndividualTrash.args = { - ciphers: deletedCiphers, - collections: [], - showOwner: true, - showCollections: false, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: true, - useEvents: false, - cloneableOrganizationCiphers: false, +export const IndividualTrash: Story = { + args: { + ciphers: deletedCiphers, + collections: [], + showOwner: true, + showCollections: false, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: true, + useEvents: false, + }, }; -export const IndividualTopLevelCollection = Template.bind({}); -IndividualTopLevelCollection.args = { - ciphers: [], - collections, - showOwner: true, - showCollections: false, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: false, - useEvents: false, - cloneableOrganizationCiphers: false, +export const IndividualTopLevelCollection: Story = { + args: { + ciphers: [], + collections, + showOwner: true, + showCollections: false, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: false, + useEvents: false, + }, }; -export const IndividualSecondLevelCollection = Template.bind({}); -IndividualSecondLevelCollection.args = { - ciphers, - collections, - showOwner: true, - showCollections: false, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: true, - showBulkTrashOptions: false, - useEvents: false, - cloneableOrganizationCiphers: false, +export const IndividualSecondLevelCollection: Story = { + args: { + ciphers, + collections, + showOwner: true, + showCollections: false, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: true, + showBulkTrashOptions: false, + useEvents: false, + }, }; -export const OrganizationVault = Template.bind({}); -OrganizationVault.args = { - ciphers: organizationOnlyCiphers, - collections: [], - showOwner: false, - showCollections: true, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: false, - useEvents: true, - cloneableOrganizationCiphers: true, +export const OrganizationVault: Story = { + args: { + ciphers: organizationOnlyCiphers, + collections: [], + showOwner: false, + showCollections: true, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: false, + useEvents: true, + }, }; -export const OrganizationTrash = Template.bind({}); -OrganizationTrash.args = { - ciphers: deletedOrganizationOnlyCiphers, - collections: [], - showOwner: false, - showCollections: true, - showGroups: false, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: true, - useEvents: true, - cloneableOrganizationCiphers: true, +export const OrganizationTrash: Story = { + args: { + ciphers: deletedOrganizationOnlyCiphers, + collections: [], + showOwner: false, + showCollections: true, + showGroups: false, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: true, + useEvents: true, + }, }; const unassignedCollection = new CollectionAdminView(); unassignedCollection.id = Unassigned; unassignedCollection.name = "Unassigned"; -export const OrganizationTopLevelCollection = Template.bind({}); -OrganizationTopLevelCollection.args = { - ciphers: [], - collections: collections.concat(unassignedCollection), - showOwner: false, - showCollections: false, - showGroups: true, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: false, - useEvents: true, - cloneableOrganizationCiphers: true, +export const OrganizationTopLevelCollection: Story = { + args: { + ciphers: [], + collections: collections.concat(unassignedCollection), + showOwner: false, + showCollections: false, + showGroups: true, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: false, + useEvents: true, + }, }; -export const OrganizationSecondLevelCollection = Template.bind({}); -OrganizationSecondLevelCollection.args = { - ciphers: organizationOnlyCiphers, - collections, - showOwner: false, - showCollections: false, - showGroups: true, - showPremiumFeatures: true, - showBulkMove: false, - showBulkTrashOptions: false, - useEvents: true, - cloneableOrganizationCiphers: true, +export const OrganizationSecondLevelCollection: Story = { + args: { + ciphers: organizationOnlyCiphers, + collections, + showOwner: false, + showCollections: false, + showGroups: true, + showPremiumFeatures: true, + showBulkMove: false, + showBulkTrashOptions: false, + useEvents: true, + }, }; function createCipherView(i: number, deleted = false): CipherView { diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index 77fd63a65f7..5a4a6794f3d 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -109,6 +109,11 @@ import { FolderFilter, OrganizationFilter } from "./vault-filter/shared/models/v import { VaultFilterModule } from "./vault-filter/vault-filter.module"; import { VaultHeaderComponent } from "./vault-header/vault-header.component"; import { VaultOnboardingComponent } from "./vault-onboarding/vault-onboarding.component"; +import { + openViewCipherDialog, + ViewCipherDialogCloseResult, + ViewCipherDialogResult, +} from "./view.component"; const BroadcasterSubscriptionId = "VaultComponent"; const SearchTextDebounceInterval = 200; @@ -215,6 +220,8 @@ export class VaultComponent implements OnInit, OnDestroy { cipherView.id = cipherId; if (params.action === "clone") { await this.cloneCipher(cipherView); + } else if (params.action === "view") { + await this.viewCipher(cipherView); } else if (params.action === "edit") { await this.editCipher(cipherView); } @@ -336,9 +343,14 @@ export class VaultComponent implements OnInit, OnDestroy { switchMap(() => this.route.queryParams), switchMap(async (params) => { const cipherId = getCipherIdFromParams(params); + if (cipherId) { - if ((await this.cipherService.get(cipherId)) != null) { - await this.editCipherId(cipherId); + if (await this.cipherService.get(cipherId)) { + if (params.action === "view") { + await this.viewCipherById(cipherId); + } else { + await this.editCipherId(cipherId); + } } else { this.toastService.showToast({ variant: "error", @@ -626,7 +638,7 @@ export class VaultComponent implements OnInit, OnDestroy { !(await this.passwordRepromptService.showPasswordPrompt()) ) { // didn't pass password prompt, so don't open add / edit modal - this.go({ cipherId: null, itemId: null }); + this.go({ cipherId: null, itemId: null, action: null }); return; } @@ -653,12 +665,64 @@ export class VaultComponent implements OnInit, OnDestroy { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises modal.onClosedPromise().then(() => { - this.go({ cipherId: null, itemId: null }); + this.go({ cipherId: null, itemId: null, action: null }); }); return childComponent; } + /** + * Takes a CipherView and opens a dialog where it can be viewed (wraps viewCipherById). + * @param cipher - CipherView + * @returns Promise + */ + viewCipher(cipher: CipherView) { + return this.viewCipherById(cipher.id); + } + + /** + * Takes a cipher id and opens a dialog where it can be viewed. + * @param id - string + * @returns Promise + */ + async viewCipherById(id: string) { + const cipher = await this.cipherService.get(id); + // If cipher exists (cipher is null when new) and MP reprompt + // is on for this cipher, then show password reprompt. + if ( + cipher && + cipher.reprompt !== 0 && + !(await this.passwordRepromptService.showPasswordPrompt()) + ) { + // Didn't pass password prompt, so don't open add / edit modal. + this.go({ cipherId: null, itemId: null }); + return; + } + + // Decrypt the cipher. + const cipherView = await cipher.decrypt( + await this.cipherService.getKeyForCipherKeyDecryption(cipher), + ); + + // Open the dialog. + const dialogRef = openViewCipherDialog(this.dialogService, { + data: { cipher: cipherView }, + }); + + // Wait for the dialog to close. + const result: ViewCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); + + // If the dialog was closed by deleting the cipher, refresh the vault. + if (result.action === ViewCipherDialogResult.deleted) { + this.refresh(); + } + + // If the dialog was closed by any other action (close button, escape key, etc), navigate back to the vault. + if (!result.action) { + this.go({ cipherId: null, itemId: null, action: null }); + } + } + async addCollection() { const dialog = openCollectionDialog(this.dialogService, { data: { diff --git a/apps/web/src/app/vault/individual-vault/vault.module.ts b/apps/web/src/app/vault/individual-vault/vault.module.ts index a6cb41bacb8..712b86a9803 100644 --- a/apps/web/src/app/vault/individual-vault/vault.module.ts +++ b/apps/web/src/app/vault/individual-vault/vault.module.ts @@ -10,6 +10,7 @@ import { OrganizationBadgeModule } from "./organization-badge/organization-badge import { PipesModule } from "./pipes/pipes.module"; import { VaultRoutingModule } from "./vault-routing.module"; import { VaultComponent } from "./vault.component"; +import { ViewComponent } from "./view.component"; @NgModule({ imports: [ @@ -23,6 +24,7 @@ import { VaultComponent } from "./vault.component"; BulkDialogsModule, CollectionDialogModule, VaultComponent, + ViewComponent, ], }) export class VaultModule {} diff --git a/apps/web/src/app/vault/individual-vault/view.component.html b/apps/web/src/app/vault/individual-vault/view.component.html new file mode 100644 index 00000000000..a70f1be49d7 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/view.component.html @@ -0,0 +1,25 @@ + + + {{ cipherTypeString }} + + + + + + +
    + +
    +
    +
    diff --git a/apps/web/src/app/vault/individual-vault/view.component.spec.ts b/apps/web/src/app/vault/individual-vault/view.component.spec.ts new file mode 100644 index 00000000000..fec97e202ef --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/view.component.spec.ts @@ -0,0 +1,117 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; +import { mock } from "jest-mock-extended"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; +import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { DialogService, ToastService } from "@bitwarden/components"; + +import { ViewComponent, ViewCipherDialogParams, ViewCipherDialogResult } from "./view.component"; + +describe("ViewComponent", () => { + let component: ViewComponent; + let fixture: ComponentFixture; + let router: Router; + + const mockCipher: CipherView = { + id: "cipher-id", + type: 1, + organizationId: "org-id", + isDeleted: false, + } as CipherView; + + const mockOrganization: Organization = { + id: "org-id", + name: "Test Organization", + } as Organization; + + const mockParams: ViewCipherDialogParams = { + cipher: mockCipher, + }; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ViewComponent], + providers: [ + { provide: DIALOG_DATA, useValue: mockParams }, + { provide: DialogRef, useValue: mock() }, + { provide: I18nService, useValue: { t: jest.fn().mockReturnValue("login") } }, + { provide: DialogService, useValue: mock() }, + { provide: CipherService, useValue: mock() }, + { provide: ToastService, useValue: mock() }, + { provide: MessagingService, useValue: mock() }, + { provide: LogService, useValue: mock() }, + { + provide: OrganizationService, + useValue: { get: jest.fn().mockResolvedValue(mockOrganization) }, + }, + { provide: Router, useValue: mock() }, + { provide: CollectionService, useValue: mock() }, + { provide: FolderService, useValue: mock() }, + { provide: CryptoService, useValue: mock() }, + { + provide: BillingAccountProfileStateService, + useValue: mock(), + }, + { provide: ConfigService, useValue: mock() }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ViewComponent); + component = fixture.componentInstance; + router = TestBed.inject(Router); + component.params = mockParams; + component.cipher = mockCipher; + }); + + describe("ngOnInit", () => { + it("initializes the component with cipher and organization", async () => { + await component.ngOnInit(); + + expect(component.cipher).toEqual(mockCipher); + expect(component.organization).toEqual(mockOrganization); + }); + }); + + describe("edit", () => { + it("navigates to the edit route and closes the dialog with the proper arguments", async () => { + jest.spyOn(router, "navigate").mockResolvedValue(true); + const dialogRefCloseSpy = jest.spyOn(component["dialogRef"], "close"); + + await component.edit(); + + expect(router.navigate).toHaveBeenCalledWith([], { + queryParams: { + itemId: mockCipher.id, + action: "edit", + organizationId: mockCipher.organizationId, + }, + }); + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.edited }); + }); + }); + + describe("delete", () => { + it("calls the delete method on delete and closes the dialog with the proper arguments", async () => { + const deleteSpy = jest.spyOn(component, "delete"); + const dialogRefCloseSpy = jest.spyOn(component["dialogRef"], "close"); + jest.spyOn(component["dialogService"], "openSimpleDialog").mockResolvedValue(true); + + await component.delete(); + + expect(deleteSpy).toHaveBeenCalled(); + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.deleted }); + }); + }); +}); diff --git a/apps/web/src/app/vault/individual-vault/view.component.ts b/apps/web/src/app/vault/individual-vault/view.component.ts new file mode 100644 index 00000000000..2a3865cd1d0 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/view.component.ts @@ -0,0 +1,193 @@ +import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { Component, Inject, OnInit, EventEmitter, OnDestroy } from "@angular/core"; +import { Router } from "@angular/router"; +import { Subject } from "rxjs"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +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"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + AsyncActionsModule, + DialogModule, + DialogService, + ToastService, +} from "@bitwarden/components"; + +import { CipherViewComponent } from "../../../../../../libs/vault/src/cipher-view/cipher-view.component"; +import { SharedModule } from "../../shared/shared.module"; + +export interface ViewCipherDialogParams { + cipher: CipherView; +} + +export enum ViewCipherDialogResult { + edited = "edited", + deleted = "deleted", +} + +export interface ViewCipherDialogCloseResult { + action: ViewCipherDialogResult; +} + +/** + * Component for viewing a cipher, presented in a dialog. + */ +@Component({ + selector: "app-vault-view", + templateUrl: "view.component.html", + standalone: true, + imports: [CipherViewComponent, CommonModule, AsyncActionsModule, DialogModule, SharedModule], +}) +export class ViewComponent implements OnInit, OnDestroy { + cipher: CipherView; + onDeletedCipher = new EventEmitter(); + cipherTypeString: string; + cipherEditUrl: string; + organization: Organization; + restrictProviderAccess = false; + + protected destroy$ = new Subject(); + + constructor( + @Inject(DIALOG_DATA) public params: ViewCipherDialogParams, + private dialogRef: DialogRef, + private i18nService: I18nService, + private dialogService: DialogService, + private messagingService: MessagingService, + private logService: LogService, + private cipherService: CipherService, + private toastService: ToastService, + private organizationService: OrganizationService, + private router: Router, + private configService: ConfigService, + ) {} + + /** + * Lifecycle hook for component initialization. + */ + async ngOnInit() { + this.cipher = this.params.cipher; + this.cipherTypeString = this.getCipherViewTypeString(); + if (this.cipher.organizationId) { + this.organization = await this.organizationService.get(this.cipher.organizationId); + } + this.restrictProviderAccess = await this.configService.getFeatureFlag( + FeatureFlag.RestrictProviderAccess, + ); + } + + /** + * Lifecycle hook for component destruction. + */ + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + /** + * Method to handle cipher deletion. Called when a user clicks the delete button. + */ + delete = async () => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "deleteItem" }, + content: { + key: this.cipher.isDeleted ? "permanentlyDeleteItemConfirmation" : "deleteItemConfirmation", + }, + type: "warning", + }); + + if (!confirmed) { + return; + } + + try { + await this.deleteCipher(); + this.toastService.showToast({ + variant: "success", + title: this.i18nService.t("success"), + message: this.i18nService.t( + this.cipher.isDeleted ? "permanentlyDeletedItem" : "deletedItem", + ), + }); + this.onDeletedCipher.emit(this.cipher); + this.messagingService.send( + this.cipher.isDeleted ? "permanentlyDeletedCipher" : "deletedCipher", + ); + } catch (e) { + this.logService.error(e); + } + + this.dialogRef.close({ action: ViewCipherDialogResult.deleted }); + }; + + /** + * Helper method to delete cipher. + */ + protected async deleteCipher(): Promise { + const asAdmin = this.organization?.canEditAllCiphers(this.restrictProviderAccess); + if (this.cipher.isDeleted) { + await this.cipherService.deleteWithServer(this.cipher.id, asAdmin); + } else { + await this.cipherService.softDeleteWithServer(this.cipher.id, asAdmin); + } + } + + /** + * Method to handle cipher editing. Called when a user clicks the edit button. + */ + async edit(): Promise { + this.dialogRef.close({ action: ViewCipherDialogResult.edited }); + await this.router.navigate([], { + queryParams: { + itemId: this.cipher.id, + action: "edit", + organizationId: this.cipher.organizationId, + }, + }); + } + + /** + * Method to get cipher view type string, used for the dialog title. + * E.g. "View login" or "View note". + * @returns The localized string for the cipher type + */ + getCipherViewTypeString(): string { + if (!this.cipher) { + return null; + } + + switch (this.cipher.type) { + case CipherType.Login: + return this.i18nService.t("viewItemType", this.i18nService.t("typeLogin").toLowerCase()); + case CipherType.SecureNote: + return this.i18nService.t("viewItemType", this.i18nService.t("note").toLowerCase()); + case CipherType.Card: + return this.i18nService.t("viewItemType", this.i18nService.t("typeCard").toLowerCase()); + case CipherType.Identity: + return this.i18nService.t("viewItemType", this.i18nService.t("typeIdentity").toLowerCase()); + default: + return null; + } + } +} + +/** + * Strongly typed helper to open a cipher view dialog + * @param dialogService Instance of the dialog service that will be used to open the dialog + * @param config Configuration for the dialog + * @returns A reference to the opened dialog + */ +export function openViewCipherDialog( + dialogService: DialogService, + config: DialogConfig, +): DialogRef { + return dialogService.open(ViewComponent, config); +} diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index a2aca71cde4..1e38cd152e9 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -89,6 +89,12 @@ import { RoutedVaultFilterModel, Unassigned, } from "../individual-vault/vault-filter/shared/models/routed-vault-filter.model"; +import { + openViewCipherDialog, + ViewCipherDialogCloseResult, + ViewCipherDialogResult, + ViewComponent, +} from "../individual-vault/view.component"; import { VaultHeaderComponent } from "../org-vault/vault-header/vault-header.component"; import { getNestedCollectionTree } from "../utils/collection-utils"; @@ -121,6 +127,7 @@ enum AddAccessStatusType { VaultItemsModule, SharedModule, NoItemsModule, + ViewComponent, ], providers: [RoutedVaultFilterService, RoutedVaultFilterBridgeService], }) @@ -517,7 +524,11 @@ export class VaultComponent implements OnInit, OnDestroy { (await firstValueFrom(allCipherMap$))[cipherId] != undefined; if (canEditCipher) { - await this.editCipherId(cipherId); + if (qParams.action === "view") { + await this.viewCipherById(cipherId); + } else { + await this.editCipherId(cipherId); + } } else { this.toastService.showToast({ variant: "error", @@ -848,12 +859,64 @@ export class VaultComponent implements OnInit, OnDestroy { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises modal.onClosedPromise().then(() => { - this.go({ cipherId: null, itemId: null }); + this.go({ cipherId: null, itemId: null, action: null }); }); return childComponent; } + /** + * Takes a CipherView and opens a dialog where it can be viewed (wraps viewCipherById). + * @param cipher - CipherView + * @returns Promise + */ + viewCipher(cipher: CipherView) { + return this.viewCipherById(cipher.id); + } + + /** + * Takes a cipher id and opens a dialog where it can be viewed. + * @param id - string + * @returns Promise + */ + async viewCipherById(id: string) { + const cipher = await this.cipherService.get(id); + // if cipher exists (cipher is null when new) and MP reprompt + // is on for this cipher, then show password reprompt. + if ( + cipher && + cipher.reprompt !== 0 && + !(await this.passwordRepromptService.showPasswordPrompt()) + ) { + // didn't pass password prompt, so don't open add / edit modal. + this.go({ cipherId: null, itemId: null }); + return; + } + + // Decrypt the cipher. + const cipherView = await cipher.decrypt( + await this.cipherService.getKeyForCipherKeyDecryption(cipher), + ); + + // Open the dialog. + const dialogRef = openViewCipherDialog(this.dialogService, { + data: { cipher: cipherView }, + }); + + // Wait for the dialog to close. + const result: ViewCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); + + // If the dialog was closed by deleting the cipher, refresh the vault. + if (result.action === ViewCipherDialogResult.deleted) { + this.refresh(); + } + + // If the dialog was closed by any other action (close button, escape key, etc), navigate back to the vault. + if (!result.action) { + this.go({ cipherId: null, itemId: null, action: null }); + } + } + async cloneCipher(cipher: CipherView) { if (cipher.login?.hasFido2Credentials) { const confirmed = await this.dialogService.openSimpleDialog({ diff --git a/apps/web/src/app/vault/org-vault/vault.module.ts b/apps/web/src/app/vault/org-vault/vault.module.ts index 7a874ad612c..db8d2256f52 100644 --- a/apps/web/src/app/vault/org-vault/vault.module.ts +++ b/apps/web/src/app/vault/org-vault/vault.module.ts @@ -4,6 +4,7 @@ import { LooseComponentsModule } from "../../shared/loose-components.module"; import { SharedModule } from "../../shared/shared.module"; import { OrganizationBadgeModule } from "../../vault/individual-vault/organization-badge/organization-badge.module"; import { CollectionDialogModule } from "../components/collection-dialog"; +import { ViewComponent } from "../individual-vault/view.component"; import { CollectionBadgeModule } from "./collection-badge/collection-badge.module"; import { GroupBadgeModule } from "./group-badge/group-badge.module"; @@ -20,6 +21,7 @@ import { VaultComponent } from "./vault.component"; OrganizationBadgeModule, CollectionDialogModule, VaultComponent, + ViewComponent, ], }) export class VaultModule {} diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 4acd8bbdb56..0673b8bb76a 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notas" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Pasgemaakte velde" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Vouer" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "U hoofwagwoord voldoen nie aan een of meer van die organisasiebeleide nie. Om toegang tot die kluis te kry, moet u nou u hoofwagwoord bywerk. Deur voort te gaan sal u van u huidige sessie afgeteken word, en u sal weer moet aanteken. Aktiewe sessies op ander toestelle kan vir tot een uur aktief bly." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 51a51b96121..a946211ee0d 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "ملاحظات" }, + "note": { + "message": "Note" + }, "customFields": { "message": "حقول مخصصة" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "المجلد" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 5b5ead8efbe..6984d000ba1 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notlar" }, + "note": { + "message": "Not" + }, "customFields": { "message": "Özəl xanalar" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Veb sayt (URI)" }, + "websiteUriCount": { + "message": "Veb sayt (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Veb sayt əlavə edildi" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden, 2 addımlı doğrulama kodlarını saxlaya və doldura bilər. Bu veb sayt kimlik doğrulayıcı QR kodunun ekran şəklini çəkmək üçün kamera ikonunu seçin, ya da açarı kopyalayıb bu xanaya yapışdırın." }, + "learnMoreAboutAuthenticators": { + "message": "Kimlik doğrulayıcılar haqqında daha ətraflı" + }, "folder": { "message": "Qovluq" }, @@ -1505,6 +1521,10 @@ "message": " ", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "yeni giriş", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " ", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -4146,7 +4166,7 @@ "message": "Minimum söz sayı" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "Parol növü", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Anbara müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, @@ -6051,23 +6083,23 @@ "message": "Təsadüfi söz" }, "usernameGenerator": { - "message": "Username generator" + "message": "İstifadəçi adı yaradıcı" }, "useThisPassword": { - "message": "Use this password" + "message": "Bu parolu istifadə et" }, "useThisUsername": { - "message": "Use this username" + "message": "Bu istifadəçi adını istifadə et" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Güvənli parol yaradıldı! Həmçinin veb saytdakı parolunuzu güncəlləməyi unutmayın." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Yaradıcı istifadə et", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "Daha unikal parollar yarat", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { @@ -8816,10 +8848,10 @@ "message": "satın alınmış yerlər silindi" }, "fileSends": { - "message": "File Sends" + "message": "Fayl \"Send\"ləri" }, "textSends": { - "message": "Text Sends" + "message": "Mətn \"Send\"ləri" }, "includesXMembers": { "message": "$COUNT$ üzv üçün", diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index e83a65f4642..6c20081ead4 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Нататкі" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Карыстальніцкія палі" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Папка" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 1131c36192b..199144bf6bb 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Бележки" }, + "note": { + "message": "Бележка" + }, "customFields": { "message": "Допълнителни полета" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Уеб сайт (адрес)" }, + "websiteUriCount": { + "message": "Уеб сайт (адрес) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Уеб сайтът е добавен" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Битуорден може да съхранява и попълва кодовете за 2-стъпково потвърждаване. Изберете иконката с камера, за да направите екранна снимка на QR-кода от този уеб сайт или копирайте ключа в това поле." }, + "learnMoreAboutAuthenticators": { + "message": "Научете повече за средствата за удостоверяване" + }, "folder": { "message": "Папка" }, @@ -1505,6 +1521,10 @@ "message": "нов елемент", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "нов елемент за вписване", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час." }, + "automaticAppLogin": { + "message": "Автоматично вписване на потребителите за разрешените приложения" + }, + "automaticAppLoginDesc": { + "message": "Формулярите за вписване ще бъдат попълвани и изпращани автоматично за приложенията, стартирани от настроения Ви доставчик на самоличност." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Сървър на доставчика на самоличност" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Въведете адреса на сървъра на своя доставчик на самоличност. Можете да въведете повече от един адрес, като ги разделите със запетаи." + }, "tdeDisabledMasterPasswordRequired": { "message": "Вашата организация е променила настройките за шифроване. Задайте главна парола, за да получите достъп до трезора си." }, diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 81bd06d6425..290ded160bd 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "মন্তব্য" }, + "note": { + "message": "Note" + }, "customFields": { "message": "পছন্দসই ক্ষেত্র" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "ফোল্ডার" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index a8b3cb41e27..7e69e71d770 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Bilješke" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Prilagođena polja" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Fascikla" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index d818b2accff..f5b246a5424 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Camps personalitzats" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Lloc web (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Lloc web afegit" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Carpeta" }, @@ -1505,6 +1521,10 @@ "message": "element nou.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " en compte d'això.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "La vostra contrasenya mestra no compleix una o més de les polítiques de l'organització. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i us demanarà que torneu a iniciar-la. Les sessions en altres dispositius poden continuar romanent actives fins a una hora." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 95030d1efa8..b003c625d80 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Poznámky" }, + "note": { + "message": "Poznámka" + }, "customFields": { "message": "Vlastní pole" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Webová stránka (URI)" }, + "websiteUriCount": { + "message": "Webová stránka (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Webová stránka přidána" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden umí ukládat a vyplňovat dvoufázové ověřovací kódy. Vyberte ikonu fotoaparátu a pořiďte snímek obrazovky ověřovacího QR kódu této webové stránky nebo klíč zkopírujte a vložte do tohoto pole." }, + "learnMoreAboutAuthenticators": { + "message": "Zjistěte více o autentizátorech" + }, "folder": { "message": "Složka" }, @@ -1505,6 +1521,10 @@ "message": "novou položku", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nové přihlášení", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -4146,7 +4166,7 @@ "message": "Minimální počet slov" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "Typ hesla", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Vaše hlavní heslo nesplňuje jednu nebo více zásad Vaší organizace. Pro přístup k trezoru musíte nyní aktualizovat své hlavní heslo. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." }, + "automaticAppLogin": { + "message": "Automaticky přihlásit uživatele pro povolené aplikace" + }, + "automaticAppLoginDesc": { + "message": "Přihlašovací formuláře budou automaticky vyplněny a odeslány pro aplikace spuštěné od Vašeho nakonfigurovaného poskytovatele identity." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Hostitel poskytovatele identity" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Zadejte URL hostitele poskytovatele identity. Zadejte více adres URL oddělením čárkou." + }, "tdeDisabledMasterPasswordRequired": { "message": "Vaše organizace aktualizovala možnosti dešifrování. Nastavte hlavní heslo pro přístup k Vašemu trezoru." }, @@ -6051,23 +6083,23 @@ "message": "Náhodné slovo" }, "usernameGenerator": { - "message": "Username generator" + "message": "Generátor uživatelského jména" }, "useThisPassword": { - "message": "Use this password" + "message": "Použít toto heslo" }, "useThisUsername": { - "message": "Use this username" + "message": "Použít toto uživatelské jméno" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Bezpečné heslo bylo vygenerováno! Nezapomeňte také aktualizovat heslo na webu." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Použijte generátor", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "pro vytvoření silného jedinečného hesla", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { @@ -8816,10 +8848,10 @@ "message": "zakoupení uživatelé odebráni" }, "fileSends": { - "message": "File Sends" + "message": "Sends se soubory" }, "textSends": { - "message": "Text Sends" + "message": "Sends s texty" }, "includesXMembers": { "message": "pro $COUNT$ členů", diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index e1ddd6cc4fb..82dad244d1a 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Nodiadau" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Ffolder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 06aeb98463f..c958322042c 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notater" }, + "note": { + "message": "Notat" + }, "customFields": { "message": "Tilpassede felter" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Websted (URI)" }, + "websiteUriCount": { + "message": "Websted (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Websted tilføjet" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kan gemme og udfylde 2-trinsbekræftelseskoder. Vælg kameraikonet for at tage et skærmfoto af dette websteds godkendelses-QR-kode, eller kopiér og indsæt nøglen i dette felt." }, + "learnMoreAboutAuthenticators": { + "message": "Læs mere om autentifikatorer" + }, "folder": { "message": "Mappe" }, @@ -1505,6 +1521,10 @@ "message": "nyt emne", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nyt login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " i stedet.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Din hovedadgangskode opfylder ikke et eller flere organisationspolitikkrav. For at kunne tilgå boksen skal hovedadgangskode derfor opdateres nu. Fortsættes, logges du ud af den nuværende session og vil skulle logge ind igen. Aktive sessioner på andre enheder kan forblive aktive i op til én time." }, + "automaticAppLogin": { + "message": "Log automatisk brugere på tilladte applikationer" + }, + "automaticAppLoginDesc": { + "message": "Login-formularer udfyldes og indsendes automatisk for apps startet fra den opsatte identitetsudbyder." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identitetsudbydervært" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Angiv identitetsudbyderværts-URL'en. Ved flere URL'er, adskil dem med komma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Organisationen har opdateret brugernes dekrypteringsmuligheder. Opsæt en hovedadgangskode for at tilgå boksen." }, diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 5a4dae11bf0..c5f48c66301 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notizen" }, + "note": { + "message": "Notiz" + }, "customFields": { "message": "Benutzerdefinierte Felder" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website hinzugefügt" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kann Zwei-Faktor-Authentifizierungsscodes speichern und ausfüllen. Wähle das Kamerasymbol aus, um einen Screenshot des Authenticator-QR-Codes dieser Website zu machen oder kopiere und füge den Schlüssel in dieses Feld ein." }, + "learnMoreAboutAuthenticators": { + "message": "Erfahre mehr über Authenticator-Apps" + }, "folder": { "message": "Ordner" }, @@ -1151,7 +1167,7 @@ "message": "Bist du sicher, dass du fortfahren möchtest?" }, "moveSelectedItemsDesc": { - "message": "Choose a folder that you would like to add the $COUNT$ selected item(s) to.", + "message": "Wähle einen Ordner aus, in dem du $COUNT$ ausgewählte(s) Objekt(e) verschieben möchtest.", "placeholders": { "count": { "content": "$1", @@ -1505,6 +1521,10 @@ "message": "neuen Eintrag", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "neue Zugangsdaten", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " erstellen.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -4909,7 +4929,7 @@ "message": "Mitgliedern Zugriff geben:" }, "viewAndSelectTheMembers": { - "message": "view and select the members you want to give access to Secrets Manager." + "message": "Die Mitgliedern anzeigen und auswählen, denen du Zugriff auf den Secrets Manager gewähren möchtest." }, "openYourOrganizations": { "message": "Open your organization's" @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Dein Master-Passwort entspricht nicht einer oder mehreren Richtlinien deiner Organisation. Um auf den Tresor zugreifen zu können, musst du dein Master-Passwort jetzt aktualisieren. Wenn du fortfährst, wirst du von deiner aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können noch bis zu einer Stunde lang aktiv bleiben." }, + "automaticAppLogin": { + "message": "Benutzer automatisch bei erlaubten Anwendungen anmelden" + }, + "automaticAppLoginDesc": { + "message": "Anmeldeformulare von Apps, die über deinen konfigurierten Identitätsanbieter gestartet wurden, werden automatisch ausgefüllt und abgesendet." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identitätsanbieter Host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Gib die Host-URL deines Identitätsanbieters ein. Trenne mehrere URLs durch ein Komma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Deine Organisation hat deine Entschlüsselungsoptionen aktualisiert. Bitte lege ein Master-Passwort fest, um auf deinen Tresor zuzugreifen." }, diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 98b7122cf71..3f3f1d35b21 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Σημειώσεις" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Προσαρμοσμένα Πεδία" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Ιστοσελίδα (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Η ιστοσελίδα προστέθηκε" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Φάκελος" }, @@ -1505,6 +1521,10 @@ "message": "νέο αντικείμενο", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " αντ' αυτού.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 265647f063b..f7899eae3a0 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -475,6 +475,15 @@ "viewItem": { "message": "View item" }, + "viewItemType": { + "message": "View $ITEMTYPE$", + "placeholders": { + "itemtype": { + "content": "$1", + "example": "login" + } + } + }, "new": { "message": "New", "description": "for adding new items" diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index f0d25683f28..c49710489e3 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organisation has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index f3607d4cf28..25b3350d44f 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organisation has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index d172d0c8e87..ead5794bc9d 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notoj" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Tekstujoj Uzantfaritaj" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Dosierujo" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 8bb900aa2d8..a0ac1f754c6 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notas" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Campos personalizados" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Carpeta" }, @@ -1505,6 +1521,10 @@ "message": "nuevo elemento", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " en su lugar.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Su contraseña maestra no cumple con una o más de las políticas de su organización. Para acceder a la caja fuerte, debe actualizar su contraseña maestra ahora. Proceder le desconectará de su sesión actual, requiriendo que vuelva a iniciar sesión. Las sesiones activas en otros dispositivos pueden seguir estando activas durante hasta una hora." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 37cbfca519a..c535f1a889e 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Märkmed" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Kohandatud väljad" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Kaust" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 1008a980831..fdb9a2427f3 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Oharrak" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Eremu pertsonalizatuak" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Karpeta" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index ab17248443f..3cc4d71eb9c 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "یادداشت‌ها" }, + "note": { + "message": "Note" + }, "customFields": { "message": "فیلدهای سفارشی" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "پوشه" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 78cd44e4504..36fb9f73969 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Merkinnät" }, + "note": { + "message": "Merkintä" + }, "customFields": { "message": "Lisäkentät" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Verkkosivusto (URI)" }, + "websiteUriCount": { + "message": "Verkkosivusto (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Verkkosivusto lisättiin" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden voi säilyttää ja täyttää kaksivaiheisen kirjautumisen koodit. Kamerakuvakkeella voit kaapata todennusavaimen avoimen sivun QR-koodista automaattisesti, tai voit kopioida ja liittää sen tähän kenttään manuaalisesti." }, + "learnMoreAboutAuthenticators": { + "message": "Lue lisää todentajista" + }, "folder": { "message": "Kansio" }, @@ -1505,6 +1521,10 @@ "message": "uuden kohteen", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "uuden kirjautumistiedon", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Pääsalasanasi ei täytä yhden tai useamman organisaatiokäytännön vaatimuksia ja holvin käyttämiseksi sinun on vaihdettava se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." }, + "automaticAppLogin": { + "message": "Kirjaa käyttäjät automaattisesti sisään sallittuihin sovelluksiin" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Organisaatiosi on päivittänyt salauksen purkuasetukset. Käytä holviasi asettamalla pääsalasana." }, @@ -6060,14 +6092,14 @@ "message": "Käytä tätä käyttäjätunnusta" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Turvallinen salasana luotu! Muista myös päivittää salasana verkkosivustolla." }, "useGeneratorHelpTextPartOne": { "message": "Käytä generaattoria", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "luodaksesi vahvan ainutlaatuisen salasanan", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 3cca56c18c0..f23f4920f42 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Mga Tala" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Ipinasadyang mga field" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 44780737c55..a17fced7472 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Champs personnalisés" }, @@ -49,22 +52,32 @@ "message": "Clé d'authentification" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Options de saisie automatique" }, "websiteUri": { - "message": "Website (URI)" + "message": "Site web (URI)" + }, + "websiteUriCount": { + "message": "Site web (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } }, "websiteAdded": { - "message": "Website added" + "message": "Site web ajouté" }, "addWebsite": { - "message": "Add website" + "message": "Ajouter le site web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Supprimer le site web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Par défaut ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -74,7 +87,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Afficher la détection de correspondance $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -83,7 +96,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Cacher la détection de correspondance $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -92,7 +105,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Remplissage automatique lors du chargement de la page ?" }, "number": { "message": "Numéro" @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden peut stocker et remplir des codes de vérification en 2 étapes. Sélectionnez l'icône caméra pour prendre une capture d'écran du code QR de l'authentificateur de ce site Web, ou copiez et collez la clé dans ce champ." }, + "learnMoreAboutAuthenticators": { + "message": "En savoir plus sur les authentificateurs" + }, "folder": { "message": "Dossier" }, @@ -1505,6 +1521,10 @@ "message": "nouvel élément", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nouvel identifiant", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " à la place.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Votre mot de passe principal ne répond pas aux exigences des politiques de sécurité de cette organisation. Pour pouvoir accéder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure." }, + "automaticAppLogin": { + "message": "Se connecter automatiquement aux utilisateurs pour les applications autorisées" + }, + "automaticAppLoginDesc": { + "message": "Les formulaires de connexion seront automatiquement remplis et soumis pour les applications lancées à partir de votre fournisseur d'identité configuré." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Hôte du fournisseur d'identité" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Entrez l'URL d'hôte de votre fournisseur d'identité. Entrez plusieurs URL en séparant avec une virgule." + }, "tdeDisabledMasterPasswordRequired": { "message": "Votre organisation a mis à jour vos options de déchiffrement. Veuillez définir un mot de passe principal pour accéder à votre coffre." }, @@ -8098,7 +8130,7 @@ } }, "addField": { - "message": "Add field" + "message": "Ajouter un champ" }, "items": { "message": "Éléments" diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 3b3ab45fbd5..f972a0e73c1 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -1,9 +1,9 @@ { "whatTypeOfItem": { - "message": "What type of item is this?" + "message": "Que tipo de elemento é este?" }, "name": { - "message": "Name" + "message": "Nome" }, "uri": { "message": "URI" @@ -19,52 +19,65 @@ } }, "newUri": { - "message": "New URI" + "message": "Nova URI" }, "username": { - "message": "Username" + "message": "Nome de usuario" }, "password": { - "message": "Password" + "message": "Contrasinal" }, "newPassword": { - "message": "New password" + "message": "Novo contrasinal" }, "passphrase": { - "message": "Passphrase" + "message": "Frase de contrasinal" }, "notes": { - "message": "Notes" + "message": "Notas" + }, + "note": { + "message": "Nota" }, "customFields": { - "message": "Custom fields" + "message": "Campos personalizados" }, "cardholderName": { - "message": "Cardholder name" + "message": "Nome do titular da tarxeta" }, "loginCredentials": { - "message": "Login credentials" + "message": "Credenciais" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Clave de autenticación" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Preferencias do enchido automaticamente" }, "websiteUri": { - "message": "Website (URI)" + "message": "Sitio web (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } }, "websiteAdded": { - "message": "Website added" + "message": "Sitio web enadido" }, "addWebsite": { - "message": "Add website" + "message": "Engadir sitio web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Eliminar sitio web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Predeterminado ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -74,7 +87,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Mostrar detección de coincidencia $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -83,7 +96,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Agochar detección de coincidencia $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -92,85 +105,85 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Autoencher ao carregar a páxina?" }, "number": { - "message": "Number" + "message": "Número" }, "brand": { - "message": "Brand" + "message": "Marca" }, "expiration": { - "message": "Expiration" + "message": "Data de expiración" }, "securityCode": { - "message": "Security code (CVV)" + "message": "Código de seguridade do reverso (CVV)" }, "identityName": { - "message": "Identity name" + "message": "Nome da identidade" }, "company": { - "message": "Company" + "message": "Empresa" }, "ssn": { - "message": "Social Security number" + "message": "Número de identidade" }, "passportNumber": { - "message": "Passport number" + "message": "Número de pasaporte" }, "licenseNumber": { - "message": "License number" + "message": "Número de matrícula" }, "email": { - "message": "Email" + "message": "Enderezo de correo electrónico" }, "phone": { - "message": "Phone" + "message": "Número de teléfono" }, "january": { - "message": "January" + "message": "Xaneiro" }, "february": { - "message": "February" + "message": "Febreiro" }, "march": { - "message": "March" + "message": "Marzo" }, "april": { - "message": "April" + "message": "Abril" }, "may": { - "message": "May" + "message": "Maio" }, "june": { - "message": "June" + "message": "Xuño" }, "july": { - "message": "July" + "message": "Xullo" }, "august": { - "message": "August" + "message": "Agosto" }, "september": { - "message": "September" + "message": "Setembro" }, "october": { - "message": "October" + "message": "Outubro" }, "november": { - "message": "November" + "message": "Novembro" }, "december": { - "message": "December" + "message": "Decembro" }, "title": { - "message": "Title" + "message": "Título" }, "mr": { - "message": "Mr" + "message": "Don" }, "mrs": { - "message": "Mrs" + "message": "Dona" }, "ms": { "message": "Ms" @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -340,140 +356,140 @@ "description": "Search Login type" }, "searchCard": { - "message": "Search cards", + "message": "Procurar tarxetas", "description": "Search Card type" }, "searchIdentity": { - "message": "Search identities", + "message": "Procurar identidades", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Search secure notes", + "message": "Procurar notas seguras", "description": "Search Secure Note type" }, "searchVault": { - "message": "Search vault" + "message": "Procurar no baúl" }, "searchMyVault": { - "message": "Search my vault" + "message": "Procurar no meu baúl" }, "searchOrganization": { - "message": "Search organization" + "message": "Procurar na organización" }, "searchMembers": { - "message": "Search members" + "message": "Procurar membros" }, "searchGroups": { - "message": "Search groups" + "message": "Procurar grupos" }, "allItems": { - "message": "All items" + "message": "Todos os elementos" }, "favorites": { - "message": "Favorites" + "message": "Favoritos" }, "types": { - "message": "Types" + "message": "Tipos" }, "typeLogin": { - "message": "Login" + "message": "Inicio de sesión" }, "typeCard": { - "message": "Card" + "message": "Tarxeta" }, "typeIdentity": { - "message": "Identity" + "message": "Identidade" }, "typeSecureNote": { - "message": "Secure note" + "message": "Nota segura" }, "typeLoginPlural": { - "message": "Logins" + "message": "Inicios de sesión" }, "typeCardPlural": { - "message": "Cards" + "message": "Tarxetas" }, "typeIdentityPlural": { - "message": "Identities" + "message": "Identidades" }, "typeSecureNotePlural": { - "message": "Secure notes" + "message": "Notas seguras" }, "folders": { - "message": "Folders" + "message": "Cartafoles" }, "collections": { - "message": "Collections" + "message": "Coleccións" }, "firstName": { - "message": "First name" + "message": "Primeiro nome" }, "middleName": { - "message": "Middle name" + "message": "Segundo nome" }, "lastName": { - "message": "Last name" + "message": "Apelidos" }, "fullName": { - "message": "Full name" + "message": "Nome completo" }, "address1": { - "message": "Address 1" + "message": "Enderezo 1" }, "address2": { - "message": "Address 2" + "message": "Enderezo 2" }, "address3": { - "message": "Address 3" + "message": "Enderezo 3" }, "cityTown": { - "message": "City / Town" + "message": "Concello" }, "stateProvince": { - "message": "State / Province" + "message": "Provincia / Comunidade Autónoma" }, "zipPostalCode": { - "message": "Zip / Postal code" + "message": "Código postal" }, "country": { - "message": "Country" + "message": "País" }, "shared": { - "message": "Shared" + "message": "Compartido" }, "attachments": { - "message": "Attachments" + "message": "Anexos" }, "select": { - "message": "Select" + "message": "Seleccionar" }, "newItem": { - "message": "New item" + "message": "Novo elemento" }, "addItem": { - "message": "Add item" + "message": "Engadir elemento" }, "editItem": { - "message": "Edit item" + "message": "Editar elemento" }, "viewItem": { - "message": "View item" + "message": "Ver elemento" }, "new": { - "message": "New", + "message": "Novo", "description": "for adding new items" }, "item": { - "message": "Item" + "message": "Elemento" }, "itemDetails": { - "message": "Item details" + "message": "Detalles do elemento" }, "itemName": { - "message": "Item name" + "message": "Nome do elemento" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "Non podes eliminar coleccións con permisos de só lectura: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -486,16 +502,16 @@ "description": "Short abbreviation for 'example'." }, "other": { - "message": "Other" + "message": "Outros" }, "share": { - "message": "Share" + "message": "Compartir" }, "moveToOrganization": { - "message": "Move to organization" + "message": "Mover á organización" }, "valueCopied": { - "message": "$VALUE$ copied", + "message": "$VALUE$ copiado", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -505,7 +521,7 @@ } }, "copyValue": { - "message": "Copy value", + "message": "Copiar valor", "description": "Copy value to clipboard" }, "copyPassword": { @@ -692,37 +708,37 @@ "message": "Your login session has expired." }, "restartRegistration": { - "message": "Restart registration" + "message": "Reiniciar rexistro" }, "expiredLink": { - "message": "Expired link" + "message": "Ligazón caducada" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Por favor, reinicie o rexistro ou tente iniciar sesión." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Pode que xa teñas unha conta" }, "logOutConfirmation": { - "message": "Are you sure you want to log out?" + "message": "Estás seguro de que queres pechar a sesión?" }, "logOut": { - "message": "Log out" + "message": "Pechar sesión" }, "ok": { - "message": "Ok" + "message": "Aceptar" }, "yes": { - "message": "Yes" + "message": "Si" }, "no": { - "message": "No" + "message": "Non" }, "loginOrCreateNewAccount": { - "message": "Log in or create a new account to access your secure vault." + "message": "Rexístrate ou crea unha nova conta para acceder ó teu baúl." }, "loginWithDevice": { - "message": "Log in with device" + "message": "Iniciar sesión cun dispositivo" }, "loginWithDeviceEnabledNote": { "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index c8d0e831c11..bfa5ff1ba5f 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "הערות" }, + "note": { + "message": "Note" + }, "customFields": { "message": "שדות מותאמים אישית" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "תיקייה" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index e3f29272067..bb3173fc51a 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "नोट्स" }, + "note": { + "message": "Note" + }, "customFields": { "message": "कस्टम फील्ड्स" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "फ़ोल्डर" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 54aa78de787..2497b9eb68c 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Bilješke" }, + "note": { + "message": "Bilješka" + }, "customFields": { "message": "Prilagođena polja" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Web stranica (URI)" }, + "websiteUriCount": { + "message": "Broj URI-ja: $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Web stranica dodana" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden može pohraniti i ispuniti kodove za dvostruku autentifikaciju. Odaberi ikonu kamere i označi QR kôd za provjeru autentičnosti ove web stranice ili kopiraj i zalijepi ključ u ovo polje." }, + "learnMoreAboutAuthenticators": { + "message": "Više o autentifikatorima" + }, "folder": { "message": "Mapa" }, @@ -1505,6 +1521,10 @@ "message": "novu stavku", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "novu prijavu", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Tvoja glavna lozinka ne zadovoljava pravila ove organizacije. Za pristup trezoru moraš odmah ažurirati svoju glavnu lozinku. Ako nastaviš, odjaviti ćeš se iz trenutne sesije te ćeš se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne do jedan sat." }, + "automaticAppLogin": { + "message": "Automatski prijavi korisnike za dopuštene aplikacije" + }, + "automaticAppLoginDesc": { + "message": "Obrasci za prijavu će biti automatski ispunjeni i poslani za aplikacije pokrenute od strane konfiguriranog davatelja identiteta." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Poslužitelj pružatelja identiteta" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Unesi URL poslužitelja pružatelja identiteta. Više URL-ova odvoji zarezom." + }, "tdeDisabledMasterPasswordRequired": { "message": "Tvoja je organizacija ažurirala tvoje opcije dešifriranja. Postavi glavnu lozinku za pristup svom trezoru." }, @@ -6051,23 +6083,23 @@ "message": "Nasumična riječ" }, "usernameGenerator": { - "message": "Username generator" + "message": "Generator korisničkih imena" }, "useThisPassword": { - "message": "Use this password" + "message": "Koristi ovu lozinku" }, "useThisUsername": { - "message": "Use this username" + "message": "Koristi ovo korisničko ime" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Sigurna lozinka generirana! Ne zaboravi ažurirati lozinku na web stranici." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Koristi generator", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "za stvaranje snažne, jedinstvene lozinke", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { @@ -8816,10 +8848,10 @@ "message": "kupljenih mjesta uklonjeno" }, "fileSends": { - "message": "File Sends" + "message": "Send datoteke" }, "textSends": { - "message": "Text Sends" + "message": "Send tekstovi" }, "includesXMembers": { "message": "za ovoliko članova: $COUNT$", diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index ce27a1e09f6..f58d778f332 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Jegyzetek" }, + "note": { + "message": "Jegyzet" + }, "customFields": { "message": "Egyedi mezők" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Webhely (URI)" }, + "websiteUriCount": { + "message": "Webhely (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "A webhely hozzáadásra került." }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "A Bitwarden képes tárolni és kitölteni a kétlépcsős ellenőrző kódokat. Válasszuk a kamera ikont, hogy képernyőképet készítsünk a webhely hitelesítő QR kódjáról vagy másoljuk ki és illesszük be a kulcsot ebbe a mezőbe." }, + "learnMoreAboutAuthenticators": { + "message": "További információ a hitelesítőkről" + }, "folder": { "message": "Mappa" }, @@ -1505,6 +1521,10 @@ "message": "új elemet", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "új bejelentkezés", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " helyett.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -4146,7 +4166,7 @@ "message": "Szavak minimális száma" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "Jelszótípus", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "A mesterjelszó nem felel meg egy vagy több szervezeti szabályzatnak. A széf eléréséhez frissíteni kell a meszerjelszót. A továbblépés kijelentkeztet az aktuális munkamenetből és újra be kell jelentkezni. A többi eszközön lévő aktív munkamenetek akár egy óráig is aktívak maradhatnak." }, + "automaticAppLogin": { + "message": "A felhasználók automatikus bejelentkezése az engedélyezett alkalmazásokhoz" + }, + "automaticAppLoginDesc": { + "message": "A bejelentkezési űrlapok automatikusan kitöltésre és elküldésre kerülnek a konfigurált azonosság szolgáltatótól indított alkalmazásokhoz." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Azonosság szolgáltató kiszolgáló" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Adjuk meg az azonosság szolgáltató kiszolgáló webcímét. Több webcímet vesszővel elválasztva adjunk meg." + }, "tdeDisabledMasterPasswordRequired": { "message": "A szervezete frissítette a visszafejtési beállításokat. Állítsunk be egy mestarjelszót a széf eléréséhez." }, @@ -6051,23 +6083,23 @@ "message": "Véletlenszerű szó" }, "usernameGenerator": { - "message": "Username generator" + "message": "Felhasználónév generátor" }, "useThisPassword": { - "message": "Use this password" + "message": "Jelszó használata" }, "useThisUsername": { - "message": "Use this username" + "message": "Felhasználónév használata" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "A biztonságos jelszó generálásra került! Ne felejtsük el frissíteni a jelszót a webhelyen is." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Generátor használata", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "erős egyedi jelszó létrehozásához", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { @@ -8816,10 +8848,10 @@ "message": "megvásárolt hely eltávolításra került." }, "fileSends": { - "message": "File Sends" + "message": "Fájl küldés" }, "textSends": { - "message": "Text Sends" + "message": "Szöveg küldés" }, "includesXMembers": { "message": "$COUNT$ member részére", diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index a4b6632ea12..6d4ce09c3a0 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Catatan" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Kolom Ubahsuai" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Direktori" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 7a66cbab289..6b3a5c0028a 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Note" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Campi personalizzati" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Cartella" }, @@ -1505,6 +1521,10 @@ "message": "nuovo elemento", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "La tua password principale non soddisfa uno o più politiche della tua organizzazione. Per accedere alla cassaforte, aggiornala ora. Procedere ti farà uscire dalla sessione corrente, richiedendoti di accedere di nuovo. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 91a1ed82cd1..03ace731e81 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "メモ" }, + "note": { + "message": "メモ" + }, "customFields": { "message": "カスタムフィールド" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "ウェブサイト (URI)" }, + "websiteUriCount": { + "message": "ウェブサイト (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "ウェブサイトを追加しました" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden は2段階認証コードを保存・入力できます。 カメラアイコンを選択して、このウェブサイトの認証 QR コードのスクリーンショットを撮るか、キーをコピーしてこのフィールドに貼り付けてください。" }, + "learnMoreAboutAuthenticators": { + "message": "認証方法の詳細" + }, "folder": { "message": "フォルダー" }, @@ -1505,6 +1521,10 @@ "message": "新しいアイテム", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "新しいログイン", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": "を作成してください。", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "マスターパスワードが組織のポリシーに適合していません。保管庫にアクセスするには、今すぐマスターパスワードを更新しなければなりません。続行すると現在のセッションからログアウトし、再度ログインする必要があります。 他のデバイス上のアクティブなセッションは、最大1時間アクティブであり続けることがあります。" }, + "automaticAppLogin": { + "message": "許可されたアプリでユーザーを自動的にログインする" + }, + "automaticAppLoginDesc": { + "message": "ログインフォームは自動的に入力され、設定された ID プロバイダーから起動されたアプリに送信されます。" + }, + "automaticAppLoginIdpHostLabel": { + "message": "ID プロバイダーホスト" + }, + "automaticAppLoginIdpHostDesc": { + "message": "ID プロバイダーのホスト URL を入力します。カンマで区切ると複数の URL を入力できます。" + }, "tdeDisabledMasterPasswordRequired": { "message": "組織が復号オプションを更新しました。保管庫にアクセスするにはマスターパスワードを設定してください。" }, diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index a7d61bf0412..f70a5950a3c 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "ჩანაწერები" }, + "note": { + "message": "Note" + }, "customFields": { "message": "თქვენზე მორგებული ველები" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "საქაღალდე" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 3b3ab45fbd5..2f801ac0158 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index a79ae8a6e1d..2003846c63e 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "ಟಿಪ್ಪಣಿಗಳು" }, + "note": { + "message": "Note" + }, "customFields": { "message": "ಕಸ್ಟಮ್ ಕ್ಷೇತ್ರಗಳು" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "ಫೋಲ್ಡರ್" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index be2642211fd..03bc47ff6dd 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "메모" }, + "note": { + "message": "Note" + }, "customFields": { "message": "사용자 지정 필드" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "폴더" }, @@ -1505,6 +1521,10 @@ "message": "새 항목", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": "을 생성할 수 있습니다.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 6c218174952..e604add504f 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Piezīmes" }, + "note": { + "message": "Piezīme" + }, "customFields": { "message": "Pielāgoti lauki" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Tīmekļvietne (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Uzzināt vairāk par autentificētājiem" + }, "folder": { "message": "Mape" }, @@ -827,7 +843,7 @@ "message": "Jāiestata droša parole" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Jāpabeidz sava konta izveida ar paroles iestatīšanu" + "message": "Sava konta izveidošana jāpabeidz ar paroles iestatīšanu" }, "newAroundHere": { "message": "Jauns šeit?" @@ -1505,6 +1521,10 @@ "message": "jaunu vienumu", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "jaunu pieteikšanās vienumu", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Galvenā parole neatbilst vienam vai vairākiem apvienības nosacījumiem. Ir jāatjaunina galvenā parole, lai varētu piekļūt glabātavai. Turpinot notiks atteikšanās no pašreizējās sesijas, un būs nepieciešams pieteikties no jauna. Citās ierīcēs esošās sesijas var turpināt darboties līdz vienai stundai." }, + "automaticAppLogin": { + "message": "Automātiski pieteikt lietotājus atļautajās lietotnēs" + }, + "automaticAppLoginDesc": { + "message": "Pieteikšanās veidlapas tiks automātiski aizpildītas un iesniegtas tajās lietotnēs, kuras ir palaistas no uzstādītā identitāšu nodrošinātāja." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identitātes nodrošinātāja resursdators" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Jāievada sava identitāšu nodrošinātāja resursdatora URL. Vairāki URL ir ievadāmi, atdalot tos ar komatu." + }, "tdeDisabledMasterPasswordRequired": { "message": "Tava apvienība ir atjauninājusi tavas atšifrēšanas iespējas. Lūgums iestatīt galveno paroli, lai piekļūtu savai glabātavai." }, diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 30cda30f1df..b22d42f74bb 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "കുറിപ്പുകൾ" }, + "note": { + "message": "Note" + }, "customFields": { "message": "ഇഷ്‌ടാനുസൃത ഫീൽഡുകൾ" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "ഫോൾഡർ" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 3b3ab45fbd5..2f801ac0158 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 3b3ab45fbd5..2f801ac0158 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 272279d8b36..55b7bedbcd9 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notater" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Tilpassede felter" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Mappe" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 1360ff2724d..fc582e83240 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "नोटहरू" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "फोल्‍डर" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index a3223ba94ab..e8cfba484c4 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notities" }, + "note": { + "message": "Notitie" + }, "customFields": { "message": "Extra velden" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website toegevoegd" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden kan tweestapsaanmeldingscodes opslaan en invullen. Selecteer het camerapictogram om een schermafbeelding van de QR-code van deze website te maken of kopieer en plak de sleutel in dit veld." }, + "learnMoreAboutAuthenticators": { + "message": "Meer informatie over authenticatoren" + }, "folder": { "message": "Map" }, @@ -1505,6 +1521,10 @@ "message": "nieuw item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nieuwe login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " aanmaken.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Je hoofdwachtwoord voldoet niet aan en of meerdere oganisatiebeleidsonderdelen. Om toegang te krijgen tot de kluis, moet je je hoofdwachtwoord nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief." }, + "automaticAppLogin": { + "message": "Gebruikers automatisch inloggen voor toegestane applicaties" + }, + "automaticAppLoginDesc": { + "message": "Inlogformulieren automatisch invullen en indienen voor apps die zijn gestart vanuit je geconfigureerde identiteitsprovider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identiteitsproviderhost" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Voer de host URL van je identiteitsprovider in. Voer meerdere URL's in door deze te scheiden met een komma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Je organisatie heeft je versleutelingsopties gewijzigd. Stel een hoofdwachtwoord in om toegang te krijgen tot je kluis." }, diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 09743c125f0..0bdb61b1abc 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notat" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Eigendefinert felt" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Mappe" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 3b3ab45fbd5..2f801ac0158 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 16f135a85ad..57dcb36d9d2 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notatki" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Pola niestandardowe" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Strona internetowa (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Strona dodana" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden może przechowywać i wypełniać kody weryfikacyjne. Wybierz ikonę aparatu, aby zrobić zrzut ekranu z kodem QR lub skopiuj i wklej klucz do tego pola." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "nowy element", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " zamiast tego.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Twoje hasło główne nie spełnia jednej lub kilku zasad organizacji. Aby uzyskać dostęp do sejfu, musisz teraz zaktualizować swoje hasło główne. Kontynuacja wyloguje Cię z bieżącej sesji, wymagając zalogowania się ponownie. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie jedną godzinę." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index e2df4cf7081..f308e262a95 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notas" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Campos Personalizados" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Site (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Site adicionado" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Selecione o ícone de câmera para tirar uma captura da tela do código QR de autenticador deste site, ou copie e cole a chave neste campo." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Pasta" }, @@ -1505,6 +1521,10 @@ "message": "Novo item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " em vez disso.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "A sua senha mestra não atende a uma ou mais das políticas da sua organização. Para acessar o cofre, você deve atualizar a sua senha mestra agora. O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Sua organização atualizou suas opções de descriptografia. Por favor, defina uma senha mestra para acessar seu cofre." }, diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 798acf3b535..a6f3ea9d889 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notas" }, + "note": { + "message": "Nota" + }, "customFields": { "message": "Campos personalizados" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Site (URI)" }, + "websiteUriCount": { + "message": "Site (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Site adicionado" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de dois passos. Selecione o ícone da câmara para tirar uma captura de ecrã do código QR do autenticador deste site ou copie e cole a chave neste campo." }, + "learnMoreAboutAuthenticators": { + "message": "Saiba mais sobre os autenticadores" + }, "folder": { "message": "Pasta" }, @@ -1505,6 +1521,10 @@ "message": "novo item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nova credencial", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": ".", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "A sua palavra-passe mestra não cumpre uma ou mais políticas da sua organização. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminará a sua sessão atual e terá de iniciar sessão novamente. As sessões ativas noutros dispositivos poderão continuar ativas até uma hora." }, + "automaticAppLogin": { + "message": "Iniciar automaticamente a sessão dos utilizadores nas aplicações permitidas" + }, + "automaticAppLoginDesc": { + "message": "Os formulários de início de sessão serão automaticamente preenchidos e submetidos para aplicações lançadas a partir do seu fornecedor de identidade configurado." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Anfitrião do fornecedor de identidade" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Introduza o URL do anfitrião do seu fornecedor de identidade. Introduza vários URLs, separando-os com uma vírgula." + }, "tdeDisabledMasterPasswordRequired": { "message": "A sua organização atualizou as opções de desencriptação. Por favor, defina uma palavra-passe mestra para aceder ao seu cofre." }, diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index ff98c7b2547..04ec54750d7 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Note" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Câmpuri particularizate" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Dosar" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 1ee49306479..36c36a58947 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Заметки" }, + "note": { + "message": "Заметка" + }, "customFields": { "message": "Пользовательские поля" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Сайт (URI)" }, + "websiteUriCount": { + "message": "Веб-сайт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Сайт добавлен" }, @@ -191,7 +204,7 @@ "message": "Ключ аутентификатора (TOTP)" }, "totpHelperTitle": { - "message": "Сделать двухэтапную аутентификацию бесшовной" + "message": "Сделайте двухэтапную аутентификацию простой и удобной" }, "totpHelper": { "message": "Bitwarden может хранить и заполнять коды двухэтапной аутентификации. Скопируйте и вставьте ключ в это поле." @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden может хранить и заполнять коды двухэтапной аутентификации. Выберите значок камеры, чтобы сделать скриншот QR-кода этого сайта, или скопируйте и вставьте ключ в это поле." }, + "learnMoreAboutAuthenticators": { + "message": "Узнайте больше об аутентификаторах" + }, "folder": { "message": "Папка" }, @@ -1505,6 +1521,10 @@ "message": "новый элемент.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "новый логин", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " вместо этого.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущий сеанс будет завершен и потребуется повторная авторизация. Сеансы на других устройствах могут оставаться активными в течение часа." }, + "automaticAppLogin": { + "message": "Автоматическая авторизация пользователей в разрешенные приложения" + }, + "automaticAppLoginDesc": { + "message": "Формы авторизаций будут автоматически заполняться и отправляться для приложений, запущенных с помощью настроенного провайдера идентификационных данных." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Хост провайдера идентификации" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Введите URL хоста провайдера идентификационных данных. Вводите несколько URL, разделяя их запятой." + }, "tdeDisabledMasterPasswordRequired": { "message": "Ваша организация обновила параметры расшифровки. Пожалуйста, установите мастер-пароль для доступа к вашему хранилищу." }, @@ -7699,7 +7731,7 @@ "message": "Запрошено одобрение устройства." }, "tdeOffboardingPasswordSet": { - "message": "Пользователь установил мастер-пароль во время регистрации в TDE." + "message": "Пользователь установил мастер-пароль при деактивации TDE." }, "startYour7DayFreeTrialOfBitwardenFor": { "message": "Начните 7-дневную бесплатную пробную версию Bitwarden для $ORG$", diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index bc214c47971..1dac83d3ec0 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "සටහන්" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "බහාලුම" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 273a99fb567..469396c7a4b 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Poznámky" }, + "note": { + "message": "Poznámka" + }, "customFields": { "message": "Vlastné polia" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Webová stránka (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Webová stránka pridaná" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden umožňuje uložiť a vyplniť kódy dvojstupňového overenia. Vyberte ikonu fotoaparátu a zosnímajte obrazovku QR kódu overovacej aplikácie tejto webovej stránky alebo skopírujte a vložte kľúč do tohto poľa." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Priečinok" }, @@ -1505,6 +1521,10 @@ "message": "novú položku", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "nové prihlasovacie údaje", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": "namiesto toho.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Vaše hlavné heslo nespĺňa jednu alebo viacero podmienok vašej organizácie. Ak chcete získať prístup k trezoru, musíte teraz aktualizovať svoje hlavné heslo. Pokračovaním sa odhlásite z aktuálnej relácie a budete sa musieť znova prihlásiť. Aktívne relácie na iných zariadeniach môžu zostať aktívne až jednu hodinu." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Vaša organizácia aktualizovala možnosti dešifrovania. Na prístup k trezoru nastavte hlavné heslo." }, @@ -6051,23 +6083,23 @@ "message": "Náhodné slovo" }, "usernameGenerator": { - "message": "Username generator" + "message": "Generátor používateľského mena" }, "useThisPassword": { - "message": "Use this password" + "message": "Použiť toto heslo" }, "useThisUsername": { - "message": "Use this username" + "message": "Použiť toto používateľské meno" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Bezpečné heslo vygenerované! Nezabudnite tiež aktualizovať heslo na stránke." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Použite generátor", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "na vytvorenie silného, unikátneho hesla.", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "service": { diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 7d817afbb73..0386539a6cd 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Zapisek" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Polja po meri" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Mapa" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 437ecb40791..2360b44e1af 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Напомене" }, + "note": { + "message": "Белешка" + }, "customFields": { "message": "Прилагођена поља" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Вебсајт (URI)" }, + "websiteUriCount": { + "message": "Сајт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Вебсајт додат" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden може да чува и попуњава верификационе кодове у 2 корака. Изаберите икону камере да бисте направили снимак екрана QR кода за аутентификацију ове веб локације или копирајте и налепите кључ у ово поље." }, + "learnMoreAboutAuthenticators": { + "message": "Сазнајте више о аутентификаторима" + }, "folder": { "message": "Фасцикла" }, @@ -1505,6 +1521,10 @@ "message": "нову ставку", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " уместо.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -4146,7 +4166,7 @@ "message": "Минимални број речи" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "Тип лозинке", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { @@ -4855,28 +4875,28 @@ "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets." }, "centralizeSecretsManagement": { - "message": "Centralize secrets management." + "message": "Централизујте управљање тајнама." }, "centralizeSecretsManagementDescription": { - "message": "Securely store and manage secrets in one location to prevent secret sprawl across your organization." + "message": "Безбедно чувајте тајне и управљајте њима на једној локацији да бисте спречили ширење тајни широм ваше организације." }, "preventSecretLeaks": { - "message": "Prevent secret leaks." + "message": "Спречите цурење тајне." }, "preventSecretLeaksDescription": { - "message": "Protect secrets with end-to-end encryption. No more hard coding secrets or sharing through .env files." + "message": "Заштитите тајне помоћу енкрипције од краја до краја. Нема више тајни тврдог кодирања или дељења путем .env датотека." }, "enhanceDeveloperProductivity": { - "message": "Enhance developer productivity." + "message": "Повећајте продуктивност програмера." }, "enhanceDeveloperProductivityDescription": { - "message": "Programmatically retrieve and deploy secrets at runtime so developers can focus on what matters most, like improving code quality." + "message": "Програмски преузмите и примените тајне како би програмери могли да се усредсреде на оно што је најважније, као што је побољшање квалитета кода." }, "strengthenBusinessSecurity": { - "message": "Strengthen business security." + "message": "Ојачајте сигурност пословања." }, "strengthenBusinessSecurityDescription": { - "message": "Maintain tight control over machine and human access to secrets with SSO integrations, event logs, and access rotation." + "message": "Одржавајте чврсту контролу над машинским и људским приступом тајнама помоћу SSO интеграција, евиденције догађаја и ротације приступа." }, "tryItNow": { "message": "Пробајте сада" @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ваша главна лозинка не испуњава једну или више смерница ваше организације. Да бисте приступили сефу, морате одмах да ажурирате главну лозинку. Ако наставите, одјавићете се са ваше тренутне сесије, што захтева да се поново пријавите. Активне сесије на другим уређајима могу да остану активне до један сат." }, + "automaticAppLogin": { + "message": "Аутоматски пријавите кориснике за дозвољене апликације" + }, + "automaticAppLoginDesc": { + "message": "Обрасци за пријаву ће аутоматски бити попуњени и послати за апликације које покреће ваш провајдер идентитета." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Хост добављача идентитета" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Унесите УРЛ хоста добављача идентитета. Унесите више УРЛ-ова одвајањем зарезом." + }, "tdeDisabledMasterPasswordRequired": { "message": "Ваша организација је ажурирала опције дешифровања. Поставите главну лозинку за приступ вашем сефу." }, @@ -8816,10 +8848,10 @@ "message": "купљена места уклоњена" }, "fileSends": { - "message": "File Sends" + "message": "Датотека „Send“" }, "textSends": { - "message": "Text Sends" + "message": "Текст „Send“" }, "includesXMembers": { "message": "for $COUNT$ member", diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index f6c45165a6b..ebe3e186a20 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Beleške" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Prilagođena Polja" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Fascikla" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 415cabbed63..c9c346a358e 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Anteckningar" }, + "note": { + "message": "Anteckning" + }, "customFields": { "message": "Anpassade fält" }, @@ -49,11 +52,21 @@ "message": "Autentiseringsnyckel" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Webbplats (URI)" }, + "websiteUriCount": { + "message": "Webbplats (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Mapp" }, @@ -1505,6 +1521,10 @@ "message": "nytt objekt", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "ny inloggning", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " istället.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 3b3ab45fbd5..2f801ac0158 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notes" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Custom fields" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Folder" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 8a8d2102b1a..d40dc14cabd 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "หมายเหตุ" }, + "note": { + "message": "Note" + }, "customFields": { "message": "ฟิลด์ที่กำหนดเอง" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "โฟลเดอร์" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 443ef8e2419..3019fd06e23 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Notlar" }, + "note": { + "message": "Not" + }, "customFields": { "message": "Özel Alanlar" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Web sitesi (URI)" }, + "websiteUriCount": { + "message": "Web sitesi (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Web sitesi eklendi" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Klasör" }, @@ -1505,6 +1521,10 @@ "message": "yeni bir kayıt", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " oluşturabilirsiniz.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ana parolanız kuruluş ilkelerinizi karşılamıyor. Kasanıza erişmek için ana parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index e4a4ebc5bbb..14c1ec9725b 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Нотатки" }, + "note": { + "message": "Нотатка" + }, "customFields": { "message": "Власні поля" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "Вебсайт (URI)" }, + "websiteUriCount": { + "message": "Вебсайт (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Вебсайт додано" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden може автоматично заповнювати одноразові коди двоетапної перевірки. Відкрийте камеру, щоб сканувати QR-код на цьому вебсайті, або скопіюйте і вставте ключ у це поле." }, + "learnMoreAboutAuthenticators": { + "message": "Докладніше про програми автентифікації" + }, "folder": { "message": "Тека" }, @@ -1505,6 +1521,10 @@ "message": "новий запис", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "новий запис", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " натомість.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Ваш головний пароль не відповідає одній або більше політикам вашої організації. Щоб отримати доступ до сховища, вам необхідно оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." }, + "automaticAppLogin": { + "message": "Автоматичний вхід користувачів для дозволених програм" + }, + "automaticAppLoginDesc": { + "message": "Форми входу автоматично заповнюватимуться і надсилатимуться для програм, запущених від налаштованого провайдера ідентифікації." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Вузол провайдера ідентифікації" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Введіть URL-адресу вузла вашого провайдера ідентифікації. Можна ввести декілька URL-адрес, розділивши їх комою." + }, "tdeDisabledMasterPasswordRequired": { "message": "Ваша організація оновила параметри дешифрування. Встановіть головний пароль для доступу до сховища." }, diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 3dd422fcfb0..f787800f669 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "Ghi chú" }, + "note": { + "message": "Note" + }, "customFields": { "message": "Trường tùy chỉnh" }, @@ -49,11 +52,21 @@ "message": "Khóa xác thực" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "Thư mục" }, @@ -1505,6 +1521,10 @@ "message": "new item", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " instead.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index b4bc9bce069..2fd288a1990 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "备注" }, + "note": { + "message": "备注" + }, "customFields": { "message": "自定义字段" }, @@ -54,6 +57,16 @@ "websiteUri": { "message": "网站 (URI)" }, + "websiteUriCount": { + "message": "网站 (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "网址已添加" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden 可以存储并填充两步验证码。选择相机图标来截取此网站的验证器二维码,或者手动复制并粘贴密钥到此字段。" }, + "learnMoreAboutAuthenticators": { + "message": "了解更多关于验证器的信息" + }, "folder": { "message": "文件夹" }, @@ -1505,6 +1521,10 @@ "message": "新的项目", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "新的登录", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": " 。", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -2258,7 +2278,7 @@ "message": "Bitwarden 家庭版计划。" }, "addons": { - "message": "插件" + "message": "附加" }, "premiumAccess": { "message": "高级会员" @@ -2300,7 +2320,7 @@ } }, "summary": { - "message": "概要" + "message": "摘要" }, "total": { "message": "总计" @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "您的主密码不符合某一项或多项组织策略要求。要访问密码库,必须立即更新您的主密码。继续操作将使您退出当前会话,并要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。" }, + "automaticAppLogin": { + "message": "为允许的应用程序自动登录用户" + }, + "automaticAppLoginDesc": { + "message": "登录表单将自动填写并提交给从您配置的身份提供程序启动的 App。" + }, + "automaticAppLoginIdpHostLabel": { + "message": "身份提供程序主机" + }, + "automaticAppLoginIdpHostDesc": { + "message": "输入您的身份提供程序主机 URL。使用逗号分隔输入多个 URL。" + }, "tdeDisabledMasterPasswordRequired": { "message": "您的组织更新了您的解密选项。要访问您的密码库,请设置一个主密码。" }, @@ -6063,7 +6095,7 @@ "message": "安全密码生成好了!别忘了也在网站上更新一下您的密码。" }, "useGeneratorHelpTextPartOne": { - "message": "使用此生成器", + "message": "使用生成器", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index e474e013265..b5cb1f250ec 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -36,6 +36,9 @@ "notes": { "message": "備註" }, + "note": { + "message": "Note" + }, "customFields": { "message": "自訂欄位" }, @@ -49,11 +52,21 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Auto-fill options" + "message": "Autofill options" }, "websiteUri": { "message": "Website (URI)" }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, "websiteAdded": { "message": "Website added" }, @@ -199,6 +212,9 @@ "totpHelperWithCapture": { "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, "folder": { "message": "資料夾" }, @@ -1505,6 +1521,10 @@ "message": "新項目", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, + "onboardingImportDataDetailsLoginLink": { + "message": "new login", + "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" + }, "onboardingImportDataDetailsPartTwoNoOrgs": { "message": "。", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." @@ -5323,6 +5343,18 @@ "updateWeakMasterPasswordWarning": { "message": "您的主密碼不符合一個或多個組織原則要求。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" }, + "automaticAppLogin": { + "message": "Automatically log in users for allowed applications" + }, + "automaticAppLoginDesc": { + "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + }, + "automaticAppLoginIdpHostLabel": { + "message": "Identity provider host" + }, + "automaticAppLoginIdpHostDesc": { + "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has updated your decryption options. Please set a master password to access your vault." }, diff --git a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html index c7b53ed3ad6..cb804f66c27 100644 --- a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html +++ b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html @@ -62,6 +62,8 @@ rel="noreferrer" appA11yTitle="{{ 'learnMore' | i18n }}" href="https://bitwarden.com/help/about-key-connector/" + slot="end" + bitLink > diff --git a/libs/angular/src/auth/functions/unauth-ui-refresh-route-swap.ts b/libs/angular/src/auth/functions/unauth-ui-refresh-route-swap.ts new file mode 100644 index 00000000000..45dad4a1a71 --- /dev/null +++ b/libs/angular/src/auth/functions/unauth-ui-refresh-route-swap.ts @@ -0,0 +1,33 @@ +import { Type, inject } from "@angular/core"; +import { Route, Routes } from "@angular/router"; + +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { componentRouteSwap } from "../../utils/component-route-swap"; + +/** + * Helper function to swap between two components based on the UnauthenticatedExtensionUIRefresh feature flag. + * We need this because the auth teams's authenticated UI will be refreshed as part of the MVP but the + * unauthenticated UIs will not necessarily make the cut. + * Note: Even though this is primarily an extension refresh initiative, this will be used across clients + * as we are consolidating the unauthenticated UIs into single libs/auth components which affects all clients. + * @param defaultComponent - The current non-refreshed component to render. + * @param refreshedComponent - The new refreshed component to render. + * @param options - The shared route options to apply to both components. + */ +export function unauthUiRefreshSwap( + defaultComponent: Type, + refreshedComponent: Type, + options: Route, +): Routes { + return componentRouteSwap( + defaultComponent, + refreshedComponent, + async () => { + const configService = inject(ConfigService); + return configService.getFeatureFlag(FeatureFlag.UnauthenticatedExtensionUIRefresh); + }, + options, + ); +} diff --git a/libs/angular/src/vault/components/premium.component.ts b/libs/angular/src/vault/components/premium.component.ts index ea38be66e4a..cfe31327891 100644 --- a/libs/angular/src/vault/components/premium.component.ts +++ b/libs/angular/src/vault/components/premium.component.ts @@ -3,12 +3,13 @@ import { firstValueFrom, Observable } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.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 { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, SimpleDialogOptions } from "@bitwarden/components"; @Directive() export class PremiumComponent implements OnInit { @@ -16,13 +17,14 @@ export class PremiumComponent implements OnInit { price = 10; refreshPromise: Promise; cloudWebVaultUrl: string; + extensionRefreshFlagEnabled: boolean; constructor( protected i18nService: I18nService, protected platformUtilsService: PlatformUtilsService, protected apiService: ApiService, + protected configService: ConfigService, private logService: LogService, - protected stateService: StateService, protected dialogService: DialogService, private environmentService: EnvironmentService, billingAccountProfileStateService: BillingAccountProfileStateService, @@ -32,6 +34,9 @@ export class PremiumComponent implements OnInit { async ngOnInit() { this.cloudWebVaultUrl = await firstValueFrom(this.environmentService.cloudWebVaultUrl$); + this.extensionRefreshFlagEnabled = await this.configService.getFeatureFlag( + FeatureFlag.ExtensionRefresh, + ); } async refresh() { @@ -45,11 +50,20 @@ export class PremiumComponent implements OnInit { } async purchase() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "premiumPurchase" }, - content: { key: "premiumPurchaseAlert" }, + const dialogOpts: SimpleDialogOptions = { + title: { key: "continueToBitwardenDotCom" }, + content: { + key: this.extensionRefreshFlagEnabled ? "premiumPurchaseAlertV2" : "premiumPurchaseAlert", + }, type: "info", - }); + }; + + if (this.extensionRefreshFlagEnabled) { + dialogOpts.acceptButtonText = { key: "continue" }; + dialogOpts.cancelButtonText = { key: "close" }; + } + + const confirmed = await this.dialogService.openSimpleDialog(dialogOpts); if (confirmed) { this.platformUtilsService.launchUri( diff --git a/libs/auth/src/angular/anon-layout/anon-layout-wrapper.stories.ts b/libs/auth/src/angular/anon-layout/anon-layout-wrapper.stories.ts index 7e6fda54a82..c05f491acd2 100644 --- a/libs/auth/src/angular/anon-layout/anon-layout-wrapper.stories.ts +++ b/libs/auth/src/angular/anon-layout/anon-layout-wrapper.stories.ts @@ -19,6 +19,8 @@ import { ThemeType } from "@bitwarden/common/platform/enums"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { ButtonModule } from "@bitwarden/components"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { PreloadedEnglishI18nModule } from "../../../../../apps/web/src/app/core/tests"; import { LockIcon } from "../icons"; import { RegistrationCheckEmailIcon } from "../icons/registration-check-email.icon"; diff --git a/libs/auth/src/angular/input-password/input-password.stories.ts b/libs/auth/src/angular/input-password/input-password.stories.ts index 1d7459cd009..5b9805fde5d 100644 --- a/libs/auth/src/angular/input-password/input-password.stories.ts +++ b/libs/auth/src/angular/input-password/input-password.stories.ts @@ -11,6 +11,8 @@ import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.se import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; import { DialogService, ToastService } from "@bitwarden/components"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { PreloadedEnglishI18nModule } from "../../../../../apps/web/src/app/core/tests"; import { InputPasswordComponent } from "./input-password.component"; diff --git a/libs/auth/src/angular/registration/registration-start/registration-start.component.html b/libs/auth/src/angular/registration/registration-start/registration-start.component.html index d4298504fce..ad30f4a87a6 100644 --- a/libs/auth/src/angular/registration/registration-start/registration-start.component.html +++ b/libs/auth/src/angular/registration/registration-start/registration-start.component.html @@ -35,8 +35,9 @@ href="https://bitwarden.com/email-preferences" target="_blank" rel="noreferrer" - >{{ "unsubscribe" | i18n }} + {{ "unsubscribe" | i18n }} + {{ "atAnyTime" | i18n }} diff --git a/libs/auth/src/angular/registration/registration-start/registration-start.stories.ts b/libs/auth/src/angular/registration/registration-start/registration-start.stories.ts index d0670dd10c4..e4d016de49b 100644 --- a/libs/auth/src/angular/registration/registration-start/registration-start.stories.ts +++ b/libs/auth/src/angular/registration/registration-start/registration-start.stories.ts @@ -27,6 +27,8 @@ import { TypographyModule, } from "@bitwarden/components"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { PreloadedEnglishI18nModule } from "../../../../../../apps/web/src/app/core/tests"; import { RegistrationStartComponent } from "./registration-start.component"; diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index bfe6dbd33de..583b6996970 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -32,6 +32,7 @@ export enum FeatureFlag { EnableUpgradePasswordManagerSub = "AC-2708-upgrade-password-manager-sub", GenerateIdentityFillScriptRefactor = "generate-identity-fill-script-refactor", DelayFido2PageScriptInitWithinMv2 = "delay-fido2-page-script-init-within-mv2", + AccountDeprovisioning = "pm-10308-account-deprovisioning", } export type AllowedFeatureFlagTypes = boolean | number | string; @@ -74,6 +75,7 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.EnableUpgradePasswordManagerSub]: FALSE, [FeatureFlag.GenerateIdentityFillScriptRefactor]: FALSE, [FeatureFlag.DelayFido2PageScriptInitWithinMv2]: FALSE, + [FeatureFlag.AccountDeprovisioning]: FALSE, } satisfies Record; export type DefaultFeatureFlagValueType = typeof DefaultFeatureFlagValue; diff --git a/libs/common/src/platform/services/fido2/fido2-active-request-manager.spec.ts b/libs/common/src/platform/services/fido2/fido2-active-request-manager.spec.ts index 77f9bd3f9cb..ce9426b4db0 100644 --- a/libs/common/src/platform/services/fido2/fido2-active-request-manager.spec.ts +++ b/libs/common/src/platform/services/fido2/fido2-active-request-manager.spec.ts @@ -1,6 +1,8 @@ import { mock } from "jest-mock-extended"; import { firstValueFrom, Observable } from "rxjs"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { flushPromises } from "@bitwarden/browser/src/autofill/spec/testing-utils"; import { Fido2CredentialView } from "../../../vault/models/view/fido2-credential.view"; diff --git a/libs/common/src/tools/send/services/send.service.spec.ts b/libs/common/src/tools/send/services/send.service.spec.ts index 9ed5bed0142..5d04127192f 100644 --- a/libs/common/src/tools/send/services/send.service.spec.ts +++ b/libs/common/src/tools/send/services/send.service.spec.ts @@ -1,5 +1,8 @@ import { mock } from "jest-mock-extended"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, of } from "rxjs"; + +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { FakeAccountService, @@ -41,6 +44,7 @@ describe("SendService", () => { const i18nService = mock(); const keyGenerationService = mock(); const encryptService = mock(); + const environmentService = mock(); let sendStateProvider: SendStateProvider; let sendService: SendService; @@ -56,6 +60,10 @@ describe("SendService", () => { accountService = mockAccountServiceWith(mockUserId); stateProvider = new FakeStateProvider(accountService); sendStateProvider = new SendStateProvider(stateProvider); + Object.defineProperty(environmentService, "environment$", { + configurable: true, + get: () => of(new SelfHostedEnvironment({ webVault: "https://example.com" })), + }); (window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService); diff --git a/libs/components/src/banner/banner.stories.ts b/libs/components/src/banner/banner.stories.ts index f265c1eccf4..26bbe30f63f 100644 --- a/libs/components/src/banner/banner.stories.ts +++ b/libs/components/src/banner/banner.stories.ts @@ -48,7 +48,7 @@ export const Premium: Story = { args: { bannerType: "premium", }, - render: (args: BannerComponent) => ({ + render: (args) => ({ props: args, template: ` @@ -93,7 +93,7 @@ export const HideClose: Story = { export const Stacked: Story = { args: {}, - render: (args: BannerComponent) => ({ + render: (args) => ({ props: args, template: ` diff --git a/libs/components/src/chip-select/chip-select.stories.ts b/libs/components/src/chip-select/chip-select.stories.ts index a54cdf23b3f..e1489ec9933 100644 --- a/libs/components/src/chip-select/chip-select.stories.ts +++ b/libs/components/src/chip-select/chip-select.stories.ts @@ -1,6 +1,6 @@ import { FormsModule } from "@angular/forms"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { getAllByRole, userEvent } from "@storybook/testing-library"; +import { getAllByRole, userEvent } from "@storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -40,7 +40,7 @@ export const Default: Story = { ...args, }, template: /* html */ ` - ({ - props: args, + render: () => ({ template: ` `, @@ -78,7 +77,7 @@ export const WithoutRoute: Story = { }; export const WithChildButtons: Story = { - render: (args: NavItemComponent) => ({ + render: (args) => ({ props: args, template: ` @@ -104,7 +103,7 @@ export const WithChildButtons: Story = { }; export const MultipleItemsWithDivider: Story = { - render: (args: NavItemComponent) => ({ + render: (args) => ({ props: args, template: ` @@ -117,7 +116,7 @@ export const MultipleItemsWithDivider: Story = { }; export const ForceActiveStyles: Story = { - render: (args: NavItemComponent) => ({ + render: (args) => ({ props: args, template: ` diff --git a/libs/components/src/stories/icons.mdx b/libs/components/src/stories/icons.mdx index 70fe18b34a8..8bc3ad7f3ac 100644 --- a/libs/components/src/stories/icons.mdx +++ b/libs/components/src/stories/icons.mdx @@ -1,5 +1,3 @@ -{/* Iconography.stories.mdx */} - import { Meta } from "@storybook/addon-docs"; diff --git a/libs/components/src/stories/kitchen-sink/components/kitchen-sink-form.component.ts b/libs/components/src/stories/kitchen-sink/components/kitchen-sink-form.component.ts index 027c155ab53..c63b36ea89c 100644 --- a/libs/components/src/stories/kitchen-sink/components/kitchen-sink-form.component.ts +++ b/libs/components/src/stories/kitchen-sink/components/kitchen-sink-form.component.ts @@ -77,6 +77,7 @@ import { KitchenSinkSharedModule } from "../kitchen-sink-shared.module"; [bitPopoverTriggerFor]="myPopover" #triggerRef="popoverTrigger" type="button" + slot="end" > diff --git a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts index f9d1e4166f5..58bd9716792 100644 --- a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts +++ b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts @@ -8,13 +8,7 @@ import { componentWrapperDecorator, moduleMetadata, } from "@storybook/angular"; -import { - userEvent, - getAllByRole, - getByRole, - getByLabelText, - fireEvent, -} from "@storybook/testing-library"; +import { userEvent, getAllByRole, getByRole, getByLabelText, fireEvent } from "@storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -126,14 +120,14 @@ export const MenuOpen: Story = { export const DefaultDialogOpen: Story = { ...Default, - play: (context) => { + play: async (context) => { const canvas = context.canvasElement; const dialogButton = getByRole(canvas, "button", { name: "Open Dialog", }); // workaround for userEvent not firing in FF https://github.com/testing-library/user-event/issues/1075 - fireEvent.click(dialogButton); + await fireEvent.click(dialogButton); }, }; @@ -151,14 +145,14 @@ export const PopoverOpen: Story = { export const SimpleDialogOpen: Story = { ...Default, - play: (context) => { + play: async (context) => { const canvas = context.canvasElement; const submitButton = getByRole(canvas, "button", { name: "Submit", }); // workaround for userEvent not firing in FF https://github.com/testing-library/user-event/issues/1075 - fireEvent.click(submitButton); + await fireEvent.click(submitButton); }, }; diff --git a/libs/components/src/tabs/tabs.stories.ts b/libs/components/src/tabs/tabs.stories.ts index 63bd632caa3..6b460d8ee00 100644 --- a/libs/components/src/tabs/tabs.stories.ts +++ b/libs/components/src/tabs/tabs.stories.ts @@ -103,7 +103,7 @@ export const ContentTabs: Story = { }; export const NavigationTabs: Story = { - render: (args: TabGroupComponent) => ({ + render: (args) => ({ props: args, template: ` @@ -126,7 +126,7 @@ export const NavigationTabs: Story = { }; export const PreserveContentTabs: Story = { - render: (args: any) => ({ + render: (args) => ({ props: args, template: ` @@ -147,7 +147,7 @@ export const PreserveContentTabs: Story = { }; export const KeyboardNavigation: Story = { - render: (args: any) => ({ + render: (args) => ({ props: args, template: ` diff --git a/libs/importer/spec/nordpass-csv-importer.spec.ts b/libs/importer/spec/nordpass-csv-importer.spec.ts index 963e4e847cc..a7bbf0fc79c 100644 --- a/libs/importer/spec/nordpass-csv-importer.spec.ts +++ b/libs/importer/spec/nordpass-csv-importer.spec.ts @@ -1,4 +1,5 @@ -import { SecureNoteType, CipherType } from "@bitwarden/common/vault/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { SecureNoteType, CipherType, FieldType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; @@ -6,6 +7,7 @@ import { NordPassCsvImporter } from "../src/importers"; import { data as creditCardData } from "./test-data/nordpass-csv/nordpass.card.csv"; import { data as identityData } from "./test-data/nordpass-csv/nordpass.identity.csv"; +import { data as loginDataWithAdditionalUrls } from "./test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv"; import { data as loginData } from "./test-data/nordpass-csv/nordpass.login.csv"; import { data as secureNoteData } from "./test-data/nordpass-csv/nordpass.secure-note.csv"; @@ -63,6 +65,21 @@ function expectLogin(cipher: CipherView) { expect(cipher.name).toBe("SomeVaultItemName"); expect(cipher.notes).toBe("Some note for the VaultItem"); expect(cipher.login.uri).toBe("https://example.com"); + expect(cipher.login.uris.length).toBe(1); + expect(cipher.login.uris[0].uri).toBe("https://example.com"); + expect(cipher.login.username).toBe("hello@bitwarden.com"); + expect(cipher.login.password).toBe("someStrongPassword"); +} + +function expectLoginWithAdditionalUrls(cipher: CipherView) { + expect(cipher.type).toBe(CipherType.Login); + + expect(cipher.name).toBe("SomeVaultItemName"); + expect(cipher.notes).toBe("Some note for the VaultItem"); + expect(cipher.login.uri).toBe("https://example.com"); + expect(cipher.login.uris.length).toBe(2); + expect(cipher.login.uris[0].uri).toBe("https://example.com"); + expect(cipher.login.uris[1].uri).toBe("https://example.net"); expect(cipher.login.username).toBe("hello@bitwarden.com"); expect(cipher.login.password).toBe("someStrongPassword"); } @@ -107,12 +124,29 @@ function expectSecureNote(cipher: CipherView) { expect(cipher.notes).toBe("MySuperSecureNote"); } +function expectFields(cipher: CipherView) { + expect(cipher.fields.length).toBe(2); + expect(cipher.fields[0].name).toBe("textLabel"); + expect(cipher.fields[0].value).toBe("text value"); + expect(cipher.fields[0].type).toBe(FieldType.Text); + expect(cipher.fields[1].name).toBe("hiddenLabel"); + expect(cipher.fields[1].value).toBe("hidden value"); + expect(cipher.fields[1].type).toBe(FieldType.Hidden); +} + describe("NordPass CSV Importer", () => { let importer: NordPassCsvImporter; beforeEach(() => { importer = new NordPassCsvImporter(); }); + it("should return false when not able to parse data", async () => { + const result = await importer.parse(""); + + expect(result).not.toBeNull(); + expect(result.success).toBe(false); + }); + it("should parse login records", async () => { const result = await importer.parse(loginData); @@ -121,6 +155,17 @@ describe("NordPass CSV Importer", () => { expect(result.ciphers.length).toBe(1); const cipher = result.ciphers[0]; expectLogin(cipher); + expectFields(cipher); //for custom fields + }); + + it("should parse login records with additinal urls", async () => { + const result = await importer.parse(loginDataWithAdditionalUrls); + + expect(result).not.toBeNull(); + expect(result.success).toBe(true); + expect(result.ciphers.length).toBe(1); + const cipher = result.ciphers[0]; + expectLoginWithAdditionalUrls(cipher); }); it("should parse credit card records", async () => { @@ -178,4 +223,15 @@ describe("NordPass CSV Importer", () => { const folder = result.folders[0]; expect(folder.name).toBe("notesFolder"); }); + + it("should parse an item and create a collection if organizationId is set", async () => { + importer.organizationId = Utils.newGuid(); + const result = await importer.parse(secureNoteData); + + expect(result).not.toBeNull(); + expect(result.success).toBe(true); + expect(result.collections.length).toBe(1); + const collection = result.collections[0]; + expect(collection.name).toBe("notesFolder"); + }); }); diff --git a/libs/importer/spec/protonpass-json-importer.spec.ts b/libs/importer/spec/protonpass-json-importer.spec.ts index f58e4d5f257..d5f4653c643 100644 --- a/libs/importer/spec/protonpass-json-importer.spec.ts +++ b/libs/importer/spec/protonpass-json-importer.spec.ts @@ -116,4 +116,14 @@ describe("Protonpass Json Importer", () => { expect(ciphers.length).toBe(4); }); + + it("should set favorites", async () => { + const testDataJson = JSON.stringify(testData); + const result = await importer.parse(testDataJson); + + const ciphers = result.ciphers; + expect(ciphers[0].favorite).toBe(true); + expect(ciphers[1].favorite).toBe(false); + expect(ciphers[2].favorite).toBe(true); + }); }); diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts b/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts index 8d79d2b1bfc..0141260ce0a 100644 --- a/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts +++ b/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts @@ -1,2 +1,2 @@ -export const data = `name,url,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state -SomeVisa,,,,,SomeHolder,4024007103939509,123,01 / 22,12345,,,,,,,,,`; +export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields +SomeVisa,,,,,,SomeHolder,4024007103939509,123,01 / 22,12345,,,,,,,,,,credit_card,`; diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts b/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts index 4dde389c729..d1bb481dfb8 100644 --- a/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts +++ b/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts @@ -1,2 +1,2 @@ -export const data = `name,url,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state -SomeTitle,,,,SomeNoteToMyIdentity,,,,,123456,,#fullName,123456789,hello@bitwarden.com,Test street 123,additional addressinfo,Cologne,Germany,North-Rhine-Westphalia`; +export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields +SomeTitle,,,,,SomeNoteToMyIdentity,,,,,123456,,#fullName,123456789,hello@bitwarden.com,Test street 123,additional addressinfo,Cologne,Germany,North-Rhine-Westphalia,identity,`; diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts b/libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts new file mode 100644 index 00000000000..a1052a0fbbc --- /dev/null +++ b/libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts @@ -0,0 +1,2 @@ +export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields +SomeVaultItemName,https://example.com,"[""https://example.net""]",hello@bitwarden.com,someStrongPassword,Some note for the VaultItem,,,,,,SomeFolderForVaultItem,,,,,,,,,password,`; diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts b/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts index e2af76b0fbb..d6c9f682a17 100644 --- a/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts +++ b/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts @@ -1,2 +1,2 @@ -export const data = `name,url,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state -SomeVaultItemName,https://example.com,hello@bitwarden.com,someStrongPassword,Some note for the VaultItem,,,,,,SomeFolderForVaultItem,,,,,,,,`; +export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields +SomeVaultItemName,https://example.com,,hello@bitwarden.com,someStrongPassword,Some note for the VaultItem,,,,,,SomeFolderForVaultItem,,,,,,,,,password,"[{""label"":""textLabel"",""type"":""text"",""value"":""text value""},{""label"":""hiddenLabel"",""type"":""hidden"",""value"":""hidden value""}]"`; diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts b/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts index 0e4dcb2ef83..1e8866525cf 100644 --- a/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts +++ b/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts @@ -1,3 +1,3 @@ -export const data = `name,url,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state -notesFolder,,,,,,,,,,,,,,,,,, -MySuperSecureNoteTitle,,,,MySuperSecureNote,,,,,,notesFolder,,,,,,,,`; +export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields +notesFolder,,,,,,,,,,,,,,,,,,,,, +MySuperSecureNoteTitle,,,,,MySuperSecureNote,,,,,,notesFolder,,,,,,,,,note,`; diff --git a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts index ddbe9e89b9e..a508a03debc 100644 --- a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts +++ b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts @@ -1,7 +1,7 @@ import { ProtonPassJsonFile } from "../../../src/importers/protonpass/types/protonpass-json-type"; export const testData: ProtonPassJsonFile = { - version: "1.3.1", + version: "1.21.2", userId: "REDACTED_USER_ID", encrypted: false, vaults: { @@ -54,6 +54,7 @@ export const testData: ProtonPassJsonFile = { urls: ["https://example.com/", "https://example2.com/"], totpUri: "otpauth://totp/Test%20Login%20-%20Personal%20Vault:Username?issuer=Test%20Login%20-%20Personal%20Vault&secret=TOTPCODE&algorithm=SHA1&digits=6&period=30", + passkeys: [], itemUsername: "Username", }, }, @@ -62,6 +63,7 @@ export const testData: ProtonPassJsonFile = { contentFormatVersion: 1, createTime: 1689182868, modifyTime: 1689182868, + pinned: true, }, { itemId: @@ -83,6 +85,7 @@ export const testData: ProtonPassJsonFile = { contentFormatVersion: 1, createTime: 1689182908, modifyTime: 1689182908, + pinned: false, }, { itemId: @@ -111,6 +114,7 @@ export const testData: ProtonPassJsonFile = { contentFormatVersion: 1, createTime: 1691001643, modifyTime: 1691001643, + pinned: true, }, { itemId: @@ -132,6 +136,7 @@ export const testData: ProtonPassJsonFile = { contentFormatVersion: 1, createTime: 1689182908, modifyTime: 1689182908, + pinned: false, }, ], }, @@ -161,6 +166,7 @@ export const testData: ProtonPassJsonFile = { password: "other vault password", urls: [], totpUri: "JBSWY3DPEHPK3PXP", + passkeys: [], itemUsername: "", }, }, @@ -169,6 +175,7 @@ export const testData: ProtonPassJsonFile = { contentFormatVersion: 1, createTime: 1689182949, modifyTime: 1689182949, + pinned: false, }, ], }, diff --git a/libs/importer/src/importers/nordpass-csv-importer.ts b/libs/importer/src/importers/nordpass-csv-importer.ts index 39685df3d4e..a2a3905e419 100644 --- a/libs/importer/src/importers/nordpass-csv-importer.ts +++ b/libs/importer/src/importers/nordpass-csv-importer.ts @@ -1,4 +1,4 @@ -import { SecureNoteType, CipherType } from "@bitwarden/common/vault/enums"; +import { SecureNoteType, CipherType, FieldType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; @@ -8,9 +8,10 @@ import { ImportResult } from "../models/import-result"; import { BaseImporter } from "./base-importer"; import { Importer } from "./importer"; -type nodePassCsvParsed = { +type NordPassCsvParsed = { name: string; url: string; + additional_urls: string; username: string; password: string; note: string; @@ -28,12 +29,20 @@ type nodePassCsvParsed = { city: string; country: string; state: string; + type: string; + custom_fields: string; +}; + +type NordPassCustomField = { + label: string; + type: string; + value: string; }; export class NordPassCsvImporter extends BaseImporter implements Importer { parse(data: string): Promise { const result = new ImportResult(); - const results: nodePassCsvParsed[] = this.parseCsv(data, true); + const results: NordPassCsvParsed[] = this.parseCsv(data, true); if (results == null) { result.success = false; return Promise.resolve(result); @@ -45,21 +54,40 @@ export class NordPassCsvImporter extends BaseImporter implements Importer { return; } - if (!this.organization) { - this.processFolder(result, record.folder); - } + this.processFolder(result, record.folder); const cipher = new CipherView(); cipher.name = this.getValueOrDefault(record.name, "--"); cipher.notes = this.getValueOrDefault(record.note); + if (record.custom_fields) { + const customFieldsParsed: NordPassCustomField[] = JSON.parse(record.custom_fields); + if (customFieldsParsed && customFieldsParsed.length > 0) { + customFieldsParsed.forEach((field) => { + let fieldType = FieldType.Text; + + if (field.type == "hidden") { + fieldType = FieldType.Hidden; + } + + this.processKvp(cipher, field.label, field.value, fieldType); + }); + } + } + switch (recordType) { case CipherType.Login: cipher.type = CipherType.Login; cipher.login = new LoginView(); cipher.login.username = this.getValueOrDefault(record.username); cipher.login.password = this.getValueOrDefault(record.password); - cipher.login.uris = this.makeUriArray(record.url); + if (record.additional_urls) { + const additionalUrlsParsed: string[] = JSON.parse(record.additional_urls); + const uris = [record.url, ...additionalUrlsParsed]; + cipher.login.uris = this.makeUriArray(uris); + } else { + cipher.login.uris = this.makeUriArray(record.url); + } break; case CipherType.Card: cipher.type = CipherType.Card; @@ -106,21 +134,16 @@ export class NordPassCsvImporter extends BaseImporter implements Importer { return Promise.resolve(result); } - private evaluateType(record: nodePassCsvParsed): CipherType { - if (!this.isNullOrWhitespace(record.username)) { - return CipherType.Login; - } - - if (!this.isNullOrWhitespace(record.cardnumber)) { - return CipherType.Card; - } - - if (!this.isNullOrWhitespace(record.full_name)) { - return CipherType.Identity; - } - - if (!this.isNullOrWhitespace(record.note)) { - return CipherType.SecureNote; + private evaluateType(record: NordPassCsvParsed): CipherType { + switch (record.type) { + case "password": + return CipherType.Login; + case "credit_card": + return CipherType.Card; + case "note": + return CipherType.SecureNote; + case "identity": + return CipherType.Identity; } return undefined; diff --git a/libs/importer/src/importers/protonpass/protonpass-json-importer.ts b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts index 7a7018bde22..b8f6bc170c2 100644 --- a/libs/importer/src/importers/protonpass/protonpass-json-importer.ts +++ b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts @@ -43,6 +43,7 @@ export class ProtonPassJsonImporter extends BaseImporter implements Importer { const cipher = this.initLoginCipher(); cipher.name = this.getValueOrDefault(item.data.metadata.name, "--"); cipher.notes = this.getValueOrDefault(item.data.metadata.note); + cipher.favorite = item.pinned; switch (item.data.type) { case "login": { diff --git a/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts index 4c082a93cfb..eb3b4bba5ac 100644 --- a/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts +++ b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts @@ -24,6 +24,7 @@ export type ProtonPassItem = { contentFormatVersion: number; createTime: number; modifyTime: number; + pinned: boolean; }; export enum ProtonPassItemState { @@ -34,6 +35,7 @@ export enum ProtonPassItemState { export type ProtonPassItemData = { metadata: ProtonPassItemMetadata; extraFields: ProtonPassItemExtraField[]; + platformSpecific?: any; type: "login" | "alias" | "creditCard" | "note"; content: ProtonPassLoginItemContent | ProtonPassCreditCardItemContent; }; @@ -60,6 +62,7 @@ export type ProtonPassLoginItemContent = { password?: string; urls?: string[]; totpUri?: string; + passkeys: []; itemUsername?: string; }; diff --git a/libs/tools/send/send-ui/src/icons/index.ts b/libs/tools/send/send-ui/src/icons/index.ts index a2428e56330..4460070f43b 100644 --- a/libs/tools/send/send-ui/src/icons/index.ts +++ b/libs/tools/send/send-ui/src/icons/index.ts @@ -1,2 +1,3 @@ -export { NoSendsIcon } from "./no-send.icon"; export { ExpiredSendIcon } from "./expired-send.icon"; +export { NoSendsIcon } from "./no-send.icon"; +export { SendCreatedIcon } from "./send-created.icon"; diff --git a/libs/tools/send/send-ui/src/icons/no-send.icon.ts b/libs/tools/send/send-ui/src/icons/no-send.icon.ts index f3d06d0cfd0..e1442ad7029 100644 --- a/libs/tools/send/send-ui/src/icons/no-send.icon.ts +++ b/libs/tools/send/send-ui/src/icons/no-send.icon.ts @@ -2,12 +2,12 @@ import { svgIcon } from "@bitwarden/components"; export const NoSendsIcon = svgIcon` - - - - - - - + + + + + + + `; diff --git a/libs/tools/send/send-ui/src/icons/send-created.icon.ts b/libs/tools/send/send-ui/src/icons/send-created.icon.ts new file mode 100644 index 00000000000..bb4bc2dd3b9 --- /dev/null +++ b/libs/tools/send/send-ui/src/icons/send-created.icon.ts @@ -0,0 +1,16 @@ +import { svgIcon } from "@bitwarden/components"; + +export const SendCreatedIcon = svgIcon` + + + + + + + + + + + + +`; diff --git a/libs/tools/send/send-ui/src/send-form/send-form.stories.ts b/libs/tools/send/send-ui/src/send-form/send-form.stories.ts index 044b26577ee..2c47bd62626 100644 --- a/libs/tools/send/send-ui/src/send-form/send-form.stories.ts +++ b/libs/tools/send/send-ui/src/send-form/send-form.stories.ts @@ -13,6 +13,8 @@ import { Send } from "@bitwarden/common/tools/send/models/domain/send"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { AsyncActionsModule, ButtonModule, ToastService } from "@bitwarden/components"; import { SendFormConfig } from "@bitwarden/send-ui"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/src/app/core/tests"; import { SendFormService } from "./abstractions/send-form.service"; diff --git a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.spec.ts b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.spec.ts index 847283ef5e1..d3651fc12cb 100644 --- a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.spec.ts +++ b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.spec.ts @@ -12,6 +12,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; import { ButtonModule, BadgeModule, @@ -30,6 +31,7 @@ describe("SendListItemsContainerComponent", () => { let component: SendListItemsContainerComponent; let fixture: ComponentFixture; let environmentService: MockProxy; + let sendService: MockProxy; const openSimpleDialog = jest.fn(); const showToast = jest.fn(); @@ -37,6 +39,8 @@ describe("SendListItemsContainerComponent", () => { const deleteFn = jest.fn().mockResolvedValue(undefined); beforeEach(async () => { + sendService = mock(); + await TestBed.configureTestingModule({ imports: [ CommonModule, @@ -57,6 +61,7 @@ describe("SendListItemsContainerComponent", () => { { provide: PlatformUtilsService, useValue: { copyToClipboard } }, { provide: SendApiService, useValue: { delete: deleteFn } }, { provide: ToastService, useValue: { showToast } }, + { provide: SendService, useValue: sendService }, ], }) .overrideProvider(DialogService, { @@ -113,10 +118,11 @@ describe("SendListItemsContainerComponent", () => { it("should copy send link", async () => { const send = { id: "123", accessId: "abc", urlB64Key: "xyz" } as SendView; + const link = "https://example.com/#/send/abc/xyz"; await component.copySendLink(send); - expect(copyToClipboard).toHaveBeenCalledWith("https://example.com/#/send/abc/xyz"); + expect(copyToClipboard).toHaveBeenCalledWith(link); expect(showToast).toHaveBeenCalledWith({ variant: "success", title: null, diff --git a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts index 9551fe07ee8..2dd8078fd7a 100644 --- a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts +++ b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts @@ -85,9 +85,9 @@ export class SendListItemsContainerComponent { } } - async copySendLink(s: SendView) { + async copySendLink(send: SendView) { const env = await firstValueFrom(this.environmentService.environment$); - const link = env.getSendUrl() + s.accessId + "/" + s.urlB64Key; + const link = env.getSendUrl() + send.accessId + "/" + send.urlB64Key; this.platformUtilsService.copyToClipboard(link); this.toastService.showToast({ variant: "success", diff --git a/libs/vault/src/cipher-form/cipher-form.stories.ts b/libs/vault/src/cipher-form/cipher-form.stories.ts index b29bf8c781f..c78bd308731 100644 --- a/libs/vault/src/cipher-form/cipher-form.stories.ts +++ b/libs/vault/src/cipher-form/cipher-form.stories.ts @@ -26,6 +26,8 @@ import { CipherFormGenerationService, PasswordRepromptService, } from "@bitwarden/vault"; +// FIXME: remove `/apps` import from `/libs` +// eslint-disable-next-line import/no-restricted-paths import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/src/app/core/tests"; import { CipherFormService } from "./abstractions/cipher-form.service"; diff --git a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html index 12171936ef9..af75eae862c 100644 --- a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html +++ b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html @@ -97,6 +97,7 @@ type="button" [bitPopoverTriggerFor]="totpPopover" [appA11yTitle]="'learnMoreAboutAuthenticators' | i18n" + slot="end" > diff --git a/libs/vault/src/cipher-view/cipher-view.component.html b/libs/vault/src/cipher-view/cipher-view.component.html index 2a2a4ded05c..68c80a7bd52 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.html +++ b/libs/vault/src/cipher-view/cipher-view.component.html @@ -9,11 +9,7 @@ - + diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index 9ca983a5c98..6aeb58c9851 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -3,7 +3,7 @@

    {{ "loginCredentials" | i18n }}

    - + {{ "username" | i18n }} @@ -11,7 +11,7 @@ readonly bitInput type="text" - [value]="login.username" + [value]="cipher.login.username" aria-readonly="true" data-testid="login-username" /> @@ -19,20 +19,20 @@ bitIconButton="bwi-clone" bitSuffix type="button" - [appCopyClick]="login.username" + [appCopyClick]="cipher.login.username" [valueLabel]="'username' | i18n" showToast [appA11yTitle]="'copyValue' | i18n" data-testid="toggle-username" > - + {{ "password" | i18n }} @@ -45,7 +45,7 @@ (toggledChange)="pwToggleValue($event)" > - + - + {{ "verificationCodeTotp" | i18n }} {{ "premium" | i18n }} @@ -84,17 +88,25 @@ +