diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml index 121236c0deb..1287970ccf6 100644 --- a/.github/workflows/publish-cli.yml +++ b/.github/workflows/publish-cli.yml @@ -199,6 +199,7 @@ jobs: - name: Get Node version id: retrieve-node-version + working-directory: ./ run: | NODE_NVMRC=$(cat .nvmrc) NODE_VERSION=${NODE_NVMRC/v/''} @@ -208,9 +209,13 @@ jobs: uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - npm-version: "11.5.1" # FIXME: npm 11.5.1 or later is required to publish w/ OIDC; move version management to somewhere maintainable by automation registry-url: "https://registry.npmjs.org/" + - name: Install NPM + run: | + npm install -g npm@latest # npm 11.5.1 or later is required to publish w/ OIDC + npm --version + - name: Download and set up artifact run: | mkdir -p build diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index de3383ef2d3..82639f19974 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index caaee731fd9..1d5ca88f40e 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -558,7 +558,7 @@ "message": "Arxivlə", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Arxivdən çıxart" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "Arxivlənmiş elementlər burada görünəcək, ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Element arxivə göndərildi" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Element arxivdən çıxarıldı" }, "archiveItem": { @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Seyfinizə xoş gəlmisiniz!" }, - "phishingPageTitle": { - "message": "Fişinq veb sayt" + "phishingPageTitleV2": { + "message": "Fişinq cəhdi aşkarlandı" }, - "phishingPageCloseTab": { - "message": "Vərəqi bağla" + "phishingPageSummary": { + "message": "Ziyarət etməyə cəhd etdiyiniz sayt, zərərli sayt kimi tanınır və təhlükəsizlik baxımından risklidir." }, - "phishingPageContinue": { - "message": "Davam" + "phishingPageCloseTabV2": { + "message": "Bu vərəqi bağla" }, - "phishingPageLearnWhy": { - "message": "Bunu niyə görürürsünüz?" + "phishingPageContinueV2": { + "message": "Bu sayta davam et (tövsiyə olunmur)" + }, + "phishingPageExplanation1": { + "message": "Bu sayt burada üzə çıxdı ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": "Bu mənbədə fərdi və həssas məlumatların oğurlanması üçün istifadə olunan məlum fişinq saytların açıq mənbəli siyahısıdır.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Fişinq aşkarlaması haqqında daha ətraflı" + }, + "protectedBy": { + "message": "$PRODUCT$ tərəfindən qorunur", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Hazırkı səhifə üçün elementləri avto-doldur" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index d395e4f01a6..60fa6e22481 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -189,7 +189,7 @@ "message": "Скапіяваць нататкі" }, "copy": { - "message": "Copy", + "message": "Скапіяваць", "description": "Copy to clipboard" }, "fill": { @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index d3d7c3dc502..fdeb336d94f 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -558,7 +558,7 @@ "message": "Архивиране", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Изваждане от архива" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Архивираните елементи ще се показват тук и ще бъдат изключени от общите резултати при търсене и от предложенията за автоматично попълване." }, - "itemSentToArchive": { - "message": "Елементът е преместен в архива" + "itemWasSentToArchive": { + "message": "Елементът беше преместен в архива" }, - "itemRemovedFromArchive": { - "message": "Елементът е изваден от архива" + "itemUnarchived": { + "message": "Елементът беше изваден от архива" }, "archiveItem": { "message": "Архивиране на елемента" @@ -3226,7 +3226,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Само трезорът свързан с $ORGANIZATION$ ще бъде експортиран. Моите записи няма да бъдат включени.", "placeholders": { "organization": { "content": "$1", @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Добре дошли в трезора си!" }, - "phishingPageTitle": { - "message": "Измамен уеб сайт" + "phishingPageTitleV2": { + "message": "Засечен е опит за измама" }, - "phishingPageCloseTab": { - "message": "Затваряне на раздела" + "phishingPageSummary": { + "message": "Уеб сайтът, който се опитвате да посетите, е известен като злонамерен и може да представлява риск за сигурността." }, - "phishingPageContinue": { - "message": "Продължаване" + "phishingPageCloseTabV2": { + "message": "Затваряне на този раздел" }, - "phishingPageLearnWhy": { - "message": "Защо виждате това?" + "phishingPageContinueV2": { + "message": "Продължаване към уеб сайта (не се препоръчва)" + }, + "phishingPageExplanation1": { + "message": "Този уеб сайт е открит в ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", отворен списък с известни измамни уеб сайтове, които могат да отмъкнат Вашите лични или поверителни данни.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Научете повече относно разпознаването на измамни уеб сайтове" + }, + "protectedBy": { + "message": "Защитено от $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Попълвайте автоматично елементи в текущата страница" diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 389a47bd248..9baa0547ffb 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 994aec7473c..402c278f1f9 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 201298369a3..255d2bcb1b2 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index d6b3cc9083b..9e08cf87e7a 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -558,7 +558,7 @@ "message": "Archivovat", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Odebrat z archivu" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "Zde se zobrazí archivované položky a budou vyloučeny z obecných výsledků vyhledávání a návrhů automatického vyplňování." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Položka byla přesunuta do archivu" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Položka byla odebrána z archivu" }, "archiveItem": { @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Vítejte ve Vašem trezoru!" }, - "phishingPageTitle": { - "message": "Phishingové webová stránka" + "phishingPageTitleV2": { + "message": "Zjištěn pokus o phishing" }, - "phishingPageCloseTab": { - "message": "Zavřít kartu" + "phishingPageSummary": { + "message": "Stránka, kterou se pokoušíte navštívit, je známá škodlivá stránka a bezpečnostní riziko." }, - "phishingPageContinue": { - "message": "Pokračovat" + "phishingPageCloseTabV2": { + "message": "Zavřít tuto kartu" }, - "phishingPageLearnWhy": { - "message": "Proč to vidíte?" + "phishingPageContinueV2": { + "message": "Pokračovat na tuto stránku (nedoporučeno)" + }, + "phishingPageExplanation1": { + "message": "Tato stránka byla nalezena v ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", open-source seznamu známých phishingových stránek používaných pro krádež osobních a citlivých informací.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Další informace o detekci phishingu" + }, + "protectedBy": { + "message": "Chráněno produktem $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Položky automatického vyplňování aktuální stránky" diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index b8758c60f00..70f0163d349 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 2fc49cceb1e..d65e8382434 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 003d4e6b8b0..e41187db557 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -558,7 +558,7 @@ "message": "Archivieren", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Nicht mehr archivieren" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Vorschlägen zum automatischen Ausfüllen ausgeschlossen." }, - "itemSentToArchive": { - "message": "Eintrag an das Archiv gesendet" + "itemWasSentToArchive": { + "message": "Eintrag wurde ins Archiv verschoben" }, - "itemRemovedFromArchive": { - "message": "Eintrag aus dem Archiv entfernt" + "itemUnarchived": { + "message": "Eintrag wird nicht mehr archiviert" }, "archiveItem": { "message": "Eintrag archivieren" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Willkommen in deinem Tresor!" }, - "phishingPageTitle": { - "message": "Phishing-Website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Tab schließen" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Weiter" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Warum wird dir das angezeigt?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Einträge für die aktuelle Seite automatisch ausfüllen" diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 9912d79920d..5fbf848c299 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 9a430654a0a..ce4c5c76b81 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -4459,7 +4459,7 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, - "uriMatchDefaultStrategyHint": { + "uriMatchDefaultStrategyHint": { "message": "URI match detection is how Bitwarden identifies autofill suggestions.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, @@ -5714,5 +5714,9 @@ }, "confirmKeyConnectorDomain": { "message": "Confirm Key Connector domain" + }, + "settingDisabledByPolicy": { + "message": "This setting is disabled by your organization's policy.", + "description": "This hint text is displayed when a user setting is disabled due to an organization policy." } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 0a551ee92bd..c3cb86b41e9 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index c2160e67d03..b8c2905f8da 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 0bacebadab1..c63ba159700 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "¡Bienvenido a tu caja fuerte!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 28e143553dd..9182a97ace9 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Tere tulemast sinu hoidlasse!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index deea3a4a245..1432a4a163e 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index ea1d68d7cf4..e7366161956 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "به گاوصندوق خود خوش آمدید!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "پر کردن خودکار موارد برای صفحه فعلی" diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 472ee14efab..f810ea1c725 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Tervetuloa holviisi!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Täytä nykyisen sivun kohteet automaattisesti" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 4281b98d7c2..03b405805e6 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 98c10cb2283..0eb29428ee9 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -246,7 +246,7 @@ "message": "Connectez-vous à votre coffre" }, "autoFillInfo": { - "message": "Il n'y a aucun identifiant disponible pour la saisie automatique concernant l'onglet actuel du navigateur." + "message": "Il n'y a pas d'identifiants disponibles pour la saisie automatique pour l'onglet actuel du navigateur." }, "addLogin": { "message": "Ajouter un identifiant" @@ -558,8 +558,8 @@ "message": "Archiver", "description": "Verb" }, - "unarchive": { - "message": "Ne plus archiver" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Éléments dans l'archive" @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Les éléments archivés apparaîtront ici et seront exclus des résultats de recherche généraux et des suggestions de remplissage automatique." }, - "itemSentToArchive": { - "message": "Élément envoyé à l'archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Élément retiré de l'archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archiver l'élément" @@ -1500,7 +1500,7 @@ "message": "Copier le TOTP automatiquement" }, "disableAutoTotpCopyDesc": { - "message": "Si un identifiant possède une clé d'authentification, copie le code de vérification TOTP dans votre presse-papiers lorsque vous saisissez automatiquement l'identifiant." + "message": "Copie le code de vérification TOTP dans votre presse-papiers lorsque vous saisissez automatiquement l'identifiant, si un identifiant possède une clé d'authentification.\n\nSi un identifiant dispose d'une clé d'authentification, copie le code de vérification TOTP dans votre presse-papiers lorsque vous saisissez automatiquement l'identifiant." }, "enableAutoBiometricsPrompt": { "message": "Demander la biométrie au lancement" @@ -4266,7 +4266,7 @@ "message": "Données du coffre exportées" }, "typePasskey": { - "message": "Clé d'identification (passkey)" + "message": "Clé d'accès" }, "accessing": { "message": "Accès en cours" @@ -4308,7 +4308,7 @@ "message": "Enregistrer la clé d'identification (passkey) comme nouvel identifiant" }, "chooseCipherForPasskeySave": { - "message": "Choisissez un identifiant ou enregistrer cette clé d'accès" + "message": "Choisissez un identifiant où enregistrer cette clé d'accès" }, "chooseCipherForPasskeyAuth": { "message": "Choisissez une clé d'accès pour vous connecter" @@ -4326,7 +4326,7 @@ "message": "Fonctionnalité non supportée" }, "yourPasskeyIsLocked": { - "message": "Authentification requise pour utiliser une clé d'identification (passkey). Vérifiez votre identité pour continuer." + "message": "Authentification requise pour utiliser une clé d'accès. Vérifiez votre identité pour continuer." }, "multifactorAuthenticationCancelled": { "message": "Authentification multi-facteurs annulée" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Bienvenue dans votre coffre !" }, - "phishingPageTitle": { - "message": "Site Web d'hameçonnage" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Fermer l'onglet" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continuer" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Pourquoi voyez-vous cela?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Remplissage automatique des éléments de la page actuelle" diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 11ef9ced579..b03f83272a0 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index f040ab6a1b6..953f7ae1150 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "ברוך בואך אל הכספת שלך!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "פריטים למילוי אוטומטי עבור הדף הנוכחי" diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 42231b15ef6..d041cbd23ed 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index b892c2c152b..4b5bd0f8612 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -558,8 +558,8 @@ "message": "Arhiviraj", "description": "Verb" }, - "unarchive": { - "message": "Poništi arhiviranje" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Stavke u arhivi" @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Arhivirane stavke biti će prikazane ovdje i biti će izuzete iz rezultata općih pretraga i preporuka auto-ispune." }, - "itemSentToArchive": { - "message": "Stavka poslana u arhivu" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Stavka maknute iz arhive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Arhiviraj stavku" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Dobrodošli u svoj trezor!" }, - "phishingPageTitle": { - "message": "Phishing web stranica" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Zatvori karticu" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Nastavi" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Zašto ovo vidiš?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Auto-ispuni stavke za trenutnu stranicu" diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index ac9f04f7389..c6726c5619d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -558,7 +558,7 @@ "message": "Archívum", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Visszavétel archívumból" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Az archivált elemek itt jelennek meg és kizárásra kerülnek az általános keresési eredményekből és az automatikus kitöltési javaslatokból." }, - "itemSentToArchive": { - "message": "Archívumba küldött elemek száma" + "itemWasSentToArchive": { + "message": "Az elem az archivumba került." }, - "itemRemovedFromArchive": { - "message": "Az elem kikerült a kedvencekből." + "itemUnarchived": { + "message": "Az elemek visszavéelre kerültek az archivumból." }, "archiveItem": { "message": "Elem archiválása" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Üdvözlet a széfben!" }, - "phishingPageTitle": { - "message": "Adathalász webhely" + "phishingPageTitleV2": { + "message": "Adathalászati kísérlet lett észlelve." }, - "phishingPageCloseTab": { + "phishingPageSummary": { + "message": "A meglátogatni kívánt webhely ismert rosszindulatú webhely és biztonsági kockázatot jelent." + }, + "phishingPageCloseTabV2": { "message": "Fül bezárása" }, - "phishingPageContinue": { - "message": "Folytatás" + "phishingPageContinueV2": { + "message": "Tovább erre a webhelyre (nem ajánlott)" }, - "phishingPageLearnWhy": { - "message": "Miért látható ez?" + "phishingPageExplanation1": { + "message": "Ez a webhely megtalálható volt ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": "listán, egy személyes és érzékeny információk ellopására használt ismert adathalász webhelyek nyílt forráskódú listáján.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "További információ az adathalászat észleléséről" + }, + "protectedBy": { + "message": "$PRODUCT$ által védett", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Az aktuális oldal elemeinek automatikus kitöltése" diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 98f46f494c5..9a3830111c5 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Selamat datang di brankas Anda!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Benda-benda isi otomatis untuk halaman saat ini" diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 8a1357df910..6e2899ddc38 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -551,36 +551,36 @@ "message": "Svuota ricerca" }, "archiveNoun": { - "message": "Archive", + "message": "Archivio", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Archivia", "description": "Verb" }, - "unarchive": { - "message": "Unarchive" + "unArchive": { + "message": "Togli dall'archivio" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Elementi in archivio" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Archivio vuoto" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Gli elementi archiviati compariranno qui e saranno esclusi dai risultati di ricerca e suggerimenti di autoriempimento." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Elemento archiviato" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { - "message": "Archive item" + "message": "Archivia elemento" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Gli elementi archiviati sono esclusi dai risultati di ricerca e suggerimenti di autoriempimento. Vuoi davvero archiviare questo elemento?" }, "edit": { "message": "Modifica" @@ -589,7 +589,7 @@ "message": "Visualizza" }, "viewLogin": { - "message": "View login" + "message": "Visualizza login" }, "noItemsInList": { "message": "Non ci sono elementi da mostrare." @@ -734,7 +734,7 @@ "message": "Password principale errata" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Password principale errata. Conferma che l'email sia corretta e che l'account sia stato creato su $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1549,13 +1549,13 @@ "message": "Leggi chiave di sicurezza" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "Lettura passkey..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "Autenticazione passkey fallita" }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "Usa un altro metodo di accesso" }, "awaitingSecurityKeyInteraction": { "message": "In attesa di interazione con la chiave di sicurezza..." @@ -1805,7 +1805,7 @@ "message": "Cliccare fuori del pop-up per controllare il codice di verifica nella tua email chiuderà questo pop-up. Vuoi aprire questo pop-up in una nuova finestra in modo che non si chiuda?" }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostra le icone dei siti e recupera gli URL di cambio password" }, "cardholderName": { "message": "Titolare della carta" @@ -1970,79 +1970,79 @@ "message": "Nota" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "Nuovo Login", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "Nuova Carta", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "Nuova Identità", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "Nuova Nota", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "Nuova chiave SSH", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Nuovo Send di testo", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Nuovo Send di File", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "Modifica Login", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "Modifica Carta", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "Modifica Identità", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Modifica Nota", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "Modifica chiave SSH", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Modifica Send di Testo", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Modifica Send di File", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Vedi Login", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Vedi Carta", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Vedi Identità", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Vedi Nota", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "Vedi chiave SSH", "description": "Header for view SSH key item type" }, "passwordHistory": { @@ -3217,7 +3217,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Solo la vault dell'organizzazione associata con $ORGANIZATION$ sarà esportata.", "placeholders": { "organization": { "content": "$1", @@ -3226,7 +3226,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Solo la vault dell'organizzazione associata con $ORGANIZATION$ sarà esportata. Le tue raccolte non saranno incluse.", "placeholders": { "organization": { "content": "$1", @@ -5526,10 +5526,10 @@ "message": "Cambia parola d'accesso a rischio" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Questo login è a rischio e non contiene un sito web. Aggiungi un sito web e cambia la password per maggiore sicurezza." }, "missingWebsite": { - "message": "Missing website" + "message": "Sito web mancante" }, "settingsVaultOptions": { "message": "Opzioni cassaforte" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Benvenuto nella tua cassaforte!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Riempimento automatico per questa pagina" @@ -5667,10 +5687,10 @@ "description": "Aria label for the body content of the generator nudge" }, "aboutThisSetting": { - "message": "About this setting" + "message": "Riguardo questa opzione" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden userà gli URL memorizzati in ogni login per mostrare, se possibile, l'icona del sito Web e l'URL di modifica password per facilitare la modifica delle credenziali. Nessuna informazione è raccolta o archiviata per il funzionamento di questo servizio." }, "noPermissionsViewPage": { "message": "Non hai i permessi per visualizzare questa pagina. Prova ad accedere con un altro account." diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index b053a0cb609..1f0711dd9d5 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 245a822cc0d..fa40f16db71 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 008a0deb1b3..5cff99b20db 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 30a157c7119..edb56940dc2 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index f8d7be17fde..7e99a52a5e1 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 1f2268a59ac..6bd32684f57 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -558,7 +558,7 @@ "message": "Arhivēt", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Atcelt arhivēšanu" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Šeit parādīsies arhivētie vienumi, un tie netiks iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos." }, - "itemSentToArchive": { - "message": "Vienums ievietots arhīvā" + "itemWasSentToArchive": { + "message": "Vienums tika ievietots arhīvā" }, - "itemRemovedFromArchive": { - "message": "Vienums izņemts no arhīva" + "itemUnarchived": { + "message": "Vienums tika izņemts no arhīva" }, "archiveItem": { "message": "Arhivēt vienumu" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Laipni lūdzam Tavā glabātavā!" }, - "phishingPageTitle": { - "message": "Pikšķerēšanas tīmekļvietne" + "phishingPageTitleV2": { + "message": "Noteikts pikšķerēšanas mēģinājums" }, - "phishingPageCloseTab": { - "message": "Aizvērt cilni" + "phishingPageSummary": { + "message": "Vietne, kuru mēģini apmeklēt, ir zināma ļaunprātīga vietne un drošības risks." }, - "phishingPageContinue": { - "message": "Turpināt" + "phishingPageCloseTabV2": { + "message": "Aizvērt šo cilni" }, - "phishingPageLearnWhy": { - "message": "Kāpēc šis ir redzams?" + "phishingPageContinueV2": { + "message": "Turpināt šīs vietnes apmeklēšanu (nav ieteicams)" + }, + "phishingPageExplanation1": { + "message": "Šī vietne tika atrasta ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", atvērta pirmkoda saraksts ar zināmām pikšķerēšanas vietnēm, kuras tiek izmantotas personīgas un jūtīgas informācijas zagšanai.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Uzzināt vairāk par pikšķerēšanas noteikšanu" + }, + "protectedBy": { + "message": "Aizsargā $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Automātiska pašreizējās lapas vienumu aizpildīšana" diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 644a2ef36b2..8c53bac93db 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index b5d78c14b58..d40a7ee8ee7 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index ef3b307e194..04c76c63d1f 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Velkommen til hvelvet ditt!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index cf152e2ded4..9d6d54bfe70 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -558,7 +558,7 @@ "message": "Archiveren", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Dearchiveren" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Gearchiveerde items verschijnen hier en worden uitgesloten van algemene zoekresultaten en automatisch invulsuggesties." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Item naar archief verzonden" }, - "itemRemovedFromArchive": { - "message": "Item verwijderd uit archief" + "itemUnarchived": { + "message": "Item uit het archief gehaald" }, "archiveItem": { "message": "Item archiveren" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welkom in je kluis!" }, - "phishingPageTitle": { - "message": "Kwaadaardige website" + "phishingPageTitleV2": { + "message": "Phishing-poging gedetecteerd" }, - "phishingPageCloseTab": { - "message": "Tabblad sluiten" + "phishingPageSummary": { + "message": "De site die je probeert te bezoeken is een bekende kwaadaardige site en een veiligheidsrisico." }, - "phishingPageContinue": { - "message": "Doorgaan" + "phishingPageCloseTabV2": { + "message": "Dit tabblad sluiten" }, - "phishingPageLearnWhy": { - "message": "Waarom zie je dit?" + "phishingPageContinueV2": { + "message": "Doorgaan naar deze site (niet aanbevolen)" + }, + "phishingPageExplanation1": { + "message": "Deze site is gevonden in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", een open-source lijst van bekende phishing-sites die worden gebruikt om persoonlijke en gevoelige informatie te stelen.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Leer meer over phishing-detectie" + }, + "protectedBy": { + "message": "Beschermd door $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Automatisch invullen van items voor de huidige pagina" diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 29e76da67ce..3de2aa27d90 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -558,7 +558,7 @@ "message": "Archiwizuj", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Usuń z archiwum" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "Zarchiwizowane elementy pojawią się tutaj i zostaną wykluczone z wyników wyszukiwania i sugestii autouzupełniania." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Element został przeniesiony do archiwum" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Element został usunięty z archiwum" }, "archiveItem": { @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Witaj w sejfie!" }, - "phishingPageTitle": { - "message": "Witryna phishingowa" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." + }, + "phishingPageCloseTabV2": { "message": "Zamknij kartę" }, - "phishingPageContinue": { - "message": "Kontynuuj" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" }, - "phishingPageLearnWhy": { - "message": "Dlaczego to widzę?" + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Uzupełniaj elementy na stronie internetowej" diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 57367d84329..b9069525242 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -3,10 +3,10 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo do Bitwarden" }, "extName": { - "message": "Gerenciador de senhas Bitwarden", + "message": "Bitwarden Gerenciador de Senhas", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -20,19 +20,19 @@ "message": "Convite aceito" }, "createAccount": { - "message": "Criar Conta" + "message": "Criar conta" }, "newToBitwarden": { "message": "Novo no Bitwarden?" }, "logInWithPasskey": { - "message": "Iniciar sessão com a chave de acesso" + "message": "Entrar com chave de acesso" }, "useSingleSignOn": { - "message": "Usar login único" + "message": "Usar autenticação única" }, "welcomeBack": { - "message": "Bem vindo de volta" + "message": "Boas-vindas de volta" }, "setAStrongPassword": { "message": "Defina uma senha forte" @@ -41,7 +41,7 @@ "message": "Termine de criar a sua conta definindo uma senha" }, "enterpriseSingleSignOn": { - "message": "Iniciar Sessão Empresarial Única" + "message": "Autenticação única empresarial" }, "cancel": { "message": "Cancelar" @@ -53,10 +53,10 @@ "message": "Enviar" }, "emailAddress": { - "message": "Endereço de correio eletrônico" + "message": "Endereço de e-mail" }, "masterPass": { - "message": "Senha Mestra" + "message": "Senha mestra" }, "masterPassDesc": { "message": "A senha mestra é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha mestra. Não há maneira de recuperar a senha caso você se esqueça." @@ -78,13 +78,13 @@ } }, "reTypeMasterPass": { - "message": "Digite Novamente a Senha Mestra" + "message": "Digite novamente a senha mestra" }, "masterPassHint": { "message": "Dica de Senha Mestra (opcional)" }, "passwordStrengthScore": { - "message": "Pontos fortes da senha: $SCORE$", + "message": "Pontuação de força da senha $SCORE$", "placeholders": { "score": { "content": "$1", @@ -96,7 +96,7 @@ "message": "Juntar-se à organização" }, "joinOrganizationName": { - "message": "Entrar em $ORGANIZATIONNAME$", + "message": "Juntar-se à $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -117,7 +117,7 @@ "message": "Meu Cofre" }, "allVaults": { - "message": "Todos os Cofres" + "message": "Todos os cofres" }, "tools": { "message": "Ferramentas" @@ -132,10 +132,10 @@ "message": "Copiar Senha" }, "copyPassphrase": { - "message": "Copiar senha" + "message": "Copiar frase secreta" }, "copyNote": { - "message": "Copiar Nota" + "message": "Copiar anotação" }, "copyUri": { "message": "Copiar URI" @@ -144,10 +144,10 @@ "message": "Copiar Nome de Usuário" }, "copyNumber": { - "message": "Copiar Número" + "message": "Copiar número" }, "copySecurityCode": { - "message": "Copiar Código de Segurança" + "message": "Copiar código de segurança" }, "copyName": { "message": "Copiar nome" @@ -156,13 +156,13 @@ "message": "Copiar empresa" }, "copySSN": { - "message": "Cadastro de Pessoas Físicas" + "message": "Copiar número de CPF" }, "copyPassportNumber": { "message": "Copiar número do passaporte" }, "copyLicenseNumber": { - "message": "Copiar número da CNH" + "message": "Copiar número da licença" }, "copyPrivateKey": { "message": "Copiar chave privada" @@ -186,7 +186,7 @@ "message": "Copiar site" }, "copyNotes": { - "message": "Copiar Notas" + "message": "Copiar anotações" }, "copy": { "message": "Copiar", @@ -216,22 +216,22 @@ "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { - "message": "Gerar Senha (copiada)" + "message": "Gerar senha (copiada)" }, "copyElementIdentifier": { - "message": "Copiar Nome do Campo Personalizado" + "message": "Copiar nome do campo personalizado" }, "noMatchingLogins": { - "message": "Sem credenciais correspondentes." + "message": "Nenhuma credencial correspondente" }, "noCards": { "message": "Sem cartões" }, "noIdentities": { - "message": "Sem Identidade" + "message": "Nenhuma identidade" }, "addLoginMenu": { - "message": "Adicionar login" + "message": "Adicionar credencial" }, "addCardMenu": { "message": "Adicionar cartão" @@ -246,16 +246,16 @@ "message": "Acesse o seu cofre" }, "autoFillInfo": { - "message": "Não há credenciais disponíveis para autopreenchimento para a aba do navegador atual." + "message": "Não há credenciais disponíveis para preencher automaticamente na aba atual do navegador." }, "addLogin": { - "message": "Adicionar um Login" + "message": "Adicionar uma credencial" }, "addItem": { - "message": "Adicionar Item" + "message": "Adicionar item" }, "accountEmail": { - "message": "Correio eletrônico da conta" + "message": "E-mail da conta" }, "requestHint": { "message": "Solicitar dica" @@ -264,7 +264,7 @@ "message": "Dica da senha mestra" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Digite o endereço de seu correio eletrônico da sua conta e sua dica da senha será enviada para você" + "message": "Digite o endereço de e-mail da sua conta e dica da sua senha será enviada para você" }, "getMasterPasswordHint": { "message": "Obter dica da senha mestra" @@ -276,13 +276,13 @@ "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { - "message": "Enviar Código" + "message": "Enviar código" }, "codeSent": { - "message": "Código Enviado" + "message": "Código enviado" }, "verificationCode": { - "message": "Código de Verificação" + "message": "Código de verificação" }, "confirmIdentity": { "message": "Confirme a sua identidade para continuar." @@ -294,7 +294,7 @@ "message": "Continuar no aplicativo web?" }, "continueToWebAppDesc": { - "message": "Explore mais recursos da sua conta no Bitwarden no aplicativo web." + "message": "Explore mais recursos da sua conta do Bitwarden no aplicativo web." }, "continueToHelpCenter": { "message": "Continuar no Centro de Ajuda?" @@ -303,16 +303,16 @@ "message": "Saiba mais sobre como usar o Bitwarden no Centro de Ajuda." }, "continueToBrowserExtensionStore": { - "message": "Continuar na extensão da loja do navegador?" + "message": "Continuar na loja de extensões do navegador?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Ajude outras pessoas a descobrirem se o Bitwarden é o que elas estão procurando. Visite a loja de extensões do seu navegador e deixe uma classificação agora." + "message": "Ajude outras pessoas a descobrirem se o Bitwarden é o que elas estão procurando. Visite a loja de extensões do seu navegador e deixe uma avaliação agora." }, "changeMasterPasswordOnWebConfirmation": { - "message": "Você pode alterar a sua senha mestra no aplicativo web Bitwarden." + "message": "Você pode alterar a sua senha mestra no aplicativo web do Bitwarden." }, "fingerprintPhrase": { - "message": "Frase Biométrica", + "message": "Frase biométrica", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { @@ -323,7 +323,7 @@ "message": "Login em Duas Etapas" }, "logOut": { - "message": "Encerrar Sessão" + "message": "Sair" }, "aboutBitwarden": { "message": "Sobre o Bitwarden" @@ -341,28 +341,28 @@ "message": "Bitwarden para Negócios" }, "bitwardenAuthenticator": { - "message": "Autenticador Bitwarden" + "message": "Bitwarden Authenticator" }, "continueToAuthenticatorPageDesc": { - "message": "O Autenticador Bitwarden permite que você armazene as chaves do autenticador e gere códigos TOTP para fluxos de verificação de 2 etapas. Saiba mais no site bitwarden.com" + "message": "O Bitwarden Authenticator permite que você armazene as chaves de autenticador e gere códigos TOTP para fluxos de verificação de 2 etapas. Saiba mais no site bitwarden.com" }, "bitwardenSecretsManager": { - "message": "Gerenciador de Segredos Bitwarden" + "message": "Bitwarden Gerenciador de Segredos" }, "continueToSecretsManagerPageDesc": { - "message": "Armazene, gerencie e compartilhe senhas de desenvolvedor com o Gerenciador de segredos do Bitwarden. Saiba mais no site bitwarden.com." + "message": "Armazene, gerencie e compartilhe segredos de desenvolvedor com o Bitwarden Gerenciador de Segredos. Saiba mais no site bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" }, "continueToPasswordlessDotDevPageDesc": { - "message": "Crie experiências de login suaves e seguras, livres de senhas tradicionais com Passwordless.dev. Saiba mais no site bitwarden.com." + "message": "Crie experiências de autenticação seguras, simples, livres de senhas tradicionais, com o Passwordless.dev. Saiba mais no site bitwarden.com." }, "freeBitwardenFamilies": { - "message": "Plano Familiar do Bitwarden Grátis" + "message": "Bitwarden Families grátis" }, "freeBitwardenFamiliesPageDesc": { - "message": "Você é elegível para o plano Familiar do Bitwarden Grátis. Resgate esta oferta hoje no aplicativo web." + "message": "Você é elegível para o plano Bitwarden Families grátis. Resgate esta oferta hoje no aplicativo web." }, "version": { "message": "Versão" @@ -398,7 +398,7 @@ "message": "Nome da pasta" }, "folderHintText": { - "message": "Aninhe uma pasta adicionando o nome da pasta pai seguido de um \"/\". Exemplo: Social/Fóruns" + "message": "Agrupe uma pasta adicionando o nome da pasta mãe seguido de uma \"/\". Exemplo: Social/Fóruns" }, "noFoldersAdded": { "message": "Nenhuma pasta adicionada" @@ -407,7 +407,7 @@ "message": "Crie pastas para organizar os itens do seu cofre" }, "deleteFolderPermanently": { - "message": "Você tem certeza que deseja excluir esta pasta permanentemente?" + "message": "Tem certeza que quer apagar esta pasta para sempre?" }, "deleteFolder": { "message": "Excluir Pasta" @@ -422,25 +422,25 @@ "message": "Ajuda & Feedback" }, "helpCenter": { - "message": "Central de Ajuda" + "message": "Central de ajuda do Bitwarden" }, "communityForums": { - "message": "Explore os fóruns da comunidade" + "message": "Explore os fóruns da comunidade do Bitwarden" }, "contactSupport": { - "message": "Contate o suporte Bitwarden" + "message": "Contate o suporte do Bitwarden" }, "sync": { "message": "Sincronizar" }, "syncVaultNow": { - "message": "Sincronizar Cofre Agora" + "message": "Sincronizar cofre agora" }, "lastSync": { "message": "Última Sincronização:" }, "passGen": { - "message": "Gerador de Senha" + "message": "Gerador de senhas" }, "generator": { "message": "Gerador", @@ -450,10 +450,10 @@ "message": "Gere automaticamente senhas fortes e únicas para as suas credenciais." }, "bitWebVaultApp": { - "message": "Aplicativo Web Bitwarden" + "message": "Aplicativo web do Bitwarden" }, "importItems": { - "message": "Importar Itens" + "message": "Importar itens" }, "select": { "message": "Selecionar" @@ -468,7 +468,7 @@ "message": "Senha gerada" }, "passphraseGenerated": { - "message": "Senha gerada" + "message": "Frase secreta gerada" }, "usernameGenerated": { "message": "Nome de usuário gerado" @@ -477,7 +477,7 @@ "message": "E-mail gerado" }, "regeneratePassword": { - "message": "Gerar Nova Senha" + "message": "Gerar nova senha" }, "options": { "message": "Opções" @@ -510,7 +510,7 @@ "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { - "message": "0 – 9", + "message": "0-9", "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { @@ -518,69 +518,69 @@ "description": "Full description for the password generator special characters checkbox" }, "numWords": { - "message": "Número de Palavras" + "message": "Número de palavras" }, "wordSeparator": { - "message": "Separador de Palavra" + "message": "Separador de palavras" }, "capitalize": { "message": "Iniciais em Maiúsculas", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Incluir Número" + "message": "Incluir número" }, "minNumbers": { - "message": "Números Mínimos" + "message": "Mínimo de números" }, "minSpecial": { - "message": "Especiais Mínimos" + "message": "Mínimo de caracteres especiais" }, "avoidAmbiguous": { "message": "Evitar caracteres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Os requisitos de política empresarial foram aplicados nesta configuração", + "message": "Os requisitos de política empresarial foram aplicados às configurações do seu gerador.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Pesquisar no Cofre" }, "resetSearch": { - "message": "Reset search" + "message": "Redefinir pesquisa" }, "archiveNoun": { - "message": "Archive", + "message": "Arquivo", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Arquivar", "description": "Verb" }, - "unarchive": { - "message": "Unarchive" + "unArchive": { + "message": "Desarquivar" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Itens no arquivo" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Nenhum item no arquivo" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados de pesquisa gerais e das sugestões de preenchimento automático." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "O item foi enviado para o arquivo" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "O item foi desarquivado" }, "archiveItem": { - "message": "Archive item" + "message": "Arquivar item" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Itens arquivados são excluídos dos resultados da pesquisa geral e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" }, "edit": { "message": "Editar" @@ -589,13 +589,13 @@ "message": "Ver" }, "viewLogin": { - "message": "View login" + "message": "Ver credencial" }, "noItemsInList": { "message": "Não há itens para listar." }, "itemInformation": { - "message": "Informação do Item" + "message": "Informações do item" }, "username": { "message": "Nome de Usuário" @@ -604,7 +604,7 @@ "message": "Senha" }, "totp": { - "message": "Senha do autenticador" + "message": "Segredo do autenticador" }, "passphrase": { "message": "Frase Secreta" @@ -625,22 +625,22 @@ "message": "Notas" }, "privateNote": { - "message": "Nota privada" + "message": "Anotação privada" }, "note": { "message": "Nota" }, "editItem": { - "message": "Editar Item" + "message": "Editar item" }, "folder": { "message": "Pasta" }, "deleteItem": { - "message": "Excluir Item" + "message": "Apagar item" }, "viewItem": { - "message": "Visualizar Item" + "message": "Ver item" }, "launch": { "message": "Abrir" @@ -649,7 +649,7 @@ "message": "Abrir site" }, "launchWebsiteName": { - "message": "Iniciar site $ITEMNAME$", + "message": "Abrir o site $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -661,7 +661,7 @@ "message": "Site" }, "toggleVisibility": { - "message": "Alternar Visibilidade" + "message": "Habilitar visibilidade" }, "manage": { "message": "Gerenciar" @@ -673,7 +673,7 @@ "message": "Opções de desbloqueio" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Configure um método de desbloqueio para alterar o tempo limite do cofre." + "message": "Configure um método de desbloqueio para alterar a ação do tempo limite do cofre." }, "unlockMethodNeeded": { "message": "Configure um método de desbloqueio nas Configurações" @@ -682,7 +682,7 @@ "message": "Tempo limite da sessão" }, "vaultTimeoutHeader": { - "message": "Tempo Limite do Cofre" + "message": "Tempo limite do cofre" }, "otherOptions": { "message": "Outras opções" @@ -700,7 +700,7 @@ "message": "Não reconhecemos este dispositivo. Digite o código enviado por e-mail para verificar a sua identidade." }, "continueLoggingIn": { - "message": "Manter sessão" + "message": "Continuar acessando" }, "yourVaultIsLocked": { "message": "Seu cofre está trancado. Verifique sua identidade para continuar." @@ -734,7 +734,7 @@ "message": "Senha mestra inválida" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Senha mestre inválida. Confirme que seu e-mail está correto e sua conta foi criada em $HOST$.", "placeholders": { "host": { "content": "$1", @@ -743,10 +743,10 @@ } }, "vaultTimeout": { - "message": "Cofre - tempo esgotado" + "message": "Tempo limite do cofre" }, "vaultTimeout1": { - "message": "Tempo de espera" + "message": "Tempo limite" }, "lockNow": { "message": "Bloquear Agora" @@ -788,10 +788,10 @@ "message": "4 horas" }, "onLocked": { - "message": "No bloqueio" + "message": "Ao bloquear o sistema" }, "onRestart": { - "message": "Ao Reiniciar" + "message": "Ao reiniciar o navegador" }, "never": { "message": "Nunca" @@ -806,7 +806,7 @@ "message": "Senha mestra" }, "masterPassImportant": { - "message": "Sua senha mestra não pode ser recuperada se você a esquecer!" + "message": "Sua senha mestra não pode ser recuperada se você esquecê-la!" }, "masterPassHintLabel": { "message": "Dica da senha mestra" @@ -821,10 +821,10 @@ "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A senha mestra é obrigatória." + "message": "A senha mestre é necessária." }, "confirmMasterPasswordRequired": { - "message": "É necessário redigitar a senha mestra." + "message": "É necessário digitar a senha mestra novamente." }, "masterPasswordMinlength": { "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", @@ -846,10 +846,10 @@ "message": "Sua nova conta foi criada!" }, "youHaveBeenLoggedIn": { - "message": "Você está conectado!" + "message": "Você foi conectado!" }, "youSuccessfullyLoggedIn": { - "message": "Você logou na sua conta com sucesso" + "message": "Você entrou na sua conta com sucesso" }, "youMayCloseThisWindow": { "message": "Você pode fechar esta janela" @@ -880,16 +880,16 @@ "message": "Não é possível preencher automaticamente o item selecionado nesta página. Em vez disso, copie e cole a informação." }, "totpCaptureError": { - "message": "Não foi possível escanear o código QR a partir da página atual" + "message": "Não é possível ler o código QR da página atual" }, "totpCaptureSuccess": { "message": "Chave do autenticador adicionada" }, "totpCapture": { - "message": "Escaneie o código QR do autenticador na página atual" + "message": "Ler o código QR do autenticador na página atual" }, "totpHelperTitle": { - "message": "Tornar a verificação em duas etapas fácil" + "message": "Torne a verificação em 2 etapas mais simples" }, "totpHelper": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Copie e cole a chave neste campo." @@ -901,7 +901,7 @@ "message": "Saiba mais sobre os autenticadores" }, "copyTOTP": { - "message": "Copiar chave de Autenticação (TOTP)" + "message": "Copiar chave do autenticador (TOTP)" }, "loggedOut": { "message": "Sessão encerrada" @@ -913,37 +913,37 @@ "message": "A sua sessão expirou." }, "logIn": { - "message": "Fazer login" + "message": "Entrar" }, "logInToBitwarden": { - "message": "Inicie a sessão no Bitwarden" + "message": "Entre no Bitwarden" }, "enterTheCodeSentToYourEmail": { "message": "Digite o código enviado por e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Digite o código a partir do seu autenticador" + "message": "Digite o código do seu autenticador" }, "pressYourYubiKeyToAuthenticate": { - "message": "Insira sua YubiKey para autenticar" + "message": "Pressione sua YubiKey para autenticar-se" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "A autenticação de dois fatores é necessária para sua conta. Siga os passos abaixo para conseguir entrar." + "message": "A autenticação de dois fatores do Duo é necessária para sua conta. Siga os passos abaixo para conseguir entrar." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Siga os passos abaixo para finalizar o login." + "message": "Siga os passos abaixo para finalizar a autenticação." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Siga os passos abaixo para finalizar a autenticação com a sua chave de segurança." }, "restartRegistration": { - "message": "Reiniciar registro" + "message": "Reiniciar cadastro" }, "expiredLink": { "message": "Link expirado" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Por favor, reinicie o registro ou tente fazer login." + "message": "Reinicie o cadastro ou tente conectar-se." }, "youMayAlreadyHaveAnAccount": { "message": "Você pode já ter uma conta" @@ -970,25 +970,25 @@ "message": "Pasta adicionada" }, "twoStepLoginConfirmation": { - "message": "O login de duas etapas torna a sua conta mais segura ao exigir que digite um código de segurança de um aplicativo de autenticação quando for iniciar a sessão. O login de duas etapas pode ser ativado no cofre web bitwarden.com. Deseja visitar o site agora?" + "message": "A autenticação de duas etapas torna a sua conta mais segura ao exigir que digite um código de segurança de um aplicativo autenticador ao se conectar. A autenticação de duas etapas pode ser ativada no cofre web do bitwarden.com. Deseja visitar o site agora?" }, "twoStepLoginConfirmationContent": { - "message": "Torne sua conta mais segura configurando o 'login' em duas etapas no aplicativo ‘web’ do Bitwarden." + "message": "Torne sua conta mais segura configurando a autenticação em duas etapas no aplicativo web do Bitwarden." }, "twoStepLoginConfirmationTitle": { "message": "Continuar para o aplicativo web?" }, "editedFolder": { - "message": "Pasta Editada" + "message": "Pasta salva" }, "deleteFolderConfirmation": { "message": "Você tem certeza que deseja excluir esta pasta?" }, "deletedFolder": { - "message": "Pasta excluída" + "message": "Pasta apagada" }, "gettingStartedTutorial": { - "message": "Tutorial de Introdução" + "message": "Tutorial de introdução" }, "gettingStartedTutorialVideo": { "message": "Assista o nosso tutorial de introdução e saiba como tirar o máximo de proveito da extensão de navegador." @@ -1026,25 +1026,25 @@ "message": "Item adicionado" }, "editedItem": { - "message": "Item editado" + "message": "Item salvo" }, "deleteItemConfirmation": { "message": "Você tem certeza que deseja enviar este item para a lixeira?" }, "deletedItem": { - "message": "Item excluído" + "message": "Item enviado para a lixeira" }, "overwritePassword": { - "message": "Sobrescrever Senha" + "message": "Substituir senha" }, "overwritePasswordConfirmation": { "message": "Você tem certeza que deseja substituir a senha atual?" }, "overwriteUsername": { - "message": "Sobrescrever Usuário" + "message": "Sobrescrever nome de usuário" }, "overwriteUsernameConfirmation": { - "message": "Tem certeza que deseja substituir o usuário atual?" + "message": "Tem certeza que deseja substituir o nome de usuário atual?" }, "searchFolder": { "message": "Pesquisar pasta" @@ -1056,47 +1056,47 @@ "message": "Pesquisar tipo" }, "noneFolder": { - "message": "Nenhuma Pasta", + "message": "Sem pasta", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Peça para adicionar login" + "message": "Pedir para adicionar credencial" }, "vaultSaveOptionsTitle": { - "message": "Salvar nas opções do cofre" + "message": "Opções de salvar no cofre" }, "addLoginNotificationDesc": { - "message": "A \"Notificação de Adicionar Login\" pede para salvar automaticamente novas logins para o seu cofre quando você inicia uma sessão em um site pela primeira vez." + "message": "Pedir para adicionar um item se um não for encontrado no seu cofre." }, "addLoginNotificationDescAlt": { - "message": "Pedir para adicionar um item se um não for encontrado no seu cofre. Aplica-se a todas as contas logadas." + "message": "Pedir para adicionar um item se um não for encontrado no seu cofre. Aplica-se a todas as contas conectadas." }, "showCardsInVaultViewV2": { "message": "Sempre mostrar cartões como sugestões de preenchimento automático na tela do Cofre" }, "showCardsCurrentTab": { - "message": "Mostrar cartões em páginas com guias." + "message": "Mostrar cartões na página da aba" }, "showCardsCurrentTabDesc": { - "message": "Exibir itens de cartão em páginas com abas para simplificar o preenchimento automático" + "message": "Listar itens de cartão na página da aba para preenchimento automático fácil." }, "showIdentitiesInVaultViewV2": { "message": "Sempre mostrar identidades como sugestões de preenchimento automático na tela do Cofre" }, "showIdentitiesCurrentTab": { - "message": "Exibir Identidades na Aba Atual" + "message": "Mostrar identidades na página da aba" }, "showIdentitiesCurrentTabDesc": { - "message": "Liste os itens de identidade na aba atual para facilitar preenchimento automático." + "message": "Liste as identidades na página da aba para facilitar o preenchimento automático." }, "clickToAutofillOnVault": { "message": "Clique em itens na tela do Cofre para preencher automaticamente" }, "clickToAutofill": { - "message": "Selecione o item para preenchê-lo automaticamente" + "message": "Clique em um item para preenchê-lo automaticamente" }, "clearClipboard": { - "message": "Limpar Área de Transferência", + "message": "Limpar área de transferência", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -1110,7 +1110,7 @@ "message": "Salvar" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Ver $ITEMNAME$, abre em uma nova janela", "placeholders": { "itemName": { "content": "$1" @@ -1119,18 +1119,18 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Novo item, abre em uma nova janela", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Editar antes de salvar", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nova notificação" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nova notificação", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1140,15 +1140,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "salvo no Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "atualizado no Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Selecionar $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1160,35 +1160,35 @@ } }, "saveAsNewLoginAction": { - "message": "Salvar como nova sessão", + "message": "Salvar como nova credencial", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Atualizar sessão", + "message": "Atualizar credencial", "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Desbloqueie para salvar esta credencial", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { - "message": "Save login", + "message": "Salvar credencial", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Atualizar credencial existente", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Sessão salva", + "message": "Credencial salva", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Sessão atualizada", + "message": "Credencial atualizada", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Ótimo trabalho! Você passou pelas etapas para tornar você e $ORGANIZATION$ mais seguros.", "placeholders": { "organization": { "content": "$1" @@ -1197,7 +1197,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Obrigado por tornar $ORGANIZATION$ mais seguro. Você tem mais $TASK_COUNT$ senhas para atualizar.", "placeholders": { "organization": { "content": "$1" @@ -1209,7 +1209,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Alterar próxima senha", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1221,19 +1221,19 @@ "description": "Detailed error message shown when saving login details fails." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "Ao alterar sua senha, você precisará entrar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectados dentro de uma hora." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "Mude a sua senha mestre para completar a recuperação de conta." }, "enableChangedPasswordNotification": { - "message": "Pedir para atualizar os dados de login existentes" + "message": "Pedir para atualizar credencial existente" }, "changedPasswordNotificationDesc": { - "message": "Peça para atualizar a senha de login quando uma mudança for detectada em um site." + "message": "Peça para atualizar a senha de uma credencial quando uma mudança for detectada em um site." }, "changedPasswordNotificationDescAlt": { - "message": "Pedir para atualizar a senha de uma credencial quando uma alteração for detectada em um site. Aplica-se a todas as contas conectadas." + "message": "Peça para atualizar a senha de uma credencial quando uma mudança for detectada em um site. Aplica-se a todas as contas conectadas." }, "enableUsePasskeys": { "message": "Pedir para salvar e usar chaves de acesso" @@ -1257,20 +1257,20 @@ "message": "Opções adicionais" }, "enableContextMenuItem": { - "message": "Mostrar opções de menu de contexto" + "message": "Mostrar opções do menu de contexto" }, "contextMenuItemDesc": { - "message": "Use um duplo clique para acessar a geração de usuários e senhas correspondentes para o site. " + "message": "Use um clique duplo para acessar a geração de senhas e credenciais correspondentes para o site." }, "contextMenuItemDescAlt": { - "message": "Use um clique secundário para acessar a geração de senha e os logins correspondentes para o site. Aplica-se a todas as contas logadas." + "message": "Use um clique secundário para acessar a geração de senha e as credenciais correspondentes para o site. Aplica-se a todas as contas conectadas." }, "defaultUriMatchDetection": { "message": "Detecção de correspondência de URI padrão", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Escolha a maneira padrão pela qual a detecção de correspondência de URI é manipulada para logins ao executar ações como preenchimento automático." + "message": "Escolha a maneira padrão pela qual a detecção de correspondência de URI é manipulada para credenciais ao executar ações como preenchimento automático." }, "theme": { "message": "Tema" @@ -1279,7 +1279,7 @@ "message": "Altere o tema de cores do aplicativo." }, "themeDescAlt": { - "message": "Altere o tema de cores da aplicação. Aplica-se para todas as contas conectadas." + "message": "Altere o tema de cores do aplicativo. Aplica-se para todas as contas conectadas." }, "dark": { "message": "Escuro", @@ -1296,10 +1296,10 @@ "message": "Exportar Cofre" }, "fileFormat": { - "message": "Formato de arquivo" + "message": "Formato do arquivo" }, "fileEncryptedExportWarningDesc": { - "message": "Esta arquivo de exportação será protegido por senha e precisará da mesma para ser descriptografado." + "message": "Este arquivo de exportação será protegido por senha e precisará da mesma para ser descriptografado." }, "filePassword": { "message": "Senha do arquivo" @@ -1308,16 +1308,16 @@ "message": "Esta senha será usada para exportar e importar este arquivo" }, "accountRestrictedOptionDescription": { - "message": "Use sua chave criptográfica da conta, derivada do nome de usuário e senha mestra da sua conta, para criptografar a exportação e restringir importação para apenas a conta atual do Bitwarden." + "message": "Use a chave de criptografia da sua conta, derivada do nome de usuário e senha mestra da sua conta, para criptografar a exportação e restringir a importação para apenas a conta atual do Bitwarden." }, "passwordProtectedOptionDescription": { - "message": "Defina uma senha de arquivo para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografia." + "message": "Defina uma senha para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografar." }, "exportTypeHeading": { "message": "Tipo da exportação" }, "accountRestricted": { - "message": "Conta restrita" + "message": "Restrita à conta" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { "message": "\"Senha do arquivo\" e \"Confirmação de senha\" não correspondem." @@ -1327,11 +1327,11 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { - "message": "Atenção", + "message": "Aviso", "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { - "message": "Confirmar Exportação do Cofre" + "message": "Confirmar exportação do cofre" }, "exportWarningDesc": { "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo." @@ -1349,10 +1349,10 @@ "message": "Compartilhado" }, "bitwardenForBusinessPageDesc": { - "message": "O Bitwarden para Business permite que você compartilhe os itens do seu cofre com outras pessoas usando uma organização. Saiba mais no site bitwarden.com." + "message": "O Bitwarden para Empresas permite que você compartilhe os itens do seu cofre com outras pessoas usando uma organização. Saiba mais no site do bitwarden.com." }, "moveToOrganization": { - "message": "Mover para a Organização" + "message": "Mover para organização" }, "movedItemToOrg": { "message": "$ITEMNAME$ movido para $ORGNAME$", @@ -1374,13 +1374,13 @@ "message": "Saber mais" }, "authenticatorKeyTotp": { - "message": "Chave de Autenticação (TOTP)" + "message": "Chave do autenticador (TOTP)" }, "verificationCodeTotp": { - "message": "Código de Verificação (TOTP)" + "message": "Código de verificação (TOTP)" }, "copyVerificationCode": { - "message": "Copiar Código de Verificação" + "message": "Copiar código de verificação" }, "attachments": { "message": "Anexos" @@ -1392,16 +1392,16 @@ "message": "Tem a certeza de que deseja excluir este anexo?" }, "deletedAttachment": { - "message": "Anexo excluído" + "message": "Anexo apagado" }, "newAttachment": { - "message": "Adicionar Novo Anexo" + "message": "Adicionar novo anexo" }, "noAttachments": { "message": "Sem anexos." }, "attachmentSaved": { - "message": "O anexo foi salvo." + "message": "Anexo salvo" }, "file": { "message": "Arquivo" @@ -1416,28 +1416,28 @@ "message": "O tamanho máximo do arquivo é de 500 MB." }, "featureUnavailable": { - "message": "Funcionalidade Indisponível" + "message": "Recurso indisponível" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "A criptografia legada não é mais suportada. Entre em contato com o suporte para recuperar a sua conta." }, "premiumMembership": { - "message": "Assinatura Premium" + "message": "Plano Premium" }, "premiumManage": { - "message": "Gerenciar Plano" + "message": "Gerenciar plano" }, "premiumManageAlert": { "message": "Você pode gerenciar a sua assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "premiumRefresh": { - "message": "Atualizar Assinatura" + "message": "Recarregar assinatura" }, "premiumNotCurrentMember": { "message": "Você não é um membro Premium atualmente." }, "premiumSignUpAndGet": { - "message": "Registre-se para uma assinatura Premium e obtenha:" + "message": "Inscreva-se para uma assinatura Premium e receba:" }, "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." @@ -1446,7 +1446,7 @@ "message": "Acesso de emergência." }, "premiumSignUpTwoStepOptions": { - "message": "Opções de login em duas etapas como YubiKey e Duo." + "message": "Opções de autenticação em duas etapas proprietárias como YubiKey e Duo." }, "ppremiumSignUpReports": { "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." @@ -1458,7 +1458,7 @@ "message": "Prioridade no suporte ao cliente." }, "ppremiumSignUpFuture": { - "message": "Todas as funcionalidades Premium no futuro. Mais em breve!" + "message": "Todas as recursos do Premium no futuro. Mais em breve!" }, "premiumPurchase": { "message": "Comprar Premium" @@ -1467,13 +1467,13 @@ "message": "Você pode comprar Premium nas configurações de sua conta no aplicativo web do Bitwarden." }, "premiumCurrentMember": { - "message": "Você é um membro premium!" + "message": "Você é um membro Premium!" }, "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." }, "premiumFeatures": { - "message": "Atualize para a versão Premium e receba:" + "message": "Faça upgrade para o Premium e receba:" }, "premiumPrice": { "message": "Tudo por apenas %price% /ano!", @@ -1500,22 +1500,22 @@ "message": "Copiar TOTP automaticamente" }, "disableAutoTotpCopyDesc": { - "message": "Se sua credencial tiver uma chave de autenticação, copie o código de verificação TOTP quando for autopreenchê-la." + "message": "Se uma credencial tiver uma chave de autenticador, copie o código de verificação TOTP quando for preenchê-la automaticamente." }, "enableAutoBiometricsPrompt": { - "message": "Pedir biometria ao iniciar" + "message": "Pedir biometria ao abrir" }, "premiumRequired": { "message": "Requer Assinatura Premium" }, "premiumRequiredDesc": { - "message": "Uma conta premium é necessária para usar esse recurso." + "message": "Uma assinatura Premium é necessária para usar esse recurso." }, "authenticationTimeout": { "message": "Tempo de autenticação esgotado" }, "authenticationSessionTimedOut": { - "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de login." + "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." }, "verificationCodeEmailSent": { "message": "E-mail de verificação enviado para $EMAIL$.", @@ -1534,13 +1534,13 @@ "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use seu código de recuperação" + "message": "Usar seu código de recuperação" }, "insertU2f": { "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." }, "openInNewTab": { - "message": "Abrir numa nova aba" + "message": "Abrir em uma nova aba" }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" @@ -1549,50 +1549,50 @@ "message": "Ler chave de segurança" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "Lendo a chave de acesso..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "Falha na autenticação da chave de acesso" }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "Usar um método de entrada diferente" }, "awaitingSecurityKeyInteraction": { "message": "Aguardando interação com a chave de segurança..." }, "loginUnavailable": { - "message": "Sessão Indisponível" + "message": "Autenticação indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem a verificação de duas etapas ativado, no entanto, nenhum dos provedores de verificação de duas etapas configurados são suportados por este navegador web." + "message": "Esta conta tem a verificação de duas etapas ativada, no entanto, nenhum dos provedores de verificação de duas etapas configurados são suportados por este navegador web." }, "noTwoStepProviders2": { "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicativo de autenticação)." }, "twoStepOptions": { - "message": "Opções de Login em Duas Etapas" + "message": "Opções de autenticação em duas etapas" }, "selectTwoStepLoginMethod": { - "message": "Escolher iniciar sessão em duas etapas" + "message": "Selecionar método de autenticação em duas etapas" }, "recoveryCodeTitle": { - "message": "Código de Recuperação" + "message": "Código de recuperação" }, "authenticatorAppTitle": { - "message": "Aplicativo de Autenticação" + "message": "Aplicativo autenticador" }, "authenticatorAppDescV2": { - "message": "Insira um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", + "message": "Digite um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Chave de Segurança Yubico OTP" + "message": "Chave de segurança Yubico OTP" }, "yubiKeyDesc": { "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." }, "duoDescV2": { - "message": "Insira um código gerado pelo Duo Security.", + "message": "Digite um código gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1603,7 +1603,7 @@ "message": "WebAuthn FIDO2" }, "webAuthnDesc": { - "message": "Utilize qualquer chave de segurança ativada por WebAuthn para acessar a sua conta." + "message": "Use qualquer chave de segurança compatível com WebAuthn para acessar a sua conta." }, "emailTitle": { "message": "E-mail" @@ -1612,60 +1612,60 @@ "message": "Digite o código enviado para seu e-mail." }, "selfHostedEnvironment": { - "message": "Ambiente Auto-hospedado" + "message": "Ambiente auto-hospedado" }, "selfHostedBaseUrlHint": { - "message": "Especifique a URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" + "message": "Especifique o0 URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { - "message": "Para usuários avançados. Você pode especificar a URL de base de cada serviço independentemente." + "message": "Para configuração avançada, você pode especificar a URL de base de cada serviço independentemente." }, "selfHostedEnvFormInvalid": { "message": "Você deve adicionar um URL do servidor de base ou pelo menos um ambiente personalizado." }, "customEnvironment": { - "message": "Ambiente Personalizado" + "message": "Ambiente personalizado" }, "baseUrl": { "message": "URL do Servidor" }, "selfHostBaseUrl": { - "message": "URL do servidor auto-host", + "message": "URL do servidor auto-hospedado", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { - "message": "URL do Servidor da API" + "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "URL do Servidor do Cofre Web" + "message": "URL do servidor do cofre web" }, "identityUrl": { - "message": "URL do Servidor de Identidade" + "message": "URL do servidor de identidade" }, "notificationsUrl": { - "message": "URL do Servidor de Notificações" + "message": "URL do servidor de notificações" }, "iconsUrl": { - "message": "URL do Servidor de Ícones" + "message": "URL do servidor de ícones" }, "environmentSaved": { - "message": "As URLs do ambiente foram salvas." + "message": "URLs do ambiente salvas" }, "showAutoFillMenuOnFormFields": { - "message": "Exibir o menu de preenchimento automático nos campos do formulário", + "message": "Mostrar o menu de preenchimento automático em campos de formulário", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { "message": "Sugestões de preenchimento automático" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Encontre sugestões de preenchimento automático com facilidade" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Desative as configurações de preenchimento automático do seu navegador, para que elas não entrem em conflito com o Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Desativar o preenchimento automático do $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1674,16 +1674,16 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Desativar o preenchimento automático" }, "showInlineMenuLabel": { - "message": "Mostrar sugestões de preenchimento automático nos campos de formulários" + "message": "Mostrar sugestões de preenchimento automático em campos de formulário" }, "showInlineMenuIdentitiesLabel": { "message": "Exibir identidades como sugestões" }, "showInlineMenuCardsLabel": { - "message": "Exibir cards como sugestões" + "message": "Exibir cartões como sugestões" }, "showInlineMenuOnIconSelectionLabel": { "message": "Exibir sugestões quando o ícone for selecionado" @@ -1692,13 +1692,13 @@ "message": "Aplica-se a todas as contas conectadas." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Desative o gerenciador de senhas padrão do seu navegador para evitar conflitos." + "message": "Desative o gerenciador de senhas integrado do seu navegador para evitar conflitos." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { - "message": "Editar configurações do navegador." + "message": "Edite as configurações do navegador." }, "autofillOverlayVisibilityOff": { - "message": "Desligado", + "message": "Desativado", "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { @@ -1710,16 +1710,16 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Preenchimento automático ao carregar a página" + "message": "Preencher automaticamente ao carregar a página" }, "enableAutoFillOnPageLoad": { "message": "Preencher automaticamente 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." + "message": "Se um formulário de credencial for detectado, preencha automaticamente quando a página carregar." }, "experimentalFeature": { - "message": "Sites comprometidos ou não confiáveis podem tomar vantagem do autopreenchimento ao carregar a página." + "message": "Sites comprometidos ou não confiáveis podem explorar do preenchimento automático ao carregar a página." }, "learnMoreAboutAutofillOnPageLoadLinkText": { "message": "Saiba mais sobre riscos" @@ -1764,16 +1764,16 @@ "message": "Bloquear o cofre" }, "customFields": { - "message": "Campos Personalizados" + "message": "Campos personalizados" }, "copyValue": { - "message": "Copiar Valor" + "message": "Copiar valor" }, "value": { "message": "Valor" }, "newCustomField": { - "message": "Novo Campo Personalizado" + "message": "Novo campo personalizado" }, "dragToSort": { "message": "Arrastar para ordenar" @@ -1805,10 +1805,10 @@ "message": "Ao clicar fora da janela de pop-up para verificar seu e-mail para o seu código de verificação fará com que este pop-up feche. Você deseja abrir este pop-up em uma nova janela para que ele não seja fechado?" }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostrar ícones de sites e obter URLs de alteração de senha" }, "cardholderName": { - "message": "Titular do Cartão" + "message": "Nome do titular do cartão" }, "number": { "message": "Número" @@ -1817,10 +1817,10 @@ "message": "Bandeira" }, "expirationMonth": { - "message": "Mês de Vencimento" + "message": "Mês de vencimento" }, "expirationYear": { - "message": "Ano de Vencimento" + "message": "Ano de vencimento" }, "expiration": { "message": "Vencimento" @@ -1862,10 +1862,10 @@ "message": "Dezembro" }, "securityCode": { - "message": "Código de Segurança" + "message": "Código de segurança" }, "cardNumber": { - "message": "card number" + "message": "número do cartão" }, "ex": { "message": "ex." @@ -1886,34 +1886,34 @@ "message": "Dr" }, "mx": { - "message": "Mx" + "message": "Sre" }, "firstName": { - "message": "Primeiro Nome" + "message": "Primeiro nome" }, "middleName": { - "message": "Nome do Meio" + "message": "Nome do meio" }, "lastName": { - "message": "Último Nome" + "message": "Sobrenome" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "identityName": { - "message": "Nome de Identidade" + "message": "Nome na identidade" }, "company": { "message": "Empresa" }, "ssn": { - "message": "Número de Segurança Social" + "message": "Número de CPF" }, "passportNumber": { - "message": "Número do Passaporte" + "message": "Número do passaporte" }, "licenseNumber": { - "message": "Número da Licença" + "message": "Número da licença" }, "email": { "message": "E-mail" @@ -1940,7 +1940,7 @@ "message": "Estado / Província" }, "zipPostalCode": { - "message": "CEP / Código Postal" + "message": "CEP / Código postal" }, "country": { "message": "País" @@ -1955,7 +1955,7 @@ "message": "Credenciais" }, "typeSecureNote": { - "message": "Nota Segura" + "message": "Anotação segura" }, "typeCard": { "message": "Cartão" @@ -1967,86 +1967,86 @@ "message": "Chave SSH" }, "typeNote": { - "message": "Nota" + "message": "Anotação" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "Nova credencial", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "Novo cartão", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "Nova identidade", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "Nova anotação", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "Nova chave SSH", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Novo Send de texto", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Novo Send de arquivo", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "Editar credencial", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "Editar cartão", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "Editar identidade", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Editar anotação", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "Editar chave SSH", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Editar Send de texto", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Editar Send de arquivo", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Visualizar credencial", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Visualizar cartão", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Visualizar identidade", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Visualizar anotação", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "Visualizar chave SSH", "description": "Header for view SSH key item type" }, "passwordHistory": { - "message": "Histórico de Senha" + "message": "Histórico de senhas" }, "generatorHistory": { "message": "Histórico do gerador" @@ -2055,7 +2055,7 @@ "message": "Limpar histórico do gerador" }, "cleargGeneratorHistoryDescription": { - "message": "Se continuar, todas as entradas serão permanentemente excluídas do histórico do gerador. Tem certeza que deseja continuar?" + "message": "Se continuar, todos os itens serão apagados para sempre do histórico do gerador. Tem certeza que deseja continuar?" }, "back": { "message": "Voltar" @@ -2064,7 +2064,7 @@ "message": "Coleções" }, "nCollections": { - "message": "Coleções $COUNT$", + "message": "$COUNT$ coleções", "placeholders": { "count": { "content": "$1", @@ -2091,7 +2091,7 @@ "message": "Credenciais" }, "secureNotes": { - "message": "Notas seguras" + "message": "Anotações seguras" }, "sshKeys": { "message": "Chaves SSH" @@ -2150,10 +2150,10 @@ "description": "Default URI match detection for autofill." }, "toggleOptions": { - "message": "Alternar Opções" + "message": "Habilitar opções" }, "toggleCurrentUris": { - "message": "Alternar URIs atuais", + "message": "Habilitar URIs atuais", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -2168,7 +2168,7 @@ "message": "Tipos" }, "allItems": { - "message": "Todos os Itens" + "message": "Todos os itens" }, "noPasswordsInList": { "message": "Não existem senhas para listar." @@ -2197,7 +2197,7 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Senha Atualizada", + "message": "Senha atualizada", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -2241,16 +2241,16 @@ "message": "Desbloquear com o PIN" }, "setYourPinTitle": { - "message": "Definir PIN" + "message": "Configurar PIN" }, "setYourPinButton": { - "message": "Definir PIN" + "message": "Configurar PIN" }, "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão redefinidas se alguma vez você encerrar completamente toda a sessão do aplicativo." }, "setPinCode": { - "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." + "message": "Você pode usar este PIN para desbloquear o Bitwarden. O seu PIN será redefinido se você sair da sua conta no aplicativo." }, "pinRequired": { "message": "O código PIN é necessário." @@ -2265,13 +2265,13 @@ "message": "Desbloquear com a biometria" }, "unlockWithMasterPassword": { - "message": "Desbloquear com a senha mestra" + "message": "Desbloquear com senha mestra" }, "awaitDesktop": { "message": "Aguardando confirmação do desktop" }, "awaitDesktopDesc": { - "message": "Por favor, confirme o uso de dados biométricos no aplicativo Bitwarden Desktop para ativar a biometria para o navegador." + "message": "Confirme o uso de biometria no aplicativo do Bitwarden Desktop para ativar a biometria para o navegador." }, "lockWithMasterPassOnRestart": { "message": "Bloquear com senha mestra ao reiniciar o navegador" @@ -2283,16 +2283,16 @@ "message": "Você deve selecionar pelo menos uma coleção." }, "cloneItem": { - "message": "Clonar Item" + "message": "Clonar item" }, "clone": { "message": "Clonar" }, "passwordGenerator": { - "message": "Gerador de Senha" + "message": "Gerador de senhas" }, "usernameGenerator": { - "message": "Gerador de usuário" + "message": "Gerador de nome de usuário" }, "useThisEmail": { "message": "Usar este e-mail" @@ -2301,7 +2301,7 @@ "message": "Use esta senha" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Use esta frase secreta" }, "useThisUsername": { "message": "Use este nome de usuário" @@ -2310,7 +2310,7 @@ "message": "Senha segura gerada! Não se esqueça de atualizar também sua senha no site." }, "useGeneratorHelpTextPartOne": { - "message": "Usar o gerador", + "message": "Use o gerador", "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": { @@ -2321,10 +2321,10 @@ "message": "Personalização do cofre" }, "vaultTimeoutAction": { - "message": "Ação de Tempo Limite do Cofre" + "message": "Ação do tempo limite do cofre" }, "vaultTimeoutAction1": { - "message": "Ação do tempo" + "message": "Ação do tempo limite" }, "lock": { "message": "Bloquear", @@ -2338,19 +2338,19 @@ "message": "Pesquisar na lixeira" }, "permanentlyDeleteItem": { - "message": "Excluir o Item Permanentemente" + "message": "Apagar item para sempre" }, "permanentlyDeleteItemConfirmation": { "message": "Você tem certeza que deseja excluir permanentemente esse item?" }, "permanentlyDeletedItem": { - "message": "Item Permanentemente Excluído" + "message": "Item apagado para sempre" }, "restoreItem": { - "message": "Restaurar Item" + "message": "Restaurar item" }, "restoredItem": { - "message": "Item Restaurado" + "message": "Item restaurado" }, "alreadyHaveAccount": { "message": "Já tem uma conta?" @@ -2359,7 +2359,7 @@ "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de Ação de Tempo Limite" + "message": "Confirmação da ação do tempo limite" }, "autoFillAndSave": { "message": "Preencher automaticamente e salvar" @@ -2374,16 +2374,16 @@ "message": "Item preenchido automaticamente " }, "insecurePageWarning": { - "message": "Aviso: Esta é uma página HTTP não segura, e qualquer informação que você enviar poderá ser interceptada e modificada por outras pessoas. Este login foi originalmente salvo em uma página segura (HTTPS)." + "message": "Aviso: Esta é uma página HTTP sem segurança, e qualquer informação que você enviar poderá ser interceptada e modificada por outras pessoas. Esta credencial foi originalmente salvo em uma página segura (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Você ainda deseja preencher esse login?" + "message": "Você ainda deseja preencher esta credencial?" }, "autofillIframeWarning": { - "message": "O formulário está hospedado em um domínio diferente do URI do seu login salvo. Escolha OK para preencher automaticamente mesmo assim ou Cancelar para parar." + "message": "O formulário está hospedado em um domínio diferente do URI da sua credencial salva. Escolha OK para preencher automaticamente mesmo assim, ou Cancelar para parar." }, "autofillIframeWarningTip": { - "message": "Para evitar este aviso no futuro, salve este URI, $HOSTNAME$, no seu item de login no Bitwarden para este site.", + "message": "Para evitar este aviso no futuro, salve este URI, $HOSTNAME$, no seu item de credencial no Bitwarden para este site.", "placeholders": { "hostname": { "content": "$1", @@ -2401,7 +2401,7 @@ "message": "Nova senha mestra" }, "confirmNewMasterPass": { - "message": "Confirme a nova senha mestre" + "message": "Confirmar nova senha mestra" }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" @@ -2446,10 +2446,10 @@ "message": "A sua nova senha mestra não cumpre aos requisitos da política." }, "receiveMarketingEmailsV2": { - "message": "Obtenha dicas, novidades e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." + "message": "Receba conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." }, "unsubscribe": { - "message": "Cancelar subscrição" + "message": "Desinscreva-se" }, "atAnyTime": { "message": "a qualquer momento." @@ -2473,7 +2473,7 @@ "message": "Política de Privacidade" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Sua nova senha não pode ser a mesma que a sua atual." + "message": "Sua senha nova não pode ser a mesma que a sua atual." }, "hintEqualsPassword": { "message": "Sua dica de senha não pode ser o mesmo que sua senha." @@ -2482,7 +2482,7 @@ "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Erro ao Atualizar Token" + "message": "Erro ao acessar token de recarregamento" }, "errorRefreshingAccessTokenDesc": { "message": "Nenhum token de atualização ou chave de API foi encontrado. Tente sair e entrar novamente." @@ -2494,19 +2494,19 @@ "message": "Por favor, verifique se o aplicativo desktop mostra esta impressão digital: " }, "desktopIntegrationDisabledTitle": { - "message": "A integração com o navegador não está habilitada" + "message": "A integração com o navegador não foi configurada" }, "desktopIntegrationDisabledDesc": { - "message": "A integração com o navegador não está habilitada no aplicativo Bitwarden Desktop. Por favor, habilite-a nas configurações do aplicativo desktop." + "message": "A integração com o navegador não foi configurada no aplicativo do Bitwarden Desktop. Configure ela nas configurações do aplicativo de computador." }, "startDesktopTitle": { "message": "Iniciar o aplicativo Bitwarden Desktop" }, "startDesktopDesc": { - "message": "O aplicativo Bitwarden Desktop precisa ser iniciado antes que esta função possa ser usada." + "message": "O aplicativo do Bitwarden para desktop precisa ser iniciado antes que o desbloqueio com biometria possa ser usado." }, "errorEnableBiometricTitle": { - "message": "Não foi possível ativar a biometria" + "message": "Não é possível ativar a biometria" }, "errorEnableBiometricDesc": { "message": "A ação foi cancelada pelo aplicativo desktop" @@ -2524,16 +2524,16 @@ "message": "A conta não confere" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Falta de chave biométrica" + "message": "Não correspondência da chave biométrica" }, "nativeMessagingWrongUserKeyDesc": { - "message": "O desbloqueio biométrico falhou. A chave secreta biométrica não conseguiu desbloquear o cofre. Tente configurar os dados biométricos novamente." + "message": "O desbloqueio biométrico falhou. A chave secreta da biometria falhou ao desbloquear o cofre. Tente configurar a biometrica biométricos novamente." }, "biometricsNotEnabledTitle": { - "message": "Biometria não ativada" + "message": "Biometria não configurada" }, "biometricsNotEnabledDesc": { - "message": "A biometria com o navegador requer que a biometria de desktop seja habilitada nas configurações primeiro." + "message": "A biometria com o navegador requer que a biometria de desktop seja ativada nas configurações primeiro." }, "biometricsNotSupportedTitle": { "message": "Biometria não suportada" @@ -2545,7 +2545,7 @@ "message": "Usuário bloqueado ou desconectado" }, "biometricsNotUnlockedDesc": { - "message": "Por favor, desbloqueie esse usuário no aplicativo da área de trabalho e tente novamente." + "message": "Desbloqueie esse usuário no aplicativo de computador e tente novamente." }, "biometricsNotAvailableTitle": { "message": "Desbloqueio biométrico indisponível" @@ -2572,19 +2572,19 @@ "message": "Esta ação não pode ser feita na barra lateral. Por favor, tente novamente no pop-up ou popout." }, "personalOwnershipSubmitError": { - "message": "Devido a uma Política Empresarial, você está restrito de salvar itens para seu cofre pessoal. Altere a opção de Propriedade para uma organização e escolha entre as Coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." }, "personalOwnershipPolicyInEffect": { "message": "Uma política de organização está afetando suas opções de propriedade." }, "personalOwnershipPolicyInEffectImports": { - "message": "A política da organização bloqueou a importação de itens para o seu cofre." + "message": "Uma política da organização bloqueou a importação de itens em seu cofre pessoal." }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "Não é possível importar tipos de item de cartão" }, "restrictCardTypeImportDesc": { - "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + "message": "Uma política definida por 1 ou mais organizações impedem que você importe cartões em seus cofres." }, "domainsTitle": { "message": "Domínios", @@ -2597,28 +2597,28 @@ "message": "Saiba mais sobre domínios bloqueados" }, "excludedDomains": { - "message": "Domínios Excluídos" + "message": "Domínios excluídos" }, "excludedDomainsDesc": { "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor." }, "excludedDomainsDescAlt": { - "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor." + "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios, em todas as contas. Você deve atualizar a página para que as alterações entrem em vigor." }, "blockedDomainsDesc": { - "message": "O preenchimento automático e outros recursos podem não estar disponíveis para estes sites. Atualize a página para que as mudanças surtam efeito." + "message": "O preenchimento automático e outros recursos não serão oferecidos para estes sites. Atualize a página para que as mudanças surtam efeito." }, "autofillBlockedNoticeV2": { "message": "O preenchimento automático está bloqueado para este site." }, "autofillBlockedNoticeGuidance": { - "message": "Altere isso em configurações" + "message": "Altere isso nas configurações" }, "change": { "message": "Alterar" }, "changePassword": { - "message": "Change password", + "message": "Alterar senha", "description": "Change password button for browser at risk notification on login." }, "changeButtonTitle": { @@ -2631,7 +2631,7 @@ } }, "atRiskPassword": { - "message": "At-risk password" + "message": "Senha em risco" }, "atRiskPasswords": { "message": "Senhas em risco" @@ -2668,7 +2668,7 @@ } }, "atRiskChangePrompt": { - "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "message": "Sua senha para este site está em risco. $ORGANIZATION$ solicitou alterá-la.", "placeholders": { "organization": { "content": "$1", @@ -2678,7 +2678,7 @@ "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." }, "atRiskNavigatePrompt": { - "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "message": "$ORGANIZATION$ quer que você altere esta senha porque está em risco. Navegue até as configurações da sua conta para alterar a senha.", "placeholders": { "organization": { "content": "$1", @@ -2688,10 +2688,10 @@ "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." }, "reviewAndChangeAtRiskPassword": { - "message": "Revisar e alterar uma senha vulnerável" + "message": "Revisar e alterar uma senha em risco" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Revisar e alterar $COUNT$ senhas vulneráveis", + "message": "Revisar e alterar $COUNT$ senhas em risco", "placeholders": { "count": { "content": "$1", @@ -2700,30 +2700,30 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Mude senhas vulneráveis rapidamente" + "message": "Altere senhas em risco mais rápido" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Atualize suas configurações para poder autopreencher ou gerar novas senhas" + "message": "Atualize suas configurações para poder preencher senhas automaticamente ou gerá-las automaticamente" }, "reviewAtRiskLogins": { - "message": "Revisar logins em risco" + "message": "Revisar credenciais em risco" }, "reviewAtRiskPasswords": { - "message": "Revisar senhas vulneráveis" + "message": "Revisar senhas em risco" }, "reviewAtRiskLoginsSlideDesc": { - "message": "As senhas da sua organização estão vulneráveis, pois são fracas, reutilizadas e/ou comprometidas.", + "message": "As senhas da sua organização estão em risco, pois são fracas, foram reutilizadas e/ou comprometidas.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Ilustração de uma lista de logins em risco." + "message": "Ilustração de uma lista de credenciais em risco." }, "generatePasswordSlideDesc": { - "message": "Gere rapidamente uma senha forte e única com a opção de autopreenchimento no site vulnerável.", + "message": "Gere uma senha forte e única com rapidez com o menu de preenchimento automático no site em risco.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Ilustração do menu de autopreenchimento do Bitwarden exibindo uma senha gerada." + "message": "Ilustração do menu de preenchimento automático do Bitwarden exibindo uma senha gerada." }, "updateInBitwarden": { "message": "Atualizar no Bitwarden" @@ -2733,7 +2733,7 @@ "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Ilustração de umja notificação do Bitwarden solicitando que o usuário atualize o login." + "message": "Ilustração de uma notificação do Bitwarden solicitando que o usuário atualize a credencial." }, "turnOnAutofill": { "message": "Ativar preenchimento automático" @@ -2769,14 +2769,14 @@ "message": "Mudanças de domínios excluídos salvas" }, "limitSendViews": { - "message": "Limitar visualização" + "message": "Limitar visualizações" }, "limitSendViewsHint": { - "message": "Ninguém pode visualizar este envio depois que o limite foi atingido.", + "message": "Ninguém poderá visualizar este Send depois que o limite foi atingido.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ Visualizações restantes", + "message": "$ACCESSCOUNT$ visualizações restantes", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2790,7 +2790,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Enviar detalhes", + "message": "Detalhes do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2807,7 +2807,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Número máximo de acessos atingido", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2833,10 +2833,10 @@ "message": "Excluir" }, "removedPassword": { - "message": "Senha Removida" + "message": "Senha removida" }, "deletedSend": { - "message": "Send Excluído", + "message": "Send apagado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -2858,7 +2858,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Tem certeza que deseja excluir este campo permanentemente?", + "message": "Tem certeza que deseja apagar este Send para sempre?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -2866,14 +2866,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { - "message": "Data de Exclusão" + "message": "Data de apagamento" }, "deletionDateDescV2": { - "message": "O envio será eliminado permanentemente na data e hora especificadas.", + "message": "O Send será apagado para sempre nesta data.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Data de Validade" + "message": "Data de validade" }, "oneDay": { "message": "1 dia" @@ -2891,18 +2891,18 @@ "message": "Personalizado" }, "sendPasswordDescV3": { - "message": "Adicione uma senha opcional para os destinatários para acessar este Envio.", + "message": "Adicione uma senha opcional para que os destinatários acessem este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Criar Novo Send", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "Nova Senha" + "message": "Senha nova" }, "sendDisabled": { - "message": "Send Desativado", + "message": "Send removido", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -2910,19 +2910,19 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send Criado", + "message": "Send criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Envio criado com sucesso!", + "message": "Send criado com sucesso!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "O envio estará disponível para qualquer pessoa com o link para a próxima 1 hora.", + "message": "O Send estará disponível para qualquer pessoa com o link pela próxima hora.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "O envio estará disponível para qualquer pessoa com o link para as próximas $HOURS$ horas.", + "message": "O Send estará disponível para qualquer pessoa com o link pelas próximas $HOURS$ horas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2932,11 +2932,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "O envio estará disponível para qualquer pessoa com o link para o próximo 1 dia.", + "message": "O Send estará disponível para qualquer pessoa com o link pelo próximo dia.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "O envio estará disponível para qualquer pessoa com o link para os próximos $DAYS$ dias.", + "message": "O Send estará disponível para qualquer pessoa com o link pelos 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": { @@ -2946,11 +2946,11 @@ } }, "sendLinkCopied": { - "message": "Enviar link copiado", + "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", + "message": "Send salvo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { @@ -2958,7 +2958,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "Para criar um arquivo enviado, você precisa colocar a extensão em uma nova janela.", + "message": "Para criar um Send de arquivo, você precisa colocar a extensão em uma nova janela.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2992,7 +2992,7 @@ "message": "Ocorreu um erro ao salvar as suas datas de exclusão e validade." }, "hideYourEmail": { - "message": "Ocultar meu endereço de correio eletrônico dos destinatários." + "message": "Oculte seu endereço de e-mail dos visualizadores." }, "passwordPrompt": { "message": "Solicitação nova de senha mestra" @@ -3004,7 +3004,7 @@ "message": "Esta ação está protegida. Para continuar, por favor, reinsira a sua senha mestra para verificar sua identidade." }, "emailVerificationRequired": { - "message": "Verificação de E-mail Necessária" + "message": "Verificação de e-mail necessária" }, "emailVerifiedV2": { "message": "E-mail verificado" @@ -3013,7 +3013,7 @@ "message": "Você precisa verificar o seu e-mail para usar este recurso. Você pode verificar seu e-mail no cofre web." }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "Senha mestra definida com sucesso" }, "updatedMasterPassword": { "message": "Senha mestra atualizada" @@ -3022,16 +3022,16 @@ "message": "Atualizar senha mestra" }, "updateMasterPasswordWarning": { - "message": "Sua senha mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la 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." + "message": "Sua senha mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você entre novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "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." + "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ê entre novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "tdeDisabledMasterPasswordRequired": { - "message": "Sua organização desativou a criptografia confiável do dispositivo. Por favor, defina uma senha mestra para acessar o seu cofre." + "message": "Sua organização desativou a criptografia confiável do dispositivo. Defina uma senha mestra para acessar o seu cofre." }, "resetPasswordPolicyAutoEnroll": { - "message": "Inscrição Automática" + "message": "Inscrição automática" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na redefinição de senha. A inscrição permitirá que os administradores da organização alterem sua senha mestra." @@ -3052,7 +3052,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "fora do $TOTAL$", + "message": "dos $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -3071,10 +3071,10 @@ "message": "Minutos" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Os requisitos de política empresarial foram aplicados nesta configuração" + "message": "Os requisitos de política empresarial foram aplicados às opções de tempo limite" }, "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. O Tempo Limite Máximo permitido do Cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "message": "As políticas da sua organização definiram o tempo máximo de limite para o cofre como $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -3139,13 +3139,13 @@ } }, "vaultTimeoutTooLarge": { - "message": "Seu tempo de espera no cofre excede as restrições estabelecidas por sua organização." + "message": "O tempo limite do seu cofre excede as restrições estabelecidas por sua organização." }, "vaultExportDisabled": { - "message": "Exportação de Cofre Desativada" + "message": "Exportação de cofre indisponível" }, "personalVaultExportPolicyInEffect": { - "message": "Uma ou mais políticas da organização impedem que você exporte seu cofre pessoal." + "message": "Uma ou mais políticas da organização impedem que você exporte seu cofre individual." }, "copyCustomFieldNameInvalidElement": { "message": "Não foi possível identificar um elemento de formulário válido. Em vez disso, tente inspecionar o HTML." @@ -3154,22 +3154,22 @@ "message": "Nenhum identificador exclusivo encontrado." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Uma senha mestra não é mais necessária para os membros da seguinte organização. Confirme o domínio abaixo com o administrador da sua organização." }, "organizationName": { - "message": "Organization name" + "message": "Nome da organização" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domínio do Conector de Chave" }, "leaveOrganization": { - "message": "Sair da Organização" + "message": "Sair da organização" }, "removeMasterPassword": { "message": "Remover senha mestra" }, "removedMasterPassword": { - "message": "Senha mestra removida." + "message": "Senha mestra removida" }, "leaveOrganizationConfirmation": { "message": "Você tem certeza que deseja sair desta organização?" @@ -3178,16 +3178,16 @@ "message": "Você saiu da organização." }, "toggleCharacterCount": { - "message": "Alternar contagem de caracteres" + "message": "Habilitar contagem de caracteres" }, "sessionTimeout": { - "message": "Sua sessão expirou. Por favor, volte e tente iniciar a sessão novamente." + "message": "Sua sessão expirou. Volte e tente entrar novamente." }, "exportingPersonalVaultTitle": { - "message": "Exportando o Cofre Pessoal" + "message": "Exportando cofre individual" }, "exportingIndividualVaultDescription": { - "message": "Apenas os itens individuais do cofre associados a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas as informações de item do cofre serão exportadas e não incluirão anexos associados.", + "message": "Apenas os itens do cofre individual associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas as informações dos itens do cofre serão exportadas e não incluirão anexos associados.", "placeholders": { "email": { "content": "$1", @@ -3196,7 +3196,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Apenas os itens individuais do cofre, incluindo anexos associados ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", + "message": "Apenas os itens do cofre individual, incluindo anexos associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", "placeholders": { "email": { "content": "$1", @@ -3208,7 +3208,7 @@ "message": "Exportando cofre da organização" }, "exportingOrganizationVaultDesc": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre individual e itens de outras organizações não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -3217,7 +3217,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Somente o cofre da organização associada com $ORGANIZATION$ será exportado.", "placeholders": { "organization": { "content": "$1", @@ -3226,7 +3226,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens da minhas coleções não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -3241,10 +3241,10 @@ "message": "Erro ao descriptografar" }, "couldNotDecryptVaultItemsBelow": { - "message": "O Bitwarden não pode descriptografar o(s) item(ns) do cofre listado abaixo." + "message": "O Bitwarden não conseguiu descriptografar o(s) item(ns) do cofre listado abaixo." }, "contactCSToAvoidDataLossPart1": { - "message": "Contato com o cliente feito com sucesso", + "message": "Contate o sucesso do cliente", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -3252,7 +3252,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { - "message": "Gerar Usuário" + "message": "Gerar nome de usuário" }, "generateEmail": { "message": "Gerar e-mail" @@ -3272,7 +3272,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ caracteres ou mais para gerar uma senha forte.", + "message": " Utilize $RECOMMENDED$ ou mais caracteres para gerar um senha forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3282,7 +3282,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use palavras $RECOMMENDED$ ou mais para gerar uma frase secreta forte.", + "message": " Utilize $RECOMMENDED$ ou mais palavras para gerar uma frase secreta forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3292,17 +3292,17 @@ } }, "plusAddressedEmail": { - "message": "E-mail alternativo (com um +)", + "message": "E-mail endereçado com +", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Use as capacidades de sub-endereçamento do seu provedor de e-mail." }, "catchallEmail": { - "message": "E-mail catch-all" + "message": "E-mail pega-tudo" }, "catchallEmailDesc": { - "message": "Use o catch-all configurado no seu domínio." + "message": "Use o pega-tudo configurado na caixa de entrada do seu domínio." }, "random": { "message": "Aleatório" @@ -3311,23 +3311,23 @@ "message": "Palavra aleatória" }, "websiteName": { - "message": "Nome do Site" + "message": "Nome do site" }, "service": { "message": "Serviço" }, "forwardedEmail": { - "message": "Apelido (alias) de E-mail Encaminhado" + "message": "Alias do e-mail encaminhado" }, "forwardedEmailDesc": { - "message": "Gere um apelido de e-mail com um serviço de encaminhamento externo." + "message": "Gere um alias de e-mail com um serviço de encaminhamento externo." }, "forwarderDomainName": { "message": "Domínio de e-mail", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Escolha um domínio que seja suportado pelo serviço selecionado", + "message": "Escolha um domínio suportado pelo serviço selecionado", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -3407,7 +3407,7 @@ } }, "forwarderNoAccountId": { - "message": "Não foi possível obter a máscara do ID da conta de email $SERVICENAME$.", + "message": "Não foi possível obter o ID da conta de e-mail mascarado $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3457,29 +3457,29 @@ } }, "hostname": { - "message": "Nome do host", + "message": "Nome do servidor", "description": "Part of a URL." }, "apiAccessToken": { - "message": "Token de Acesso à API" + "message": "Token de acesso à API" }, "apiKey": { "message": "Chave da API" }, "ssoKeyConnectorError": { - "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." + "message": "Erro do conector de chave: certifique-se de que o conector de chave está disponível e funcionando corretamente." }, "premiumSubcriptionRequired": { "message": "Assinatura Premium necessária" }, "organizationIsDisabled": { - "message": "Organização está desabilitada." + "message": "Organização suspensa." }, "disabledOrganizationFilterError": { - "message": "Itens em Organizações Desativadas não podem ser acessados. Entre em contato com o proprietário da sua Organização para obter assistência." + "message": "Itens em organizações suspensas não podem ser acessados. Entre em contato com o proprietário da sua Organização para obter assistência." }, "loggingInTo": { - "message": "Fazendo login em $DOMAIN$", + "message": "Entrando em $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -3497,7 +3497,7 @@ "message": "Terceiros" }, "thirdPartyServerMessage": { - "message": "Conectado a implementação de servidores terceiros, $SERVERNAME$. Por favor, verifique as falhas usando o servidor oficial ou reporte-os ao servidor de terceiros.", + "message": "Conectado à implementação de servidores terceiros, $SERVERNAME$. Verifique bugs usando o servidor oficial ou reporte-os ao servidor de terceiros.", "placeholders": { "servername": { "content": "$1", @@ -3524,49 +3524,49 @@ "message": "Lembrar e-mail" }, "loginWithDevice": { - "message": "Fazer login com dispositivo" + "message": "Entrar com dispositivo" }, "fingerprintPhraseHeader": { - "message": "Frase de impressão digital" + "message": "Frase biométrica" }, "fingerprintMatchInfo": { - "message": "Certifique-se que o cofre esteja desbloqueado e que a frase de impressão digital corresponda à do outro dispositivo." + "message": "Certifique-se que o cofre esteja desbloqueado e que a frase biométrica corresponda à do outro dispositivo." }, "resendNotification": { "message": "Reenviar notificação" }, "viewAllLogInOptions": { - "message": "Visualizar todas as opções de login" + "message": "Ver todas as opções de autenticação" }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, "notificationSentDevicePart1": { - "message": "Desbloqueie o Bitwarden em seu dispositivo ou na" + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " }, "notificationSentDeviceAnchor": { "message": "aplicativo web" }, "notificationSentDevicePart2": { - "message": "Certifique-se de que a frase de biometria corresponde a frase abaixo antes de aprovar." + "message": "Certifique-se de que a frase biométrica corresponde a frase abaixo antes de aprovar." }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para o seu dispositivo" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "Você será notificado assim que a requisição for aprovada" + "message": "Você será notificado assim que a solicitação for aprovada" }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" }, "loginInitiated": { - "message": "Login iniciado" + "message": "Autenticação iniciada" }, "logInRequestSent": { - "message": "Pedido enviado" + "message": "Solicitação enviada" }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "Solicitação de autenticação aprovada para $EMAIL$ em $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3579,16 +3579,16 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente entrar com o dispositivo novamente." }, "device": { - "message": "Device" + "message": "Dispositivo" }, "loginStatus": { - "message": "Login status" + "message": "Estado de autenticação" }, "masterPasswordChanged": { - "message": "Master password saved" + "message": "Senha mestre salva" }, "exposedMasterPassword": { "message": "Senha mestra comprometida" @@ -3603,7 +3603,7 @@ "message": "Senha fraca identificada e encontrada em um vazamento de dados. Use uma senha forte e única para proteger a sua conta. Tem certeza de que deseja usar essa senha?" }, "checkForBreaches": { - "message": "Verificar vazamento de dados conhecidos para esta senha" + "message": "Conferir vazamentos de dados conhecidos por esta senha" }, "important": { "message": "Importante:" @@ -3612,7 +3612,7 @@ "message": "Sua senha mestra não pode ser recuperada se você a esquecer!" }, "characterMinimum": { - "message": "$LENGTH$ caracteres mínimos", + "message": "Mínimo de $LENGTH$ caracteres", "placeholders": { "length": { "content": "$1", @@ -3675,34 +3675,34 @@ } }, "opensInANewWindow": { - "message": "Abrir em uma nova janela" + "message": "Abre em uma nova janela" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Lembrar deste dispositivo para permanecer conectado" + "message": "Lembrar deste dispositivo para tornar futuras autenticações simples" }, "manageDevices": { "message": "Gerenciar dispositivos" }, "currentSession": { - "message": "Current session" + "message": "Sessão atual" }, "mobile": { - "message": "Mobile", + "message": "Móvel", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "Extensão", "description": "Browser extension/addon" }, "desktop": { - "message": "Desktop", + "message": "Computador", "description": "Desktop app" }, "webVault": { - "message": "Web vault" + "message": "Cofre web" }, "webApp": { - "message": "Web app" + "message": "Aplicativo web" }, "cli": { "message": "CLI" @@ -3712,22 +3712,22 @@ "description": "Software Development Kit" }, "requestPending": { - "message": "Request pending" + "message": "Solicitação pendente" }, "firstLogin": { - "message": "First login" + "message": "Primeiro acesso" }, "trusted": { - "message": "Trusted" + "message": "Confiado" }, "needsApproval": { - "message": "Needs approval" + "message": "Precisa de aprovação" }, "devices": { "message": "Dispositivos" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Tentativa de acesso por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3736,31 +3736,31 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "Confirmar acesso" }, "denyAccess": { - "message": "Deny access" + "message": "Negar acesso" }, "time": { - "message": "Time" + "message": "Horário" }, "deviceType": { - "message": "Device Type" + "message": "Tipo do dispositivo" }, "loginRequest": { - "message": "Login request" + "message": "Solicitação de autenticação" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Esta solicitação não é mais válida." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "A solicitação de autenticação já expirou." }, "justNow": { - "message": "Just now" + "message": "Agora há pouco" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Solicitado há $MINUTES$ minutos", "placeholders": { "minutes": { "content": "$1", @@ -3790,28 +3790,28 @@ "message": "Solicitar aprovação do administrador" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "Não é possível concluir a autenticação" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "Você precisa entrar com um dispositivo confiável ou solicitar ao administrador que lhe atribua uma senha." }, "ssoIdentifierRequired": { - "message": "Identificador SSO da organização é necessário." + "message": "Identificador de SSO da organização é necessário." }, "creatingAccountOn": { "message": "Criando conta em" }, "checkYourEmail": { - "message": "Verifique seu e-mail" + "message": "Confira seu e-mail" }, "followTheLinkInTheEmailSentTo": { - "message": "Siga o link no e-mail enviado para" + "message": "Abra o link no e-mail enviado para" }, "andContinueCreatingYourAccount": { "message": "e continue criando a sua conta." }, "noEmail": { - "message": "Sem e-mail?" + "message": "Nenhum e-mail?" }, "goBack": { "message": "Voltar" @@ -3820,7 +3820,7 @@ "message": "para editar o seu endereço de e-mail." }, "eu": { - "message": "Europa", + "message": "União Europeia", "description": "European Union" }, "accessDenied": { @@ -3830,7 +3830,7 @@ "message": "Gerais" }, "display": { - "message": "Exibir" + "message": "Exibição" }, "accountSuccessfullyCreated": { "message": "Conta criada com sucesso!" @@ -3839,13 +3839,13 @@ "message": "Aprovação do administrador necessária" }, "adminApprovalRequestSentToAdmins": { - "message": "Seu pedido foi enviado para seu administrador." + "message": "Sua solicitação foi enviada para seu administrador." }, "troubleLoggingIn": { - "message": "Problemas em efetuar login?" + "message": "Problemas para acessar?" }, "loginApproved": { - "message": "Login aprovado" + "message": "Autenticação aprovada" }, "userEmailMissing": { "message": "E-mail do usuário ausente" @@ -3854,38 +3854,38 @@ "message": "E-mail de usuário ativo não encontrado. Desconectando." }, "deviceTrusted": { - "message": "Dispositivo confiável" + "message": "Dispositivo confiado" }, "trustOrganization": { - "message": "Trust organization" + "message": "Confiar organização" }, "trust": { - "message": "Trust" + "message": "Confiar" }, "doNotTrust": { - "message": "Do not trust" + "message": "Não confiar" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "Organização não foi confiada" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida em sua conta" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem uma recuperação de conta ativa e a frase biométrica exibida abaixo corresponde com a da organização." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A inscrição permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a impressão digital da organização." }, "trustUser": { - "message": "Trust user" + "message": "Confiar no usuário" }, "sendsTitleNoItems": { "message": "Envie informações confidenciais com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Compartilhe arquivos e dados de forma segura com qualquer pessoa, em qualquer plataforma. Suas informações permanecerão criptografadas de ponta a ponta enquanto limitam a exposição.", + "message": "Compartilhe dados e arquivos com segurança com qualquer pessoa, em qualquer plataforma. Suas informações permanecerão criptografadas de ponta a ponta, limitando a exposição.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3943,7 +3943,7 @@ } }, "multipleInputEmails": { - "message": "1 ou mais e-mails são inválidos" + "message": "Um ou mais e-mails são inválidos" }, "inputTrimValidator": { "message": "A entrada não pode conter somente espaços em branco.", @@ -3962,10 +3962,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 campo precisa de sua atenção." + "message": "Um campo precisa da sua atenção." }, "multipleFieldsNeedAttention": { - "message": "Campos $COUNT$ precisam de sua atenção.", + "message": "$COUNT$ campos precisam da sua atenção.", "placeholders": { "count": { "content": "$1", @@ -3980,16 +3980,16 @@ "message": "-- Digite para filtrar --" }, "multiSelectLoading": { - "message": "Carrgando Opções..." + "message": "Carrgando opções..." }, "multiSelectNotFound": { "message": "Nenhum item encontrado" }, "multiSelectClearAll": { - "message": "Limpar todos" + "message": "Limpar tudo" }, "plusNMore": { - "message": "+ $QUANTITY$ mais", + "message": "+ mais $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -4001,7 +4001,7 @@ "message": "Submenu" }, "toggleCollapse": { - "message": "Alternar colapso", + "message": "Guardar/mostrar", "description": "Toggling an expand/collapse state." }, "aliasDomain": { @@ -4012,7 +4012,7 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "toggleSideNavigation": { - "message": "Ativar/desativar navegação lateral" + "message": "Habilitar navegação lateral" }, "skipToContent": { "message": "Ir para o conteúdo" @@ -4022,7 +4022,7 @@ "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { - "message": "Ativar menu de preenchimento automático do Bitwarden", + "message": "Habilitar menu de preenchimento automático do Bitwarden", "description": "Screen reader and tool tip label for the overlay button" }, "bitwardenVault": { @@ -4030,7 +4030,7 @@ "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { - "message": "Desbloqueie sua conta para ver os logins correspondentes", + "message": "Desbloqueie sua conta para ver as credenciais correspondentes", "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { @@ -4042,7 +4042,7 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Desbloqueie sua conta, abra em uma nova janela", + "message": "Desbloqueie sua conta, abre em uma nova janela", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { @@ -4050,15 +4050,15 @@ "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Tempo até o código expirar", + "message": "Tempo até o código TOTP atual expirar", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { - "message": "Preencha as credenciais para", + "message": "Preencher credenciais para", "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { - "message": "Nome parcial", + "message": "Nome de usuário parcial", "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" }, "noItemsToShow": { @@ -4074,11 +4074,11 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "Novo login", + "message": "Nova credencial", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Adicionar novo item de login no cofre, abre em uma nova janela", + "message": "Adicionar novo item de credencial no cofre, abre em uma nova janela", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -4086,7 +4086,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Adicione um novo item do cartão do cofre, abre em uma nova janela", + "message": "Adicione um novo item de cartão no cofre, abre em uma nova janela", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -4094,7 +4094,7 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Adicionar novo item de identidade do cofre, abre em uma nova janela", + "message": "Adicionar novo item de identidade no cofre, abre em uma nova janela", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { @@ -4102,7 +4102,7 @@ "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { - "message": "Ligar" + "message": "Ativar" }, "ignore": { "message": "Ignorar" @@ -4115,7 +4115,7 @@ "message": "Erro ao importar" }, "importErrorDesc": { - "message": "Houve um problema com os dados que você tentou importar. Por favor, resolva os erros listados abaixo em seu arquivo de origem e tente novamente." + "message": "Houve um problema com os dados que você tentou importar. Resolva os erros listados abaixo em seu arquivo de origem e tente novamente." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Resolva os erros abaixo e tente novamente." @@ -4145,7 +4145,7 @@ "message": "Definir PIN" }, "verifyWithBiometrics": { - "message": "Verificiar com biometria" + "message": "Verificar com biometria" }, "awaitingConfirmation": { "message": "Aguardando confirmação" @@ -4190,13 +4190,13 @@ "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, "popoutExtension": { - "message": "Extensão pop-out" + "message": "Mostrar extensão" }, "launchDuo": { "message": "Abrir o Duo" }, "importFormatError": { - "message": "Os dados não estão formatados corretamente. Por favor, verifique o seu arquivo de importação e tente novamente." + "message": "Os dados não estão formatados corretamente. Verifique o seu arquivo de importação e tente novamente." }, "importNothingError": { "message": "Nada foi importado." @@ -4205,7 +4205,7 @@ "message": "Erro ao descriptografar o arquivo exportado. Sua chave de criptografia não corresponde à chave de criptografia usada para exportar os dados." }, "invalidFilePassword": { - "message": "Senha do arquivo inválida, por favor informe a senha utilizada quando criou o arquivo de exportação." + "message": "Senha do arquivo inválida, informe a senha utilizada quando criou o arquivo de exportação." }, "destination": { "message": "Destino" @@ -4220,10 +4220,10 @@ "message": "Selecione uma coleção" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma coleção" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -4235,7 +4235,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Selecionar Arquivo" + "message": "Escolher arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -4244,7 +4244,7 @@ "message": "ou copie/cole o conteúdo do arquivo de importação" }, "instructionsFor": { - "message": "$NAME$ instruções", + "message": "Instruções para $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -4257,7 +4257,7 @@ "message": "Confirmar importação do cofre" }, "confirmVaultImportDesc": { - "message": "Este arquivo é protegido por senha. Por favor, digite a senha do arquivo para importar os dados." + "message": "Este arquivo é protegido por senha. Digite a senha do arquivo para importar os dados." }, "confirmFilePassword": { "message": "Confirmar senha do arquivo" @@ -4272,7 +4272,7 @@ "message": "Acessando" }, "loggedInExclamation": { - "message": "Sessão Iniciada!" + "message": "Conectado!" }, "passkeyNotCopied": { "message": "A chave de acesso não será copiada" @@ -4281,7 +4281,7 @@ "message": "A chave de acesso não será copiada para o item clonado. Deseja continuar clonando este item?" }, "logInWithPasskeyQuestion": { - "message": "Fazer ‘login’ com chave de acesso?" + "message": "Entrar com chave de acesso?" }, "passkeyAlreadyExists": { "message": "Uma chave de acesso já existe para este aplicativo." @@ -4290,13 +4290,13 @@ "message": "Nenhuma chave de acesso encontrada para este aplicativo." }, "noMatchingPasskeyLogin": { - "message": "Você não tem um login correspondente para este site." + "message": "Você não tem uma credencial correspondente para este site." }, "noMatchingLoginsForSite": { "message": "Sem credenciais correspondentes para este site" }, "searchSavePasskeyNewLogin": { - "message": "Pesquisar ou salvar senha como novo login" + "message": "Salvar ou pesquisar chave de acesso como uma nova credencial" }, "confirm": { "message": "Confirmar" @@ -4305,13 +4305,13 @@ "message": "Salvar chave de acesso" }, "savePasskeyNewLogin": { - "message": "Salvar chave de acesso como um novo login" + "message": "Salvar chave de acesso como uma nova credencial" }, "chooseCipherForPasskeySave": { - "message": "Escolha um ‘login’ para salvar com essa chave de acesso" + "message": "Escolha uma credencial para salvar essa chave de acesso" }, "chooseCipherForPasskeyAuth": { - "message": "Escolha uma senha para iniciar sessão" + "message": "Escolha uma chave para conectar-se" }, "passkeyItem": { "message": "Item de chave de acesso" @@ -4353,19 +4353,19 @@ "message": "Incluir pastas compartilhadas" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "E-mail do LastPass" }, "importingYourAccount": { "message": "Importando sua conta..." }, "lastPassMFARequired": { - "message": "Requer autenticação multifatores do LastPass" + "message": "Requer autenticação multifatorial do LastPass" }, "lastPassMFADesc": { - "message": "Digite sua senha única do app de autenticação" + "message": "Digite sua senha única do app autenticador" }, "lastPassOOBDesc": { - "message": "Aprove a solicitação de login no seu aplicativo de autenticação ou insira código unico." + "message": "Aprove a solicitação de autenticação no seu aplicativo autenticador ou digite um código único." }, "passcode": { "message": "Código" @@ -4377,10 +4377,10 @@ "message": "Autenticação do LastPass necessária" }, "awaitingSSO": { - "message": "Aguardando autenticação SSO" + "message": "Aguardando autenticação do SSO" }, "awaitingSSODesc": { - "message": "Por favor, continue a iniciar a sessão usando as credenciais da sua empresa." + "message": "Continue autenticando-se usando as credenciais da sua empresa." }, "seeDetailedInstructions": { "message": "Veja instruções detalhadas no nosso site de ajuda em", @@ -4399,10 +4399,10 @@ "message": "Coleção" }, "lastPassYubikeyDesc": { - "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dele." + "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dela." }, "switchAccount": { - "message": "Trocar conta" + "message": "Trocar de conta" }, "switchAccounts": { "message": "Alternar conta" @@ -4414,13 +4414,13 @@ "message": "Conta ativa" }, "bitwardenAccount": { - "message": "Conta Bitwarden" + "message": "Conta do Bitwarden" }, "availableAccounts": { "message": "Contas disponíveis" }, "accountLimitReached": { - "message": "Limite de contas atingido. Termine a sessão de uma conta para adicionar outra." + "message": "Limite de contas atingido. Saia de uma conta para adicionar outra." }, "active": { "message": "ativo" @@ -4460,23 +4460,23 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "Detecção de correspondência de URI é como o Bitwarden identifica sugestões de preenchimento automático.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Expressão regular\" é uma opção avançada com maior risco de exposição das credenciais.", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Começa com\" é uma opção avançada com maior risco de exposição de credenciais.", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "Mais sobre detecção de correspondências", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "Opções avançadas", "description": "Advanced option placeholder for uri option component" }, "confirmContinueToBrowserSettingsTitle": { @@ -4520,7 +4520,7 @@ "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "privacyPermissionAdditionNotGrantedDescription": { - "message": "Você deve conceder permissões de privacidade do navegador ao Bitwarden para defini-lo como o Gerenciador de Senhas padrão.", + "message": "Você deve conceder permissões de privacidade do navegador ao Bitwarden para defini-lo como o gerenciador de senhas padrão.", "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "makeDefault": { @@ -4563,7 +4563,7 @@ "message": "Itens sugeridos" }, "autofillSuggestionsTip": { - "message": "Salvar um item de login para este site autopreenchimento" + "message": "Salvar um item de credencial para este site para o preenchimento automático" }, "yourVaultIsEmpty": { "message": "Seu cofre está vazio" @@ -4572,10 +4572,10 @@ "message": "Nenhum item corresponde à sua pesquisa" }, "clearFiltersOrTryAnother": { - "message": "Limpar filtros ou tentar outro termo de pesquisa" + "message": "Limpe os filtros ou tente outro termo de pesquisa" }, "copyInfoTitle": { - "message": "Copiar informação - $ITEMNAME$", + "message": "Copiar informações - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4585,7 +4585,7 @@ } }, "copyNoteTitle": { - "message": "Copiar Nota - $ITEMNAME$", + "message": "Copiar anotação - $ITEMNAME$", "description": "Title for a button copies a note to the clipboard.", "placeholders": { "itemname": { @@ -4663,7 +4663,7 @@ } }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "Copiar $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4746,7 +4746,7 @@ "message": "Itens sem pasta" }, "itemDetails": { - "message": "Detalhes dos item" + "message": "Detalhes do item" }, "itemName": { "message": "Nome do item" @@ -4765,7 +4765,7 @@ "message": "Itens em organizações desativadas não podem ser acessados. Entre em contato com o proprietário da sua organização para obter assistência." }, "additionalInformation": { - "message": "Informação adicional" + "message": "Informações adicionais" }, "itemHistory": { "message": "Histórico do item" @@ -4780,10 +4780,10 @@ "message": "Vinculado" }, "copySuccessful": { - "message": "Copiado com Sucesso" + "message": "Copiado com sucesso" }, "upload": { - "message": "Fazer upload" + "message": "Enviar" }, "addAttachment": { "message": "Adicionar anexo" @@ -4792,7 +4792,7 @@ "message": "O tamanho máximo de arquivo é de 500 MB" }, "deleteAttachmentName": { - "message": "Excluir anexo $NAME$", + "message": "Apagar anexo $NAME$", "placeholders": { "name": { "content": "$1", @@ -4813,31 +4813,31 @@ "message": "Baixar o Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Baixar o Bitwarden em todos os dispositivos" + "message": "Baixe o Bitwarden em todos os dispositivos" }, "getTheMobileApp": { "message": "Baixar o aplicativo para dispositivos móveis" }, "getTheMobileAppDesc": { - "message": "Acesse as suas senhas em qualquer lugar com o aplicativo móvel Bitwarden." + "message": "Acesse as suas senhas em qualquer lugar com o aplicativo móvel do Bitwarden." }, "getTheDesktopApp": { - "message": "Obter o aplicativo para desktop" + "message": "Baixe o aplicativo para computador" }, "getTheDesktopAppDesc": { - "message": "Acesse o seu cofre sem um navegador e, em seguida, configure o desbloqueio com dados biométricos para facilitar o desbloqueio tanto no aplicativo desktop quanto na extensão do navegador." + "message": "Acesse o seu cofre sem um navegador e, em seguida, configure o desbloqueio com biometria para facilitar o desbloqueio tanto no aplicativo de computador quanto na extensão do navegador." }, "downloadFromBitwardenNow": { "message": "Baixar em bitwarden.com agora" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Baixar no Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Baixar na App Store" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Tem certeza de que deseja excluir este anexo permanentemente?" + "message": "Tem certeza que quer apagar este anexo para sempre?" }, "premium": { "message": "Premium" @@ -4855,7 +4855,7 @@ "message": "Um filtro aplicado" }, "filterAppliedPlural": { - "message": "Foram aplicados $COUNT$ filtros", + "message": "$COUNT$ filtros aplicados", "placeholders": { "count": { "content": "$1", @@ -4886,7 +4886,7 @@ "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { - "message": "Credenciais de login" + "message": "Credenciais de acesso" }, "authenticatorKey": { "message": "Chave do autenticador" @@ -4914,7 +4914,7 @@ "message": "Adicionar site" }, "deleteWebsite": { - "message": "Excluir site" + "message": "Apagar site" }, "defaultLabel": { "message": "Padrão ($VALUE$)", @@ -4927,7 +4927,7 @@ } }, "showMatchDetection": { - "message": "Exibir detecção de correspondência $WEBSITE$", + "message": "Mostrar detecção de correspondência $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4948,7 +4948,7 @@ "message": "Preencher automaticamente ao carregar a página?" }, "cardExpiredTitle": { - "message": "Cartão expirado" + "message": "Cartão vencido" }, "cardExpiredMessage": { "message": "Se você o renovou, atualize as informações do cartão" @@ -4957,7 +4957,7 @@ "message": "Detalhes do cartão" }, "cardBrandDetails": { - "message": "Detalhes $BRAND$", + "message": "Detalhes da $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -4966,7 +4966,7 @@ } }, "showAnimations": { - "message": "Exibir animações" + "message": "Mostrar animações" }, "addAccount": { "message": "Adicionar conta" @@ -4975,10 +4975,10 @@ "message": "Carregando" }, "data": { - "message": "Dado" + "message": "Dados" }, "passkeys": { - "message": "Senhas", + "message": "Chaves de acesso", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4986,7 +4986,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Iniciar sessão com a chave de acesso", + "message": "Entrar com chave de acesso", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -5029,13 +5029,13 @@ "message": "Use campos ocultos para dados confidenciais como uma senha" }, "checkBoxHelpText": { - "message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um e-mail de lembrança" + "message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um lembrar e-mail" }, "linkedHelpText": { "message": "Use um campo vinculado quando estiver enfrentando problemas com o preenchimento automático com um site específico." }, "linkedLabelHelpText": { - "message": "Digite o Id html do campo, nome, nome aria-label, ou espaço reservado." + "message": "Digite o ID html, nome, aria-label, ou placeholder do campo." }, "editField": { "message": "Editar campo" @@ -5050,7 +5050,7 @@ } }, "deleteCustomField": { - "message": "Excluir $LABEL$", + "message": "Apagar $LABEL$", "placeholders": { "label": { "content": "$1", @@ -5080,7 +5080,7 @@ "message": "Reorganize a URI do site. Use as setas para mover o item para cima ou para baixo." }, "reorderFieldUp": { - "message": "$LABEL$ se moveu para cima, posição $INDEX$ de $LENGTH$", + "message": "$LABEL$ movido para cima, posição $INDEX$ de $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -5100,10 +5100,10 @@ "message": "Selecione as coleções para atribuir" }, "personalItemTransferWarningSingular": { - "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais possuir este item." + "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais ser dono deste item." }, "personalItemsTransferWarningPlural": { - "message": "Itens $PERSONAL_ITEMS_COUNT$ serão transferidos permanentemente para a organização selecionada. Você não irá mais possuir esses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para a organização selecionada. Você não irá mais ser dono desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5112,7 +5112,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais possuir este item.", + "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais ser dono deste item.", "placeholders": { "org": { "content": "$1", @@ -5121,7 +5121,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "Os itens $PERSONAL_ITEMS_COUNT$ serão transferidos permanentemente para $ORG$. Você não irá mais possuir esses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para $ORG$. Você não irá mais ser dono desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5137,7 +5137,7 @@ "message": "Coleções atribuídas com sucesso" }, "nothingSelected": { - "message": "Você selecionou nada." + "message": "Você não selecionou nada." }, "itemsMovedToOrg": { "message": "Itens movidos para $ORGNAME$", @@ -5158,7 +5158,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ se moveu para baixo, posição $INDEX$ de $LENGTH$", + "message": "$LABEL$ movido para baixo, posição $INDEX$ de $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -5175,13 +5175,13 @@ } }, "itemLocation": { - "message": "Localização do Item" + "message": "Localização do item" }, "fileSends": { - "message": "Arquivos enviados" + "message": "Sends de arquivo" }, "textSends": { - "message": "Texto enviado" + "message": "Sends de texto" }, "accountActions": { "message": "Ações da conta" @@ -5190,10 +5190,10 @@ "message": "Mostrar o número de sugestões de preenchimento automático de login no ícone da extensão" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "Acesso à conta solicitado" }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "Confirmar tentativa de acesso para $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -5226,28 +5226,28 @@ "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA de 2048 bits" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA de 3072 bits" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA de 4096 bits" }, "retry": { - "message": "Tente novamente" + "message": "Tentar novamente" }, "vaultCustomTimeoutMinimum": { "message": "Tempo limite mínimo personalizado é 1 minuto." }, "fileSavedToDevice": { - "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferências do seu dispositivo." + "message": "Arquivo salvo no dispositivo. Gerencie a partir dos downloads do seu dispositivo." }, "showCharacterCount": { - "message": "Mostrar contagem de caracteres" + "message": "Mostrar número de caracteres" }, "hideCharacterCount": { - "message": "Esconder contagem de caracteres" + "message": "Ocultar número de caracteres" }, "itemsInTrash": { "message": "Itens na lixeira" @@ -5256,16 +5256,16 @@ "message": "Nenhum item na lixeira" }, "noItemsInTrashDesc": { - "message": "Os itens que você excluir aparecerão aqui e serão excluídos permanentemente após 30 dias" + "message": "Os itens que você apagar aparecerão aqui, e serão apagados para sempre depois de 30 dias" }, "trashWarning": { - "message": "Os itens que ficarem na lixeira por mais de 30 dias serão excluídos automaticamente" + "message": "Os itens que ficarem na lixeira por mais de 30 dias serão apagados para sempre" }, "restore": { "message": "Restaurar" }, "deleteForever": { - "message": "Apagar permanentemente" + "message": "Apagar para sempre" }, "noEditPermissions": { "message": "Você não tem permissão para editar este arquivo" @@ -5283,10 +5283,10 @@ "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "O desbloqueio por biometria está indisponível porque o aplicativo de desktop não está aberto." + "message": "O desbloqueio por biometria está indisponível porque o aplicativo de computador não está aberto." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de desktop de $EMAIL$.", + "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de computador de $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -5298,16 +5298,16 @@ "message": "O desbloqueio por biometria está indisponível por razões desconhecidas." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Desbloqueie seu cofre em segundos" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Você pode personalizar suas configurações de desbloqueio e tempo limite para acessar mais rapidamente seu cofre." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "Desbloqueio com PIN definido" }, "unlockWithBiometricSet": { - "message": "Unlock with biometrics set" + "message": "Desbloqueio com biometria definido" }, "authenticating": { "message": "Autenticando" @@ -5321,7 +5321,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Salvar no Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5329,11 +5329,11 @@ "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { - "message": "Linear", + "message": "Til", "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Bastão", + "message": "Grave", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { @@ -5349,7 +5349,7 @@ "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { - "message": "cifrão", + "message": "Cifrão", "description": "Represents the $ key in screen reader content as a readable word" }, "percentSignCharacterDescriptor": { @@ -5369,11 +5369,11 @@ "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { - "message": "Parêntese esquerdo", + "message": "Abre parênteses", "description": "Represents the ( key in screen reader content as a readable word" }, "parenRightCharacterDescriptor": { - "message": "Parênteses direito", + "message": "Fecha parênteses", "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { @@ -5389,7 +5389,7 @@ "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "iguais", + "message": "Igual", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { @@ -5409,15 +5409,15 @@ "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { - "message": "Pipe", + "message": "Barra vertical", "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Barra Invertida", + "message": "Barra invertida", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { - "message": "Dois Pontos", + "message": "Dois pontos", "description": "Represents the : key in screen reader content as a readable word" }, "semicolonCharacterDescriptor": { @@ -5472,28 +5472,28 @@ "message": "Beta" }, "extensionWidth": { - "message": "Largura da janela" + "message": "Largura da extensão" }, "wide": { - "message": "Grande" + "message": "Larga" }, "extraWide": { - "message": "Extra Grande" + "message": "Extra larga" }, "sshKeyWrongPassword": { - "message": "A senha está incorreta." + "message": "A senha que você digitou está incorreta." }, "importSshKey": { "message": "Importar" }, "confirmSshKeyPassword": { - "message": "Confirme a senha" + "message": "Confirmar senha" }, "enterSshKeyPasswordDesc": { - "message": "Insira a senha da chave SSH." + "message": "Digite a senha da chave SSH." }, "enterSshKeyPassword": { - "message": "Insira a senha" + "message": "Digite a senha" }, "invalidSshKey": { "message": "A chave SSH é inválida" @@ -5517,43 +5517,43 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Atualize seu aplicativo de desktop" + "message": "Atualize seu aplicativo de computador" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "Para usar o desbloqueio de biometria, atualize seu aplicativo de desktop ou desative a opção \"desbloqueio por biometria\"." + "message": "Para usar o desbloqueio biométrica, atualize seu aplicativo de computador ou desative o desbloqueio biométrico nas configurações do desktop." }, "changeAtRiskPassword": { - "message": "Alterar senhas vulneráveis" + "message": "Alterar senhas em risco" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Esta credencial está em risco e está sem um site. Adicione um site e altere a senha para segurança melhor." }, "missingWebsite": { - "message": "Missing website" + "message": "Site ausente" }, "settingsVaultOptions": { "message": "Opções do cofre" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "O cofre protege mais do que só suas senhas. Armazene credenciais, identidades, cartões, e anotações com segurança aqui." }, "introCarouselLabel": { - "message": "Bem-vindo(a) ao Bitwarden" + "message": "Boas-vindas ao Bitwarden" }, "securityPrioritized": { - "message": "Segurança em primeiro lugar" + "message": "Segurança, priorizada" }, "securityPrioritizedBody": { - "message": "Guarde suas senhas, cartões e documentos no seu cofre seguro. Bitwarden usa criptografia ponta-a-ponta de zero-knowledge, protegendo o que é valioso para você." + "message": "Guarde suas senhas, cartões e documentos no seu cofre seguro. Bitwarden usa criptografia de ponta a ponta de zero conhecimento, protegendo o que é valioso para você." }, "quickLogin": { - "message": "Login rápido e fácil" + "message": "Autenticação rápida e fácil" }, "quickLoginBody": { - "message": "Ative o desbloqueio por biometria e o preenchimento automático para acessar suas contas sem digitar uma única letra." + "message": "Configure o desbloqueio por biometria e o preenchimento automático para acessar suas contas sem digitar uma única letra." }, "secureUser": { - "message": "Melhore seus logins de nível" + "message": "Dê um up nas suas credenciais" }, "secureUserBody": { "message": "Use o gerador de senhas para criar e salvar senhas fortes e únicas para todas as suas contas." @@ -5565,134 +5565,154 @@ "message": "Guarde quantas senhas quiser e acesse de qualquer lugar com o Bitwarden. No seu celular, navegador e computador." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 notificação" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importar senhas existentes" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Use o importador para transferir rapidamente as credenciais para o Bitwarden sem adicioná-las manualmente." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importar agora" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Boas-vindas ao seu cofre!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Tentativa de phishing detectada" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "O site que você está tentando visitar é um site malicioso conhecido e um risco à segurança." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Fechar esta aba" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continuar para este site (não recomendado)" + }, + "phishingPageExplanation1": { + "message": "Este site foi encontrado em ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", uma lista de código aberto de sites de phishing conhecidos usados para roubar informações pessoais e sensíveis.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Saiba mais sobre a detecção de phishing" + }, + "protectedBy": { + "message": "Protegido pelo $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Preencher itens automaticamente para a página atual" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Favorite itens para acesso rápido" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Pesquise seu cofre por outra coisa" }, "newLoginNudgeTitle": { "message": "Seja mais rápido com o preenchimento automático" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Inclua um", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Site", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "para que esta credencial apareça como uma sugestão de preenchimento automático.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Pagamento on-line simplificado" }, "newCardNudgeBody": { "message": "Preencha automaticamente formulários de pagamento com cartões de forma segura e precisa." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Simplifique a criação de contas" }, "newIdentityNudgeBody": { - "message": "Preencha automaticamente formulários longos de registro ou contato de forma rápida." + "message": "Com identidades, preencha formulários de cadastro ou contato longos rapidamente, de forma automática." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Mantenha seus dados sensíveis seguros" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Com anotações, armazene com segurança dados sensíveis como detalhes de informações bancárias ou de seguro." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Acesso SSH amigável para desenvolvedores" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Armazene suas chaves e conecte com o agente SSH para uma autenticação rápida e criptografada.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Saiba mais sobre o agente SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Crie senhas de forma rápida" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Crie senhas únicas e fortes com facilidade clicando em", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "para ajudá-lo a manter suas credenciais seguras.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Crie senhas únicas e fortes com facilidade clicando no botão de gerar senha para ajudá-lo a manter suas credenciais seguras.", "description": "Aria label for the body content of the generator nudge" }, "aboutThisSetting": { - "message": "About this setting" + "message": "Sobre esta configuração" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de mudança de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Você não tem permissão para visualizar esta página. Tente entrar com uma conta diferente." }, "wasmNotSupported": { - "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "message": "O WebAssembly não é suportado no seu navegador ou não está ativado. O WebAssembly é necessário para utilizar o aplicativo do Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." }, "showMore": { - "message": "Show more" + "message": "Mostrar mais" }, "showLess": { - "message": "Show less" + "message": "Mostrar menos" }, "next": { - "message": "Next" + "message": "Avançar" }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "Mais trilhas", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "Confirmar domínio do Conector de Chave" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index df830be16ad..a1d403b54da 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -558,7 +558,7 @@ "message": "Arquivar", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Desarquivar" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático." }, - "itemSentToArchive": { - "message": "Item movido para o arquivo" + "itemWasSentToArchive": { + "message": "O item foi movido para o arquivo" }, - "itemRemovedFromArchive": { - "message": "Item removido do arquivo" + "itemUnarchived": { + "message": "O item foi desarquivado" }, "archiveItem": { "message": "Arquivar item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Bem-vindo ao seu cofre!" }, - "phishingPageTitle": { - "message": "Site de phishing" + "phishingPageTitleV2": { + "message": "Tentativa de phishing detetada" }, - "phishingPageCloseTab": { - "message": "Fechar separador" + "phishingPageSummary": { + "message": "O site que está a tentar visitar é um site malicioso conhecido e um risco de segurança." }, - "phishingPageContinue": { - "message": "Continuar" + "phishingPageCloseTabV2": { + "message": "Fechar este separador" }, - "phishingPageLearnWhy": { - "message": "Porque é que está a ver isto?" + "phishingPageContinueV2": { + "message": "Continuar para este site (não recomendado)" + }, + "phishingPageExplanation1": { + "message": "Este site foi encontrado em ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", uma lista de fonte aberta de sites de phishing conhecidos, utilizados para roubar informações pessoais e sensíveis.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Saiba mais sobre a deteção de phishing" + }, + "protectedBy": { + "message": "Protegido por $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Preenchimento automático de itens para a página atual" diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 15dd663451d..b9a501ce461 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index c23f51dc39d..2abae0ffde6 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -558,7 +558,7 @@ "message": "Архивировать", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Разархивировать" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Архивированные элементы появятся здесь и будут исключены из общих результатов поиска и предложений автозаполнения." }, - "itemSentToArchive": { - "message": "Элемент отправлен в архив" + "itemWasSentToArchive": { + "message": "Элемент был отправлен в архив" }, - "itemRemovedFromArchive": { - "message": "Элемент удален из архива" + "itemUnarchived": { + "message": "Элемент был разархивирован" }, "archiveItem": { "message": "Архивировать элемент" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Добро пожаловать в ваше хранилище!" }, - "phishingPageTitle": { - "message": "Фишинг-сайт" + "phishingPageTitleV2": { + "message": "Обнаружена попытка фишинга" }, - "phishingPageCloseTab": { - "message": "Закрыть вкладку" + "phishingPageSummary": { + "message": "Сайт, который вы пытаетесь посетить, является заведомо вредоносным сайтом и представляет угрозу безопасности." }, - "phishingPageContinue": { - "message": "Продолжить" + "phishingPageCloseTabV2": { + "message": "Закрыть эту вкладку" }, - "phishingPageLearnWhy": { - "message": "Почему вы это видите?" + "phishingPageContinueV2": { + "message": "Перейти на этот сайт (не рекомендуется)" + }, + "phishingPageExplanation1": { + "message": "Этот сайт был найден в ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", списке известных фишинговых сайтов, используемых для кражи персональной и конфиденциальной информации.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Узнайте больше об обнаружении фишинга" + }, + "protectedBy": { + "message": "Защищено $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Автозаполнение элементов на текущей странице" diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 66bc97ef431..6291fc0a40c 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 6d0bbfc02d6..130d4db6503 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -558,7 +558,7 @@ "message": "Archivovať", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Zrušiť archiváciu" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "Tu sa zobrazia archivované položky, ktoré budú vylúčené zo všeobecného vyhľadávania a z návrhov automatického vypĺňania." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Položka bola archivovaná" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Položka bola odobraná z archívu" }, "archiveItem": { @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Vitajte vo svojom trezore!" }, - "phishingPageTitle": { - "message": "Phishingová webová stránka" + "phishingPageTitleV2": { + "message": "Bol zaznamenaný pokus o phising" }, - "phishingPageCloseTab": { - "message": "Zavrieť kartu" + "phishingPageSummary": { + "message": "Stránka, ktorú sa pokúšate navštíviť je známa ako podvodná stránka a nesie bezpečnostné riziko." }, - "phishingPageContinue": { - "message": "Pokračovať" + "phishingPageCloseTabV2": { + "message": "Zatvoriť túto kartu" }, - "phishingPageLearnWhy": { - "message": "Prečo to vidíte?" + "phishingPageContinueV2": { + "message": "Pokračovať na stránku (neodporúča sa)" + }, + "phishingPageExplanation1": { + "message": "Táto stránka sa našla v ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", otvorený zoznam známych phisingových stránok, ktoré sa používajú na krádež osobných a citlivých informácií.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Viac informácií o detekcii phishingu" + }, + "protectedBy": { + "message": "Chráni $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Položky na automatické vypĺňanie pre aktuálnu stránku" diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index ab914ee0804..253e4fb3550 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index c931242e4a8..db482e74175 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -558,7 +558,7 @@ "message": "Архива", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Врати из архиве" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Архивиране ставке ће се овде појавити и бити искључени из општих резултата претраге и сугестија о ауто-пуњењу." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Ставка је послата у архиву" }, - "itemRemovedFromArchive": { - "message": "Ставка је уклоњена из архиве" + "itemUnarchived": { + "message": "Ставка враћена из архиве" }, "archiveItem": { "message": "Архивирај ставку" @@ -1549,13 +1549,13 @@ "message": "Читај сигурносни кључ" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "Читање притупачног кључа..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "Потврда приступачног кључа" }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "Користи други начин пријављивања" }, "awaitingSecurityKeyInteraction": { "message": "Чека се интеракција сигурносног кључа..." @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Добродошли у ваш сеф!" }, - "phishingPageTitle": { - "message": "Пронађен злонамеран сајт" + "phishingPageTitleV2": { + "message": "Откривен је покушај „пецања“" }, - "phishingPageCloseTab": { - "message": "Затвори језичак" + "phishingPageSummary": { + "message": "Сајт који покушавате да посетите је позната злонамерна локација и представља безбедносни ризик." }, - "phishingPageContinue": { - "message": "Настави" + "phishingPageCloseTabV2": { + "message": "Затвори ову картицу" }, - "phishingPageLearnWhy": { - "message": "Зашто видите ово?" + "phishingPageContinueV2": { + "message": "Настави до овог сајта (не препоручује се)" + }, + "phishingPageExplanation1": { + "message": "Овај сајт је нађен у ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", листа отвореног кода познатих сајтова за крађу идентитета који се користе за крађу личних и осетљивих информација.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Сазнајте више о откривању „пецања“" + }, + "protectedBy": { + "message": "Заштићено са $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Ауто-пуњење предмета за тренутну страницу" diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 5976deb4200..979750a4d56 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -558,8 +558,8 @@ "message": "Arkivera", "description": "Verb" }, - "unarchive": { - "message": "Packa upp" + "unArchive": { + "message": "Avarkivera" }, "itemsInArchive": { "message": "Objekt i arkiv" @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Arkiverade objekt kommer att visas här och kommer att uteslutas från allmänna sökresultat och förslag för autofyll." }, - "itemSentToArchive": { - "message": "Objekt skickat till arkiv" + "itemWasSentToArchive": { + "message": "Objektet skickades till arkivet" }, - "itemRemovedFromArchive": { - "message": "Objekt borttaget från arkiv" + "itemUnarchived": { + "message": "Objektet har avarkiverats" }, "archiveItem": { "message": "Arkivera objekt" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Välkommen till ditt valv!" }, - "phishingPageTitle": { - "message": "Webbsida för nätfiske" + "phishingPageTitleV2": { + "message": "Försök till nätfiske upptäcktes" }, - "phishingPageCloseTab": { - "message": "Stäng flik" + "phishingPageSummary": { + "message": "Webbplatsen som du försöker besöka är en känd skadlig webbplats och en säkerhetsrisk." }, - "phishingPageContinue": { - "message": "Fortsätt" + "phishingPageCloseTabV2": { + "message": "Stäng denna flik" }, - "phishingPageLearnWhy": { - "message": "Varför ser du detta?" + "phishingPageContinueV2": { + "message": "Fortsätt till denna webbplats (rekommenderas inte)" + }, + "phishingPageExplanation1": { + "message": "Denna webbplats hittades i ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", en öppen källkodslista över kända nätfiskeplatser som används för att stjäla personlig och känslig information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Läs mer om nätfiskedetektering" + }, + "protectedBy": { + "message": "Skyddad av $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofyll objekt för den aktuella sidan" diff --git a/apps/browser/src/_locales/ta/messages.json b/apps/browser/src/_locales/ta/messages.json index e0a64ab13d1..fea818db9f4 100644 --- a/apps/browser/src/_locales/ta/messages.json +++ b/apps/browser/src/_locales/ta/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "உங்கள் சேமிப்பு பெட்டகத்திற்கு நல்வரவு!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "தற்போதைய பக்கத்திற்கான தானாக நிரப்பு பொருள்கள்" diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 6180d490f09..db205f4740b 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 744f1e6aa49..9a8c074fb0c 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -558,7 +558,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index f1ae2b1accd..3969bb8095c 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -558,7 +558,7 @@ "message": "Arşivle", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Arşivden çıkar" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "Arşivlenmiş kayıtlar burada görünecek ve genel arama sonuçlarından ile otomatik doldurma önerilerinden hariç tutulacaktır." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Kayıt arşive gönderildi" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Kayıt arşivden çıkarıldı" }, "archiveItem": { @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Kasanıza hoş geldiniz!" }, - "phishingPageTitle": { - "message": "Dolandırıcılık web sitesi" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Sekmeyi kapat" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Devam et" + "phishingPageCloseTabV2": { + "message": "Bu sekmeyi kapat" }, - "phishingPageLearnWhy": { - "message": "Bunu neden görüyorsunuz?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Geçerli sayfada kayıtları otomatik doldurun" diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 313c30b568e..b2988e6e9cb 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -558,8 +558,8 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { - "message": "Видобути" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Записи в архіві" @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Архівовані записи з'являтимуться тут і будуть виключені з результатів звичайного пошуку та пропозицій автозаповнення." }, - "itemSentToArchive": { - "message": "Запис переміщено до архіву" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Запис вилучено з архіву" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Архівувати запис" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Вітаємо у вашому сховищі!" }, - "phishingPageTitle": { - "message": "Шахрайський вебсайт" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Закрити вкладку" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Продовжити" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Чому ви це бачите?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Автозаповнення записів для поточної сторінки" diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 738b22fcad2..c94ba40c9a6 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -558,7 +558,7 @@ "message": "Lưu trữ", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Hủy lưu trữ" }, "itemsInArchive": { @@ -570,11 +570,11 @@ "noItemsInArchiveDesc": { "message": "Các mục đã lưu trữ sẽ hiển thị ở đây và sẽ bị loại khỏi kết quả tìm kiếm và gợi ý tự động điền." }, - "itemSentToArchive": { - "message": "Mục đã được gửi đến kho lưu trữ" + "itemWasSentToArchive": { + "message": "Mục đã được chuyển vào kho lưu trữ" }, - "itemRemovedFromArchive": { - "message": "Mục đã được gỡ khỏi kho lưu trữ" + "itemUnarchived": { + "message": "Mục đã được bỏ lưu trữ" }, "archiveItem": { "message": "Lưu trữ mục" @@ -1549,13 +1549,13 @@ "message": "Đọc khóa bảo mật" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "Đang đọc mã khoá..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "Xác thực mã khóa thất bại" }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "Dùng phương thức đăng nhập khác" }, "awaitingSecurityKeyInteraction": { "message": "Đang chờ tương tác với khóa bảo mật..." @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "Chào mừng đến với kho lưu trữ của bạn!" }, - "phishingPageTitle": { - "message": "Trang web lừa đảo" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Đóng tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Tiếp tục" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Tại sao bạn thấy điều này?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "Tự động điền các mục cho trang hiện tại" diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index aa3c9de9e13..c0c48881394 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -558,7 +558,7 @@ "message": "归档", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "取消归档" }, "itemsInArchive": { @@ -570,10 +570,10 @@ "noItemsInArchiveDesc": { "message": "已归档的项目将显示在此处,并将被排除在一般搜索结果和自动填充建议之外。" }, - "itemSentToArchive": { - "message": "项目已归档" + "itemWasSentToArchive": { + "message": "项目已发送到归档" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "项目已取消归档" }, "archiveItem": { @@ -1940,7 +1940,7 @@ "message": "州 / 省" }, "zipPostalCode": { - "message": "邮政编码" + "message": "ZIP / 邮政编码" }, "country": { "message": "国家" @@ -2058,7 +2058,7 @@ "message": "若继续,所有条目将从生成器历史记录中永久删除。确定要继续吗?" }, "back": { - "message": "后退" + "message": "返回" }, "collections": { "message": "集合" @@ -5579,17 +5579,37 @@ "hasItemsVaultNudgeTitle": { "message": "欢迎来到您的密码库!" }, - "phishingPageTitle": { - "message": "钓鱼网站" + "phishingPageTitleV2": { + "message": "检测到钓鱼尝试" }, - "phishingPageCloseTab": { - "message": "关闭标签页" + "phishingPageSummary": { + "message": "您尝试访问的网站是一个已知的恶意网站,存在安全风险。" }, - "phishingPageContinue": { - "message": "继续" + "phishingPageCloseTabV2": { + "message": "关闭此标签页" }, - "phishingPageLearnWhy": { - "message": "为什么您会看到这个?" + "phishingPageContinueV2": { + "message": "继续访问此网站(不推荐)" + }, + "phishingPageExplanation1": { + "message": "该网站被发现于 ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ",一个已知的用于窃取个人和敏感信息的钓鱼网站的开源列表。", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "进一步了解钓鱼检测" + }, + "protectedBy": { + "message": "受 $PRODUCT$ 保护", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { "message": "为当前页面自动填充项目" diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 373fa0c75e1..eb3e9d98eb6 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -84,7 +84,7 @@ "message": "主密碼提示(選用)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "密碼強度分數 $SCORE$", "placeholders": { "score": { "content": "$1", @@ -255,7 +255,7 @@ "message": "新增項目" }, "accountEmail": { - "message": "帳戶電子郵件" + "message": "帳號電子郵件" }, "requestHint": { "message": "請求提示" @@ -294,7 +294,7 @@ "message": "接下來造訪網頁 App 嗎?" }, "continueToWebAppDesc": { - "message": "在 Web 應用程式上探索 Bitwarden 帳戶的更多功能。" + "message": "在 Web 應用程式上探索 Bitwarden 帳號的更多功能。" }, "continueToHelpCenter": { "message": "接下來前往說明中心嗎?" @@ -383,7 +383,7 @@ "message": "編輯資料夾" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "編輯資料夾:$FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -468,7 +468,7 @@ "message": "已產生密碼" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "已產生密碼" }, "usernameGenerated": { "message": "已產生使用者名稱" @@ -551,36 +551,36 @@ "message": "重設搜尋" }, "archiveNoun": { - "message": "Archive", + "message": "封存", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "封存", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { - "message": "Items in archive" + "message": "封存中的項目" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "封存中沒有項目" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "封存的項目會顯示在此處,且不會出現在一般搜尋結果或自動填入建議中。" }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { - "message": "Archive item" + "message": "封存項目" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "封存的項目將不會出現在一般搜尋結果或自動填入建議中。確定要封存此項目嗎?" }, "edit": { "message": "編輯" @@ -589,7 +589,7 @@ "message": "檢視" }, "viewLogin": { - "message": "View login" + "message": "檢視登入" }, "noItemsInList": { "message": "沒有可列出的項目。" @@ -734,7 +734,7 @@ "message": "無效的主密碼" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "主密碼無效。請確認你的電子郵件正確,且帳號是於 $HOST$ 建立的。", "placeholders": { "host": { "content": "$1", @@ -922,19 +922,19 @@ "message": "輸入傳送到您電子郵件信箱的驗證碼" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "請輸入您驗證器應用程式中的代碼" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "請輕觸您的 YubiKey 以進行驗證" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "您的帳號需要使用 Duo 兩步驟登入。請依照以下步驟完成登入。" }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "請依照以下步驟完成登入" }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "請依照以下步驟使用你的安全金鑰完成登入。" }, "restartRegistration": { "message": "重新啟動註冊" @@ -1110,7 +1110,7 @@ "message": "儲存" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "檢視 $ITEMNAME$(於新視窗中開啟)", "placeholders": { "itemName": { "content": "$1" @@ -1119,18 +1119,18 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "新增項目(於新視窗中開啟)", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "儲存前先編輯", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { "message": "新通知" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$:新通知", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1148,7 +1148,7 @@ "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "選擇 $ITEMTYPE$,$ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1160,7 +1160,7 @@ } }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "儲存為新的登入資訊", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { @@ -1168,7 +1168,7 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "解鎖以儲存此登入資訊", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1176,19 +1176,19 @@ "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "更新現有的登入資訊", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "登入資訊已儲存", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "登入資訊已更新", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "做得好!你已採取行動,讓你與 $ORGANIZATION$ 更加安全。", "placeholders": { "organization": { "content": "$1" @@ -1197,7 +1197,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "感謝你讓 $ORGANIZATION$ 更加安全。你還有 $TASK_COUNT$ 個密碼需要更新。", "placeholders": { "organization": { "content": "$1" @@ -1209,22 +1209,22 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "變更下一個密碼", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Error saving", + "message": "儲存時發生錯誤", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "糟了!我們無法儲存此項目。請嘗試手動輸入詳細資料。", "description": "Detailed error message shown when saving login details fails." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "變更密碼後,你需要使用新密碼重新登入。其他裝置上的工作階段會在一小時內登出。" }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "變更你的主密碼以完成帳號復原。" }, "enableChangedPasswordNotification": { "message": "詢問更新現有的登入資料" @@ -1419,7 +1419,7 @@ "message": "功能不可用" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "不再支援舊版加密。請聯繫支援團隊以恢復您的帳號。" }, "premiumMembership": { "message": "進階會員" @@ -1527,7 +1527,7 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "30 天內不要再於這部裝置上詢問" }, "selectAnotherMethod": { "message": "選擇其他方式", @@ -1549,16 +1549,16 @@ "message": "讀取安全金鑰" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "正在讀取通行金鑰..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "通行金鑰驗證失敗" }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "使用其他登入方式" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "等待安全金鑰操作中……" }, "loginUnavailable": { "message": "登入無法使用" @@ -1659,13 +1659,13 @@ "message": "自動填入建議" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "輕鬆找到自動填入建議" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "請關閉瀏覽器的自動填入設定,以免與 Bitwarden 發生衝突。" }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "關閉 $BROWSER$ 自動填入", "placeholders": { "browser": { "content": "$1", @@ -1805,7 +1805,7 @@ "message": "如果您點選彈出式視窗外的任意區域,將導致彈出式視窗關閉。您想在新視窗中開啟此彈出式視窗,以讓它不關閉嗎?" }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "顯示網站圖示並取得變更密碼網址" }, "cardholderName": { "message": "持卡人姓名" @@ -1865,7 +1865,7 @@ "message": "安全代碼" }, "cardNumber": { - "message": "card number" + "message": "信用卡號碼" }, "ex": { "message": "例如" @@ -1967,82 +1967,82 @@ "message": "SSH 金鑰" }, "typeNote": { - "message": "Note" + "message": "備註" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "新增登入資訊", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "新增支付卡", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "新增身分", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "新增備註", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "新增 SSH 金鑰", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "新增文字 Send", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "新增檔案 Send", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "編輯登入資訊", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "編輯支付卡", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "編輯身分", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "編輯備註", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "編輯 SSH 金鑰", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "編輯文字 Send", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "編輯檔案 Send", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "檢視登入資訊", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "檢視支付卡", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "檢視身分", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "檢視備註", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "檢視 SSH 金鑰", "description": "Header for view SSH key item type" }, "passwordHistory": { @@ -2250,7 +2250,7 @@ "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。" }, "setPinCode": { - "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." + "message": "你可以使用此 PIN 來解鎖 Bitwarden。若你完全登出應用程式,PIN 將會被重設。" }, "pinRequired": { "message": "必須填入 PIN 碼。" @@ -2301,7 +2301,7 @@ "message": "使用此密碼" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "使用此密碼" }, "useThisUsername": { "message": "使用此使用者名稱" @@ -2473,7 +2473,7 @@ "message": "隱私權政策" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "你的新密碼不能與目前的密碼相同。" }, "hintEqualsPassword": { "message": "密碼提示不能與您的密碼相同。" @@ -2581,10 +2581,10 @@ "message": "某個組織原則已禁止您將項目匯入至您的個人密碼庫。" }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "無法匯入卡片項目類別" }, "restrictCardTypeImportDesc": { - "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + "message": "由於一或多個組織設有政策,您無法匯入支付卡至您的密碼庫。" }, "domainsTitle": { "message": "網域", @@ -2594,7 +2594,7 @@ "message": "已封鎖的網域" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "瞭解更多關於被封鎖網域的資訊" }, "excludedDomains": { "message": "排除網域" @@ -2618,11 +2618,11 @@ "message": "變更" }, "changePassword": { - "message": "Change password", + "message": "變更密碼", "description": "Change password button for browser at risk notification on login." }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "變更密碼 - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2631,13 +2631,13 @@ } }, "atRiskPassword": { - "message": "At-risk password" + "message": "具有風險的密碼" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "具有風險的密碼" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ 要求你變更一組有風險的密碼。", "placeholders": { "organization": { "content": "$1", @@ -2646,7 +2646,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ 要求你變更 $COUNT$ 組有風險的密碼。", "placeholders": { "organization": { "content": "$1", @@ -2659,7 +2659,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "你的組織要求你變更 $COUNT$ 組有風險的密碼。", "placeholders": { "count": { "content": "$1", @@ -2668,7 +2668,7 @@ } }, "atRiskChangePrompt": { - "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "message": "你在此網站的密碼存在風險,$ORGANIZATION$ 已要求你變更該密碼。", "placeholders": { "organization": { "content": "$1", @@ -2678,7 +2678,7 @@ "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." }, "atRiskNavigatePrompt": { - "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "message": "$ORGANIZATION$ 要求你變更此密碼,因為它存在風險。請前往帳號設定以變更密碼。", "placeholders": { "organization": { "content": "$1", @@ -2688,10 +2688,10 @@ "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "檢視並變更一組有風險的密碼" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "檢視並變更 $COUNT$ 組有風險的密碼", "placeholders": { "count": { "content": "$1", @@ -2700,49 +2700,49 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "更快速地變更有風險的密碼" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "更新你的設定,以便能快速自動填入密碼並產生新密碼" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "檢視有風險的登入資訊" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "檢視有風險的密碼" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "你的組織密碼存在風險,原因可能是密碼過於簡弱、重複使用或已外洩。", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "有風險登入清單的示意圖。" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "在有風險的網站上,透過 Bitwarden 自動填入選單快速產生強且唯一的密碼。", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Bitwarden 自動填入選單顯示產生密碼的示意圖。" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "在 Bitwarden 中更新" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "之後 Bitwarden 會提示你在密碼管理器中更新該密碼。", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Bitwarden 通知使用者更新登入資訊的示意圖。" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "啟用自動填入" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "停用自動填入" }, "dismiss": { - "message": "Dismiss" + "message": "忽略" }, "websiteItemLabel": { "message": "網站 $number$ (URI)", @@ -2807,7 +2807,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "已達最大存取次數", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -3013,7 +3013,7 @@ "message": "您必須驗證您的電子郵件才能使用此功能。您可以在網頁密碼庫裡驗證您的電子郵件。" }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "主密碼設定成功" }, "updatedMasterPassword": { "message": "已更新主密碼" @@ -3154,13 +3154,13 @@ "message": "找不到唯一識別碼。" }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "以下組織的成員已不再需要主密碼。請與你的組織管理員確認下方的網域。" }, "organizationName": { - "message": "Organization name" + "message": "組織名稱" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector 網域" }, "leaveOrganization": { "message": "離開組織" @@ -3196,7 +3196,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫(包含附件)。組織密碼庫的項目不包含在內。", "placeholders": { "email": { "content": "$1", @@ -3217,7 +3217,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織密碼庫。", "placeholders": { "organization": { "content": "$1", @@ -3226,7 +3226,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織保險庫,「我的項目」集合將不會包含在內。", "placeholders": { "organization": { "content": "$1", @@ -3383,7 +3383,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ 拒絕了你的請求。請聯絡你的服務提供者以取得協助。", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3393,7 +3393,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ 拒絕了你的請求:$ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3542,7 +3542,7 @@ "message": "已傳送通知至您的裝置。" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "在你的裝置或其他裝置上解鎖 Bitwarden" }, "notificationSentDeviceAnchor": { "message": "網頁應用程式" @@ -3566,7 +3566,7 @@ "message": "已傳送請求" }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "登入請求已由 $DEVICE$ 上的 $EMAIL$ 批准", "placeholders": { "email": { "content": "$1", @@ -3579,16 +3579,16 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "您拒絕了來自其他裝置的登入嘗試。如果這是您本人,請嘗試再次使用該裝置登入。" }, "device": { "message": "裝置" }, "loginStatus": { - "message": "Login status" + "message": "登入狀態" }, "masterPasswordChanged": { - "message": "Master password saved" + "message": "主密碼已儲存" }, "exposedMasterPassword": { "message": "已洩露的主密碼" @@ -3684,25 +3684,25 @@ "message": "管理裝置" }, "currentSession": { - "message": "Current session" + "message": "目前工作階段" }, "mobile": { - "message": "Mobile", + "message": "行動裝置", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "擴充套件", "description": "Browser extension/addon" }, "desktop": { - "message": "Desktop", + "message": "電腦版應用程式", "description": "Desktop app" }, "webVault": { - "message": "Web vault" + "message": "網頁版密碼庫" }, "webApp": { - "message": "Web app" + "message": "網路應用程式" }, "cli": { "message": "CLI" @@ -3712,22 +3712,22 @@ "description": "Software Development Kit" }, "requestPending": { - "message": "Request pending" + "message": "等待請求" }, "firstLogin": { - "message": "First login" + "message": "首次登入" }, "trusted": { - "message": "Trusted" + "message": "已信任" }, "needsApproval": { - "message": "Needs approval" + "message": "需要批准" }, "devices": { "message": "裝置" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "來自 $EMAIL$ 的存取嘗試", "placeholders": { "email": { "content": "$1", @@ -3736,31 +3736,31 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "確認訪問" }, "denyAccess": { - "message": "Deny access" + "message": "拒絕訪問權限" }, "time": { - "message": "Time" + "message": "時間" }, "deviceType": { "message": "裝置類型" }, "loginRequest": { - "message": "Login request" + "message": "已要求登入" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "此請求已失效。" }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "登入要求已逾期。" }, "justNow": { - "message": "Just now" + "message": "剛剛" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "$MINUTES$ 分鐘前已發起要求", "placeholders": { "minutes": { "content": "$1", @@ -3790,10 +3790,10 @@ "message": "要求管理員核准" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "無法完成登入" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "你需要在受信任的裝置上登入,或請管理員為你指派密碼。" }, "ssoIdentifierRequired": { "message": "需要組織 SSO 識別碼。" @@ -3857,35 +3857,35 @@ "message": "裝置已信任" }, "trustOrganization": { - "message": "Trust organization" + "message": "目前組織" }, "trust": { - "message": "Trust" + "message": "信任" }, "doNotTrust": { - "message": "Do not trust" + "message": "不信任" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "機構不被信任" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "為了保護你的帳號安全,僅在你已授予此使用者緊急存取權,且其指紋與其帳號中顯示的指紋相符時才確認。" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "為了保護你的帳號安全,僅在你是此組織的成員、已啟用帳號復原功能,且下方顯示的指紋與組織的指紋相符時才繼續。" }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "此組織有企業政策,會將你加入帳號復原功能。加入後,組織管理員可變更你的密碼。僅在你確認此組織身份,且下方顯示的指紋詞句與該組織的指紋相符時才繼續。" }, "trustUser": { - "message": "Trust user" + "message": "信任使用者" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "安全傳送機密的資訊", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "安全的和任何人及任何平臺分享檔案及資料。您的資料會受到端對端加密的保護。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4220,10 +4220,10 @@ "message": "選擇一個分類" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "若你希望將匯入檔案的內容移至集合,請選擇此選項" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "若你希望將匯入檔案的內容移至資料夾,請選擇此選項" }, "importUnassignedItemsError": { "message": "檔案包含未指派項目。" @@ -4414,7 +4414,7 @@ "message": "目前帳戶" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Bitwarden 帳號" }, "availableAccounts": { "message": "可用帳戶" @@ -4460,23 +4460,23 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "URI 匹配偵測是 Bitwarden 用來識別自動填入建議的方式。", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "「正則表達式」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "「開頭為」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "深入了解匹配偵測", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "進階選項", "description": "Advanced option placeholder for uri option component" }, "confirmContinueToBrowserSettingsTitle": { @@ -4625,7 +4625,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "檢視項目 - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4649,7 +4649,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "自動填入 - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4663,7 +4663,7 @@ } }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "複製 $FIELD$,$CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4816,22 +4816,22 @@ "message": "在所有裝置中下載 Bitwarden" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "取得手機應用程式" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "使用 Bitwarden 行動應用程式,隨時隨地存取你的密碼。" }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "取得桌面應用程式" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "在不使用瀏覽器的情況下存取你的密碼庫,然後設定生物辨識解鎖,以加快在桌面應用程式和瀏覽器擴充功能中的解鎖速度。" }, "downloadFromBitwardenNow": { "message": "立即從 bitwarden.com 下載" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "在 Google Play上取得" }, "downloadOnTheAppStore": { "message": "從 App Store 下載" @@ -5077,7 +5077,7 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "重新排序網站 URI。使用方向鍵可將項目上移或下移。" }, "reorderFieldUp": { "message": "往上移動 $LABEL$,位置 $LENGTH$ 之 $INDEX$", @@ -5190,10 +5190,10 @@ "message": "在擴充套件圖示上顯示自動填入建議的數量" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "帳號存取請求" }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "確認 $EMAIL$ 的存取嘗試", "placeholders": { "email": { "content": "$1", @@ -5298,16 +5298,16 @@ "message": "基於不明原因,生物辨識解鎖無法使用。" }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "幾秒內解鎖你的密碼庫" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "你可以自訂解鎖與逾時設定,以更快速地存取你的密碼庫。" }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "解鎖 PIN 已設定" }, "unlockWithBiometricSet": { - "message": "Unlock with biometrics set" + "message": "使用生物辨識解鎖" }, "authenticating": { "message": "驗證中" @@ -5321,7 +5321,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "已儲存至 Bitwarden。", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5481,31 +5481,31 @@ "message": "超寬" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "您輸入的密碼錯誤。" }, "importSshKey": { - "message": "Import" + "message": "匯入" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "確認密碼" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "輸入 SSH 金鑰的密碼" }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "請輸入密碼" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH 密鑰不正確" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "SSH 密鑰類型不支援" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "從剪貼簿中匯入密鑰" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH 密鑰成功匯入" }, "cannotRemoveViewOnlyCollections": { "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", @@ -5523,176 +5523,196 @@ "message": "為了使用生物辨識解鎖,請更新您的桌面應用程式,或在設定中停用指紋解鎖。" }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "變更有風險的密碼" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "此登入資訊存在風險,且缺少網站。請新增網站並變更密碼以提升安全性。" }, "missingWebsite": { - "message": "Missing website" + "message": "缺少網站" }, "settingsVaultOptions": { "message": "密碼庫選項" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "除了密碼之外,您也可以儲存安全的登入資訊、身分資訊、信用卡及筆記在您的密碼庫。" }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "歡迎使用 Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "安全,第一優先" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "儲存登入資訊、信用卡和數位身分到您的安全密碼庫。Bitwarden 使用零知識、端對端的加密來保護您的重要資訊。" }, "quickLogin": { - "message": "Quick and easy login" + "message": "快速方便的登入" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "設定生物辨識解鎖及自動填入,不需要輸入任何字元就可以登入。" }, "secureUser": { - "message": "Level up your logins" + "message": "升級您的登入體驗" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "使用密碼產生器來建立及儲存高強度、唯一的密碼,來保護您所有的帳號。" }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "您的資料,隨時隨地都垂手可得" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "使用 Bitwarden 行動應用程式、瀏覽器及桌面應用程式在無限制的裝置來儲存無上限的密碼。" }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 通知" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "匯入現有密碼" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "使用匯入工具可快速將登入資訊轉移到 Bitwarden,而不需手動新增。" }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "立即匯入" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "歡迎來到你的密碼庫!" }, - "phishingPageTitle": { - "message": "Phishing website" + "phishingPageTitleV2": { + "message": "Phishing attempt detected" }, - "phishingPageCloseTab": { - "message": "Close tab" + "phishingPageSummary": { + "message": "The site you are attempting to visit is a known malicious site and a security risk." }, - "phishingPageContinue": { - "message": "Continue" + "phishingPageCloseTabV2": { + "message": "Close this tab" }, - "phishingPageLearnWhy": { - "message": "Why are you seeing this?" + "phishingPageContinueV2": { + "message": "Continue to this site (not recommended)" + }, + "phishingPageExplanation1": { + "message": "This site was found in ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." + }, + "phishingPageExplanation2": { + "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." + }, + "phishingPageLearnMore": { + "message": "Learn more about phishing detection" + }, + "protectedBy": { + "message": "Protected by $PRODUCT$", + "placeholders": { + "product": { + "content": "$1", + "example": "Bitwarden Phishing Blocker" + } + } }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "當前頁面的自動填入項目" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "收藏項目,方便快速存取" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "在密碼庫中搜尋其他內容" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "使用自動填入節省時間" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "包含", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "網頁", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "讓此登入顯示為自動填入建議。", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "流暢的線上結帳體驗" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "使用卡片功能,安全且精準地自動填入付款表單。" }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "簡化帳號建立流程 " }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "使用身份資訊,快速自動填入冗長的註冊或聯絡表單。" }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "保護你的敏感資料安全" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "使用備註功能,安全儲存銀行或保險等敏感資料。" }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "開發者友善的 SSH 存取" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "儲存你的金鑰並透過 SSH 代理程式進行快速、加密的驗證。", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "深入了解 SSH 代理程式", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "快速建立密碼" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "點擊即可輕鬆產生強且唯一的密碼。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "協助你維持登入資訊的安全。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "點擊「產生密碼」按鈕即可輕鬆建立強且唯一的密碼,協助你確保登入資訊的安全。", "description": "Aria label for the body content of the generator nudge" }, "aboutThisSetting": { - "message": "About this setting" + "message": "關於此設定" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden 會使用已儲存的登入 URI 來判斷應顯示的圖示或變更密碼網址,以改善你的使用體驗。使用此服務時,不會收集或儲存任何資訊。" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "你沒有檢視此頁面的權限。請嘗試使用其他帳號登入。" }, "wasmNotSupported": { - "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "message": "你的瀏覽器不支援或未啟用 WebAssembly。使用 Bitwarden 應用程式需要啟用 WebAssembly。", "description": "'WebAssembly' is a technical term and should not be translated." }, "showMore": { - "message": "Show more" + "message": "顯示更多" }, "showLess": { - "message": "Show less" + "message": "顯示較少" }, "next": { - "message": "Next" + "message": "下一步" }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "更多導覽階層", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "確認 Key Connector 網域" } } diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index a9f43045902..4eb24d19605 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -311,12 +311,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { .pipe( concatMap(async (value) => { const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; - const pinKeyEncryptedUserKey = - (await this.pinService.getPinKeyEncryptedUserKeyPersistent(userId)) || - (await this.pinService.getPinKeyEncryptedUserKeyEphemeral(userId)); - await this.pinService.clearPinKeyEncryptedUserKeyPersistent(userId); - await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); - await this.pinService.storePinKeyEncryptedUserKey(pinKeyEncryptedUserKey, value, userId); + const pin = await this.pinService.getPin(userId); + await this.pinService.setPin(pin, value ? "EPHEMERAL" : "PERSISTENT", userId); this.refreshTimeoutSettings$.next(); }), takeUntil(this.destroy$), @@ -486,7 +482,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { } } else { const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); - await this.vaultTimeoutSettingsService.clear(userId); + await this.pinService.unsetPin(userId); } } diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 47a5e8fec4c..80e453e9e83 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -1,6 +1,7 @@ import { mock, MockProxy, mockReset } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { @@ -105,6 +106,7 @@ describe("OverlayBackground", () => { let platformUtilsService: MockProxy; let enablePasskeysMock$: BehaviorSubject; let vaultSettingsServiceMock: MockProxy; + const policyService = mock(); let fido2ActiveRequestManager: Fido2ActiveRequestManager; let selectedThemeMock$: BehaviorSubject; let inlineMenuFieldQualificationService: InlineMenuFieldQualificationService; @@ -156,7 +158,11 @@ describe("OverlayBackground", () => { fakeStateProvider = new FakeStateProvider(accountService); showFaviconsMock$ = new BehaviorSubject(true); neverDomainsMock$ = new BehaviorSubject({}); - domainSettingsService = new DefaultDomainSettingsService(fakeStateProvider); + domainSettingsService = new DefaultDomainSettingsService( + fakeStateProvider, + policyService, + accountService, + ); domainSettingsService.showFavicons$ = showFaviconsMock$; domainSettingsService.neverDomains$ = neverDomainsMock$; logService = mock(); diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.html b/apps/browser/src/autofill/popup/settings/autofill.component.html index 40dd013bbf4..add53a0cd33 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.html +++ b/apps/browser/src/autofill/popup/settings/autofill.component.html @@ -265,6 +265,9 @@ [disabled]="option.disabled" > + + {{ "settingDisabledByPolicy" | i18n }} + {{ hints[0] | i18n }} diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index 3d2d605c13f..c3b5915a10a 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -26,6 +26,7 @@ import { import { JslibModule } from "@bitwarden/angular/jslib.module"; import { NudgesService, NudgeType } from "@bitwarden/angular/vault"; import { SpotlightComponent } from "@bitwarden/angular/vault/components/spotlight/spotlight.component"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { @@ -140,6 +141,8 @@ export class AutofillComponent implements OnInit { defaultUriMatch: new FormControl(), }); + protected isDefaultUriMatchDisabledByPolicy = false; + advancedOptionWarningMap: Partial>; enableAutofillOnPageLoad: boolean = false; enableInlineMenu: boolean = false; @@ -174,6 +177,7 @@ export class AutofillComponent implements OnInit { private accountService: AccountService, private autofillBrowserSettingsService: AutofillBrowserSettingsService, private restrictedItemTypesService: RestrictedItemTypesService, + private policyService: PolicyService, ) { this.autofillOnPageLoadOptions = [ { name: this.i18nService.t("autoFillOnPageLoadYes"), value: true }, @@ -302,7 +306,7 @@ export class AutofillComponent implements OnInit { }); const defaultUriMatch = await firstValueFrom( - this.domainSettingsService.defaultUriMatchStrategy$, + this.domainSettingsService.resolvedDefaultUriMatchStrategy$, ); this.defaultUriMatch = defaultUriMatch == null ? UriMatchStrategy.Domain : defaultUriMatch; @@ -310,6 +314,8 @@ export class AutofillComponent implements OnInit { emitEvent: false, }); + this.applyUriMatchPolicy(); + this.additionalOptionsForm.controls.enableContextMenuItem.valueChanges .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((value) => { @@ -524,6 +530,20 @@ export class AutofillComponent implements OnInit { await this.updateDefaultBrowserAutofillDisabled(); }; + private applyUriMatchPolicy() { + this.domainSettingsService.defaultUriMatchStrategyPolicy$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((value) => { + if (value !== null) { + this.isDefaultUriMatchDisabledByPolicy = true; + this.additionalOptionsForm.controls.defaultUriMatch.disable({ emitEvent: false }); + } else { + this.isDefaultUriMatchDisabledByPolicy = false; + this.additionalOptionsForm.controls.defaultUriMatch.enable({ emitEvent: false }); + } + }); + } + private async handleAdvancedMatch( previous: UriMatchStrategySetting | null, current: UriMatchStrategySetting | null, diff --git a/apps/browser/src/autofill/services/autofill.service.spec.ts b/apps/browser/src/autofill/services/autofill.service.spec.ts index 9b0424c5cdf..77e8c661d08 100644 --- a/apps/browser/src/autofill/services/autofill.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill.service.spec.ts @@ -1,6 +1,7 @@ import { mock, MockProxy, mockReset } from "jest-mock-extended"; import { BehaviorSubject, of, Subject } from "rxjs"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; @@ -86,6 +87,7 @@ describe("AutofillService", () => { const totpService = mock(); const eventCollectionService = mock(); const logService = mock(); + const policyService = mock(); const userVerificationService = mock(); const billingAccountProfileStateService = mock(); const platformUtilsService = mock(); @@ -138,7 +140,11 @@ describe("AutofillService", () => { userNotificationsSettings, messageListener, ); - domainSettingsService = new DefaultDomainSettingsService(fakeStateProvider); + domainSettingsService = new DefaultDomainSettingsService( + fakeStateProvider, + policyService, + accountService, + ); domainSettingsService.equivalentDomains$ = of(mockEquivalentDomains); jest.spyOn(BrowserApi, "tabSendMessage"); }); diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index ea0fb089690..2b37e0654ca 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -400,7 +400,7 @@ export default class AutofillService implements AutofillServiceInterface { * Gets the default URI match strategy setting from the domain settings service. */ async getDefaultUriMatchStrategy(): Promise { - return await firstValueFrom(this.domainSettingsService.defaultUriMatchStrategy$); + return await firstValueFrom(this.domainSettingsService.resolvedDefaultUriMatchStrategy$); } /** diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index d382e9367a9..dcb1430d7ba 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -97,6 +97,7 @@ import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarde import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/services/key-connector.service"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; +import { PinStateService } from "@bitwarden/common/key-management/pin/pin-state.service.implementation"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { PinService } from "@bitwarden/common/key-management/pin/pin.service.implementation"; import { SecurityStateService } from "@bitwarden/common/key-management/security-state/abstractions/security-state.service"; @@ -220,8 +221,10 @@ import { UsernameGenerationServiceAbstraction, } from "@bitwarden/generator-legacy"; import { + DefaultImportMetadataService, ImportApiService, ImportApiServiceAbstraction, + ImportMetadataServiceAbstraction, ImportService, ImportServiceAbstraction, } from "@bitwarden/importer-core"; @@ -368,6 +371,7 @@ export default class MainBackground { authService: AuthServiceAbstraction; loginEmailService: LoginEmailServiceAbstraction; importApiService: ImportApiServiceAbstraction; + importMetadataService: ImportMetadataServiceAbstraction; importService: ImportServiceAbstraction; exportApiService: VaultExportApiService; exportService: VaultExportServiceAbstraction; @@ -694,9 +698,7 @@ export default class MainBackground { this.masterPasswordService = new MasterPasswordService( this.stateProvider, - this.stateService, this.keyGenerationService, - this.encryptService, this.logService, this.cryptoFunctionService, this.accountService, @@ -706,18 +708,7 @@ export default class MainBackground { this.kdfConfigService = new DefaultKdfConfigService(this.stateProvider); - this.pinService = new PinService( - this.accountService, - this.cryptoFunctionService, - this.encryptService, - this.kdfConfigService, - this.keyGenerationService, - this.logService, - this.stateProvider, - ); - this.keyService = new DefaultKeyService( - this.pinService, this.masterPasswordService, this.keyGenerationService, this.cryptoFunctionService, @@ -730,6 +721,19 @@ export default class MainBackground { this.kdfConfigService, ); + const pinStateService = new PinStateService(this.stateProvider); + + this.pinService = new PinService( + this.accountService, + this.encryptService, + this.kdfConfigService, + this.keyGenerationService, + this.logService, + this.keyService, + this.sdkService, + pinStateService, + ); + this.appIdService = new AppIdService(this.storageService, this.logService); this.userDecryptionOptionsService = new UserDecryptionOptionsService(this.stateProvider); @@ -738,7 +742,7 @@ export default class MainBackground { this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, - this.pinService, + pinStateService, this.userDecryptionOptionsService, this.keyService, this.tokenService, @@ -756,6 +760,7 @@ export default class MainBackground { this.biometricStateService, this.messagingService, this.vaultTimeoutSettingsService, + this.pinService, ); this.apiService = new ApiService( @@ -886,6 +891,7 @@ export default class MainBackground { this.apiService, this.stateProvider, this.authRequestApiService, + this.accountService, ); this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( @@ -915,7 +921,11 @@ export default class MainBackground { this.userVerificationApiService = new UserVerificationApiService(this.apiService); - this.domainSettingsService = new DefaultDomainSettingsService(this.stateProvider); + this.domainSettingsService = new DefaultDomainSettingsService( + this.stateProvider, + this.policyService, + this.accountService, + ); this.themeStateService = new DefaultThemeStateService(this.globalStateProvider); @@ -1087,6 +1097,18 @@ export default class MainBackground { this.importApiService = new ImportApiService(this.apiService); + this.importMetadataService = new DefaultImportMetadataService( + createSystemServiceProvider( + new KeyServiceLegacyEncryptorProvider(this.encryptService, this.keyService), + this.stateProvider, + this.policyService, + buildExtensionRegistry(), + this.logService, + this.platformUtilsService, + this.configService, + ), + ); + this.importService = new ImportService( this.cipherService, this.folderService, @@ -1098,15 +1120,6 @@ export default class MainBackground { this.pinService, this.accountService, this.restrictedItemTypesService, - createSystemServiceProvider( - new KeyServiceLegacyEncryptorProvider(this.encryptService, this.keyService), - this.stateProvider, - this.policyService, - buildExtensionRegistry(), - this.logService, - this.platformUtilsService, - this.configService, - ), ); this.individualVaultExportService = new IndividualVaultExportService( @@ -1673,11 +1686,10 @@ export default class MainBackground { await Promise.all([ this.keyService.clearKeys(userBeingLoggedOut), this.cipherService.clear(userBeingLoggedOut), - // ! DO NOT REMOVE folderService.clear ! For more information see PM-25660 this.folderService.clear(userBeingLoggedOut), - this.vaultTimeoutSettingsService.clear(userBeingLoggedOut), this.biometricStateService.logout(userBeingLoggedOut), this.popupViewCacheBackgroundService.clearState(), + this.pinService.logout(userBeingLoggedOut), /* We intentionally do not clear: * - autofillSettingsService * - badgeSettingsService diff --git a/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.spec.ts b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.spec.ts index 4017953ee28..5bbba77d12e 100644 --- a/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.spec.ts +++ b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.spec.ts @@ -1,5 +1,6 @@ import { mock } from "jest-mock-extended"; +import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -18,6 +19,7 @@ describe("background browser biometrics service tests", function () { const biometricStateService = mock(); const messagingService = mock(); const vaultTimeoutSettingsService = mock(); + const pinService = mock(); beforeEach(() => { jest.resetAllMocks(); @@ -28,6 +30,7 @@ describe("background browser biometrics service tests", function () { biometricStateService, messagingService, vaultTimeoutSettingsService, + pinService, ); }); diff --git a/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts index 8f755cfeda6..c8be58b0bde 100644 --- a/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts +++ b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts @@ -1,6 +1,7 @@ import { combineLatest, timer } from "rxjs"; import { filter, concatMap } from "rxjs/operators"; +import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -29,6 +30,7 @@ export class BackgroundBrowserBiometricsService extends BiometricsService { private biometricStateService: BiometricStateService, private messagingService: MessagingService, private vaultTimeoutSettingsService: VaultTimeoutSettingsService, + private pinService: PinServiceAbstraction, ) { super(); // Always connect to the native messaging background if biometrics are enabled, not just when it is used @@ -101,6 +103,7 @@ export class BackgroundBrowserBiometricsService extends BiometricsService { if (await this.keyService.validateUserKey(userKey, userId)) { await this.biometricStateService.setBiometricUnlockEnabled(true); await this.keyService.setUserKey(userKey, userId); + await this.pinService.userUnlocked(userId); // to update badge and other things this.messagingService.send("switchAccount", { userId }); return userKey; diff --git a/apps/browser/src/platform/services/browser-script-injector.service.spec.ts b/apps/browser/src/platform/services/browser-script-injector.service.spec.ts index e4abea1d719..f2c3fe3317e 100644 --- a/apps/browser/src/platform/services/browser-script-injector.service.spec.ts +++ b/apps/browser/src/platform/services/browser-script-injector.service.spec.ts @@ -1,6 +1,7 @@ import { mock } from "jest-mock-extended"; import { of } from "rxjs"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { DomainSettingsService, DefaultDomainSettingsService, @@ -57,10 +58,15 @@ describe("ScriptInjectorService", () => { const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); const fakeStateProvider: FakeStateProvider = new FakeStateProvider(accountService); let domainSettingsService: DomainSettingsService; + const policyService = mock(); beforeEach(() => { jest.spyOn(BrowserApi, "getTab").mockImplementation(async () => tabMock); - domainSettingsService = new DefaultDomainSettingsService(fakeStateProvider); + domainSettingsService = new DefaultDomainSettingsService( + fakeStateProvider, + policyService, + accountService, + ); domainSettingsService.equivalentDomains$ = of(mockEquivalentDomains); domainSettingsService.blockedInteractionsUris$ = of({}); scriptInjectorService = new BrowserScriptInjectorService( diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 4f5174c6a2e..acfe2f755cf 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -75,7 +75,6 @@ import { InternalMasterPasswordServiceAbstraction, MasterPasswordServiceAbstraction, } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeoutService, VaultTimeoutStringType, @@ -271,7 +270,6 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: KeyService, useFactory: ( - pinService: PinServiceAbstraction, masterPasswordService: InternalMasterPasswordServiceAbstraction, keyGenerationService: KeyGenerationService, cryptoFunctionService: CryptoFunctionService, @@ -284,7 +282,6 @@ const safeProviders: SafeProvider[] = [ kdfConfigService: KdfConfigService, ) => { const keyService = new DefaultKeyService( - pinService, masterPasswordService, keyGenerationService, cryptoFunctionService, @@ -300,7 +297,6 @@ const safeProviders: SafeProvider[] = [ return keyService; }, deps: [ - PinServiceAbstraction, InternalMasterPasswordServiceAbstraction, KeyGenerationService, CryptoFunctionService, @@ -368,7 +364,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: DomainSettingsService, useClass: DefaultDomainSettingsService, - deps: [StateProvider], + deps: [StateProvider, PolicyService, AccountService], }), safeProvider({ provide: AbstractStorageService, diff --git a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts index 506dae2fb18..6397ddc1850 100644 --- a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts @@ -4,7 +4,16 @@ import { Router } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; -import { ImportComponent } from "@bitwarden/importer-ui"; +import { + DefaultImportMetadataService, + ImportMetadataServiceAbstraction, +} from "@bitwarden/importer-core"; +import { + ImportComponent, + ImporterProviders, + SYSTEM_SERVICE_PROVIDER, +} from "@bitwarden/importer-ui"; +import { safeProvider } from "@bitwarden/ui-common"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; @@ -25,6 +34,14 @@ import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page PopupHeaderComponent, PopOutComponent, ], + providers: [ + ...ImporterProviders, + safeProvider({ + provide: ImportMetadataServiceAbstraction, + useClass: DefaultImportMetadataService, + deps: [SYSTEM_SERVICE_PROVIDER], + }), + ], }) export class ImportBrowserV2Component { protected disabled = false; diff --git a/apps/browser/store/locales/pt_BR/copy.resx b/apps/browser/store/locales/pt_BR/copy.resx index edf2351c92d..96ae2332f53 100644 --- a/apps/browser/store/locales/pt_BR/copy.resx +++ b/apps/browser/store/locales/pt_BR/copy.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Gerenciador de Senhas Bitwarden + Bitwarden Gerenciador de Senhas Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, chaves de acesso e informações sensíveis. diff --git a/apps/cli/package.json b/apps/cli/package.json index 35dc7920382..02627f80a27 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -13,7 +13,7 @@ "homepage": "https://bitwarden.com", "repository": { "type": "git", - "url": "https://github.com/bitwarden/clients" + "url": "git+https://github.com/bitwarden/clients.git" }, "license": "SEE LICENSE IN LICENSE.txt", "scripts": { diff --git a/apps/cli/src/auth/commands/login.command.ts b/apps/cli/src/auth/commands/login.command.ts index e1a3d123441..aa43b353f9c 100644 --- a/apps/cli/src/auth/commands/login.command.ts +++ b/apps/cli/src/auth/commands/login.command.ts @@ -621,7 +621,7 @@ export class LoginCommand { const newPasswordHash = await this.keyService.hashMasterKey(masterPassword, newMasterKey); // Grab user key - const userKey = await this.keyService.getUserKey(); + const userKey = await firstValueFrom(this.keyService.userKey$(userId)); if (!userKey) { throw new Error("User key not found."); } diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index c677e705ec1..3453e0cff70 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -74,6 +74,7 @@ import { MasterPasswordUnlockService } from "@bitwarden/common/key-management/ma import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { DefaultMasterPasswordUnlockService } from "@bitwarden/common/key-management/master-password/services/default-master-password-unlock.service"; import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; +import { PinStateService } from "@bitwarden/common/key-management/pin/pin-state.service.implementation"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { PinService } from "@bitwarden/common/key-management/pin/pin.service.implementation"; import { SecurityStateService } from "@bitwarden/common/key-management/security-state/abstractions/security-state.service"; @@ -93,7 +94,7 @@ import { } from "@bitwarden/common/platform/abstractions/environment.service"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; -import { KeySuffixOptions, LogLevelType } from "@bitwarden/common/platform/enums"; +import { LogLevelType } from "@bitwarden/common/platform/enums"; import { MessageSender } from "@bitwarden/common/platform/messaging"; import { TaskSchedulerService, @@ -151,8 +152,10 @@ import { PasswordGenerationServiceAbstraction, } from "@bitwarden/generator-legacy"; import { + DefaultImportMetadataService, ImportApiService, ImportApiServiceAbstraction, + ImportMetadataServiceAbstraction, ImportService, ImportServiceAbstraction, } from "@bitwarden/importer-core"; @@ -252,6 +255,7 @@ export class ServiceContainer { auditService: AuditService; importService: ImportServiceAbstraction; importApiService: ImportApiServiceAbstraction; + importMetadataService: ImportMetadataServiceAbstraction; exportService: VaultExportServiceAbstraction; vaultExportApiService: VaultExportApiService; individualExportService: IndividualVaultExportServiceAbstraction; @@ -451,26 +455,13 @@ export class ServiceContainer { this.kdfConfigService = new DefaultKdfConfigService(this.stateProvider); this.masterPasswordService = new MasterPasswordService( this.stateProvider, - this.stateService, this.keyGenerationService, - this.encryptService, this.logService, this.cryptoFunctionService, this.accountService, ); - this.pinService = new PinService( - this.accountService, - this.cryptoFunctionService, - this.encryptService, - this.kdfConfigService, - this.keyGenerationService, - this.logService, - this.stateProvider, - ); - this.keyService = new KeyService( - this.pinService, this.masterPasswordService, this.keyGenerationService, this.cryptoFunctionService, @@ -483,6 +474,18 @@ export class ServiceContainer { this.kdfConfigService, ); + const pinStateService = new PinStateService(this.stateProvider); + this.pinService = new PinService( + this.accountService, + this.encryptService, + this.kdfConfigService, + this.keyGenerationService, + this.logService, + this.keyService, + this.sdkService, + pinStateService, + ); + this.masterPasswordUnlockService = new DefaultMasterPasswordUnlockService( this.masterPasswordService, this.keyService, @@ -506,7 +509,7 @@ export class ServiceContainer { this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, - this.pinService, + pinStateService, this.userDecryptionOptionsService, this.keyService, this.tokenService, @@ -557,7 +560,11 @@ export class ServiceContainer { this.authService, ); - this.domainSettingsService = new DefaultDomainSettingsService(this.stateProvider); + this.domainSettingsService = new DefaultDomainSettingsService( + this.stateProvider, + this.policyService, + this.accountService, + ); this.fileUploadService = new FileUploadService(this.logService, this.apiService); @@ -657,6 +664,7 @@ export class ServiceContainer { this.apiService, this.stateProvider, this.authRequestApiService, + this.accountService, ); this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( @@ -771,7 +779,7 @@ export class ServiceContainer { this.folderApiService = new FolderApiService(this.folderService, this.apiService); const lockedCallback = async (userId: UserId) => - await this.keyService.clearStoredUserKey(KeySuffixOptions.Auto, userId); + await this.keyService.clearStoredUserKey(userId); this.userVerificationApiService = new UserVerificationApiService(this.apiService); @@ -844,6 +852,18 @@ export class ServiceContainer { this.importApiService = new ImportApiService(this.apiService); + this.importMetadataService = new DefaultImportMetadataService( + createSystemServiceProvider( + new KeyServiceLegacyEncryptorProvider(this.encryptService, this.keyService), + this.stateProvider, + this.policyService, + buildExtensionRegistry(), + this.logService, + this.platformUtilsService, + this.configService, + ), + ); + this.importService = new ImportService( this.cipherService, this.folderService, @@ -855,15 +875,6 @@ export class ServiceContainer { this.pinService, this.accountService, this.restrictedItemTypesService, - createSystemServiceProvider( - new KeyServiceLegacyEncryptorProvider(this.encryptService, this.keyService), - this.stateProvider, - this.policyService, - buildExtensionRegistry(), - this.logService, - this.platformUtilsService, - this.configService, - ), ); this.individualExportService = new IndividualVaultExportService( @@ -948,7 +959,6 @@ export class ServiceContainer { this.eventUploadService.uploadEvents(userId as UserId), this.keyService.clearKeys(userId), this.cipherService.clear(userId), - // ! DO NOT REMOVE folderService.clear ! For more information see PM-25660 this.folderService.clear(userId), ]); diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index 4fe1dc8cd8d..6d156dbbcec 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -450,6 +450,8 @@ dependencies = [ "cbc", "hex", "homedir", + "napi", + "napi-derive", "oo7", "pbkdf2", "rand 0.9.1", @@ -889,15 +891,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] - [[package]] name = "desktop_core" version = "0.0.0" @@ -993,10 +986,10 @@ dependencies = [ "desktop_core", "embed_plist", "futures", - "log", - "simplelog", "tokio", "tokio-util", + "tracing", + "tracing-subscriber", ] [[package]] @@ -2072,12 +2065,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -2119,15 +2106,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - [[package]] name = "objc2" version = "0.6.1" @@ -2548,12 +2526,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3067,17 +3039,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simplelog" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" -dependencies = [ - "log", - "termcolor", - "time", -] - [[package]] name = "siphasher" version = "0.3.11" @@ -3319,39 +3280,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" version = "0.8.1" diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/Cargo.toml b/apps/desktop/desktop_native/bitwarden_chromium_importer/Cargo.toml index d1efbd006f0..656c3ad1504 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/Cargo.toml +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/Cargo.toml @@ -14,6 +14,8 @@ base64 = { workspace = true } cbc = { workspace = true, features = ["alloc"] } hex = { workspace = true } homedir = { workspace = true } +napi = { workspace = true } +napi-derive = { workspace = true } pbkdf2 = "=0.12.2" rand = { workspace = true } rusqlite = { version = "=0.37.0", features = ["bundled"] } diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/chromium.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/chromium.rs index 8179a10213d..094500e6d42 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/chromium.rs +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/chromium.rs @@ -11,7 +11,7 @@ use rusqlite::{params, Connection}; #[cfg_attr(target_os = "linux", path = "linux.rs")] #[cfg_attr(target_os = "windows", path = "windows.rs")] #[cfg_attr(target_os = "macos", path = "macos.rs")] -mod platform; +pub mod platform; // // Public API @@ -50,18 +50,26 @@ pub enum LoginImportResult { Failure(LoginImportFailure), } -// TODO: Make thus async -pub fn get_installed_browsers() -> Result> { - let mut browsers = Vec::with_capacity(SUPPORTED_BROWSER_MAP.len()); +pub trait InstalledBrowserRetriever { + fn get_installed_browsers() -> Result>; +} - for (browser, config) in SUPPORTED_BROWSER_MAP.iter() { - let data_dir = get_browser_data_dir(config)?; - if data_dir.exists() { - browsers.push((*browser).to_string()); +pub struct DefaultInstalledBrowserRetriever {} + +impl InstalledBrowserRetriever for DefaultInstalledBrowserRetriever { + // TODO: Make thus async + fn get_installed_browsers() -> Result> { + let mut browsers = Vec::with_capacity(SUPPORTED_BROWSER_MAP.len()); + + for (browser, config) in SUPPORTED_BROWSER_MAP.iter() { + let data_dir = get_browser_data_dir(config)?; + if data_dir.exists() { + browsers.push((*browser).to_string()); + } } - } - Ok(browsers) + Ok(browsers) + } } // TODO: Make thus async @@ -104,13 +112,13 @@ pub async fn import_logins( // Private // -#[derive(Debug)] -struct BrowserConfig { - name: &'static str, - data_dir: &'static str, +#[derive(Debug, Clone, Copy)] +pub struct BrowserConfig { + pub name: &'static str, + pub data_dir: &'static str, } -static SUPPORTED_BROWSER_MAP: LazyLock< +pub static SUPPORTED_BROWSER_MAP: LazyLock< std::collections::HashMap<&'static str, &'static BrowserConfig>, > = LazyLock::new(|| { platform::SUPPORTED_BROWSERS @@ -132,12 +140,12 @@ fn get_browser_data_dir(config: &BrowserConfig) -> Result { // #[async_trait] -trait CryptoService: Send { +pub trait CryptoService: Send { async fn decrypt_to_string(&mut self, encrypted: &[u8]) -> Result; } #[derive(serde::Deserialize, Clone)] -struct LocalState { +pub struct LocalState { profile: AllProfiles, #[allow(dead_code)] os_crypt: Option, diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/lib.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/lib.rs index b0a399d6321..84f140d2341 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/lib.rs +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/lib.rs @@ -1 +1,8 @@ +#[macro_use] +extern crate napi_derive; + pub mod chromium; +pub mod metadata; +pub mod util; + +pub use crate::chromium::platform::SUPPORTED_BROWSERS as PLATFORM_SUPPORTED_BROWSERS; diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/linux.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/linux.rs index 0ead034a4b2..be3bcdb1e1d 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/linux.rs +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/linux.rs @@ -6,7 +6,7 @@ use oo7::XDG_SCHEMA_ATTRIBUTE; use crate::chromium::{BrowserConfig, CryptoService, LocalState}; -mod util; +use crate::util; // // Public API diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/macos.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/macos.rs index d9aeff68f2b..bcb2c005000 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/macos.rs +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/macos.rs @@ -4,7 +4,7 @@ use security_framework::passwords::get_generic_password; use crate::chromium::{BrowserConfig, CryptoService, LocalState}; -mod util; +use crate::util; // // Public API diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/metadata.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/metadata.rs new file mode 100644 index 00000000000..a95a86ef0e8 --- /dev/null +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/metadata.rs @@ -0,0 +1,203 @@ +use std::collections::{HashMap, HashSet}; + +use crate::{chromium::InstalledBrowserRetriever, PLATFORM_SUPPORTED_BROWSERS}; + +#[napi(object)] +/// Mechanisms that load data into the importer +pub struct NativeImporterMetadata { + /// Identifies the importer + pub id: String, + /// Describes the strategies used to obtain imported data + pub loaders: Vec<&'static str>, + /// Identifies the instructions for the importer + pub instructions: &'static str, +} + +/// Returns a map of supported importers based on the current platform. +/// +/// Only browsers listed in PLATFORM_SUPPORTED_BROWSERS will have the "chromium" loader. +/// All importers will have the "file" loader. +pub fn get_supported_importers( +) -> HashMap { + let mut map = HashMap::new(); + + // Check for installed browsers + let installed_browsers = T::get_installed_browsers().unwrap_or_default(); + + const IMPORTERS: [(&str, &str); 6] = [ + ("chromecsv", "Chrome"), + ("chromiumcsv", "Chromium"), + ("bravecsv", "Brave"), + ("operacsv", "Opera"), + ("vivaldicsv", "Vivaldi"), + ("edgecsv", "Microsoft Edge"), + ]; + + let supported: HashSet<&'static str> = + PLATFORM_SUPPORTED_BROWSERS.iter().map(|b| b.name).collect(); + + for (id, browser_name) in IMPORTERS { + let mut loaders: Vec<&'static str> = vec!["file"]; + if supported.contains(browser_name) { + loaders.push("chromium"); + } + + if installed_browsers.contains(&browser_name.to_string()) { + map.insert( + id.to_string(), + NativeImporterMetadata { + id: id.to_string(), + loaders, + instructions: "chromium", + }, + ); + } + } + + map +} + +/* + Tests are cfg-gated based upon OS, and must be compiled/run on each OS for full coverage +*/ +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashSet; + + use crate::chromium::{InstalledBrowserRetriever, SUPPORTED_BROWSER_MAP}; + + pub struct MockInstalledBrowserRetriever {} + + impl InstalledBrowserRetriever for MockInstalledBrowserRetriever { + fn get_installed_browsers() -> Result, anyhow::Error> { + Ok(SUPPORTED_BROWSER_MAP + .keys() + .map(|browser| browser.to_string()) + .collect()) + } + } + + fn map_keys(map: &HashMap) -> HashSet { + map.keys().cloned().collect() + } + + fn get_loaders( + map: &HashMap, + id: &str, + ) -> HashSet<&'static str> { + map.get(id) + .map(|m| m.loaders.iter().copied().collect::>()) + .unwrap_or_default() + } + + #[cfg(target_os = "macos")] + #[test] + fn macos_returns_all_known_importers() { + let map = get_supported_importers::(); + + let expected: HashSet = HashSet::from([ + "chromecsv".to_string(), + "chromiumcsv".to_string(), + "bravecsv".to_string(), + "operacsv".to_string(), + "vivaldicsv".to_string(), + "edgecsv".to_string(), + ]); + assert_eq!(map.len(), expected.len()); + assert_eq!(map_keys(&map), expected); + + for (key, meta) in map.iter() { + assert_eq!(&meta.id, key); + assert_eq!(meta.instructions, "chromium"); + assert!(meta.loaders.iter().any(|l| *l == "file")); + } + } + + #[cfg(target_os = "macos")] + #[test] + fn macos_specific_loaders_match_const_array() { + let map = get_supported_importers::(); + let ids = [ + "chromecsv", + "chromiumcsv", + "bravecsv", + "operacsv", + "vivaldicsv", + "edgecsv", + ]; + for id in ids { + let loaders = get_loaders(&map, id); + assert!(loaders.contains("file")); + assert!(loaders.contains("chromium"), "missing chromium for {id}"); + } + } + + #[cfg(target_os = "linux")] + #[test] + fn returns_all_known_importers() { + let map = get_supported_importers::(); + + let expected: HashSet = HashSet::from([ + "chromecsv".to_string(), + "chromiumcsv".to_string(), + "bravecsv".to_string(), + "operacsv".to_string(), + ]); + assert_eq!(map.len(), expected.len()); + assert_eq!(map_keys(&map), expected); + + for (key, meta) in map.iter() { + assert_eq!(&meta.id, key); + assert_eq!(meta.instructions, "chromium"); + assert!(meta.loaders.iter().any(|l| *l == "file")); + } + } + + #[cfg(target_os = "linux")] + #[test] + fn linux_specific_loaders_match_const_array() { + let map = get_supported_importers::(); + let ids = ["chromecsv", "chromiumcsv", "bravecsv", "operacsv"]; + + for id in ids { + let loaders = get_loaders(&map, id); + assert!(loaders.contains("file")); + assert!(loaders.contains("chromium"), "missing chromium for {id}"); + } + } + + #[cfg(target_os = "windows")] + #[test] + fn returns_all_known_importers() { + let map = get_supported_importers::(); + + let expected: HashSet = HashSet::from([ + "chromiumcsv".to_string(), + "edgecsv".to_string(), + "operacsv".to_string(), + "vivaldicsv".to_string(), + ]); + assert_eq!(map.len(), expected.len()); + assert_eq!(map_keys(&map), expected); + + for (key, meta) in map.iter() { + assert_eq!(&meta.id, key); + assert_eq!(meta.instructions, "chromium"); + assert!(meta.loaders.iter().any(|l| *l == "file")); + } + } + + #[cfg(target_os = "windows")] + #[test] + fn windows_specific_loaders_match_const_array() { + let map = get_supported_importers::(); + let ids = ["chromiumcsv", "edgecsv", "operacsv", "vivaldicsv"]; + + for id in ids { + let loaders = get_loaders(&map, id); + assert!(loaders.contains("file")); + assert!(loaders.contains("chromium"), "missing chromium for {id}"); + } + } +} diff --git a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/windows.rs b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/windows.rs index e7dffe93dba..b9c1c9a4cc2 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_importer/src/windows.rs +++ b/apps/desktop/desktop_native/bitwarden_chromium_importer/src/windows.rs @@ -9,18 +9,14 @@ use windows::Win32::Foundation::{LocalFree, HLOCAL}; use crate::chromium::{BrowserConfig, CryptoService, LocalState}; -#[allow(dead_code)] -mod util; +use crate::util; // // Public API // -pub const SUPPORTED_BROWSERS: [BrowserConfig; 6] = [ - BrowserConfig { - name: "Chrome", - data_dir: "AppData/Local/Google/Chrome/User Data", - }, +// IMPORTANT adjust array size when enabling / disabling chromium importers here +pub const SUPPORTED_BROWSERS: [BrowserConfig; 4] = [ BrowserConfig { name: "Chromium", data_dir: "AppData/Local/Chromium/User Data", @@ -29,10 +25,6 @@ pub const SUPPORTED_BROWSERS: [BrowserConfig; 6] = [ name: "Microsoft Edge", data_dir: "AppData/Local/Microsoft/Edge/User Data", }, - BrowserConfig { - name: "Brave", - data_dir: "AppData/Local/BraveSoftware/Brave-Browser/User Data", - }, BrowserConfig { name: "Opera", data_dir: "AppData/Roaming/Opera Software/Opera Stable", diff --git a/apps/desktop/desktop_native/core/src/process_isolation/linux.rs b/apps/desktop/desktop_native/core/src/process_isolation/linux.rs index 395d722ea01..bad348c93e2 100644 --- a/apps/desktop/desktop_native/core/src/process_isolation/linux.rs +++ b/apps/desktop/desktop_native/core/src/process_isolation/linux.rs @@ -2,6 +2,7 @@ use anyhow::Result; #[cfg(target_env = "gnu")] use libc::c_uint; use libc::{self, c_int}; +use tracing::info; // RLIMIT_CORE is the maximum size of a core dump file. Setting both to 0 disables core dumps, on crashes // https://github.com/torvalds/linux/blob/1613e604df0cd359cf2a7fbd9be7a0bcfacfabd0/include/uapi/asm-generic/resource.h#L20 @@ -20,7 +21,7 @@ pub fn disable_coredumps() -> Result<()> { rlim_cur: 0, rlim_max: 0, }; - println!("[Process Isolation] Disabling core dumps via setrlimit"); + info!("Disabling core dumps via setrlimit."); if unsafe { libc::setrlimit(RLIMIT_CORE, &rlimit) } != 0 { let e = std::io::Error::last_os_error(); @@ -48,9 +49,9 @@ pub fn is_core_dumping_disabled() -> Result { pub fn isolate_process() -> Result<()> { let pid = std::process::id(); - println!( - "[Process Isolation] Disabling ptrace and memory access for main ({}) via PR_SET_DUMPABLE", - pid + info!( + pid, + "Disabling ptrace and memory access for main via PR_SET_DUMPABLE." ); if unsafe { libc::prctl(PR_SET_DUMPABLE, 0) } != 0 { diff --git a/apps/desktop/desktop_native/core/src/process_isolation/macos.rs b/apps/desktop/desktop_native/core/src/process_isolation/macos.rs index ce42e06a832..928eac749c0 100644 --- a/apps/desktop/desktop_native/core/src/process_isolation/macos.rs +++ b/apps/desktop/desktop_native/core/src/process_isolation/macos.rs @@ -1,4 +1,5 @@ use anyhow::{bail, Result}; +use tracing::info; pub fn disable_coredumps() -> Result<()> { bail!("Not implemented on Mac") @@ -10,10 +11,7 @@ pub fn is_core_dumping_disabled() -> Result { pub fn isolate_process() -> Result<()> { let pid: u32 = std::process::id(); - println!( - "[Process Isolation] Disabling ptrace on main process ({}) via PT_DENY_ATTACH", - pid - ); + info!(pid, "Disabling ptrace on main process via PT_DENY_ATTACH."); secmem_proc::harden_process().map_err(|e| { anyhow::anyhow!( diff --git a/apps/desktop/desktop_native/core/src/process_isolation/windows.rs b/apps/desktop/desktop_native/core/src/process_isolation/windows.rs index dc1092f9131..fddea8bc53a 100644 --- a/apps/desktop/desktop_native/core/src/process_isolation/windows.rs +++ b/apps/desktop/desktop_native/core/src/process_isolation/windows.rs @@ -1,4 +1,5 @@ use anyhow::{bail, Result}; +use tracing::info; pub fn disable_coredumps() -> Result<()> { bail!("Not implemented on Windows") @@ -10,10 +11,7 @@ pub fn is_core_dumping_disabled() -> Result { pub fn isolate_process() -> Result<()> { let pid: u32 = std::process::id(); - println!( - "[Process Isolation] Isolating main process via DACL {}", - pid - ); + info!(pid, "Isolating main process via DACL."); secmem_proc::harden_process().map_err(|e| { anyhow::anyhow!( diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index 030bf4c964d..c822017c1a2 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -3,6 +3,15 @@ /* auto-generated by NAPI-RS */ +/** Mechanisms that load data into the importer */ +export interface NativeImporterMetadata { + /** Identifies the importer */ + id: string + /** Describes the strategies used to obtain imported data */ + loaders: Array + /** Identifies the instructions for the importer */ + instructions: string +} export declare namespace passwords { /** The error message returned when a password is not found during retrieval or deletion. */ export const PASSWORD_NOT_FOUND: string @@ -228,6 +237,8 @@ export declare namespace chromium_importer { login?: Login failure?: LoginImportFailure } + /** Returns OS aware metadata describing supported Chromium based importers as a JSON string. */ + export function getMetadata(): Record export function getInstalledBrowsers(): Array export function getAvailableProfiles(browser: string): Array export function importLogins(browser: string, profileId: string): Promise> diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 327c7c1c8e5..3e6a5f00ae2 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -944,8 +944,12 @@ pub mod logging { #[napi] pub mod chromium_importer { + use bitwarden_chromium_importer::chromium::DefaultInstalledBrowserRetriever; + use bitwarden_chromium_importer::chromium::InstalledBrowserRetriever; use bitwarden_chromium_importer::chromium::LoginImportResult as _LoginImportResult; use bitwarden_chromium_importer::chromium::ProfileInfo as _ProfileInfo; + use bitwarden_chromium_importer::metadata::NativeImporterMetadata; + use std::collections::HashMap; #[napi(object)] pub struct ProfileInfo { @@ -1007,9 +1011,17 @@ pub mod chromium_importer { } } + #[napi] + /// Returns OS aware metadata describing supported Chromium based importers as a JSON string. + pub fn get_metadata() -> HashMap { + bitwarden_chromium_importer::metadata::get_supported_importers::< + DefaultInstalledBrowserRetriever, + >() + } + #[napi] pub fn get_installed_browsers() -> napi::Result> { - bitwarden_chromium_importer::chromium::get_installed_browsers() + bitwarden_chromium_importer::chromium::DefaultInstalledBrowserRetriever::get_installed_browsers() .map_err(|e| napi::Error::from_reason(e.to_string())) } diff --git a/apps/desktop/desktop_native/proxy/Cargo.toml b/apps/desktop/desktop_native/proxy/Cargo.toml index cb1f39d9b42..c672f57543d 100644 --- a/apps/desktop/desktop_native/proxy/Cargo.toml +++ b/apps/desktop/desktop_native/proxy/Cargo.toml @@ -9,10 +9,10 @@ publish = { workspace = true } anyhow = { workspace = true } desktop_core = { path = "../core" } futures = { workspace = true } -log = { workspace = true } -simplelog = { workspace = true } tokio = { workspace = true, features = ["io-std", "io-util", "macros", "rt"] } tokio-util = { workspace = true, features = ["codec"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] embed_plist = { workspace = true } diff --git a/apps/desktop/desktop_native/proxy/src/main.rs b/apps/desktop/desktop_native/proxy/src/main.rs index 792b1bf272d..bad3a9deb54 100644 --- a/apps/desktop/desktop_native/proxy/src/main.rs +++ b/apps/desktop/desktop_native/proxy/src/main.rs @@ -2,8 +2,11 @@ use std::path::Path; use desktop_core::ipc::{MESSAGE_CHANNEL_BUFFER, NATIVE_MESSAGING_BUFFER_SIZE}; use futures::{FutureExt, SinkExt, StreamExt}; -use log::*; use tokio_util::codec::LengthDelimitedCodec; +use tracing::{debug, error, info, level_filters::LevelFilter}; +use tracing_subscriber::{ + fmt, layer::SubscriberExt as _, util::SubscriberInitExt as _, EnvFilter, Layer as _, +}; #[cfg(target_os = "windows")] mod windows; @@ -11,30 +14,38 @@ mod windows; #[cfg(target_os = "macos")] embed_plist::embed_info_plist!("../../../resources/info.desktop_proxy.plist"); +const ENV_VAR_PROXY_LOG_LEVEL: &str = "PROXY_LOG_LEVEL"; + fn init_logging(log_path: &Path, console_level: LevelFilter, file_level: LevelFilter) { - use simplelog::{ColorChoice, CombinedLogger, Config, SharedLogger, TermLogger, TerminalMode}; + let console_filter = EnvFilter::builder() + .with_default_directive(console_level.into()) + .with_env_var(ENV_VAR_PROXY_LOG_LEVEL) + .from_env_lossy(); - let config = Config::default(); - - let mut loggers: Vec> = Vec::new(); - loggers.push(TermLogger::new( - console_level, - config.clone(), - TerminalMode::Stderr, - ColorChoice::Auto, - )); + let console_layer = fmt::layer() + .with_writer(std::io::stderr) + .with_filter(console_filter); match std::fs::File::create(log_path) { Ok(file) => { - loggers.push(simplelog::WriteLogger::new(file_level, config, file)); - } - Err(e) => { - eprintln!("Can't create file: {e}"); - } - } + let file_filter = EnvFilter::builder() + .with_default_directive(file_level.into()) + .from_env_lossy(); - if let Err(e) = CombinedLogger::init(loggers) { - eprintln!("Failed to initialize logger: {e}"); + let file_layer = fmt::layer() + .with_writer(file) + .with_ansi(false) + .with_filter(file_filter); + + tracing_subscriber::registry() + .with(console_layer) + .with(file_layer) + .init(); + } + Err(error) => { + tracing_subscriber::registry().with(console_layer).init(); + error!(%error, ?log_path, "Could not create log file."); + } } } @@ -65,12 +76,7 @@ async fn main() { path }; - let level = std::env::var("PROXY_LOG_LEVEL") - .ok() - .and_then(|s| s.parse().ok()) - .unwrap_or(LevelFilter::Info); - - init_logging(&log_path, level, LevelFilter::Info); + init_logging(&log_path, LevelFilter::INFO, LevelFilter::INFO); info!("Starting Bitwarden IPC Proxy."); @@ -88,7 +94,7 @@ async fn main() { // - Origin of the extension that started it (in the form `chrome-extension://[ID]`). let args: Vec<_> = std::env::args().skip(1).collect(); - info!("Process args: {:?}", args); + info!(?args, "Process args"); // Setup two channels, one for sending messages to the desktop application (`out`) and one for receiving messages from the desktop application (`in`) let (in_send, in_recv) = tokio::sync::mpsc::channel(MESSAGE_CHANNEL_BUFFER); @@ -123,12 +129,12 @@ async fn main() { info!("IPC client finished successfully."); std::process::exit(0); } - Ok(Err(e)) => { - error!("IPC client connection error: {}", e); + Ok(Err(error)) => { + error!(error, "IPC client connection error."); std::process::exit(1); } - Err(e) => { - error!("IPC client spawn error: {}", e); + Err(error) => { + error!(%error, "IPC client spawn error."); std::process::exit(1); } } @@ -138,7 +144,7 @@ async fn main() { msg = out_recv.recv() => { match msg { Some(msg) => { - debug!("OUT: {}", msg); + debug!(msg, "OUT"); stdout.send(msg.into()).await.unwrap(); } None => { @@ -155,12 +161,12 @@ async fn main() { match msg { Some(Ok(msg)) => { - let m = String::from_utf8(msg.to_vec()).unwrap(); - debug!("IN: {}", m); - in_send.send(m).await.unwrap(); + let msg = String::from_utf8(msg.to_vec()).unwrap(); + debug!(msg, "IN"); + in_send.send(msg).await.unwrap(); } - Some(Err(e)) => { - error!("Error parsing input: {}", e); + Some(Err(error)) => { + error!(%error, "Error parsing input."); std::process::exit(1); } None => { diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 17dad010e46..19ab9e783d4 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2025.10.1", + "version": "2025.10.2", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/app/accounts/settings.component.spec.ts b/apps/desktop/src/app/accounts/settings.component.spec.ts index 18b62fbf593..cb2a6ae259a 100644 --- a/apps/desktop/src/app/accounts/settings.component.spec.ts +++ b/apps/desktop/src/app/accounts/settings.component.spec.ts @@ -390,7 +390,7 @@ describe("SettingsComponent", () => { await component.updatePinHandler(false); expect(component.form.controls.pin.value).toBe(false); - expect(vaultTimeoutSettingsService.clear).toHaveBeenCalled(); + expect(vaultTimeoutSettingsService.clear).not.toHaveBeenCalled(); expect(messagingService.send).toHaveBeenCalledWith("redrawMenu"); }); }); diff --git a/apps/desktop/src/app/accounts/settings.component.ts b/apps/desktop/src/app/accounts/settings.component.ts index 55b3b5f2f68..53b2cad4376 100644 --- a/apps/desktop/src/app/accounts/settings.component.ts +++ b/apps/desktop/src/app/accounts/settings.component.ts @@ -588,7 +588,7 @@ export class SettingsComponent implements OnInit, OnDestroy { this.form.controls.pin.setValue(this.userHasPinSet, { emitEvent: false }); } else { const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); - await this.vaultTimeoutSettingsService.clear(userId); + await this.pinService.unsetPin(userId); } } diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index 94c31079da9..a17484a4195 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -49,6 +49,7 @@ import { PendingAuthRequestsStateService } from "@bitwarden/common/auth/services import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeout, VaultTimeoutAction, @@ -180,6 +181,7 @@ export class AppComponent implements OnInit, OnDestroy { private readonly destroyRef: DestroyRef, private readonly documentLangSetter: DocumentLangSetter, private restrictedItemTypesService: RestrictedItemTypesService, + private pinService: PinServiceAbstraction, private readonly tokenService: TokenService, private desktopAutotypeDefaultSettingPolicy: DesktopAutotypeDefaultSettingPolicy, private pendingAuthRequestsState: PendingAuthRequestsStateService, @@ -732,10 +734,9 @@ export class AppComponent implements OnInit, OnDestroy { await this.eventUploadService.uploadEvents(userBeingLoggedOut); await this.keyService.clearKeys(userBeingLoggedOut); await this.cipherService.clear(userBeingLoggedOut); - // ! DO NOT REMOVE folderService.clear ! For more information see PM-25660 await this.folderService.clear(userBeingLoggedOut); - await this.vaultTimeoutSettingsService.clear(userBeingLoggedOut); await this.biometricStateService.logout(userBeingLoggedOut); + await this.pinService.logout(userBeingLoggedOut); await this.stateEventRunnerService.handleEvent("logout", userBeingLoggedOut); diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index 7f1f8362b5e..2a7023579c8 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -310,7 +310,6 @@ const safeProviders: SafeProvider[] = [ provide: KeyServiceAbstraction, useClass: ElectronKeyService, deps: [ - PinServiceAbstraction, InternalMasterPasswordServiceAbstraction, KeyGenerationService, CryptoFunctionServiceAbstraction, diff --git a/apps/desktop/src/app/tools/import/chromium-importer.service.ts b/apps/desktop/src/app/tools/import/chromium-importer.service.ts index 56f31c359db..5273eef4b54 100644 --- a/apps/desktop/src/app/tools/import/chromium-importer.service.ts +++ b/apps/desktop/src/app/tools/import/chromium-importer.service.ts @@ -4,6 +4,10 @@ import { chromium_importer } from "@bitwarden/desktop-napi"; export class ChromiumImporterService { constructor() { + ipcMain.handle("chromium_importer.getMetadata", async (event) => { + return await chromium_importer.getMetadata(); + }); + ipcMain.handle("chromium_importer.getInstalledBrowsers", async (event) => { return await chromium_importer.getInstalledBrowsers(); }); diff --git a/apps/desktop/src/app/tools/import/desktop-import-metadata.service.ts b/apps/desktop/src/app/tools/import/desktop-import-metadata.service.ts new file mode 100644 index 00000000000..fc2c2ff1183 --- /dev/null +++ b/apps/desktop/src/app/tools/import/desktop-import-metadata.service.ts @@ -0,0 +1,66 @@ +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; +import type { NativeImporterMetadata } from "@bitwarden/desktop-napi"; +import { + ImportType, + DefaultImportMetadataService, + ImportMetadataServiceAbstraction, + DataLoader, + ImporterMetadata, + InstructionLink, + Instructions, + Loader, +} from "@bitwarden/importer-core"; + +export class DesktopImportMetadataService + extends DefaultImportMetadataService + implements ImportMetadataServiceAbstraction +{ + constructor(system: SystemServiceProvider) { + super(system); + } + + async init(): Promise { + const metadata = await ipc.tools.chromiumImporter.getMetadata(); + await this.parseNativeMetaData(metadata); + await super.init(); + } + + private async parseNativeMetaData(raw: Record): Promise { + const entries = Object.entries(raw).map(([id, meta]) => { + const loaders = meta.loaders.map(this.mapLoader); + const instructions = this.mapInstructions(meta.instructions); + const mapped: ImporterMetadata = { + type: id as ImportType, + loaders, + ...(instructions ? { instructions } : {}), + }; + return [id, mapped] as const; + }); + + // Do not overwrite existing importers, just add new ones or update existing ones + this.importers = { + ...this.importers, + ...Object.fromEntries(entries), + }; + } + + private mapLoader(name: string): DataLoader { + switch (name) { + case "file": + return Loader.file; + case "chromium": + return Loader.chromium; + default: + throw new Error(`Unknown loader from native module: ${name}`); + } + } + + private mapInstructions(name: string): InstructionLink | undefined { + switch (name) { + case "chromium": + return Instructions.chromium; + default: + return undefined; + } + } +} diff --git a/apps/desktop/src/app/tools/import/import-desktop.component.ts b/apps/desktop/src/app/tools/import/import-desktop.component.ts index f096471f770..fefeb439010 100644 --- a/apps/desktop/src/app/tools/import/import-desktop.component.ts +++ b/apps/desktop/src/app/tools/import/import-desktop.component.ts @@ -3,7 +3,15 @@ import { Component } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { DialogRef, AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; -import { ImportComponent } from "@bitwarden/importer-ui"; +import { ImportMetadataServiceAbstraction } from "@bitwarden/importer-core"; +import { + ImportComponent, + ImporterProviders, + SYSTEM_SERVICE_PROVIDER, +} from "@bitwarden/importer-ui"; +import { safeProvider } from "@bitwarden/ui-common"; + +import { DesktopImportMetadataService } from "./desktop-import-metadata.service"; @Component({ templateUrl: "import-desktop.component.html", @@ -15,6 +23,14 @@ import { ImportComponent } from "@bitwarden/importer-ui"; ButtonModule, ImportComponent, ], + providers: [ + ...ImporterProviders, + safeProvider({ + provide: ImportMetadataServiceAbstraction, + useClass: DesktopImportMetadataService, + deps: [SYSTEM_SERVICE_PROVIDER], + }), + ], }) export class ImportDesktopComponent { protected disabled = false; diff --git a/apps/desktop/src/app/tools/preload.ts b/apps/desktop/src/app/tools/preload.ts index 574c27ac9fd..4d629c992ad 100644 --- a/apps/desktop/src/app/tools/preload.ts +++ b/apps/desktop/src/app/tools/preload.ts @@ -1,6 +1,10 @@ import { ipcRenderer } from "electron"; +import type { NativeImporterMetadata } from "@bitwarden/desktop-napi"; + const chromiumImporter = { + getMetadata: (): Promise> => + ipcRenderer.invoke("chromium_importer.getMetadata"), getInstalledBrowsers: (): Promise => ipcRenderer.invoke("chromium_importer.getInstalledBrowsers"), getAvailableProfiles: (browser: string): Promise => diff --git a/apps/desktop/src/key-management/electron-key.service.spec.ts b/apps/desktop/src/key-management/electron-key.service.spec.ts index 2d60c47217d..cc1d68ed050 100644 --- a/apps/desktop/src/key-management/electron-key.service.spec.ts +++ b/apps/desktop/src/key-management/electron-key.service.spec.ts @@ -4,7 +4,6 @@ import { KeyGenerationService } from "@bitwarden/common/key-management/crypto"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; -import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; 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"; @@ -26,7 +25,6 @@ import { ElectronKeyService } from "./electron-key.service"; describe("ElectronKeyService", () => { let keyService: ElectronKeyService; - const pinService = mock(); const keyGenerationService = mock(); const cryptoFunctionService = mock(); const encryptService = mock(); @@ -48,7 +46,6 @@ describe("ElectronKeyService", () => { stateProvider = new FakeStateProvider(accountService); keyService = new ElectronKeyService( - pinService, masterPasswordService, keyGenerationService, cryptoFunctionService, diff --git a/apps/desktop/src/key-management/electron-key.service.ts b/apps/desktop/src/key-management/electron-key.service.ts index 59295b2ca21..8de079a826b 100644 --- a/apps/desktop/src/key-management/electron-key.service.ts +++ b/apps/desktop/src/key-management/electron-key.service.ts @@ -3,7 +3,6 @@ import { KeyGenerationService } from "@bitwarden/common/key-management/crypto"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; 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"; @@ -22,7 +21,6 @@ import { DesktopBiometricsService } from "./biometrics/desktop.biometrics.servic // TODO Remove this class once biometric client key half storage is moved https://bitwarden.atlassian.net/browse/PM-22342 export class ElectronKeyService extends DefaultKeyService { constructor( - pinService: PinServiceAbstraction, masterPasswordService: InternalMasterPasswordServiceAbstraction, keyGenerationService: KeyGenerationService, cryptoFunctionService: CryptoFunctionService, @@ -37,7 +35,6 @@ export class ElectronKeyService extends DefaultKeyService { private biometricService: DesktopBiometricsService, ) { super( - pinService, masterPasswordService, keyGenerationService, cryptoFunctionService, @@ -51,10 +48,6 @@ export class ElectronKeyService extends DefaultKeyService { ); } - override async clearStoredUserKey(keySuffix: KeySuffixOptions, userId: UserId): Promise { - await super.clearStoredUserKey(keySuffix, userId); - } - protected override async storeAdditionalKeys(key: UserKey, userId: UserId) { await super.storeAdditionalKeys(key, userId); diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index eeae0ea82d1..61927009c3a 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 4ade7e4fd47..aa72960577e 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "تم قبول الدعوة" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index cd2822165da..8c1e1bd23d6 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Dəvət qəbul edildi" }, @@ -4149,7 +4152,7 @@ "message": "Arxivlə", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Arxivdən çıxart" }, "itemsInArchive": { @@ -4161,10 +4164,10 @@ "noItemsInArchiveDesc": { "message": "Arxivlənmiş elementlər burada görünəcək, ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Element arxivə göndərildi" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Element arxivdən çıxarıldı" }, "archiveItem": { diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 2302cc2f322..981f042352d 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index d5007d7dced..64232779cc6 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Минималното персонализирано време за достъп е 1 минута." + }, "inviteAccepted": { "message": "Поканата е приета" }, @@ -4149,7 +4152,7 @@ "message": "Архивиране", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Изваждане от архива" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Архивираните елементи ще се показват тук и ще бъдат изключени от общите резултати при търсене и от предложенията за автоматично попълване." }, - "itemSentToArchive": { - "message": "Елементът е преместен в архива" + "itemWasSentToArchive": { + "message": "Елементът беше преместен в архива" }, - "itemRemovedFromArchive": { - "message": "Елементът е изваден от архива" + "itemUnarchived": { + "message": "Елементът беше изваден от архива" }, "archiveItem": { "message": "Архивиране на елемента" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 267e0817e30..c33565740e2 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 1c415c99d7a..0a7061ba291 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index b5a7362dcad..58c2773f10a 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitació acceptada" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 260f0451321..444d61c172a 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimální vlastní časový limit je 1 minuta." + }, "inviteAccepted": { "message": "Pozvánka byla přijata" }, @@ -4149,7 +4152,7 @@ "message": "Archivovat", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Odebrat z archivu" }, "itemsInArchive": { @@ -4161,10 +4164,10 @@ "noItemsInArchiveDesc": { "message": "Zde se zobrazí archivované položky a budou vyloučeny z obecných výsledků vyhledávání a návrhů automatického vyplňování." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Položka byla přesunuta do archivu" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Položka byla odebrána z archivu" }, "archiveItem": { diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 956d92d5914..5225818ec95 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 644bf9c37ac..33b333a61a1 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepteret" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 63a58bd725a..77052612eb4 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Das minimal benutzerdefinierte Timeout beträgt 1 Minute." + }, "inviteAccepted": { "message": "Einladung angenommen" }, @@ -4149,8 +4152,8 @@ "message": "Archivieren", "description": "Verb" }, - "unarchive": { - "message": "Archivierung aufheben" + "unArchive": { + "message": "Nicht mehr archivieren" }, "itemsInArchive": { "message": "Einträge im Archiv" @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Auto-Ausfüllen-Vorschlägen ausgeschlossen." }, - "itemSentToArchive": { - "message": "Eintrag an das Archiv gesendet" + "itemWasSentToArchive": { + "message": "Eintrag wurde ins Archiv verschoben" }, - "itemRemovedFromArchive": { - "message": "Eintrag aus dem Archiv entfernt" + "itemUnarchived": { + "message": "Eintrag wird nicht mehr archiviert" }, "archiveItem": { "message": "Eintrag archivieren" diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index e1d802f07e5..858dee3849e 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Η πρόσκληση έγινε αποδεκτή" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 7b329b5e78d..5151cd2502d 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 78ce6e28ce9..fdc4537c1a6 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 276b906fd51..828f82495b0 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 02bbc63ef7c..0368ea0f202 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitación aceptada" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 2b0672ff14c..e33fe78e56b 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Kutse vastu võetud" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 900bf170aee..9306b55ec8b 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 3e296731a79..4b1d32a2d7a 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "دعوتنامه پذیرفته شد" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index fae42af9bf9..3b54c4d0757 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Kutsu hyväksyttiin" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 74fd370fe74..5334b43c35a 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index b7330cdd9b0..38edba7136a 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation acceptée" }, @@ -4149,8 +4152,8 @@ "message": "Archiver", "description": "Verb" }, - "unarchive": { - "message": "Désarchiver" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Éléments dans l'archive" @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Les éléments archivés apparaîtront ici et seront exclus des résultats de recherche généraux et des suggestions de remplissage automatique." }, - "itemSentToArchive": { - "message": "Élément envoyé à l'archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Élément retiré de l'archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archiver l'élément" diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index b8fb4061be9..be029fc4e2e 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 714cd0279d0..cad04a51a9b 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "ההזמנה התקבלה" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index be4e294413d..8b00acfe49b 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 55762dbec9b..8f21ddd199e 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Pozivnica prihvaćena" }, @@ -4149,8 +4152,8 @@ "message": "Arhiviraj", "description": "Verb" }, - "unarchive": { - "message": "Poništi arhiviranje" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Stavke u arhivi" @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Arhivirane stavke biti će prikazane ovdje i biti će izuzete iz rezultata općih pretraga i preporuka auto-ispune." }, - "itemSentToArchive": { - "message": "Stavka poslana u arhivu" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Stavka maknute iz arhive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Arhiviraj stavku" diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 42048f89b8d..7dd61d4fd28 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "A minimális egyedi időkifutás 1 perc." + }, "inviteAccepted": { "message": "A meghívás elfogadásra került." }, @@ -4149,7 +4152,7 @@ "message": "Archívum", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Visszavétel archívumból" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Az archivált elemek itt jelennek meg és kizárásra kerülnek az általános keresési eredményekből és az automatikus kitöltési javaslatokból." }, - "itemSentToArchive": { - "message": "Archívumba küldött elemek száma" + "itemWasSentToArchive": { + "message": "Az elem az archivumba került." }, - "itemRemovedFromArchive": { - "message": "Az elem kikerült az archívumból." + "itemUnarchived": { + "message": "Az elem visszavéelre került az archivumból." }, "archiveItem": { "message": "Elem archiválása" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 047da18937f..73c09e2d972 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 670fe7f6318..1ef09903a83 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invito accettato" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index ac8fac8e619..92e86c44f39 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "招待が承認されました" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 0f4f5d7f2e2..f5f21a5eec5 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index b8fb4061be9..be029fc4e2e 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index ae79bf6d02f..7281afada7f 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index ac83e004a2c..57af822737b 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 2e2f48cd7ce..f5f535aee09 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index d684ef0f03a..e12458b1bc4 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Mazākā pieļaujamā pielāgotā noildze ir 1 minūte." + }, "inviteAccepted": { "message": "Uzaicinājums apstiprināts" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Atcelt arhivēšanu" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Šeit parādīsies arhivētie vienumi, un tie netiks iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos." }, - "itemSentToArchive": { - "message": "Vienums ievietots arhīvā" + "itemWasSentToArchive": { + "message": "Vienums tika ievietots arhīvā" }, - "itemRemovedFromArchive": { - "message": "Vienums izņemts no arhīva" + "itemUnarchived": { + "message": "Vienums tika izņemts no arhīva" }, "archiveItem": { "message": "Arhivēt vienumu" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 83d3f8d5df8..26957e97439 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index bdfbac91371..e6b7dd42f2a 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index b8fb4061be9..be029fc4e2e 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index cb662a55b6f..c230591d212 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 237556406f4..a4ee9d6fac5 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitasjon akseptert" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index aadf4de1af5..81e339d099a 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 7a9d07fa4e1..3330f148c0e 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimale aangepaste time-out is 1 minuut." + }, "inviteAccepted": { "message": "Uitnodiging geaccepteerd" }, @@ -4149,7 +4152,7 @@ "message": "Archiveren", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Dearchiveren" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Gearchiveerde items verschijnen hier en worden uitgesloten van algemene zoekresultaten en automatisch invulsuggesties." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Item naar archief verzonden" }, - "itemRemovedFromArchive": { - "message": "Item verwijderd uit archief" + "itemUnarchived": { + "message": "Item uit het archief gehaald" }, "archiveItem": { "message": "Item archiveren" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index a2d0ab1d304..92caf401a11 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index b642d88c550..ffe8f673a1e 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 3825c1b4c08..6359bbccb00 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Zaproszenie zostało zaakceptowane" }, @@ -4149,8 +4152,8 @@ "message": "Archiwizuj", "description": "Verb" }, - "unarchive": { - "message": "Usuń z archiwum" + "unArchive": { + "message": "Unarchive" }, "itemsInArchive": { "message": "Elementy w archiwum" @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Zarchiwizowane elementy pojawią się tutaj i zostaną wykluczone z wyników wyszukiwania i sugestii autouzupełniania." }, - "itemSentToArchive": { - "message": "Element został przeniesiony do archiwum" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Element został usunięty z archiwum" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archiwizuj element" diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 5a0a30ab610..4c09f4f7cfe 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -24,7 +24,7 @@ "message": "Identidade" }, "typeNote": { - "message": "Notas" + "message": "Anotação" }, "typeSecureNote": { "message": "Nota Segura" @@ -39,7 +39,7 @@ "message": "Coleções" }, "searchVault": { - "message": "Pesquisar no Cofre" + "message": "Pesquisar no cofre" }, "resetSearch": { "message": "Redefinir pesquisa" @@ -54,7 +54,7 @@ "message": "Compartilhar" }, "moveToOrganization": { - "message": "Mover para a organização" + "message": "Mover para organização" }, "movedItemToOrg": { "message": "$ITEMNAME$ movido para $ORGNAME$", @@ -70,7 +70,7 @@ } }, "welcomeBack": { - "message": "Bem vindo de volta" + "message": "Boas-vindas de volta" }, "moveToOrgDesc": { "message": "Escolha uma organização para a qual deseja mover este item. Mudar para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido." @@ -202,52 +202,52 @@ "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA de 2048 bits" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA de 3072 bits" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA de 4096 bits" }, "sshKeyGenerated": { "message": "Uma nova chave SSH foi gerada" }, "sshKeyWrongPassword": { - "message": "Sua senha está incorreta." + "message": "A senha que você digitou está incorreta." }, "importSshKey": { "message": "Importar" }, "confirmSshKeyPassword": { - "message": "Confirme a senha" + "message": "Confirmar senha" }, "enterSshKeyPasswordDesc": { "message": "Digite a senha para a chave SSH." }, "enterSshKeyPassword": { - "message": "Insira sua senha" + "message": "Digite a sua senha" }, "sshAgentUnlockRequired": { - "message": "Por favor, desbloqueie seu cofre para aprovar a solicitação de chave SSH." + "message": "Desbloqueie seu cofre para aprovar a solicitação de chave SSH." }, "sshAgentUnlockTimeout": { "message": "Solicitação de chave SSH expirada." }, "enableSshAgent": { - "message": "Habilitar SSH agent" + "message": "Ativar agente SSH" }, "enableSshAgentDesc": { - "message": "Permitir que o agente SSH assine solicitações SSH diretamente do seu cofre Bitwarden." + "message": "Ative o agente SSH para assinar solicitações SSH diretamente do seu cofre Bitwarden." }, "enableSshAgentHelp": { "message": "O agente SSH é um serviço direcionado a desenvolvedores que permite que você assine solicitações SSH diretamente do seu cofre do Bitwarden." }, "sshAgentPromptBehavior": { - "message": "Solicitar autorização ao usar o agente SSH" + "message": "Pedir autorização ao usar o agente SSH" }, "sshAgentPromptBehaviorDesc": { - "message": "Defina como lidar com as solicitações de autorização do agente-SSH." + "message": "Escolha como lidar com as solicitações de autorização do agente SSH." }, "sshAgentPromptBehaviorHelp": { "message": "Lembrar das autorizações de SSH" @@ -259,7 +259,7 @@ "message": "Nunca" }, "sshAgentPromptBehaviorRememberUntilLock": { - "message": "Lembrar até o repositório estar trancado" + "message": "Lembrar até que o cofre seja bloqueado" }, "premiumRequired": { "message": "Requer Assinatura Premium" @@ -277,10 +277,10 @@ "message": "Erro ao descriptografar" }, "couldNotDecryptVaultItemsBelow": { - "message": "O Bitwarden não pode descriptografar o(s) item(ns) do cofre listado abaixo." + "message": "O Bitwarden não pode descriptografar o(s) item(ns) do cofre listados abaixo." }, "contactCSToAvoidDataLossPart1": { - "message": "Contato com o cliente feito com sucesso", + "message": "Contatar sucesso do cliente", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -340,16 +340,16 @@ "message": "Sra" }, "mx": { - "message": "Mx" + "message": "Sre" }, "dr": { "message": "Dr" }, "expirationMonth": { - "message": "Mês de Vencimento" + "message": "Mês de vencimento" }, "expirationYear": { - "message": "Ano de Vencimento" + "message": "Ano de vencimento" }, "select": { "message": "Selecionar" @@ -361,13 +361,13 @@ "message": "Tipo" }, "firstName": { - "message": "Primeiro Nome" + "message": "Primeiro nome" }, "middleName": { - "message": "Nome do Meio" + "message": "Nome do meio" }, "lastName": { - "message": "Último Nome" + "message": "Sobrenome" }, "fullName": { "message": "Nome completo" @@ -388,7 +388,7 @@ "message": "Estado / Província" }, "zipPostalCode": { - "message": "CEP / Código Postal" + "message": "CEP / Código postal" }, "country": { "message": "País" @@ -409,10 +409,10 @@ "message": "Editar" }, "authenticatorKeyTotp": { - "message": "Chave de Autenticação (TOTP)" + "message": "Chave de autenticação (TOTP)" }, "authenticatorKey": { - "message": "Chave de autenticação" + "message": "Chave do autenticador" }, "autofillOptions": { "message": "Opções de preenchimento automático" @@ -437,7 +437,7 @@ "message": "Adicionar site" }, "deleteWebsite": { - "message": "Deletar site" + "message": "Apagar site" }, "owner": { "message": "Proprietário" @@ -449,13 +449,13 @@ "message": "Editar campo" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Tem certeza de que deseja deletar permanentemente esse anexo?" + "message": "Tem certeza que quer apagar este anexo para sempre?" }, "fieldType": { "message": "Tipo do campo" }, "fieldLabel": { - "message": "Rótulo de campo" + "message": "Rótulo do campo" }, "add": { "message": "Adicionar" @@ -467,19 +467,19 @@ "message": "Use campos ocultos para dados sensíveis como senhas" }, "checkBoxHelpText": { - "message": "Use caixas de seleção caso deseje preencher automaticamente as caixas de seleção de um formulário, como um email de lembrete" + "message": "Use caixas de seleção caso deseje preencher automaticamente as caixas de seleção de um formulário, como um e-mail de lembrete" }, "linkedHelpText": { - "message": "Use um campo vinculado quando você estiver experienciando problemas de preenchimento automático para um site específico." + "message": "Use um campo vinculado quando você estiver experienciando problemas de preenchimento automático em um site específico." }, "linkedLabelHelpText": { - "message": "Digite o ID html, nome, rótulo acessível (aria-label), ou espaço reservado do campo." + "message": "Digite o ID html, nome, aria-label, ou placeholder do campo." }, "folder": { "message": "Pasta" }, "newCustomField": { - "message": "Novo Campo Personalizado" + "message": "Novo campo personalizado" }, "value": { "message": "Valor" @@ -517,13 +517,13 @@ "message": "Item adicionado" }, "editedItem": { - "message": "Item editado" + "message": "Item salvo" }, "deleteItem": { - "message": "Excluir Item" + "message": "Apagar item" }, "deleteFolder": { - "message": "Excluir Pasta" + "message": "Apagar pasta" }, "deleteAttachment": { "message": "Excluir Anexo" @@ -532,29 +532,29 @@ "message": "Você realmente deseja enviar para a lixeira?" }, "deletedItem": { - "message": "Item excluído" + "message": "Item enviado para a lixeira" }, "overwritePasswordConfirmation": { "message": "Você tem certeza que deseja substituir a senha atual?" }, "overwriteUsername": { - "message": "Sobrescrever usuário" + "message": "Sobrescrever nome de usuário" }, "overwriteUsernameConfirmation": { - "message": "Tem certeza que deseja substituir o usuário atual?" + "message": "Tem certeza que quer substituir o nome de usuário atual?" }, "noneFolder": { "message": "Nenhuma Pasta", "description": "This is the folder for uncategorized items" }, "addFolder": { - "message": "Adicionar Pasta" + "message": "Adicionar pasta" }, "editFolder": { - "message": "Editar Pasta" + "message": "Editar pasta" }, "regeneratePassword": { - "message": "Gerar Nova Senha" + "message": "Gerar nova senha" }, "copyPassword": { "message": "Copiar Senha" @@ -573,7 +573,7 @@ "message": "Copiar URI" }, "copyVerificationCodeTotp": { - "message": "Copiar Código de Verificação (TOTP)" + "message": "Copiar código de verificação (TOTP)" }, "copyFieldCipherName": { "message": "Copiar $FIELD$, $CIPHERNAME$", @@ -593,7 +593,7 @@ "message": "Comprimento" }, "passwordMinLength": { - "message": "Tamanho mínimo da senha" + "message": "Comprimento mínimo da senha" }, "uppercase": { "message": "Maiúsculas (A-Z)", @@ -659,14 +659,14 @@ "message": "Fechar" }, "minNumbers": { - "message": "Números Mínimos" + "message": "Mínimo de números" }, "minSpecial": { - "message": "Especiais Mínimos", + "message": "Mínimo de caracteres especiais", "description": "Minimum Special Characters" }, "ambiguous": { - "message": "Evitar Caracteres Ambíguos", + "message": "Evitar caracteres ambíguos", "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { @@ -691,16 +691,16 @@ "description": "Search item type" }, "newAttachment": { - "message": "Adicionar Novo Anexo" + "message": "Adicionar novo anexo" }, "deletedAttachment": { - "message": "Anexo excluído" + "message": "Anexo apagado" }, "deleteAttachmentConfirmation": { "message": "Tem certeza que deseja excluir esse anexo?" }, "attachmentSaved": { - "message": "O anexo foi salvo." + "message": "Anexo salvo" }, "addAttachment": { "message": "Adicionar anexo" @@ -712,13 +712,13 @@ "message": "Arquivo" }, "selectFile": { - "message": "Selecione um arquivo." + "message": "Selecione um arquivo" }, "maxFileSize": { "message": "O tamanho máximo do arquivo é de 500 MB." }, "legacyEncryptionUnsupported": { - "message": "A criptografia legada não é mais suportada. Por favor, contate o suporte para recuperar a sua conta." + "message": "A criptografia legada não é mais suportada. Entre em contato com o suporte para recuperar a sua conta." }, "editedFolder": { "message": "Pasta editada" @@ -730,13 +730,13 @@ "message": "Você tem certeza que deseja excluir esta pasta?" }, "deletedFolder": { - "message": "Pasta excluída" + "message": "Pasta apagada" }, "loginOrCreateNewAccount": { "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." }, "createAccount": { - "message": "Criar Conta" + "message": "Criar conta" }, "newToBitwarden": { "message": "Novo no Bitwarden?" @@ -751,31 +751,31 @@ "message": "Iniciar sessão" }, "logInToBitwarden": { - "message": "Inicie a sessão no Bitwarden" + "message": "Entre no Bitwarden" }, "enterTheCodeSentToYourEmail": { "message": "Digite o código enviado por e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Insira o código do seu aplicativo autenticador" + "message": "Digite o código do seu aplicativo autenticador" }, "pressYourYubiKeyToAuthenticate": { - "message": "Pressione seu YubiKey para autenticar" + "message": "Pressione sua YubiKey para autenticar-se" }, "logInWithPasskey": { - "message": "Iniciar sessão com a chave de acesso" + "message": "Entrar com chave de acesso" }, "loginWithDevice": { - "message": "Fazer login com dispositivo" + "message": "Entrar com dispositivo" }, "useSingleSignOn": { - "message": "Usar login único" + "message": "Usar autenticação única" }, "submit": { "message": "Enviar" }, "masterPass": { - "message": "Senha Mestra" + "message": "Senha mestra" }, "masterPassDesc": { "message": "A senha mestra é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha mestra. Não há maneira de recuperar a senha caso você se esqueça." @@ -784,10 +784,10 @@ "message": "Uma dica de senha mestra pode ajudá-lo(a) a lembrá-lo(a) caso você esqueça." }, "reTypeMasterPass": { - "message": "Digite Novamente a Senha Mestra" + "message": "Digite novamente a senha mestra" }, "masterPassHint": { - "message": "Dica da Senha Mestra (opcional)" + "message": "Dica da senha mestra (opcional)" }, "masterPassHintText": { "message": "Se você esquecer sua senha, a dica da senha pode ser enviada ao seu e-mail. $CURRENT$/$MAXIMUM$ caracteres máximos.", @@ -803,16 +803,16 @@ } }, "masterPassword": { - "message": "Senha mestra" + "message": "Senha mestre" }, "masterPassImportant": { - "message": "Sua senha mestra não pode ser recuperada se você a esquecer!" + "message": "Sua senha mestre não pode ser recuperada se você a esquecer!" }, "confirmMasterPassword": { - "message": "Confirme a senha mestra" + "message": "Confirme a senha mestre" }, "masterPassHintLabel": { - "message": "Dica da senha mestra" + "message": "Dica da senha mestre" }, "passwordStrengthScore": { "message": "Pontuação de força da senha $SCORE$", @@ -827,7 +827,7 @@ "message": "Juntar-se à organização" }, "joinOrganizationName": { - "message": "Entrar em $ORGANIZATIONNAME$", + "message": "Juntar-se à $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -836,19 +836,19 @@ } }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Termine de juntar-se nessa organização definindo uma senha mestra." + "message": "Termine de juntar-se à esta organização definindo uma senha mestra." }, "settings": { "message": "Configurações" }, "accountEmail": { - "message": "Email da conta" + "message": "E-mail da conta" }, "requestHint": { - "message": "Pedir dica" + "message": "Solicitar dica" }, "requestPasswordHint": { - "message": "Dica da senha mestra" + "message": "Dica da senha mestre" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" @@ -863,13 +863,13 @@ "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A senha mestra é obrigatória." + "message": "A senha mestre é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "É necessário redigitar a senha mestra." + "message": "É necessário redigitar a senha mestre." }, "masterPasswordMinlength": { - "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", + "message": "A senha mestre deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -879,7 +879,7 @@ } }, "youSuccessfullyLoggedIn": { - "message": "Você logou na sua conta com sucesso" + "message": "Você entrou na sua conta com sucesso" }, "youMayCloseThisWindow": { "message": "Você pode fechar esta janela" @@ -894,7 +894,7 @@ "message": "Sua nova conta foi criada!" }, "youHaveBeenLoggedIn": { - "message": "Você está conectado!" + "message": "Você entrou!" }, "masterPassSent": { "message": "Enviamos um e-mail com a dica da sua senha mestra." @@ -903,7 +903,7 @@ "message": "Ocorreu um erro inesperado." }, "itemInformation": { - "message": "Informação do Item" + "message": "Informações do item" }, "noItemsInList": { "message": "Não há itens para listar." @@ -918,7 +918,7 @@ "message": "Código enviado" }, "verificationCode": { - "message": "Código de Verificação" + "message": "Código de verificação" }, "confirmIdentity": { "message": "Confirme a sua identidade para continuar." @@ -927,10 +927,10 @@ "message": "Requer o código de verificação." }, "webauthnCancelOrTimeout": { - "message": "A autenticação foi cancelada ou demorou muito. Por favor tente novamente." + "message": "A autenticação foi cancelada ou demorou muito. Tente novamente." }, "openInNewTab": { - "message": "Abrir numa nova aba" + "message": "Abrir em uma nova aba" }, "invalidVerificationCode": { "message": "Código de verificação inválido" @@ -961,13 +961,13 @@ "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." }, "recoveryCodeTitle": { - "message": "Código de Recuperação" + "message": "Código de recuperação" }, "authenticatorAppTitle": { - "message": "Aplicativo de Autenticação" + "message": "Aplicativo autenticador" }, "authenticatorAppDescV2": { - "message": "Insira um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", + "message": "Digite um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { @@ -977,7 +977,7 @@ "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." }, "duoDescV2": { - "message": "Insira um código gerado pelo Duo Security.", + "message": "Digite um código gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -991,7 +991,7 @@ "message": "Não reconhecemos este dispositivo. Digite o código enviado por e-mail para verificar a sua identidade." }, "continueLoggingIn": { - "message": "Continue acessando" + "message": "Continuar acessando" }, "webAuthnTitle": { "message": "WebAuthn FIDO2" @@ -1006,19 +1006,19 @@ "message": "Digite o código enviado para seu e-mail." }, "loginUnavailable": { - "message": "Sessão Indisponível" + "message": "Autenticação indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem a autenticação por duas etapas ativado, no entanto, nenhum dos provedores de início de sessão em duas etapas configurados são suportados por este dispositivo." + "message": "Esta conta tem a autenticação por duas etapas ativada, no entanto, nenhum dos provedores de autenticação em duas etapas configurados são suportados por este dispositivo." }, "noTwoStepProviders2": { "message": "Por favor inclua provedores adicionais que são melhor suportados entre dispositivos (como um aplicativo de autenticação)." }, "twoStepOptions": { - "message": "Opções de Login em Duas Etapas" + "message": "Opções de autenticação em duas etapas" }, "selectTwoStepLoginMethod": { - "message": "Selecionar método de login em duas etapas" + "message": "Selecionar método de autenticação em duas etapas" }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" @@ -1033,7 +1033,7 @@ "message": "Você deve adicionar um URL do servidor de base ou pelo menos um ambiente personalizado." }, "customEnvironment": { - "message": "Ambiente Personalizado" + "message": "Ambiente personalizado" }, "baseUrl": { "message": "URL do Servidor" @@ -1042,29 +1042,29 @@ "message": "Tempo de autenticação esgotado" }, "authenticationSessionTimedOut": { - "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de login." + "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." }, "selfHostBaseUrl": { - "message": "URL do servidor auto-host", + "message": "URL do servidor auto-hospedado", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { - "message": "URL do Servidor da API" + "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "URL do Servidor do Cofre Web" + "message": "URL do servidor do cofre web" }, "identityUrl": { - "message": "URL do Servidor de Identidade" + "message": "URL do servidor de identidade" }, "notificationsUrl": { "message": "URL do servidor de notificações" }, "iconsUrl": { - "message": "URL do Servidor de Ícones" + "message": "URL do servidor de ícones" }, "environmentSaved": { - "message": "As URLs de ambiente foram salvas" + "message": "URLs de ambiente salvos" }, "ok": { "message": "Ok" @@ -1079,13 +1079,13 @@ "message": "Localização" }, "overwritePassword": { - "message": "Substituir Senha" + "message": "Sobrescrever senha" }, "learnMore": { "message": "Saber mais" }, "featureUnavailable": { - "message": "Recurso Indisponível" + "message": "Recurso indisponível" }, "loggedOut": { "message": "Sessão encerrada" @@ -1097,13 +1097,13 @@ "message": "A sua sessão expirou." }, "restartRegistration": { - "message": "Reiniciar registro" + "message": "Reiniciar cadastro" }, "expiredLink": { "message": "Link expirado" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Por favor, reinicie o registro ou tente fazer login." + "message": "Reinicie o cadastro ou tente conectar-se." }, "youMayAlreadyHaveAnAccount": { "message": "Você pode já ter uma conta" @@ -1115,10 +1115,10 @@ "message": "Encerrar a Sessão" }, "addNewLogin": { - "message": "Adicionar Nova Credencial" + "message": "Nova credencial" }, "addNewItem": { - "message": "Adicionar Novo Item" + "message": "Novo item" }, "view": { "message": "Ver" @@ -1133,19 +1133,19 @@ "message": "Bloquear cofre" }, "passwordGenerator": { - "message": "Gerador de Senha" + "message": "Gerador de senha" }, "contactUs": { - "message": "Fale Conosco" + "message": "Contate-nos" }, "helpAndFeedback": { - "message": "Ajuda e feedback" + "message": "Ajuda e retorno" }, "getHelp": { - "message": "Obter Ajuda" + "message": "Receber ajuda" }, "fileBugReport": { - "message": "Relate um bug" + "message": "Reportar um bug" }, "blog": { "message": "Blog" @@ -1154,16 +1154,16 @@ "message": "Siga-nos" }, "syncVault": { - "message": "Sincronizar Cofre" + "message": "Sincronizar cofre" }, "changeMasterPass": { - "message": "Alterar Senha Mestra" + "message": "Alterar senha mestra" }, "continueToWebApp": { - "message": "Continuar no aplicativo web?" + "message": "Continuar no app web?" }, "changeMasterPasswordOnWebConfirmation": { - "message": "Você pode alterar a sua senha mestra no aplicativo web Bitwarden." + "message": "Você pode alterar a sua senha mestre no app web Bitwarden." }, "fingerprintPhrase": { "message": "Frase biométrica", @@ -1177,10 +1177,10 @@ "message": "Ir para o Cofre Web" }, "getMobileApp": { - "message": "Obter o aplicativo para celular" + "message": "Baixar o app para celular" }, "getBrowserExtension": { - "message": "Obter a extensão de navegador" + "message": "Baixar a extensão para navegador" }, "syncingComplete": { "message": "Sincronização completada" @@ -1198,10 +1198,10 @@ "message": "ou" }, "unlockWithBiometrics": { - "message": "Desbloquear com a biometria" + "message": "Desbloquear com biometria" }, "unlockWithMasterPassword": { - "message": "Desbloquear com a senha mestra" + "message": "Desbloquear com senha mestre" }, "unlock": { "message": "Desbloquear" @@ -1223,7 +1223,7 @@ "message": "Senha mestra inválida" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Senha mestre inválida. Confirme que seu e-mail está correto e sua conta foi criada em $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1232,7 +1232,7 @@ } }, "twoStepLoginConfirmation": { - "message": "A autenticação em duas etapas torna sua conta mais segura, exigindo que você verifique o seu login com outro dispositivo, como uma chave de segurança, um aplicativo de autenticação, SMS, chamada telefônica ou e-mail. A autenticação em duas etapas pode ser ativada no cofre web em bitwarden.com. Você deseja visitar o site agora?" + "message": "A autenticação em duas etapas torna sua conta mais segura, exigindo que você verifique o seu login com outro dispositivo, como uma chave de segurança, um aplicativo autenticador, SMS, chamada telefônica ou e-mail. A autenticação em duas etapas pode ser ativada no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "twoStepLogin": { "message": "Autenticação em duas etapas" @@ -1241,13 +1241,13 @@ "message": "Tempo limite do cofre" }, "vaultTimeout": { - "message": "Tempo Limite do Cofre" + "message": "Tempo limite do cofre" }, "vaultTimeout1": { - "message": "Tempo esgotado" + "message": "Tempo limite" }, "vaultTimeoutAction1": { - "message": "Tempo limite de ação" + "message": "Ação do tempo limite" }, "vaultTimeoutDesc": { "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e execute a ação selecionada." @@ -1286,16 +1286,16 @@ "message": "4 horas" }, "onIdle": { - "message": "Quando o sistema está inativo" + "message": "Quando o sistema ficar inativo" }, "onSleep": { "message": "Quando o sistema hibernar" }, "onLocked": { - "message": "Quando o Sistema estiver Bloqueado" + "message": "Quando o sistema estiver bloqueado" }, "onRestart": { - "message": "Ao Reiniciar" + "message": "Ao reiniciar" }, "never": { "message": "Nunca" @@ -1312,7 +1312,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostrar ícones de sites e obter URLs de alteração de senha" }, "enableMinToTray": { "message": "Minimizar para ícone da bandeja" @@ -1327,7 +1327,7 @@ "message": "Ao minimizar a janela, mostra um ícone na barra de menus." }, "enableCloseToTray": { - "message": "Fechar para a área de notificações" + "message": "Fechar para ícone da bandeja" }, "enableCloseToTrayDesc": { "message": "Ao fechar a janela, mostra um ícone na bandeja do sistema." @@ -1339,13 +1339,13 @@ "message": "Ao fechar a janela, mostra um ícone na barra de menu." }, "enableTray": { - "message": "Ativar Ícone de Bandeja" + "message": "Ativar icone da bandeja" }, "enableTrayDesc": { "message": "Sempre mostrar um ícone na bandeja do sistema." }, "startToTray": { - "message": "Iniciar para o Ícone da Bandeja" + "message": "Iniciar no ícone da bandeja" }, "startToTrayDesc": { "message": "Quando o aplicativo for iniciado, apenas mostrar um ícone na bandeja do sistema." @@ -1360,7 +1360,7 @@ "message": "Iniciar automaticamente ao iniciar sessão" }, "openAtLoginDesc": { - "message": "Inicie o aplicativo Bitwarden Desktop automaticamente no login." + "message": "Inicie o aplicativo Bitwarden Desktop automaticamente junto com o usuário." }, "alwaysShowDock": { "message": "Exibir sempre na Dock" @@ -1369,7 +1369,7 @@ "message": "Mostrar o ícone do Bitwarden na Dock, mesmo quando minimizado para a barra de menu." }, "confirmTrayTitle": { - "message": "Confirmar desativação da bandeja" + "message": "Confirmar ocultamento da bandeja" }, "confirmTrayDesc": { "message": "Desativar esta configuração também desativará todas as outras configurações relacionadas à bandeja." @@ -1399,7 +1399,7 @@ "description": "Copy to clipboard" }, "checkForUpdates": { - "message": "Verificar por atualizações…" + "message": "Conferir se há atualizações…" }, "version": { "message": "Versão $VERSION_NUM$", @@ -1411,7 +1411,7 @@ } }, "restartToUpdate": { - "message": "Reiniciar para Atualizar" + "message": "Reinicie para atualizar" }, "restartToUpdateDesc": { "message": "A versão $VERSION_NUM$ está pronta para ser instalada. Você deve reiniciar o Bitwarden para completar a instalação. Você quer reiniciar e atualizar agora?", @@ -1423,7 +1423,7 @@ } }, "updateAvailable": { - "message": "Atualização Disponível" + "message": "Atualização disponível" }, "updateAvailableDesc": { "message": "Uma atualização foi encontrada. Você quer baixá-la agora?" @@ -1444,17 +1444,17 @@ "message": "Desconhecido" }, "copyUsername": { - "message": "Copiar Nome de Usuário" + "message": "Copiar nome de usuário" }, "copyNumber": { - "message": "Copiar Número", + "message": "Copiar número", "description": "Copy credit card number" }, "copyEmail": { "message": "Copiar e-mail" }, "copySecurityCode": { - "message": "Copiar Código de Segurança", + "message": "Copiar código de segurança", "description": "Copy credit card security code (CVV)" }, "cardNumber": { @@ -1464,25 +1464,25 @@ "message": "Assinatura Premium" }, "premiumManage": { - "message": "Gerenciar Plano" + "message": "Gerenciar assinatura" }, "premiumManageAlert": { "message": "Você pode gerenciar a sua assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "premiumRefresh": { - "message": "Atualizar Assinatura" + "message": "Recarregar assinatura" }, "premiumNotCurrentMember": { "message": "Você não possui uma assinatura Premium." }, "premiumSignUpAndGet": { - "message": "Registe-se para uma assinatura premium e obtenha:" + "message": "Inscreva-se para uma assinatura Premium e receba:" }, "premiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." }, "premiumSignUpTwoStepOptions": { - "message": "Opções de login em duas etapas como YubiKey e Duo." + "message": "Opções de autenticação em duas etapas como YubiKey e Duo." }, "premiumSignUpReports": { "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." @@ -1530,7 +1530,7 @@ "message": "Limpar histórico do gerador" }, "cleargGeneratorHistoryDescription": { - "message": "Se continuar, todas as entradas serão permanentemente excluídas do histórico do gerador. Tem certeza que deseja continuar?" + "message": "Se continuar, todos os itens serão apagados para sempre do histórico do gerador. Tem certeza que deseja continuar?" }, "clear": { "message": "Limpar", @@ -1546,7 +1546,7 @@ "message": "Nada para mostrar" }, "nothingGeneratedRecently": { - "message": "Você não gerou uma senha recentemente" + "message": "Você não gerou nada recentemente" }, "undo": { "message": "Desfazer" @@ -1563,7 +1563,7 @@ "description": "Paste from clipboard" }, "selectAll": { - "message": "Selecionar Tudo" + "message": "Selecionar tudo" }, "zoomIn": { "message": "Ampliar" @@ -1572,16 +1572,16 @@ "message": "Reduzir" }, "resetZoom": { - "message": "Redefinir Zoom" + "message": "Redefinir zoom" }, "toggleFullScreen": { - "message": "Alternar para Tela Cheia" + "message": "Habilitar tela cheia" }, "reload": { "message": "Recarregar" }, "toggleDevTools": { - "message": "Alternar ferramentas de desenvolvedor" + "message": "Habilitar ferramentas de desenvolvedor" }, "minimize": { "message": "Minimizar", @@ -1591,7 +1591,7 @@ "message": "Zoom" }, "bringAllToFront": { - "message": "Trazer Tudo para a Frente", + "message": "Trazer tudo para a frente", "description": "Bring all windows to front (foreground)" }, "aboutBitwarden": { @@ -1604,10 +1604,10 @@ "message": "Ocultar o Bitwarden" }, "hideOthers": { - "message": "Ocultar Outros" + "message": "Ocultar outros" }, "showAll": { - "message": "Mostrar Todos" + "message": "Mostrar todos" }, "quitBitwarden": { "message": "Sair do Bitwarden" @@ -1626,7 +1626,7 @@ "message": "Copiado com sucesso" }, "errorRefreshingAccessToken": { - "message": "Erro ao Atualizar Token" + "message": "Erro ao acessar token de recarregamento" }, "errorRefreshingAccessTokenDesc": { "message": "Nenhum token de atualização ou chave de API foi encontrado. Tente sair e entrar novamente." @@ -1657,7 +1657,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Nome do Domínio", + "message": "Nome do domínio", "description": "Domain name. Ex. website.com" }, "host": { @@ -1675,7 +1675,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Deteção de correspondência", + "message": "Detecção de correspondência", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1683,7 +1683,7 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Alternar Opções" + "message": "Habilitar opções" }, "organization": { "message": "Organização", @@ -1700,10 +1700,10 @@ "description": "Text for a button that toggles the visibility of the window. Shows the window when it is hidden or hides the window if it is currently open." }, "hideToTray": { - "message": "Ocultar para a área de notificações" + "message": "Ocultar para a bandeja" }, "alwaysOnTop": { - "message": "Sempre no Topo", + "message": "Sempre acima", "description": "Application window should always stay on top of other windows" }, "dateUpdated": { @@ -1737,7 +1737,7 @@ "message": "Esta senha será usada para exportar e importar este arquivo" }, "accountRestrictedOptionDescription": { - "message": "Use sua chave criptográfica da conta, derivada do nome de usuário e Senha Mestra da sua conta, para criptografar a exportação e restringir importação para apenas a conta atual do Bitwarden." + "message": "Use a chave de criptografia da sua conta, derivada do nome de usuário e senha mestre da sua conta, para criptografar a exportação e restringir a importação para apenas a conta atual do Bitwarden." }, "passwordProtected": { "message": "Protegido por senha" @@ -1749,26 +1749,26 @@ "message": "Tipo da exportação" }, "accountRestricted": { - "message": "Conta restrita" + "message": "Restrita à conta" }, "restrictCardTypeImport": { - "message": "Não é possível importar os tipos de item cartão" + "message": "Não é possível importar tipos de item de cartão" }, "restrictCardTypeImportDesc": { - "message": "Uma política definida por 1 ou mais organizações impedem que você importe cartões dos seus repositórios." + "message": "Uma política definida por 1 ou mais organizações impedem que você importe cartões em seus cofres." }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "\"Senha do arquivo\" e \"Confirmação de senha\" não correspondem." + "message": "\"Senha do arquivo\" e \"Confirmar senha do arquivo\" não correspondem." }, "done": { - "message": "Concluído" + "message": "Pronto" }, "warning": { "message": "AVISO", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirmar Exportação do Cofre" + "message": "Confirmar exportação do cofre" }, "exportWarningDesc": { "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo." @@ -1853,22 +1853,22 @@ "message": "Bloquear com senha mestra ao reiniciar" }, "deleteAccount": { - "message": "Excluir conta" + "message": "Apagar conta" }, "deleteAccountDesc": { - "message": "Prossiga abaixo para excluir a sua conta e todos os dados associados." + "message": "Prossiga abaixo para apagar sua conta e todos os dados do cofre." }, "deleteAccountWarning": { - "message": "A exclusão de sua conta é permanente. Não poderá ser desfeito." + "message": "O apagamento de sua conta é permanente. Não pode ser desfeito." }, "cannotDeleteAccount": { - "message": "Não é possível excluir conta" + "message": "Não é possível apagar a conta" }, "cannotDeleteAccountDesc": { "message": "Esta ação não pode ser concluída porque sua conta pertence a uma organização. Entre em contato com o administrador da sua organização para obter mais detalhes." }, "accountDeleted": { - "message": "Conta excluída" + "message": "Conta apagada" }, "accountDeletedDesc": { "message": "A sua conta foi fechada e todos os dados associados foram excluídos." @@ -1877,19 +1877,19 @@ "message": "Preferências" }, "enableMenuBar": { - "message": "Ativar Ícone da Barra de Menu" + "message": "Ativar ícone da barra de menu" }, "enableMenuBarDesc": { "message": "Sempre mostrar um ícone na barra de menu." }, "hideToMenuBar": { - "message": "Ocultar para a Barra de Menu" + "message": "Ocultar para a barra de menu" }, "selectOneCollection": { "message": "Você deve selecionar pelo menos uma coleção." }, "premiumUpdated": { - "message": "Você atualizou para premium." + "message": "Você fez upgrade para o Premium." }, "restore": { "message": "Restaurar" @@ -1911,7 +1911,7 @@ "message": "Você tem certeza que deseja sair? Se sair agora, as suas informações atuais não serão salvas." }, "unsavedChangesTitle": { - "message": "Alterações não Salvas" + "message": "Alterações não salvas" }, "clone": { "message": "Clonar" @@ -1920,16 +1920,16 @@ "message": "Uma ou mais políticas da organização estão afetando as suas configurações do gerador." }, "vaultTimeoutAction": { - "message": "Ação de Tempo Limite do Cofre" + "message": "Ação do tempo limite do cofre" }, "vaultTimeoutActionLockDesc": { - "message": "Um cofre bloqueado requer que você reinsira a sua senha mestra para entrar novamente." + "message": "A senha mestre ou outro método de desbloqueio é necessário para acessar seu cofre novamente." }, "vaultTimeoutActionLogOutDesc": { - "message": "Uma sessão encerrada com o cofre requer que você autentique-se novamente para acessá-lo de novo." + "message": "Reautenticação é necessária para acessar seu cofre novamente." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Configure um método de desbloqueio para alterar o tempo limite do cofre." + "message": "Configure um método de desbloqueio para alterar a ação do tempo limite do cofre." }, "lock": { "message": "Bloquear", @@ -1943,42 +1943,42 @@ "message": "Pesquisar na lixeira" }, "permanentlyDeleteItem": { - "message": "Excluir o Item Permanentemente" + "message": "Apagar item para sempre" }, "permanentlyDeleteItemConfirmation": { "message": "Você tem certeza que deseja excluir permanentemente esse item?" }, "permanentlyDeletedItem": { - "message": "Item Permanentemente Excluído" + "message": "Item apagado para sempre" }, "restoredItem": { - "message": "Item Restaurado" + "message": "Item restaurado" }, "permanentlyDelete": { - "message": "Excluir Permanentemente" + "message": "Apagar para sempre" }, "vaultTimeoutLogOutConfirmation": { "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de Ação de Tempo Limite" + "message": "Confirmação de ação do tempo limite" }, "enterpriseSingleSignOn": { - "message": "Iniciar Sessão Empresarial Única" + "message": "Autenticação única empresarial" }, "setMasterPassword": { - "message": "Definir Senha Mestra" + "message": "Configurar senha mestre" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "As permissões da sua organização foram atualizadas, exigindo que você defina uma senha mestra.", + "message": "As permissões da sua organização foram atualizadas, exigindo que você defina uma senha mestre.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Sua organização requer que você defina uma senha mestra.", + "message": "Sua organização requer que você defina uma senha mestre.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "fora do $TOTAL$", + "message": "dos $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -1990,7 +1990,7 @@ "message": "Detalhes do cartão" }, "cardBrandDetails": { - "message": "$BRAND$ Detalhes", + "message": "Detalhes da $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -1999,13 +1999,13 @@ } }, "learnMoreAboutAuthenticators": { - "message": "Aprenda mais sobre autenticadores" + "message": "Saiba mais sobre autenticadores" }, "copyTOTP": { - "message": "Copiar a chave de autenticação (TOTP)" + "message": "Copiar chave do autenticador (TOTP)" }, "totpHelperTitle": { - "message": "Tornar a verificação em 2 etapas mais simples" + "message": "Torne a verificação em 2 etapas mais simples" }, "totpHelper": { "message": "Bitwarden pode armazenar e preencher códigos de verificação de 2 etapas. Copie e cole a chave nesse campo." @@ -2021,7 +2021,7 @@ "message": "Organizações gratuitas não podem utilizar anexos" }, "singleFieldNeedsAttention": { - "message": "1 campo precisa da sua atenção." + "message": "Um campo precisa da sua atenção." }, "multipleFieldsNeedAttention": { "message": "$COUNT$ campos precisam da sua atenção.", @@ -2043,13 +2043,13 @@ "description": "Default title for the user verification dialog." }, "currentMasterPass": { - "message": "Senha mestra atual" + "message": "Senha mestre atual" }, "newMasterPass": { - "message": "Nova Senha Mestra" + "message": "Nova senha mestra" }, "confirmNewMasterPass": { - "message": "Confirme a Nova Senha Mestra" + "message": "Confirmar nova senha mestra" }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" @@ -2094,10 +2094,10 @@ "message": "A sua nova senha mestra não cumpre aos requisitos da política." }, "receiveMarketingEmailsV2": { - "message": "Obtenha conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." + "message": "Receba conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." }, "unsubscribe": { - "message": "Cancelar subscrição" + "message": "Desinscreva-se" }, "atAnyTime": { "message": "a qualquer momento." @@ -2115,25 +2115,25 @@ "message": "Os Termos de Serviço e a Política de Privacidade não foram aceitos." }, "enableBrowserIntegration": { - "message": "Ativar integração com o navegador" + "message": "Permitir integração com o navegador" }, "enableBrowserIntegrationDesc1": { - "message": "Usado para permitir desbloqueio biométrico em navegadores que não são Safari." + "message": "Usado para permitir desbloqueio biométrico em navegadores que não são o Safari." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Permitir integração ao navegador DuckDuckGo" + "message": "Permitir integração com o navegador DuckDuckGo" }, "enableDuckDuckGoBrowserIntegrationDesc": { "message": "Use o seu cofre do Bitwarden ao navegar com DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { - "message": "Integração com o navegador não suportado" + "message": "Integração com o navegador não suportada" }, "browserIntegrationErrorTitle": { "message": "Erro ao ativar a integração do navegador" }, "browserIntegrationErrorDesc": { - "message": "Ocorreu um erro ao permitir a integração do navegador." + "message": "Ocorreu um erro ao ativar a integração do navegador." }, "browserIntegrationMasOnlyDesc": { "message": "Infelizmente, por ora, a integração do navegador só é suportada na versão da Mac App Store." @@ -2142,19 +2142,19 @@ "message": "Infelizmente, a integração do navegador não é suportada na versão da Microsoft Store." }, "browserIntegrationLinuxDesc": { - "message": "Infelizmente, a integração do navegador não é suportada na versão linux." + "message": "Infelizmente, a integração do navegador não é suportada na versão linux no momento." }, "enableBrowserIntegrationFingerprint": { "message": "Exigir verificação para integração com o navegador" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Ative uma camada adicional de segurança, exigindo validação de frase de impressão digital ao estabelecer uma ligação entre o computador e o navegador. Quando ativado, isto requer intervenção do usuário e verificação cada vez que uma conexão é estabelecida." + "message": "Adicione uma camada adicional de segurança, exigindo validação de frase biométrica ao estabelecer uma ligação entre o computador e o navegador. Quando ativado, isto requer intervenção do usuário e verificação cada vez que uma conexão é estabelecida." }, "enableHardwareAcceleration": { "message": "Utilizar aceleração de hardware" }, "enableHardwareAccelerationDesc": { - "message": "Por padrão esta configuração está ativada. Desligar apenas se tiver problemas gráficos. Reiniciar é necessário." + "message": "Por padrão esta configuração está ativada. Desligue apenas se tiver problemas gráficos. Reiniciar é necessário." }, "approve": { "message": "Aprovar" @@ -2181,22 +2181,22 @@ "message": "Se não iniciou esta solicitação, não a aprove." }, "biometricsNotEnabledTitle": { - "message": "Biometria não ativada" + "message": "Biometria não configurada" }, "biometricsNotEnabledDesc": { - "message": "A biometria do navegador exige que a biometria do desktop seja configurada primeiro nas configurações." + "message": "A biometria do navegador exige que a biometria do computador seja configurada primeiro nas configurações." }, "biometricsManualSetupTitle": { "message": "Configuração automática não disponível" }, "biometricsManualSetupDesc": { - "message": "Devido ao método de instalação, o suporte a dados biométricos não pôde ser ativado automaticamente. Você gostaria de abrir a documentação sobre como fazer isso manualmente?" + "message": "Devido ao método de instalação, o suporte à biometria não pôde ser ativado automaticamente. Você gostaria de abrir a documentação sobre como fazer isso manualmente?" }, "personalOwnershipSubmitError": { - "message": "Devido a uma Política Empresarial, você está restrito de salvar itens para seu cofre pessoal. Altere a opção de Propriedade para uma organização e escolha entre as Coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Sua nova senha não pode ser a mesma que a sua atual." + "message": "Sua senha nova não pode ser a mesma que a sua atual." }, "hintEqualsPassword": { "message": "Sua dica de senha não pode ser o mesmo que sua senha." @@ -2205,7 +2205,7 @@ "message": "Uma política de organização está afetando suas opções de propriedade." }, "personalOwnershipPolicyInEffectImports": { - "message": "A política da organização bloqueou a importação de itens para o seu cofre." + "message": "Uma política da organização bloqueou a importação de itens em seu cofre pessoal." }, "personalDetails": { "message": "Detalhes pessoais" @@ -2235,27 +2235,27 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "myVault": { - "message": "Meu Cofre" + "message": "Meu cofre" }, "text": { "message": "Texto" }, "deletionDate": { - "message": "Data de Exclusão" + "message": "Data de apagamento" }, "deletionDateDesc": { "message": "O Send será eliminado permanentemente na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Data de Expiração" + "message": "Data de validade" }, "expirationDateDesc": { "message": "Se definido, o acesso a este Send expirará na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "Contagem Máxima de Acessos", + "message": "Número máximo de acessos", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "maxAccessCountDesc": { @@ -2263,10 +2263,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Contagem Atual de Acessos" + "message": "Número atual de acessos" }, "disableSend": { - "message": "Desative este envio para que ninguém possa acessá-lo.", + "message": "Desative este Send para que ninguém possa acessá-lo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { @@ -2282,7 +2282,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinkLabel": { - "message": "Enviar link", + "message": "Link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "textHiddenByDefault": { @@ -2290,26 +2290,26 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Envio adicionado", + "message": "Send adicionado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Envio salvo", + "message": "Send salvo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "Enviar excluído", + "message": "Send apagado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "Nova senha" + "message": "Senha nova" }, "whatTypeOfSend": { "message": "Que tipo de Send é este?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Novo envio", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -2345,7 +2345,7 @@ "message": "Copiar o link para compartilhar este Send para minha área de transferência ao salvar." }, "sendDisabled": { - "message": "Envio removido", + "message": "Send removido", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -2416,28 +2416,28 @@ "message": "Senha mestra atualizada" }, "updateMasterPassword": { - "message": "Atualizar Senha Mestra" + "message": "Atualizar senha mestre" }, "updateMasterPasswordWarning": { - "message": "Sua Senha Mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la 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." + "message": "Sua senha mestre foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você entre novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "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." + "message": "A sua senha mestre não atende a uma ou mais das políticas da sua organização. Para acessar o cofre, você deve atualizar a sua senha mestre 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." }, "changePasswordWarning": { "message": "Após mudar a sua senha, será necessário entrar novamente com a sua nova senha. Sessões ativas em outros dispositivos serão encerradas em até uma hora." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Mude a sua senha mestra para completar a recuperação de conta." + "message": "Mude a sua senha mestre para completar a recuperação de conta." }, "updateMasterPasswordSubtitle": { - "message": "Sua senha mestra não corresponde aos requerimentos da organização. Mude a sua senha mestra para continuar." + "message": "Sua senha mestre não corresponde aos requisitos da organização. Mude a sua senha mestre para continuar." }, "tdeDisabledMasterPasswordRequired": { - "message": "Sua organização desativou a criptografia confiável do dispositivo. Por favor, defina uma senha mestra para acessar o seu cofre." + "message": "Sua organização desativou a criptografia confiável do dispositivo. Defina uma senha mestra para acessar o seu cofre." }, "tryAgain": { - "message": "Tentar novamente" + "message": "Repetir" }, "verificationRequiredForActionSetPinToContinue": { "message": "Verificação necessária para esta ação. Defina um PIN para continuar." @@ -2446,7 +2446,7 @@ "message": "Definir PIN" }, "verifyWithBiometrics": { - "message": "Verificiar com biometria" + "message": "Verificar com biometria" }, "awaitingConfirmation": { "message": "Aguardando confirmação" @@ -2492,7 +2492,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "As políticas da sua organização estão afetando seu cofre tempo limite. Tempo limite máximo permitido para cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre é definida como $ACTION$.", + "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. O tempo limite máximo permitido para cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre é definida como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2509,7 +2509,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "As políticas da sua organização definiram a ação tempo limite do seu cofre para $ACTION$.", + "message": "As políticas da sua organização definiram a ação do tempo limite do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "O tempo limite personalizado mínimo é de 1 minuto." + }, "inviteAccepted": { "message": "Convite aceito" }, @@ -2559,19 +2562,19 @@ "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na redefinição de senha. A inscrição permitirá que os administradores da organização alterem sua senha mestra." }, "vaultExportDisabled": { - "message": "Exportação de Cofre Desativada" + "message": "Exportação de cofre removida" }, "personalVaultExportPolicyInEffect": { "message": "Uma ou mais políticas da organização impdem que você exporte seu cofre pessoal." }, "addAccount": { - "message": "Adicionar Conta" + "message": "Adicionar conta" }, "removeMasterPassword": { - "message": "Remover Senha Mestra" + "message": "Remover senha mestre" }, "removedMasterPassword": { - "message": "Senha mestra removida." + "message": "Senha mestre removida" }, "removeMasterPasswordForOrganizationUserKeyConnector": { "message": "Uma senha mestra não é mais necessária para membros da seguinte organização. Por favor, confirme o domínio abaixo com o administrador da sua organização." @@ -2580,10 +2583,10 @@ "message": "Nome da organização" }, "keyConnectorDomain": { - "message": "Chave de conexão do domínio" + "message": "Domínio do Conector de Chave" }, "leaveOrganization": { - "message": "Sair da Organização" + "message": "Sair da organização" }, "leaveOrganizationConfirmation": { "message": "Você tem certeza que deseja sair desta organização?" @@ -2592,10 +2595,10 @@ "message": "Você saiu da organização." }, "ssoKeyConnectorError": { - "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." + "message": "Erro do conector de chave: certifique-se de que o conector de chave está disponível e funcionando corretamente." }, "lockAllVaults": { - "message": "Bloquear Todos os Cofres" + "message": "Bloquear todos os cofres" }, "accountLimitReached": { "message": "Não mais do que 5 contas podem estar logadas ao mesmo tempo." @@ -2619,7 +2622,7 @@ } }, "switchAccount": { - "message": "Trocar de Conta" + "message": "Trocar de conta" }, "alreadyHaveAccount": { "message": "Já tem uma conta?" @@ -2628,13 +2631,13 @@ "message": "Opções" }, "sessionTimeout": { - "message": "Sua sessão expirou. Por favor, volte e tente iniciar a sessão novamente." + "message": "Sua sessão expirou. Volte e tente entrar novamente." }, "exportingPersonalVaultTitle": { - "message": "Exportação do Cofre Pessoal" + "message": "Exportando cofre individual" }, "exportingIndividualVaultDescription": { - "message": "Apenas os itens individuais do cofre associados a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas as informações de item do cofre serão exportadas e não incluirão anexos associados.", + "message": "Apenas os itens do cofre individual associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas as informações dos itens do cofre serão exportadas e não incluirão anexos associados.", "placeholders": { "email": { "content": "$1", @@ -2643,7 +2646,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Apenas os itens individuais do cofre, incluindo anexos associados ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", + "message": "Apenas os itens do cofre individual, incluindo anexos associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", "placeholders": { "email": { "content": "$1", @@ -2655,7 +2658,7 @@ "message": "Exportando cofre da organização" }, "exportingOrganizationVaultDesc": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre individual e itens de outras organizações não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -2664,7 +2667,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado.", "placeholders": { "organization": { "content": "$1", @@ -2673,7 +2676,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens da minhas coleções não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -2701,10 +2704,10 @@ "message": "Tipo de senha" }, "regenerateUsername": { - "message": "Gerar nome de usuário novamente" + "message": "Regenerar nome de usuário" }, "generateUsername": { - "message": "Gerar usuário" + "message": "Gerar nome de usuário" }, "generateEmail": { "message": "Gerar e-mail" @@ -2713,16 +2716,16 @@ "message": "Gerador de nome de usuário" }, "generatePassword": { - "message": "Gerar Senha" + "message": "Gerar senha" }, "generatePassphrase": { "message": "Gerar frase secreta" }, "passwordGenerated": { - "message": "Gerador de senhas" + "message": "Senha gerada" }, "passphraseGenerated": { - "message": "Gerador de palavra-passe" + "message": "Gerador de frase secreta" }, "usernameGenerated": { "message": "Nome de usuário gerado" @@ -2745,7 +2748,7 @@ } }, "passwordLengthRecommendationHint": { - "message": "", + "message": " Utilize $RECOMMENDED$ ou mais caracteres para gerar um senha forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2755,7 +2758,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Utilize as palavras $RECOMMENDED$ ou mais para gerar uma frase secreta forte.", + "message": " Utilize $RECOMMENDED$ ou mais palavras para gerar uma frase secreta forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2765,14 +2768,14 @@ } }, "usernameType": { - "message": "Tipo de usuário" + "message": "Tipo do nome de usuário" }, "plusAddressedEmail": { - "message": "Mais e-mail endereçado", + "message": "E-mail endereçado com +", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use os recursos de subendereçamento do seu provedor de e-mail." + "message": "Use os recursos de sub-endereçamento do seu provedor de e-mail." }, "catchallEmail": { "message": "E-mail pega-tudo" @@ -2787,7 +2790,7 @@ "message": "Use esta senha" }, "useThisPassphrase": { - "message": "Use essa palavra-passe" + "message": "Use esta frase secreta" }, "useThisUsername": { "message": "Use este nome de usuário" @@ -2805,16 +2808,16 @@ "message": "Serviço" }, "allVaults": { - "message": "Todos os Cofres" + "message": "Todos os cofres" }, "searchOrganization": { - "message": "Pesquisar Organização" + "message": "Pesquisar organização" }, "searchMyVault": { - "message": "Pesquisar no Meu Cofre" + "message": "Pesquisar meu cofre" }, "forwardedEmail": { - "message": "Alias de E-mail Encaminhado" + "message": "Alias de Encaminhamento de E-mail" }, "forwardedEmailDesc": { "message": "Gere um alias de e-mail com um serviço externo de encaminhamento." @@ -2824,7 +2827,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Escolha um domínio que seja suportado pelo serviço selecionado", + "message": "Escolha um domínio suportado pelo serviço selecionado", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2904,7 +2907,7 @@ } }, "forwarderNoAccountId": { - "message": "Não foi possível obter a máscara do ID da conta de email $SERVICENAME$.", + "message": "Não foi possível obter o ID da conta de e-mail mascarado $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -2924,7 +2927,7 @@ } }, "forwarderNoUrl": { - "message": "URL $SERVICENAME$ inválida.", + "message": "URL $SERVICENAME$ inválido.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -2954,32 +2957,32 @@ } }, "hostname": { - "message": "Nome do host", + "message": "Servidor", "description": "Part of a URL." }, "apiAccessToken": { - "message": "Token de acesso API" + "message": "Token de acesso à API" }, "apiKey": { - "message": "Chave de API" + "message": "Chave da API" }, "premiumSubcriptionRequired": { "message": "Assinatura Premium necessária" }, "organizationIsDisabled": { - "message": "Organização está desabilitada." + "message": "Organização suspensa" }, "disabledOrganizationFilterError": { - "message": "Itens em Organizações Desativadas não podem ser acessados. Entre em contato com o proprietário da sua Organização para obter ajuda." + "message": "Itens em organizações suspensas não podem ser acessados. Contate o proprietário da sua organização para obter ajuda." }, "neverLockWarning": { - "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Definir suas opções de bloqueio para \"Nunca\" armazena a chave de criptografia do seu cofre no seu dispositivo. Se você usar esta opção, deve garantir que mantém seu dispositivo devidamente protegido." + "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Ao usar o \"Nunca\", a chave de criptografia do seu cofre é armazenada no seu dispositivo. Se você usar esta opção, deve garantir que mantém seu dispositivo devidamente protegido." }, "vault": { "message": "Cofre" }, "loginWithMasterPassword": { - "message": "‘Login’ com senha ‘master’" + "message": "Entrar com senha mestre" }, "rememberEmail": { "message": "Lembrar e-mail" @@ -2988,7 +2991,7 @@ "message": "Novo por aqui?" }, "loggingInTo": { - "message": "Fazendo login em $DOMAIN$", + "message": "Entrando em $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -2997,13 +3000,13 @@ } }, "logInWithAnotherDevice": { - "message": "Fazer login com outro dispositivo" + "message": "Entrar com outro dispositivo" }, "loginInitiated": { - "message": "Login iniciado" + "message": "Autenticação iniciada" }, "logInRequestSent": { - "message": "Pedido enviado" + "message": "Solicitação enviada" }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." @@ -3012,40 +3015,40 @@ "message": "Uma notificação foi enviada para seu dispositivo" }, "notificationSentDevicePart1": { - "message": "Desbloqueie o Bitwarden no seu dispositivo ou na " + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " }, "notificationSentDeviceAnchor": { - "message": "aplicativo web" + "message": "app web" }, "notificationSentDevicePart2": { - "message": "Certifique-se de que a frase de biometria corresponde à frase abaixo antes de aprovar." + "message": "Certifique-se de que a frase biométrica corresponde à frase abaixo antes de aprovar." }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" }, "fingerprintMatchInfo": { - "message": "Por favor, certifique-se de que o seu cofre esteja desbloqueado e a frase de identificação corresponda ao outro dispositivo." + "message": "Certifique-se de que o seu cofre esteja desbloqueado e a frase biométrica corresponda ao outro dispositivo." }, "fingerprintPhraseHeader": { - "message": "Frase de identificação" + "message": "Frase biométrica" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "Você será notificado assim que a requisição for aprovada" + "message": "Você será notificado assim que a solicitação for aprovada" }, "needAnotherOption": { - "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" + "message": "A entrada com dispositivo deve ser ativada nas configurações do aplicativo móvel do Bitwarden. Precisa de outra opção?" }, "viewAllLogInOptions": { - "message": "Ver todas as opções de login" + "message": "Ver todas as opções de autenticação" }, "viewAllLoginOptions": { - "message": "Ver todas as opções de login" + "message": "Ver todas as opções de autenticação" }, "resendNotification": { "message": "Reenviar notificação" }, "toggleCharacterCount": { - "message": "Ativar/Desativar contagem de caracteres", + "message": "Habilitar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "accessAttemptBy": { @@ -3058,7 +3061,7 @@ } }, "loginRequestApprovedForEmailOnDevice": { - "message": "Solicitação de ‘login’ aprovada para $EMAIL$ em $DEVICE$", + "message": "Solicitação de autenticação aprovada para $EMAIL$ em $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3071,10 +3074,10 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "Você negou uma tentativa de 'login' por outro dispositivo. Se foi você, tente logar com outro dispositivo novamente." + "message": "Você negou uma tentativa de autenticação por outro dispositivo. Se foi você, tente entrar com o dispositivo novamente." }, "webApp": { - "message": "Aplicativo da Web" + "message": "App web" }, "mobile": { "message": "Móvel", @@ -3099,13 +3102,13 @@ "message": "Servidor" }, "loginRequest": { - "message": "Solicitação de 'Login'" + "message": "Solicitação de autenticação" }, "deviceType": { "message": "Tipo de dispositivo" }, "ipAddress": { - "message": "Endereço IP" + "message": "Endereço de IP" }, "time": { "message": "Horário" @@ -3129,10 +3132,10 @@ } }, "loginRequestHasAlreadyExpired": { - "message": "O pedido de login já expirou." + "message": "A solicitação de autenticação já expirou." }, "thisRequestIsNoLongerValid": { - "message": "Este pedido não é mais válido." + "message": "Esta solicitação não é mais válida." }, "confirmAccessAttempt": { "message": "Confirmar tentativa de acesso para $EMAIL$", @@ -3153,16 +3156,16 @@ "message": "Criando conta em" }, "checkYourEmail": { - "message": "Verifique seu e-mail" + "message": "Confira seu e-mail" }, "followTheLinkInTheEmailSentTo": { - "message": "Siga o link no e-mail enviado para" + "message": "Abra o link no e-mail enviado para" }, "andContinueCreatingYourAccount": { "message": "e continue criando a sua conta." }, "noEmail": { - "message": "Sem e-mail?" + "message": "Nenhum e-mail?" }, "goBack": { "message": "Voltar" @@ -3171,22 +3174,22 @@ "message": "para editar o seu endereço de e-mail." }, "exposedMasterPassword": { - "message": "Senha Mestra comprometida" + "message": "Senha mestre comprometida" }, "exposedMasterPasswordDesc": { "message": "Senha encontrada em um vazamento de dados. Use uma senha única para proteger sua conta. Tem certeza de que deseja usar uma senha já exposta?" }, "weakAndExposedMasterPassword": { - "message": "Senha Mestra Fraca e Comprometida" + "message": "Senha mestra fraca e comprometida" }, "weakAndBreachedMasterPasswordDesc": { "message": "Senha fraca identificada e encontrada em um vazamento de dados. Use uma senha forte e única para proteger a sua conta. Tem certeza de que deseja usar essa senha?" }, "checkForBreaches": { - "message": "Verificar vazamentos de dados conhecidos para esta senha" + "message": "Conferir vazamentos de dados conhecidos por esta senha" }, "loggedInExclamation": { - "message": "Sessão Iniciada!" + "message": "Conectado!" }, "important": { "message": "Importante:" @@ -3195,16 +3198,16 @@ "message": "Acessando" }, "accessTokenUnableToBeDecrypted": { - "message": "Você foi desconectado porque seu token de acesso não pôde ser descriptografado. Por favor, faça o login novamente para resolver esse problema." + "message": "Você foi desconectado porque seu token de acesso não pôde ser descriptografado. Por favor, entre novamente para resolver esse problema." }, "refreshTokenSecureStorageRetrievalFailure": { - "message": "Você foi desconectado porque seu token de atualização não pôde ser recuperado. Por favor, faça o login novamente para resolver esse problema." + "message": "Você foi desconectado porque seu token de recarregamento não pôde ser recuperado. Por favor, entre novamente para resolver esse problema." }, "masterPasswordHint": { "message": "A sua senha mestra não pode ser recuperada se você esquecê-la!" }, "characterMinimum": { - "message": "$LENGTH$ caracteres mínimos", + "message": "Mínimo de $LENGTH$ caracteres", "placeholders": { "length": { "content": "$1", @@ -3216,16 +3219,16 @@ "message": "O Bitwarden recomenda a atualização das suas configurações de biometria para exigir a sua senha mestra (ou PIN) no primeiro desbloqueio. Gostaria de atualizar suas configurações agora?" }, "windowsBiometricUpdateWarningTitle": { - "message": "Atualização de configurações recomendadas" + "message": "Atualização recomendada das configurações" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Lembrar deste dispositivo para permanecer conectado" + "message": "Lembrar deste dispositivo para tornar futuras autenticações simples" }, "deviceApprovalRequired": { "message": "Aprovação do dispositivo necessária. Selecione uma opção de aprovação abaixo:" }, "deviceApprovalRequiredV2": { - "message": "É necessária a aprovação do dispositivo" + "message": "Aprovação do dispositivo necessária" }, "selectAnApprovalOptionBelow": { "message": "Selecione uma opção de aprovação abaixo" @@ -3243,19 +3246,19 @@ "message": "Solicitar aprovação do administrador" }, "unableToCompleteLogin": { - "message": "Incapaz de completar o login" + "message": "Incapaz de concluir a autenticação" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "Você precisar entrar em um dispositivo confiável ou solicitar ao administrador que lhe atribua uma senha." + "message": "Você precisa entrar com um dispositivo confiável ou solicitar ao administrador que lhe atribua uma senha." }, "region": { "message": "Região" }, "ssoIdentifierRequired": { - "message": "Identificador SSO da organização é necessário." + "message": "Identificador de SSO da organização é necessário." }, "eu": { - "message": "Europa", + "message": "União Europeia", "description": "European Union" }, "selfHostedServer": { @@ -3274,10 +3277,10 @@ "message": "Seu pedido foi enviado para seu administrador." }, "troubleLoggingIn": { - "message": "Problemas em efetuar login?" + "message": "Problemas para acessar?" }, "loginApproved": { - "message": "Login aprovado" + "message": "Sessão aprovada" }, "userEmailMissing": { "message": "E-mail do usuário ausente" @@ -3286,10 +3289,10 @@ "message": "E-mail de usuário ativo não encontrado. Desconectando." }, "deviceTrusted": { - "message": "Dispositivo confiável" + "message": "Dispositivo confiado" }, "trustOrganization": { - "message": "Organização confiável" + "message": "Confiar organização" }, "trust": { "message": "Confiar" @@ -3298,19 +3301,19 @@ "message": "Não confiar" }, "organizationNotTrusted": { - "message": "Organização não confiável" + "message": "Organização não foi confiada" }, "emergencyAccessTrustWarning": { - "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a impressão digital dele coincide com a que é exibida em sua conta" + "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida em sua conta" }, "orgTrustWarning": { - "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem uma recuperação de conta ativa e a impressão digital exibida abaixo corresponde com a impressão digital da organização." + "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem uma recuperação de conta ativa e a frase biométrica exibida abaixo corresponde com a da organização." }, "orgTrustWarning1": { "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A matrícula permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a impressão digital da organização." }, "trustUser": { - "message": "Usuário confiável" + "message": "Confiar no usuário" }, "inputRequired": { "message": "Entrada necessária." @@ -3392,16 +3395,16 @@ "message": "-- Digite para filtrar --" }, "multiSelectLoading": { - "message": "Carrgando Opções..." + "message": "Carrgando opções..." }, "multiSelectNotFound": { "message": "Nenhum item encontrado" }, "multiSelectClearAll": { - "message": "Limpar todos" + "message": "Limpar tudo" }, "plusNMore": { - "message": "+ $QUANTITY$ mais", + "message": "+ mais $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -3422,7 +3425,7 @@ "message": "Chave de acesso" }, "passkeyNotCopied": { - "message": "A senha não será copiada" + "message": "A chave de acesso não será copiada" }, "passkeyNotCopiedAlert": { "message": "A senha não será copiada para o item clonado. Deseja continuar clonando este item?" @@ -3438,7 +3441,7 @@ "message": "Erro ao importar" }, "importErrorDesc": { - "message": "Houve um problema com os dados que você tentou importar. Por favor, resolva os erros listados abaixo em seu arquivo de origem e tente novamente." + "message": "Houve um problema com os dados que você tentou importar. Resolva os erros listados abaixo em seu arquivo de origem e tente novamente." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Resolva os erros abaixo e tente novamente." @@ -3480,16 +3483,16 @@ "message": "A autenticação de dois fatores é necessária para sua conta. Siga os passos abaixo para conseguir entrar." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Siga os passos abaixo para finalizar o login." + "message": "Siga os passos abaixo para finalizar a autenticação." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Siga os passos abaixo para finalizar o login com a sua chave de segurança." + "message": "Siga os passos abaixo para finalizar a autenticação com a sua chave de segurança." }, "launchDuo": { - "message": "Iniciar o Duo no navegador" + "message": "Abrir o Duo no navegador" }, "importFormatError": { - "message": "Os dados não estão formatados corretamente. Por favor, verifique o seu arquivo de importação e tente novamente." + "message": "Os dados não estão formatados corretamente. Verifique o seu arquivo de importação e tente novamente." }, "importNothingError": { "message": "Nada foi importado." @@ -3498,7 +3501,7 @@ "message": "Erro ao descriptografar o arquivo exportado. Sua chave de criptografia não corresponde à chave de criptografia usada para exportar os dados." }, "invalidFilePassword": { - "message": "Senha do arquivo inválida, por favor informe a senha utilizada quando criou o arquivo de exportação." + "message": "Senha do arquivo inválida, informe a senha utilizada quando criou o arquivo de exportação." }, "destination": { "message": "Destino" @@ -3513,10 +3516,10 @@ "message": "Selecione uma coleção" }, "importTargetHintCollection": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos movidos para a coleção" + "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma coleção" }, "importTargetHintFolder": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos movidos para a pasta" + "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -3528,7 +3531,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Selecionar Arquivo" + "message": "Escolher arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -3537,7 +3540,7 @@ "message": "ou copie/cole o conteúdo do arquivo de importação" }, "instructionsFor": { - "message": "$NAME$ instruções", + "message": "Instruções para $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -3550,7 +3553,7 @@ "message": "Confirmar importação do cofre" }, "confirmVaultImportDesc": { - "message": "Este arquivo é protegido por senha. Por favor, digite a senha do arquivo para importar os dados." + "message": "Este arquivo é protegido por senha. Digite a senha do arquivo para importar os dados." }, "confirmFilePassword": { "message": "Confirmar senha do arquivo" @@ -3565,7 +3568,7 @@ "message": "Nenhum dado do LastPass encontrado" }, "incorrectUsernameOrPassword": { - "message": "Nome de usuário ou senha incorretos" + "message": "Nome do usuário ou senha incorretos" }, "incorrectPassword": { "message": "Senha incorreta" @@ -3583,7 +3586,7 @@ "message": "Incluir pastas compartilhadas" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "E-mail do LastPass" }, "importingYourAccount": { "message": "Importando sua conta..." @@ -3592,31 +3595,31 @@ "message": "Requer autenticação multifatores do LastPass" }, "lastPassMFADesc": { - "message": "Digite sua senha única do app de autenticação" + "message": "Digite sua senha única do app autenticador" }, "lastPassOOBDesc": { - "message": "Aprove a solicitação de login no seu aplicativo de autenticação ou insira código unico." + "message": "Aprove a solicitação de autenticação no seu aplicativo autenticador ou digite um código único." }, "passcode": { "message": "Código" }, "lastPassMasterPassword": { - "message": "Senha mestra do LastPass" + "message": "Senha mestre do LastPass" }, "lastPassAuthRequired": { "message": "Autenticação do LastPass necessária" }, "awaitingSSO": { - "message": "Aguardando autenticação SSO" + "message": "Aguardando autenticação do SSO" }, "awaitingSSODesc": { - "message": "Por favor, continue a iniciar a sessão usando as credenciais da sua empresa." + "message": "Continue autenticando-se usando as credenciais da sua empresa." }, "importDirectlyFromBrowser": { - "message": "Import directly from browser" + "message": "Importar diretamente do navegador" }, "browserProfile": { - "message": "Browser Profile" + "message": "Perfil do navegador" }, "seeDetailedInstructions": { "message": "Veja instruções detalhadas no nosso site de ajuda em", @@ -3635,18 +3638,18 @@ "message": "Coleção" }, "lastPassYubikeyDesc": { - "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dele." + "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dela." }, "commonImportFormats": { "message": "Formatos comuns", "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "Detecção de correspondência de URI é como o Bitwarden identifica sugestões de autopreenchimento.", + "message": "Detecção de correspondência de URI é como o Bitwarden identifica sugestões de preenchimento automático.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Expressão regular\" é uma opção avançada com maior risco de exposição de credenciais.", + "message": "\"Expressão regular\" é uma opção avançada com maior risco de exposição das credenciais.", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { @@ -3662,7 +3665,7 @@ "description": "Advanced option placeholder for uri option component" }, "warningCapitalized": { - "message": "Aviso", + "message": "Atenção", "description": "Warning (should maintain locale-relevant capitalization)" }, "success": { @@ -3678,7 +3681,7 @@ "message": "Ativar aceleração de hardware e reiniciar" }, "removePasskey": { - "message": "Remover senha" + "message": "Remover chave de acesso" }, "passkeyRemoved": { "message": "Chave de acesso removida" @@ -3724,26 +3727,26 @@ } }, "data": { - "message": "Dado" + "message": "Dados" }, "fileSends": { - "message": "Arquivos enviados" + "message": "Sends de arquivo" }, "textSends": { - "message": "Texto enviado" + "message": "Sends de texto" }, "ssoError": { - "message": "Nenhuma porta livre foi encontrada para o cliente final." + "message": "Nenhuma porta livre foi encontrada para a autenticação de SSO." }, "securePasswordGenerated": { "message": "Senha segura gerada! Não esqueça de também atualizar a sua senha no site." }, "useGeneratorHelpTextPartOne": { - "message": "Usar o gerador", + "message": "Use o gerador", "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": "ppara criar uma senha única e segura", + "message": "para criar uma senha única e segura", "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'" }, "biometricsStatusHelptextUnlockNeeded": { @@ -3759,7 +3762,7 @@ "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de desktop de $EMAIL$.", + "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de computador de $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -3777,7 +3780,7 @@ "message": "Nome do item" }, "loginCredentials": { - "message": "Credenciais de login" + "message": "Credenciais de acesso" }, "additionalOptions": { "message": "Opções adicionais" @@ -3789,7 +3792,7 @@ "message": "Última edição" }, "upload": { - "message": "Fazer upload" + "message": "Enviar" }, "authorize": { "message": "Autorizar" @@ -3804,7 +3807,7 @@ "message": "Aviso: Encaminhamento de Agente" }, "agentForwardingWarningText": { - "message": "Este pedido vem de um dispositivo remoto em que você está logado" + "message": "Esta solicitação vem de um dispositivo remoto em qual você está conectado" }, "sshkeyApprovalMessageInfix": { "message": "está solicitando acesso para" @@ -3816,13 +3819,13 @@ "message": "autenticar em um servidor" }, "sshActionSign": { - "message": "assine uma mensagem" + "message": "assinar uma mensagem" }, "sshActionGitSign": { - "message": "assine um commit no git" + "message": "assinar um commit no git" }, "unknownApplication": { - "message": "Uma aplicação" + "message": "Um aplicativo" }, "invalidSshKey": { "message": "A chave SSH é inválida" @@ -3837,34 +3840,34 @@ "message": "Chave SSH importada com sucesso" }, "fileSavedToDevice": { - "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferências do seu dispositivo." + "message": "Arquivo salvo no dispositivo. Gerencie a partir dos downloads do seu dispositivo." }, "allowScreenshots": { "message": "Permitir captura de tela" }, "allowScreenshotsDesc": { - "message": "Permitir que a aplicação do Bitwarden seja capturada em capturas de tela e visualizada em sessões remotas no computador. Desabilitar isso impedirá acesso em algumas telas externas." + "message": "Permitir que o aplicativo do Bitwarden seja capturado em capturas de tela e visualizado em sessões remotas no computador. Desativar isso impede o acesso em algumas telas externas." }, "confirmWindowStillVisibleTitle": { "message": "Confirmar janela ainda visível" }, "confirmWindowStillVisibleContent": { - "message": "Por favor, confirme que a janela ainda está visível." + "message": "Confirme que a janela ainda está visível." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Atualização de extensão necessária" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "A extensão de navegador que você está usando está desatualizada. Atualize-a ou desabilite a validação de integração de impressão digital do navegador nas configurações do aplicativo da área de trabalho." + "message": "A extensão de navegador que você está usando está desatualizada. Atualize-a ou desative a validação de integração de frase biométrica do navegador nas configurações do aplicativo da área de trabalho." }, "changeAtRiskPassword": { - "message": "Alterar senhas vulneráveis" + "message": "Alterar senhas em risco" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Esta credencial está em risco e está sem um site. Adicione um site e altere a senha para segurança melhor." }, "missingWebsite": { - "message": "Missing website" + "message": "Site ausente" }, "cannotRemoveViewOnlyCollections": { "message": "Você não pode remover coleções com permissões de Apenas visualização: $COLLECTIONS$", @@ -3885,38 +3888,38 @@ "message": "Nome da pasta" }, "folderHintText": { - "message": "Aninhe uma pasta adicionando o nome da pasta pai seguido de uma \"/\". Exemplo: Social/Fóruns" + "message": "Agrupe uma pasta adicionando o nome da pasta mãe seguido de uma \"/\". Exemplo: Social/Fóruns" }, "sendsTitleNoItems": { - "message": "Enviar informações sensíveis com segurança", + "message": "Envie informações sensíveis com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Compartilhe dados e arquivos com segurança com qualquer pessoa ou plataforma. Suas informações permanecerão com criptografia de ponta a ponta, limitando exposições.", + "message": "Compartilhe dados e arquivos com segurança com qualquer pessoa, em qualquer plataforma. Suas informações permanecerão criptografadas de ponta a ponta, limitando a exposição.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "generatorNudgeTitle": { - "message": "Criação rápida de senhas" + "message": "Crie senhas de forma rápida" }, "generatorNudgeBodyOne": { - "message": "Crie facilmente senhas únicas e fortes clicando em", + "message": "Crie senhas únicas e fortes com facilidade clicando em", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "para ajudá-lo a manter seus logins seguros.", + "message": "para ajudá-lo a manter suas credenciais seguras.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Crie facilmente senhas únicas e fortes clicando no botão Gerador de senhas para ajudá-lo a manter seus logins seguros.", + "message": "Crie senhas únicas e fortes com facilidade clicando no botão do Gerador de senhas para ajudá-lo a manter suas credenciais seguras.", "description": "Aria label for the body content of the generator nudge" }, "newLoginNudgeTitle": { "message": "Economize tempo com o preenchimento automático" }, "newLoginNudgeBodyOne": { - "message": "Incluir em", + "message": "Inclua um", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -3926,52 +3929,52 @@ "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "assim este login aparece como uma sugestão de preenchimento automático.", + "message": "para que esta credencial apareça como uma sugestão de preenchimento automático.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Pagamento online simplificado" + "message": "Pagamento on-line simplificado" }, "newCardNudgeBody": { "message": "Preencha automaticamente formulários de pagamento com cartões de forma segura e precisa." }, "newIdentityNudgeTitle": { - "message": "Criação de contas simplificada" + "message": "Simplifique a criação de contas" }, "newIdentityNudgeBody": { - "message": "Preencha automaticamente formulários longos de registro ou contato de forma rápida." + "message": "Preencha automaticamente formulários longos de cadastro ou contato de forma rápida." }, "newNoteNudgeTitle": { "message": "Mantenha seus dados sensíveis seguros" }, "newNoteNudgeBody": { - "message": "Com notas, armazena com segurança dados sensíveis como detalhes de informações bancárias ou de seguro." + "message": "Com anotações, armazene com segurança dados sensíveis como detalhes de informações bancárias ou de seguro." }, "newSshNudgeTitle": { "message": "Acesso SSH amigável para desenvolvedores" }, "newSshNudgeBodyOne": { - "message": "Armazena suas chaves e conecta com o agente SSH para uma autenticação rápida e criptografada.", + "message": "Armazene suas chaves e conecte com o agente SSH para uma autenticação rápida e criptografada.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Aprenda mais sobre o agente SSH", + "message": "Saiba mais sobre o agente SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "aboutThisSetting": { - "message": "About this setting" + "message": "Sobre esta configuração" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de mudança de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "assignToCollections": { - "message": "Atribuído a coleções" + "message": "Atribuir a coleções" }, "assignToTheseCollections": { - "message": "Atribuído a essas coleções" + "message": "Atribuir a estas coleções" }, "bulkCollectionAssignmentDialogDescriptionSingular": { "message": "Apenas membros da organização com acesso a essas coleções poderão ver o item." @@ -4001,7 +4004,7 @@ } }, "selectCollectionsToAssign": { - "message": "Selecionar coleções para atribuir" + "message": "Selecione coleções para atribuir" }, "personalItemsTransferWarning": { "message": "$PERSONAL_ITEMS_COUNT$ serão permanentemente transferidas para a organização selecionada. Você deixará de ser o proprietário desses itens.", @@ -4026,10 +4029,10 @@ } }, "personalItemTransferWarningSingular": { - "message": "1 item será permanentemente transferido para a organização selecionada. Você deixará de ser o proprietário desse item." + "message": "Um item será permanentemente transferido para a organização selecionada. Você deixará de ser o proprietário desse item." }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item será permanentemente transferido para $ORG$. Você deixará de ser o proprietário desse item.", + "message": "Um item será permanentemente transferido para $ORG$. Você deixará de ser o proprietário desse item.", "placeholders": { "org": { "content": "$1", @@ -4108,69 +4111,69 @@ "message": "Mostrar menos" }, "enableAutotypeDescription": { - "message": "Bitwarden não valida localizações de entrada, tenha certeza de estar na janela e campo corretos antes de utilizar o atalho." + "message": "O Bitwarden não valida localizações de entrada, tenha certeza de estar na janela e campo corretos antes de utilizar o atalho." }, "typeShortcut": { - "message": "Type shortcut" + "message": "Digitar atalho" }, "editAutotypeShortcutDescription": { - "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + "message": "Inclua um ou dois dos seguintes modificadores: Ctrl, Alt, Win, Shift e uma letra." }, "invalidShortcut": { - "message": "Invalid shortcut" + "message": "Atalho inválido" }, "moreBreadcrumbs": { "message": "Mais trilhas", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "next": { - "message": "Next" + "message": "Avançar" }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "Confirmar domínio do Conector de Chave" }, "confirm": { - "message": "Confirm" + "message": "Confirmar" }, "enableAutotypeShortcutPreview": { - "message": "Enable autotype shortcut (Feature Preview)" + "message": "Ativar atalho da digitação automática (Feature Preview)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "Certifique-se que está no campo correto antes de usar o atalho para evitar preencher dados no lugar errado." }, "editShortcut": { - "message": "Edit shortcut" + "message": "Editar atalho" }, "archiveNoun": { - "message": "Archive", + "message": "Arquivo", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Arquivar", "description": "Verb" }, - "unarchive": { - "message": "Unarchive" + "unArchive": { + "message": "Desarquivar" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Itens no arquivo" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Nenhum item no arquivo" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados de pesquisa gerais e das sugestões de preenchimento automático." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "O item foi enviado para o arquivo" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "O item foi desarquivado" }, "archiveItem": { - "message": "Archive item" + "message": "Arquivar item" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Itens arquivados são excluídos dos resultados da pesquisa geral e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" } } diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index e31693e91dd..716d0089506 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "O tempo limite mínimo personalizado é de 1 minuto." + }, "inviteAccepted": { "message": "Convite aceite" }, @@ -4149,7 +4152,7 @@ "message": "Arquivar", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Desarquivar" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático." }, - "itemSentToArchive": { - "message": "Item movido para o arquivo" + "itemWasSentToArchive": { + "message": "O item foi movido para o arquivo" }, - "itemRemovedFromArchive": { - "message": "Item removido do arquivo" + "itemUnarchived": { + "message": "O item foi desarquivado" }, "archiveItem": { "message": "Arquivar item" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 11d68198cf0..9231fe210b2 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index cbe379bf65a..5d116cda009 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Минимальный пользовательский тайм-аут составляет 1 минуту." + }, "inviteAccepted": { "message": "Приглашение принято" }, @@ -4149,7 +4152,7 @@ "message": "Архивировать", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Разархивировать" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Архивированные элементы появятся здесь и будут исключены из общих результатов поиска и предложений автозаполнения." }, - "itemSentToArchive": { - "message": "Элемент отправлен в архив" + "itemWasSentToArchive": { + "message": "Элемент был отправлен в архив" }, - "itemRemovedFromArchive": { - "message": "Элемент удален из архива" + "itemUnarchived": { + "message": "Элемент был разархивирован" }, "archiveItem": { "message": "Архивировать элемент" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index b06328a738d..ece911b848b 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index fcce3d4c10e..9c98013eb67 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimálny vlastný časový limit je 1 minúta." + }, "inviteAccepted": { "message": "Pozvánka prijatá" }, @@ -4149,7 +4152,7 @@ "message": "Archivovať", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Zrušiť archiváciu" }, "itemsInArchive": { @@ -4161,10 +4164,10 @@ "noItemsInArchiveDesc": { "message": "Tu sa zobrazia archivované položky, ktoré budú vylúčené zo všeobecného vyhľadávania a z návrhov automatického vypĺňania." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Položka bola archivovaná" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "Položka bola odobraná z archívu" }, "archiveItem": { diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 6218b006282..e63d37a92c6 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 61a7906dbf5..bb2fae4e2a3 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Минимално прилагођено временско ограничење је 1 минут." + }, "inviteAccepted": { "message": "Позив прихваћен" }, @@ -4136,7 +4139,7 @@ "message": "Омогућите пречицу ауто-уноса (преглед функције)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "Будите сигурни да сте у исправном пољу пре употребе пречице да бисте избегли попуњавање података на погрешно место." }, "editShortcut": { "message": "Уреди пречицу" @@ -4149,7 +4152,7 @@ "message": "Архивирај", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Врати из архиве" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Архивиране ставке ће се овде појавити и бити искључени из општих резултата претраге и сугестија о ауто-пуњењу." }, - "itemSentToArchive": { + "itemWasSentToArchive": { "message": "Ставка је послата у архиву" }, - "itemRemovedFromArchive": { - "message": "Ставка је уклоњена из архиве" + "itemUnarchived": { + "message": "Ставка враћена из архиве" }, "archiveItem": { "message": "Архивирај ставку" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index acc058f8862..4e9133cd6f8 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minsta anpassade tidsgräns är 1 minut." + }, "inviteAccepted": { "message": "Inbjudan accepterad" }, @@ -4149,8 +4152,8 @@ "message": "Arkivera", "description": "Verb" }, - "unarchive": { - "message": "Packa upp" + "unArchive": { + "message": "Avarkivera" }, "itemsInArchive": { "message": "Objekt i arkivet" @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Arkiverade objekt kommer att visas här och kommer att uteslutas från allmänna sökresultat och förslag för autofyll." }, - "itemSentToArchive": { - "message": "Objekt skickat till arkiv" + "itemWasSentToArchive": { + "message": "Objektet skickades till arkivet" }, - "itemRemovedFromArchive": { - "message": "Objekt borttaget från arkiv" + "itemUnarchived": { + "message": "Objektet har avarkiverats" }, "archiveItem": { "message": "Arkivera objekt" diff --git a/apps/desktop/src/locales/ta/messages.json b/apps/desktop/src/locales/ta/messages.json index 37a8990396f..ed4e61b04f8 100644 --- a/apps/desktop/src/locales/ta/messages.json +++ b/apps/desktop/src/locales/ta/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "அழைப்பு ஏற்கப்பட்டது" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index b8fb4061be9..be029fc4e2e 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index b50629c0cf9..60362ce09a6 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Invitation accepted" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 335a2bf039f..54fb09d147e 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum özel zaman aşımı 1 dakikadır." + }, "inviteAccepted": { "message": "Davet kabul edildi" }, @@ -4149,7 +4152,7 @@ "message": "Arşivle", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Arşivden çıkar" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Kayıt arşive gönderildi" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Kayıt arşivden çıkarıldı" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index 3caed882f81..3f80e8c1e9e 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "Запрошення прийнято" }, @@ -4149,7 +4152,7 @@ "message": "Archive", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { "message": "Archive item" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 482572cd596..51274907720 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Thời gian đóng kho tùy chỉnh tối thiểu là 1 phút." + }, "inviteAccepted": { "message": "Đã chấp nhận lời mời" }, @@ -4136,7 +4139,7 @@ "message": "Bật phím tắt tự động nhập (Xem trước tính năng)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "Hãy đảm bảo bạn đang ở đúng trường trước khi sử dụng phím tắt để tránh điền dữ liệu vào sai chỗ." }, "editShortcut": { "message": "Chỉnh sửa phím tắt" @@ -4149,7 +4152,7 @@ "message": "Lưu trữ", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Hủy lưu trữ" }, "itemsInArchive": { @@ -4161,11 +4164,11 @@ "noItemsInArchiveDesc": { "message": "Các mục đã lưu trữ sẽ hiển thị ở đây và sẽ bị loại khỏi kết quả tìm kiếm và gợi ý tự động điền." }, - "itemSentToArchive": { - "message": "Mục đã được gửi đến kho lưu trữ" + "itemWasSentToArchive": { + "message": "Mục đã được chuyển vào kho lưu trữ" }, - "itemRemovedFromArchive": { - "message": "Mục đã được gỡ khỏi kho lưu trữ" + "itemUnarchived": { + "message": "Mục đã được bỏ lưu trữ" }, "archiveItem": { "message": "Lưu trữ mục" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 6ba38110ab4..2193e69af24 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -388,7 +388,7 @@ "message": "州 / 省" }, "zipPostalCode": { - "message": "邮政编码" + "message": "ZIP / 邮政编码" }, "country": { "message": "国家/地区" @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "自定义超时时间最小为 1 分钟。" + }, "inviteAccepted": { "message": "邀请已接受" }, @@ -2604,13 +2607,13 @@ "message": "偏好设置" }, "appPreferences": { - "message": "应用程序设置(所有账户)" + "message": "App 设置(所有账户)" }, "accountSwitcherLimitReached": { "message": "已达到账户上限。请注销一个账户后再添加其他账户。" }, "settingsTitle": { - "message": "$EMAIL$ 的应用程序设置", + "message": "$EMAIL$ 的 App 设置", "placeholders": { "email": { "content": "$1", @@ -4149,7 +4152,7 @@ "message": "归档", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "取消归档" }, "itemsInArchive": { @@ -4161,10 +4164,10 @@ "noItemsInArchiveDesc": { "message": "已归档的项目将显示在此处,并将被排除在一般搜索结果和自动填充建议之外。" }, - "itemSentToArchive": { - "message": "项目已归档" + "itemWasSentToArchive": { + "message": "项目已发送到归档" }, - "itemRemovedFromArchive": { + "itemUnarchived": { "message": "项目已取消归档" }, "archiveItem": { diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 49fe63463a6..4a081aadb1a 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -470,10 +470,10 @@ "message": "如果您想自動填充表單的復選框,例如「記住電子郵件」,請使用復選框" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "使用連結欄位若您在特定網站上遇到自動填入問題。" }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "填入欄位的 html id、名稱、標籤或預留字元" }, "folder": { "message": "資料夾" @@ -576,7 +576,7 @@ "message": "複製驗證碼 (TOTP)" }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "複製 $FIELD$,$CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -703,10 +703,10 @@ "message": "附件已儲存" }, "addAttachment": { - "message": "Add attachment" + "message": "新增附件" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "最大檔案大小為 500MB" }, "file": { "message": "檔案" @@ -1223,7 +1223,7 @@ "message": "無效的主密碼" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "主密碼無效。請確認你的電子郵件正確,且帳號是於 $HOST$ 建立的。", "placeholders": { "host": { "content": "$1", @@ -1238,7 +1238,7 @@ "message": "兩步驟登入" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "密碼庫逾時時間" }, "vaultTimeout": { "message": "密碼庫逾時時間" @@ -1247,7 +1247,7 @@ "message": "逾時" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "逾時後動作" }, "vaultTimeoutDesc": { "message": "選擇密碼庫何時執行密碼庫逾時動作。" @@ -1312,7 +1312,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "顯示網站圖示並取得變更密碼網址" }, "enableMinToTray": { "message": "最小化至系統匣圖示" @@ -1978,7 +1978,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "$TOTAL$ 不足", "placeholders": { "total": { "content": "$1", @@ -1990,7 +1990,7 @@ "message": "信用卡資料" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "$BRAND$ 詳細資訊", "placeholders": { "brand": { "content": "$1", @@ -1999,7 +1999,7 @@ } }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "了解更多驗證程式" }, "copyTOTP": { "message": "複製驗證器金鑰 (TOTP)" @@ -2008,23 +2008,23 @@ "message": "無縫兩步驟驗證" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden 可以儲存並填入兩步驟驗證碼。複製金鑰並貼上到此欄位。" }, "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." + "message": "Bitwarden 可以儲存並填入兩步驟驗證碼。選擇相機圖示來截取此網站的驗證器QR code,或手動複製金鑰並貼上到此欄位。" }, "premium": { - "message": "Premium", + "message": "進階版", "description": "Premium membership" }, "freeOrgsCannotUseAttachments": { - "message": "Free organizations cannot use attachments" + "message": "免費組織無法使用附檔" }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "您需注意上方的 1 個欄位。" }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "您需注意上方的 $COUNT$ 個欄位。", "placeholders": { "count": { "content": "$1", @@ -2033,10 +2033,10 @@ } }, "cardExpiredTitle": { - "message": "Expired card" + "message": "過期的信用卡" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "如果您已續期,請更新信用卡資訊" }, "verificationRequired": { "message": "需要驗證", @@ -2094,19 +2094,19 @@ "message": "新的主密碼不符合原則要求。" }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "獲得來自 Bitwarden 的公告、建議及研究資訊電子郵件。" }, "unsubscribe": { - "message": "Unsubscribe" + "message": "取消訂閱" }, "atAnyTime": { - "message": "at any time." + "message": "在任何時間。" }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "若是繼續,則代表您同意" }, "and": { - "message": "and" + "message": "和" }, "acceptPolicies": { "message": "選中此選取框,即表示您同意下列條款:" @@ -2118,7 +2118,7 @@ "message": "允許瀏覽器整合" }, "enableBrowserIntegrationDesc1": { - "message": "Used to allow biometric unlock in browsers that are not Safari." + "message": "用於在非 Safari 的瀏覽器中啟用生物辨識解鎖。" }, "enableDuckDuckGoBrowserIntegration": { "message": "允許 DuckDuckGo 瀏覽器整合" @@ -2130,10 +2130,10 @@ "message": "不支援瀏覽器整合" }, "browserIntegrationErrorTitle": { - "message": "Error enabling browser integration" + "message": "啟用瀏覽器整合時發生錯誤" }, "browserIntegrationErrorDesc": { - "message": "An error has occurred while enabling browser integration." + "message": "啟用瀏覽器整合時發生錯誤。" }, "browserIntegrationMasOnlyDesc": { "message": "很遺憾,目前僅 Mac App Store 版本支援瀏覽器整合功能。" @@ -2187,16 +2187,16 @@ "message": "需先在桌面應用程式設定中設定生物特徵辨識,才能使用瀏覽器的生物特徵辨識功能。" }, "biometricsManualSetupTitle": { - "message": "Automatic 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": "由於生效中的某個企業原則,您不可將項目儲存至您的個人密碼庫。請將所有權變更為組織帳號,並選擇可用的分類。" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "你的新密碼不能與目前的密碼相同。" }, "hintEqualsPassword": { "message": "密碼提示不能與您的密碼相同。" @@ -2208,13 +2208,13 @@ "message": "某個組織政策已禁止您將項目匯入至您的個人密碼庫。" }, "personalDetails": { - "message": "Personal details" + "message": "個人詳細資訊" }, "identification": { - "message": "Identification" + "message": "身分" }, "contactInfo": { - "message": "Contact information" + "message": "聯絡資訊" }, "allSends": { "message": "所有 Send", @@ -2380,10 +2380,10 @@ "message": "驗證 WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "讀取安全金鑰" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "等待安全金鑰操作中……" }, "hideEmail": { "message": "對收件人隱藏我的電子郵件位址。" @@ -2395,7 +2395,7 @@ "message": "需要驗證電子郵件" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "電子郵件已驗證" }, "emailVerificationRequiredDesc": { "message": "必須驗證您的電子郵件才能使用此功能。" @@ -2410,7 +2410,7 @@ "message": "此操作受到保護。若要繼續,請重新輸入您的主密碼以驗證您的身份。" }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "主密碼設定成功" }, "updatedMasterPassword": { "message": "已更新主密碼" @@ -2425,16 +2425,16 @@ "message": "您的主密碼不符合一個或多個組織政策規定。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能持續長達一小時。" }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "變更密碼後,你需要使用新密碼重新登入。其他裝置上的工作階段會在一小時內登出。" }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "變更你的主密碼以完成帳號復原。" }, "updateMasterPasswordSubtitle": { - "message": "Your master password does not meet this organization’s requirements. Change your master password to continue." + "message": "你的主密碼不符合此組織的要求。請變更主密碼以繼續。" }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "您的組織停用了信任裝置加密。若要存取您的密碼庫,請設定主密碼。" }, "tryAgain": { "message": "再試一次" @@ -2467,7 +2467,7 @@ "message": "使用生物辨識" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "輸入傳送到你的電子郵件的驗證碼。" }, "resendCode": { "message": "重新傳送驗證碼" @@ -2479,7 +2479,7 @@ "message": "分鐘" }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "最多 $HOURS$ 小時 $MINUTES$ 分鐘", "placeholders": { "hours": { "content": "$1", @@ -2521,10 +2521,10 @@ "message": "您的密碼庫逾時時間超過組織設定的限制。" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "企業政策已套用至您的逾時選項中" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "您的組織政策已限定您密碼庫逾時的時間長度。密碼庫逾時時間最高可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", "placeholders": { "hours": { "content": "$1", @@ -2537,7 +2537,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "逾時時間超出了您組織設定的此限制:最多 $HOURS$ 小時 $MINUTES$ 分鐘", "placeholders": { "hours": { "content": "$1", @@ -2549,6 +2549,9 @@ } } }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, "inviteAccepted": { "message": "邀請已接受" }, @@ -2574,13 +2577,13 @@ "message": "主密碼已移除" }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "以下組織的成員已不再需要主密碼。請與你的組織管理員確認下方的網域。" }, "organizationName": { "message": "機構名稱" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector 網域" }, "leaveOrganization": { "message": "離開組織" @@ -2643,7 +2646,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫(包含附件)。組織密碼庫的項目不包含在內。", "placeholders": { "email": { "content": "$1", @@ -2664,7 +2667,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織密碼庫。", "placeholders": { "organization": { "content": "$1", @@ -2673,7 +2676,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織保險庫,「我的項目」集合將不會包含在內。", "placeholders": { "organization": { "content": "$1", @@ -2685,7 +2688,7 @@ "message": "已鎖定" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "您的密碼庫已被鎖定" }, "unlocked": { "message": "已解鎖" @@ -2707,10 +2710,10 @@ "message": "產生使用者名稱" }, "generateEmail": { - "message": "Generate email" + "message": "生成電子郵件" }, "usernameGenerator": { - "message": "Username generator" + "message": "使用者名稱產生器" }, "generatePassword": { "message": "產生密碼" @@ -2719,19 +2722,19 @@ "message": "產生密碼片語" }, "passwordGenerated": { - "message": "Password generated" + "message": "已產生密碼" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "已產生密碼" }, "usernameGenerated": { - "message": "Username generated" + "message": "已產生使用者名稱" }, "emailGenerated": { - "message": "Email generated" + "message": "已產生電子郵件" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "值必須介於 $MIN$ 及 $MAX$。", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -2745,7 +2748,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " 使用 $RECOMMENDED$ 或更多個字元產生更強的密碼。", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2755,7 +2758,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " 使用 $RECOMMENDED$ 或更多個單字產生強的密碼短語。", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2781,7 +2784,7 @@ "message": "使用您的網域設定的 Catch-all 收件匣。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此電子郵件" }, "useThisPassword": { "message": "使用此密碼" @@ -2824,11 +2827,11 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "選擇一個所選服務支援的網域", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { - "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "message": "$SERVICENAME$ 錯誤:$ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -2846,7 +2849,7 @@ "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "網站:$WEBSITE$。透過 Bitwarden 產生。", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2856,7 +2859,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "無效的 $SERVICENAME$ API 權杖", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2866,7 +2869,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "無效的 $SERVICENAME$ API 權杖:$ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2880,7 +2883,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ 拒絕了你的請求。請聯絡你的服務提供者以取得協助。", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -2890,7 +2893,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ 拒絕了你的請求:$ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2904,7 +2907,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "無法獲得 $SERVICENAME$ 的轉送電子郵件帳號。", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -2914,7 +2917,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "無效的 $SERVICENAME$ 網域。", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -2924,7 +2927,7 @@ } }, "forwarderNoUrl": { - "message": "Invalid $SERVICENAME$ url.", + "message": "無效的 $SERVICENAME$ URI。", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -2934,7 +2937,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "發生未知的 $SERVICENAME$ 錯誤。", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -2944,7 +2947,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "未知的轉送服務提供商:$SERVICENAME$。", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -3003,7 +3006,7 @@ "message": "登入已啟動" }, "logInRequestSent": { - "message": "Request sent" + "message": "已傳送請求" }, "notificationSentDevice": { "message": "已傳送通知至您的裝置。" @@ -3012,13 +3015,13 @@ "message": "已傳送通知至您的裝置" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "在你的裝置或其他裝置上解鎖 Bitwarden" }, "notificationSentDeviceAnchor": { "message": "網頁應用程式" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "在核准前請確保您的指紋短語與下面完全相符。" }, "needAnotherOptionV1": { "message": "需要另一個選項嗎?" @@ -3030,7 +3033,7 @@ "message": "指紋短語" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "一旦您的請求被通過,您會獲得通知。" }, "needAnotherOption": { "message": "必須先在 Bitwarden 應用程式設定中開啟,才可以使用裝置登入。要改用其他選項嗎?" @@ -3049,7 +3052,7 @@ "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "來自 $EMAIL$ 的存取嘗試", "placeholders": { "email": { "content": "$1", @@ -3058,7 +3061,7 @@ } }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "登入請求已由 $DEVICE$ 上的 $EMAIL$ 批准", "placeholders": { "email": { "content": "$1", @@ -3071,21 +3074,21 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "您拒絕了來自其他裝置的登入嘗試。如果這是您本人,請嘗試再次使用該裝置登入。" }, "webApp": { - "message": "Web app" + "message": "網路應用程式" }, "mobile": { - "message": "Mobile", + "message": "行動裝置", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "擴充套件", "description": "Browser extension/addon" }, "desktop": { - "message": "Desktop", + "message": "電腦版應用程式", "description": "Desktop app" }, "cli": { @@ -3096,10 +3099,10 @@ "description": "Software Development Kit" }, "server": { - "message": "Server" + "message": "伺服器" }, "loginRequest": { - "message": "Login request" + "message": "已要求登入" }, "deviceType": { "message": "裝置類型" @@ -3111,10 +3114,10 @@ "message": "時間" }, "confirmAccess": { - "message": "Confirm access" + "message": "確認訪問" }, "denyAccess": { - "message": "Deny access" + "message": "拒絕訪問權限" }, "justNow": { "message": "剛剛" @@ -3135,7 +3138,7 @@ "message": "此請求已失效。" }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "確認 $EMAIL$ 的存取嘗試", "placeholders": { "email": { "content": "$1", @@ -3147,28 +3150,28 @@ "message": "已要求登入" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "帳號存取請求" }, "creatingAccountOn": { - "message": "Creating account on" + "message": "建立帳號於" }, "checkYourEmail": { - "message": "Check your email" + "message": "檢查您的電子郵件" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "跟隨電子郵件中的連結" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "並繼續建立您的帳號" }, "noEmail": { - "message": "No email?" + "message": "沒有電子郵件?" }, "goBack": { "message": "返回" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "來編輯您的電子郵件位址。" }, "exposedMasterPassword": { "message": "已洩露的主密碼" @@ -3192,13 +3195,13 @@ "message": "重要:" }, "accessing": { - "message": "Accessing" + "message": "正在存取" }, "accessTokenUnableToBeDecrypted": { - "message": "You have been logged out because your access token could not be decrypted. Please log in again to resolve this issue." + "message": "由於無法解密你的存取權杖,你已被登出。請重新登入以解決此問題。" }, "refreshTokenSecureStorageRetrievalFailure": { - "message": "You have been logged out because your refresh token could not be retrieved. Please log in again to resolve this issue." + "message": "由於無法取得你的重新整理權杖,你已被登出。請重新登入以解決此問題。" }, "masterPasswordHint": { "message": "若您忘記主密碼,將會無法找回!" @@ -3219,7 +3222,7 @@ "message": "建議設定更新" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "記住此裝置來讓未來的登入體驗更簡易" }, "deviceApprovalRequired": { "message": "裝置需要取得核准。請在下面選擇一個核准選項:" @@ -3243,10 +3246,10 @@ "message": "要求管理員核准" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "無法完成登入" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "你需要在受信任的裝置上登入,或請管理員為你指派密碼。" }, "region": { "message": "區域" @@ -3289,7 +3292,7 @@ "message": "裝置已信任" }, "trustOrganization": { - "message": "Trust organization" + "message": "目前組織" }, "trust": { "message": "信任" @@ -3301,16 +3304,16 @@ "message": "機構不被信任" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "為了保護你的帳號安全,僅在你已授予此使用者緊急存取權,且其指紋與其帳號中顯示的指紋相符時才確認。" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "為了保護你的帳號安全,僅在你是此組織的成員、已啟用帳號復原功能,且下方顯示的指紋與組織的指紋相符時才繼續。" }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "此組織有企業政策,會將你加入帳號復原功能。加入後,組織管理員可變更你的密碼。僅在你確認此組織身份,且下方顯示的指紋詞句與該組織的指紋相符時才繼續。" }, "trustUser": { - "message": "Trust user" + "message": "信任使用者" }, "inputRequired": { "message": "必須輸入內容。" @@ -3477,13 +3480,13 @@ "message": "您的帳號要求使用 Duo 兩步驟驗證登入。" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "您的帳號需要使用 Duo 兩步驟登入。請依照以下步驟完成登入。" }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "請依照以下步驟完成登入" }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "請依照以下步驟使用你的安全金鑰完成登入。" }, "launchDuo": { "message": "使用瀏覽器啟動 Duo" @@ -3513,10 +3516,10 @@ "message": "選擇一個分類" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "若你希望將匯入檔案的內容移至集合,請選擇此選項" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "若你希望將匯入檔案的內容移至資料夾,請選擇此選項" }, "importUnassignedItemsError": { "message": "檔案包含未指派項目。" @@ -3613,10 +3616,10 @@ "message": "請使用您的公司憑證繼續登入。" }, "importDirectlyFromBrowser": { - "message": "Import directly from browser" + "message": "從瀏覽器直接匯入" }, "browserProfile": { - "message": "Browser Profile" + "message": "瀏覽器設定檔" }, "seeDetailedInstructions": { "message": "請參閱我們說明網站上的詳細說明於", @@ -3642,27 +3645,27 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "URI 匹配偵測是 Bitwarden 用來識別自動填入建議的方式。", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "「正則表達式」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "「開頭為」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "深入了解匹配偵測", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "進階選項", "description": "Advanced option placeholder for uri option component" }, "warningCapitalized": { - "message": "Warning", + "message": "警告", "description": "Warning (should maintain locale-relevant capitalization)" }, "success": { @@ -3736,14 +3739,14 @@ "message": "無法找到可用於 SSO 登入的空閒連接埠。" }, "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'" }, "biometricsStatusHelptextUnlockNeeded": { @@ -3777,19 +3780,19 @@ "message": "項目名稱" }, "loginCredentials": { - "message": "Login credentials" + "message": "登入資訊" }, "additionalOptions": { - "message": "Additional options" + "message": "額外選項" }, "itemHistory": { "message": "項目歷史記錄" }, "lastEdited": { - "message": "Last edited" + "message": "最後編輯" }, "upload": { - "message": "Upload" + "message": "上傳" }, "authorize": { "message": "授權" @@ -3801,25 +3804,25 @@ "message": "確認 SSH 密鑰使用" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "警告:代理轉送" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "此請求來自你已登入的遠端裝置" }, "sshkeyApprovalMessageInfix": { "message": "正在請求存取權限到" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "用於" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "驗證伺服器 " }, "sshActionSign": { - "message": "sign a message" + "message": "簽署訊息" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "簽署 git 提交" }, "unknownApplication": { "message": "應用程式" @@ -3834,40 +3837,40 @@ "message": "從剪貼簿中匯入密鑰" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH 密鑰成功匯入" }, "fileSavedToDevice": { "message": "檔案已儲存到裝置。在您的裝置上管理下載檔案。" }, "allowScreenshots": { - "message": "Allow screen capture" + "message": "允許螢幕擷取" }, "allowScreenshotsDesc": { - "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." + "message": "允許 Bitwarden 桌面應用程式可被截圖或在遠端桌面工作階段中顯示。停用此功能將會限制在部分外接螢幕上的存取。" }, "confirmWindowStillVisibleTitle": { - "message": "Confirm window still visible" + "message": "確認視窗仍可見" }, "confirmWindowStillVisibleContent": { - "message": "Please confirm that the window is still visible." + "message": "請確認視窗仍然可見。" }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "必須更新擴充套件" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "你使用的瀏覽器擴充功能版本已過期。請更新擴充功能,或在桌面應用程式設定中停用瀏覽器整合的指紋驗證。" }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "變更有風險的密碼" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "此登入資訊存在風險,且缺少網站。請新增網站並變更密碼以提升安全性。" }, "missingWebsite": { - "message": "Missing website" + "message": "缺少網站" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", "placeholders": { "collections": { "content": "$1", @@ -3876,120 +3879,120 @@ } }, "move": { - "message": "Move" + "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": "在資料夾名稱後面使用「/」來建立樹狀結構。\n例如:社交網路/論壇" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "安全傳送機密的資訊", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "安全的和任何人及任何平臺分享檔案及資料。您的資料會受到端對端加密的保護。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "快速建立密碼" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "點擊即可輕鬆產生強且唯一的密碼。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "協助你維持登入資訊的安全。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "點擊「產生密碼」按鈕即可輕鬆建立強且唯一的密碼,協助你確保登入資訊的安全。", "description": "Aria label for the body content of the generator nudge" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "使用自動填入節省時間" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "包含", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "網頁", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "讓此登入顯示為自動填入建議。", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "流暢的線上結帳體驗" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "使用卡片功能,安全且精準地自動填入付款表單。" }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "簡化帳號建立流程 " }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "使用身份資訊,快速自動填入冗長的註冊或聯絡表單。" }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "保護你的敏感資料安全" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "使用備註功能,安全儲存銀行或保險等敏感資料。" }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "開發者友善的 SSH 存取" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "儲存你的金鑰並透過 SSH 代理程式進行快速、加密的驗證。", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "深入了解 SSH 代理程式", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "aboutThisSetting": { - "message": "About this setting" + "message": "關於此設定" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden 會使用已儲存的登入 URI 來判斷應顯示的圖示或變更密碼網址,以改善你的使用體驗。使用此服務時,不會收集或儲存任何資訊。" }, "assignToCollections": { - "message": "Assign to collections" + "message": "指派至集合" }, "assignToTheseCollections": { - "message": "Assign to these collections" + "message": "指派至這些集合" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "只有可以檢視集合的組織成員才能看到其中的項目。" }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "只有可以檢視集合的組織成員才能看到其中的項目。" }, "noCollectionsAssigned": { - "message": "No collections have been assigned" + "message": "尚未指派任何集合" }, "assign": { - "message": "Assign" + "message": "指定" }, "bulkCollectionAssignmentDialogDescription": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "只有可以檢視集合的組織成員才能看到其中的項目。" }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "您已經選擇 $TOTAL_COUNT$ 個項目。由於您沒有編輯權限,無法更新其中的 $READONLY_COUNT$ 個項目。", "placeholders": { "total_count": { "content": "$1", @@ -4001,10 +4004,10 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "選擇要指派的集合" }, "personalItemsTransferWarning": { - "message": "$PERSONAL_ITEMS_COUNT$ 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", @@ -4013,7 +4016,7 @@ } }, "personalItemsWithOrgTransferWarning": { - "message": "$PERSONAL_ITEMS_COUNT$ will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ 會被永久移到 $ORG$。您將不再擁有這些項目。", "placeholders": { "personal_items_count": { "content": "$1", @@ -4026,10 +4029,10 @@ } }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 個項目會被永久移到選擇的組織。您將不再擁有此項目。" }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 個項目會被永久移到 $ORG$。您將不再擁有此項目。", "placeholders": { "org": { "content": "$1", @@ -4038,13 +4041,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "指派集合成功" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "您沒有選擇任何項目。" }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "項目已移到 $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4053,7 +4056,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "項目已移到 $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4062,7 +4065,7 @@ } }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "將已選取項目移動至 $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4102,75 +4105,75 @@ } }, "showMore": { - "message": "Show more" + "message": "顯示更多" }, "showLess": { - "message": "Show less" + "message": "顯示較少" }, "enableAutotypeDescription": { - "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." + "message": "Bitwarden 不會驗證輸入位置,請在使用快捷鍵前確認你位於正確的視窗與欄位中。" }, "typeShortcut": { - "message": "Type shortcut" + "message": "輸入快捷鍵" }, "editAutotypeShortcutDescription": { - "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + "message": "請包含以下修飾鍵之一或兩個:Ctrl、Alt、Win 或 Shift,再加上一個字母。" }, "invalidShortcut": { - "message": "Invalid shortcut" + "message": "無效的捷徑" }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "更多導覽階層", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "next": { - "message": "Next" + "message": "下一步" }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "確認 Key Connector 網域" }, "confirm": { - "message": "Confirm" + "message": "確認" }, "enableAutotypeShortcutPreview": { - "message": "Enable autotype shortcut (Feature Preview)" + "message": "啟用自動輸入快捷鍵(功能預覽)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "請在使用快捷鍵前確認位於正確的欄位中,以避免將資料填入錯誤" }, "editShortcut": { - "message": "Edit shortcut" + "message": "編輯捷徑" }, "archiveNoun": { - "message": "Archive", + "message": "封存", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "封存", "description": "Verb" }, - "unarchive": { + "unArchive": { "message": "Unarchive" }, "itemsInArchive": { - "message": "Items in archive" + "message": "封存中的項目" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "封存中沒有項目" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "封存的項目會顯示在此處,且不會出現在一般搜尋結果或自動填入建議中。" }, - "itemSentToArchive": { - "message": "Item sent to archive" + "itemWasSentToArchive": { + "message": "Item was sent to archive" }, - "itemRemovedFromArchive": { - "message": "Item removed from archive" + "itemUnarchived": { + "message": "Item was unarchived" }, "archiveItem": { - "message": "Archive item" + "message": "封存項目" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "封存的項目將不會出現在一般搜尋結果或自動填入建議中。確定要封存此項目嗎?" } } diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index bf7789578d9..88be6ebd4f5 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2025.10.1", + "version": "2025.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2025.10.1", + "version": "2025.10.2", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 5ca46f87bb7..d122978f943 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2025.10.1", + "version": "2025.10.2", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 2fc81fe2119..60911173308 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -258,7 +258,6 @@ export class AppComponent implements OnDestroy, OnInit { await Promise.all([ this.keyService.clearKeys(userId), this.cipherService.clear(userId), - // ! DO NOT REMOVE folderService.clear ! For more information see PM-25660 this.folderService.clear(userId), this.biometricStateService.logout(userId), ]); diff --git a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts index 2ff38f6eab0..05d6094745c 100644 --- a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts +++ b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts @@ -17,6 +17,7 @@ import { CsprngArray } from "@bitwarden/common/types/csprng"; import { UserId } from "@bitwarden/common/types/guid"; import { UserKey, MasterKey, UserPrivateKey } from "@bitwarden/common/types/key"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { newGuid } from "@bitwarden/guid"; import { Argon2KdfConfig, KdfType, KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management"; import { EmergencyAccessStatusType } from "../enums/emergency-access-status-type"; @@ -44,6 +45,7 @@ describe("EmergencyAccessService", () => { const mockNewUserKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; const mockTrustedPublicKeys = [Utils.fromUtf8ToArray("trustedPublicKey")]; + const mockUserId = newGuid() as UserId; beforeAll(() => { emergencyAccessApiService = mock(); @@ -125,7 +127,7 @@ describe("EmergencyAccessService", () => { "mockUserPublicKeyEncryptedUserKey", ); - keyService.getUserKey.mockResolvedValueOnce(mockUserKey); + keyService.userKey$.mockReturnValue(of(mockUserKey)); encryptService.encapsulateKeyUnsigned.mockResolvedValueOnce( mockUserPublicKeyEncryptedUserKey, @@ -134,7 +136,7 @@ describe("EmergencyAccessService", () => { emergencyAccessApiService.postEmergencyAccessConfirm.mockResolvedValueOnce(); // Act - await emergencyAccessService.confirm(id, granteeId, publicKey); + await emergencyAccessService.confirm(id, granteeId, publicKey, mockUserId); // Assert expect(emergencyAccessApiService.postEmergencyAccessConfirm).toHaveBeenCalledWith(id, { diff --git a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts index cce8d9345b2..b91bc932e83 100644 --- a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts +++ b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts @@ -175,11 +175,17 @@ export class EmergencyAccessService * Step 3 of the 3 step setup flow. * Intended for grantor. * @param id emergency access id - * @param token secret token provided in email + * @param granteeId id of the grantee * @param publicKey public key of grantee + * @param activeUserId the active user's id */ - async confirm(id: string, granteeId: string, publicKey: Uint8Array): Promise { - const userKey = await this.keyService.getUserKey(); + async confirm( + id: string, + granteeId: string, + publicKey: Uint8Array, + activeUserId: UserId, + ): Promise { + const userKey = await firstValueFrom(this.keyService.userKey$(activeUserId)); if (!userKey) { throw new Error("No user key found"); } diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts index de30205e6fe..f6594f4b11a 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Component, OnInit } from "@angular/core"; -import { lastValueFrom, Observable, firstValueFrom, switchMap } from "rxjs"; +import { lastValueFrom, Observable, firstValueFrom, switchMap, map } from "rxjs"; import { PremiumBadgeComponent } from "@bitwarden/angular/billing/components/premium-badge"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; @@ -165,7 +165,15 @@ export class EmergencyAccessComponent implements OnInit { }); const result = await lastValueFrom(dialogRef.closed); if (result === EmergencyAccessConfirmDialogResult.Confirmed) { - await this.emergencyAccessService.confirm(contact.id, contact.granteeId, publicKey); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getUserId), + ); + await this.emergencyAccessService.confirm( + contact.id, + contact.granteeId, + publicKey, + activeUserId, + ); updateUser(); this.toastService.showToast({ variant: "success", @@ -176,10 +184,14 @@ export class EmergencyAccessComponent implements OnInit { return; } + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); this.actionPromise = this.emergencyAccessService.confirm( contact.id, contact.granteeId, publicKey, + activeUserId, ); await this.actionPromise; updateUser(); diff --git a/apps/web/src/app/tools/import/import-web.component.ts b/apps/web/src/app/tools/import/import-web.component.ts index 7883769389f..17c586a1b9d 100644 --- a/apps/web/src/app/tools/import/import-web.component.ts +++ b/apps/web/src/app/tools/import/import-web.component.ts @@ -1,7 +1,16 @@ import { Component } from "@angular/core"; import { Router } from "@angular/router"; -import { ImportComponent } from "@bitwarden/importer-ui"; +import { + DefaultImportMetadataService, + ImportMetadataServiceAbstraction, +} from "@bitwarden/importer-core"; +import { + ImportComponent, + ImporterProviders, + SYSTEM_SERVICE_PROVIDER, +} from "@bitwarden/importer-ui"; +import { safeProvider } from "@bitwarden/ui-common"; import { HeaderModule } from "../../layouts/header/header.module"; import { SharedModule } from "../../shared"; @@ -9,6 +18,14 @@ import { SharedModule } from "../../shared"; @Component({ templateUrl: "import-web.component.html", imports: [SharedModule, ImportComponent, HeaderModule], + providers: [ + ...ImporterProviders, + safeProvider({ + provide: ImportMetadataServiceAbstraction, + useClass: DefaultImportMetadataService, + deps: [SYSTEM_SERVICE_PROVIDER], + }), + ], }) export class ImportWebComponent { protected loading = false; diff --git a/apps/web/src/app/tools/import/org-import.component.ts b/apps/web/src/app/tools/import/org-import.component.ts index 8fb5a582b1a..4bc348f8769 100644 --- a/apps/web/src/app/tools/import/org-import.component.ts +++ b/apps/web/src/app/tools/import/org-import.component.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Component, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { firstValueFrom, map } from "rxjs"; @@ -11,8 +9,18 @@ import { } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { ImportCollectionServiceAbstraction } from "@bitwarden/importer-core"; -import { ImportComponent } from "@bitwarden/importer-ui"; +import { isId, OrganizationId } from "@bitwarden/common/types/guid"; +import { + DefaultImportMetadataService, + ImportCollectionServiceAbstraction, + ImportMetadataServiceAbstraction, +} from "@bitwarden/importer-core"; +import { + ImportComponent, + ImporterProviders, + SYSTEM_SERVICE_PROVIDER, +} from "@bitwarden/importer-ui"; +import { safeProvider } from "@bitwarden/ui-common"; import { HeaderModule } from "../../layouts/header/header.module"; import { SharedModule } from "../../shared"; @@ -23,6 +31,12 @@ import { ImportCollectionAdminService } from "./import-collection-admin.service" templateUrl: "org-import.component.html", imports: [SharedModule, ImportComponent, HeaderModule], providers: [ + ...ImporterProviders, + safeProvider({ + provide: ImportMetadataServiceAbstraction, + useClass: DefaultImportMetadataService, + deps: [SYSTEM_SERVICE_PROVIDER], + }), { provide: ImportCollectionServiceAbstraction, useClass: ImportCollectionAdminService, @@ -31,7 +45,7 @@ import { ImportCollectionAdminService } from "./import-collection-admin.service" ], }) export class OrgImportComponent implements OnInit { - protected routeOrgId: string = null; + protected routeOrgId: OrganizationId | undefined = undefined; protected loading = false; protected disabled = false; @@ -43,7 +57,16 @@ export class OrgImportComponent implements OnInit { ) {} ngOnInit(): void { - this.routeOrgId = this.route.snapshot.paramMap.get("organizationId"); + const orgIdParam = this.route.snapshot.paramMap.get("organizationId"); + if (orgIdParam === undefined) { + throw new Error("`organizationId` is a required route parameter"); + } + + if (!isId(orgIdParam)) { + throw new Error("Invalid OrganizationId provided in route parameter `organizationId`"); + } + + this.routeOrgId = orgIdParam; } /** diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 97650f48518..70cd9a860b5 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 035d87df5de..5e1f3e7997b 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index e29faae93fc..83aacc70815 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "İrəliləyişi izləmək üçün üzvlərə tapşırıqlar təyin edin" }, - "onceYouReviewApplications": { - "message": "Müraciətləri incələyib kritik olaraq işarələsəniz, onlar burada nümayiş olunacaq." + "onceYouReviewApps": { + "message": "Tətbiqləri incələyib kritik olaraq işarələdikdən sonra, riskli elementləri həll etməsi üçün üzvlərə tapşırıqlar verə və irəliləyişi burada izləyə bilərsiniz" }, "sendReminders": { "message": "Xatırlatma göndər" @@ -188,16 +188,16 @@ "message": "Tətbiqi kritik olaraq işarələ" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Kritik olaraq işarələ" }, "applicationsSelected": { - "message": "applications selected" + "message": "tətbiq seçildi" }, "selectApplication": { - "message": "Select application" + "message": "Tətbiq seç" }, "unselectApplication": { - "message": "Unselect application" + "message": "Tətbiqi seçimini götür" }, "applicationsMarkedAsCriticalSuccess": { "message": "Kritik olaraq işarələnmiş tətbiqlər" @@ -311,13 +311,13 @@ "message": "İndi incələ" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Kritik tətbiqləri prioritetləşdir" }, "atRiskItems": { - "message": "At-risk items" + "message": "Riskli elementlər" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Kritik olaraq işarələmə funksionallığı, gələcək güncəlləmədə tətbiq olunacaq" }, "unmarkAsCritical": { "message": "Kritik olaraq işarələməni götür" @@ -2951,7 +2951,7 @@ "message": "Lütfən bu alış üçün hesabınızda yetərli qədər kredit olduğuna əmin olun. Hesabınızda yetərli kredit yoxdursa, fərq üçün fayldakı ilkin ödəniş metodunuz istifadə edilir. Hesabınıza, faktura səhifəsindən kredit əlavə edə bilərsiniz." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Bu satın alma üçün hesabınızda yetərli kredit yoxdur. Faktura səhifəsindən hesabınıza kredit əlavə edə bilərsiniz." }, "creditAppliedDesc": { "message": "Hesabınızın krediti, satın alma üçün istifadə oluna bilər. Əlçatan istənilən kredit, bu hesab üçün yaradılan fakturalara avtomatik tətbiq ediləcək." @@ -11294,12 +11294,47 @@ "message": "Arxivlə", "description": "Verb" }, + "unArchive": { + "message": "Arxivdən çıxart" + }, + "itemsInArchive": { + "message": "Arxivdəki elementlər" + }, "noItemsInArchive": { "message": "Arxivdə element yoxdur" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Arxivlənmiş elementlər burada görünəcək, ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək." }, + "itemWasSentToArchive": { + "message": "Element arxivə göndərildi" + }, + "itemsWereSentToArchive": { + "message": "Elementlər arxivə göndərildi" + }, + "itemUnarchived": { + "message": "Element arxivdən çıxarıldı" + }, + "bulkArchiveItems": { + "message": "Arxivlənən elementlər" + }, + "bulkUnarchiveItems": { + "message": "Arxivdən çıxarılmış elementlər" + }, + "archiveItem": { + "message": "Elementi arxivlə", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Arxivlənmiş elementlər ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək. Bu elementi arxivləmək istədiyinizə əminsiniz?" + }, + "archiveBulkItems": { + "message": "Elementləri arxivlə", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Arxivlənmiş elementlər ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək. Bu elementləri arxivləmək istədiyinizə əminsiniz?" + }, "businessUnit": { "message": "Biznes vahidi" }, @@ -11772,36 +11807,54 @@ "message": "Problemsiz inteqrasiya" }, "families": { - "message": "Families" + "message": "Ailələr" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "\"Ailələr\"ə yüksəlt" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "\"Premium\"a yüksəlt" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "\"Ailələr\"ə yüksəltdiniz!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Yerləşməniz üçün vergi hesablanması zamanı xəta baş verdi. Lütfən yenidən sınayın." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Bitwarden-ə xoş gəlmisiniz" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Premium ilə daha çox təhlükəsizlik özəlliklərinin kilidini açın və ya Ailələr ilə elementləri paylaşmağa başlayın" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Qiymətə vergi daxil deyildir və illik hesablanır." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Üzvlərə göndərəcəyiniz dəvətlərdə təşkilatınızın adı görünəcək." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Yüksəltmə olmadan davam et" + }, + "upgradeYourPlan": { + "message": "Planınızı yüksəldin" + }, + "upgradeNow": { + "message": "İndi yüksəlt" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Bu formu tamamladığınız zaman yeni bir Ailələr təşkilatı yaradılacaq. Ödənişsiz təşkilatınızı Admin Konsolundan yüksəldə bilərsiniz." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Yüksəltmə prosesiniz emal olunarkən xəta ilə üzləşdik. Lütfən yenidən sınayın." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 72337228225..da155bcd0a4 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 694ad4ac22d..ef9d72b4b63 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Назначете задачи на членовете, за да следите напредъка" }, - "onceYouReviewApplications": { - "message": "Когато прегледате приложенията и ги отбележите като важни, те ще се появят тук." + "onceYouReviewApps": { + "message": "След като прегледате приложенията и отбележите някои като важни, можете да зададете задачи на членовете, така че те да се занимаят с нещата в риск, а Вие да следите напредъка тук" }, "sendReminders": { "message": "Изпращане на напомняния" @@ -188,10 +188,10 @@ "message": "Отбелязване на приложението като важно" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Отбелязване като важно" }, "applicationsSelected": { - "message": "applications selected" + "message": "избрани приложения" }, "selectApplication": { "message": "Select application" @@ -311,13 +311,13 @@ "message": "Преглеждане сега" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Даване на приоритет на важните приложения" }, "atRiskItems": { - "message": "At-risk items" + "message": "Елементи в риск" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Функционалността за отбелязване на нещо като важно ще бъде добавена в бъдеща версия" }, "unmarkAsCritical": { "message": "Премахване от важните" @@ -2951,7 +2951,7 @@ "message": "Проверете дали към абонамента си имате достатъчно средства за тази покупка. В противен случай разликата от наличното и необходимото се изисква от основния ви метод за плащане, който сте задали." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Нямате достатъчно средства в акаунта за тази покупка. Можете да добавите средства в акаунта си на страницата за плащанията." }, "creditAppliedDesc": { "message": "Може да използвате кредитите към абонамента си за покупки. Кредитите се използват за покриването на издадените фактури към абонамента." @@ -11294,12 +11294,47 @@ "message": "Архивиране", "description": "Verb" }, + "unArchive": { + "message": "Изваждане от архива" + }, + "itemsInArchive": { + "message": "Елементи в архива" + }, "noItemsInArchive": { "message": "Няма елементи в архива" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Архивираните елементи ще се показват тук и ще бъдат изключени от общите резултати при търсене и от предложенията за автоматично попълване." }, + "itemWasSentToArchive": { + "message": "Елементът беше преместен в архива" + }, + "itemsWereSentToArchive": { + "message": "Елементите бяха преместени в архива" + }, + "itemUnarchived": { + "message": "Елементът беше изваден от архива" + }, + "bulkArchiveItems": { + "message": "Елементите са архивирани" + }, + "bulkUnarchiveItems": { + "message": "Елементите са извадени от архива" + }, + "archiveItem": { + "message": "Архивиране на елемента", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Архивираните елементи са изключени от общите резултати при търсене и от предложенията за автоматично попълване. Наистина ли искате да архивирате този елемент?" + }, + "archiveBulkItems": { + "message": "Архивиране на елементите", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Архивираните елементи са изключени от общите резултати при търсене и от предложенията за автоматично попълване. Наистина ли искате да архивирате тези елементи?" + }, "businessUnit": { "message": "Бизнес единица" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Продължаване без надграждане" }, + "upgradeYourPlan": { + "message": "Надградете плана си" + }, + "upgradeNow": { + "message": "Надграждане сега" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Чрез попълването на този формуляр ще създадете нова Семейна организация. Можете да надградите безплатната си организация от Администраторската конзола." + }, "upgradeErrorMessage": { "message": "Възникна грешка при надграждането. Моля, опитайте отново." + }, + "bitwardenFreeplanMessage": { + "message": "Имате безплатния план на Битуорден" + }, + "upgradeCompleteSecurity": { + "message": "Надградете, за да се възползвате от пълна защита" + }, + "viewbusinessplans": { + "message": "Преглед на плановете за компании" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 2dbe8104be8..dc900e83525 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 01594127641..7040e9aa3d5 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index a8b97f65e17..142422a6e95 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Unitat de negoci" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 262ab520326..796db063b21 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Přiřadit úkoly členů ke sledování průběhu" }, - "onceYouReviewApplications": { - "message": "Jakmile zkontrolujete a označíte aplikace jako kritické, zobrazí se zde." + "onceYouReviewApps": { + "message": "Jakmile zkontrolujete aplikace a označíte je jako kritické, můžete přidělit členům úkoly k řešení ohrožených položek a sledovat průběh zde" }, "sendReminders": { "message": "Odeslat připomenutí" @@ -11294,12 +11294,47 @@ "message": "Archivovat", "description": "Verb" }, + "unArchive": { + "message": "Odebrat z archivu" + }, + "itemsInArchive": { + "message": "Položky v archivu" + }, "noItemsInArchive": { "message": "Žádné položky v archivu" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Zde se zobrazí archivované položky a budou vyloučeny z obecných výsledků vyhledávání a návrhů automatického vyplňování." }, + "itemWasSentToArchive": { + "message": "Položka byla přesunuta do archivu" + }, + "itemsWereSentToArchive": { + "message": "Položky byly přesunuty do archivu" + }, + "itemUnarchived": { + "message": "Položka byla odebrána z archivu" + }, + "bulkArchiveItems": { + "message": "Archivované položky" + }, + "bulkUnarchiveItems": { + "message": "Položky odebrané z archivu" + }, + "archiveItem": { + "message": "Archivovat položku", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archivované položky jsou vyloučeny z obecných výsledků vyhledávání a z návrhů automatického vyplňování. Jste si jisti, že chcete tuto položku archivovat?" + }, + "archiveBulkItems": { + "message": "Archivovat položky", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archivované položky jsou vyloučeny z obecných výsledků vyhledávání a z návrhů automatického vyplňování. Jste si jisti, že chcete tyto položky archivovat?" + }, "businessUnit": { "message": "Obchodní jednotka" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Pokračovat bez aktualizace" }, + "upgradeYourPlan": { + "message": "Aktualizovat plán" + }, + "upgradeNow": { + "message": "Aktualizovat nyní" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Vyplněním tohoto formuláře vytvoříte novou organizaci Rodin. Můžete vylepšit svou bezplatnou organizaci z konzole správce." + }, "upgradeErrorMessage": { "message": "Při zpracování aktualizace došlo k chybě. Zkuste to znovu." + }, + "bitwardenFreeplanMessage": { + "message": "Máte bezplatný plán Bitwarden" + }, + "upgradeCompleteSecurity": { + "message": "Aktualizujte pro úplné zabezpečení" + }, + "viewbusinessplans": { + "message": "Zobrazit obchodní plány" } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 9a8754f8ae8..7361ac14f76 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 165d08ab3ff..b5103d4d6ba 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 918efb73db9..ae47ed19ae6 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Mitglieder Aufgaben zuweisen, um den Fortschritt zu überwachen" }, - "onceYouReviewApplications": { - "message": "Sobald du Anwendungen überprüft und als kritisch markiert hast, werden sie hier angezeigt." + "onceYouReviewApps": { + "message": "Sobald du die Anwendungen überprüft und als kritisch markiert hast, kannst du Mitgliedern Aufgaben zuweisen, um gefährdete Einträge zu beheben und den Fortschritt hier überwachen" }, "sendReminders": { "message": "Erinnerungen senden" @@ -11294,11 +11294,46 @@ "message": "Archivieren", "description": "Verb" }, + "unArchive": { + "message": "Nicht mehr archivieren" + }, + "itemsInArchive": { + "message": "Einträge im Archiv" + }, "noItemsInArchive": { "message": "Keine Einträge im Archiv" }, - "archivedItemsDescription": { - "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Auto-Ausfüllen-Vorschlägen ausgeschlossen." + "noItemsInArchiveDesc": { + "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen und Auto-Ausfüllen-Vorschlägen ausgeschlossen." + }, + "itemWasSentToArchive": { + "message": "Eintrag wurde ins Archiv verschoben" + }, + "itemsWereSentToArchive": { + "message": "Einträge wurden ins Archiv verschoben" + }, + "itemUnarchived": { + "message": "Eintrag wird nicht mehr archiviert" + }, + "bulkArchiveItems": { + "message": "Einträge archiviert" + }, + "bulkUnarchiveItems": { + "message": "Eintrag nicht mehr archiviert" + }, + "archiveItem": { + "message": "Eintrag archivieren", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archivierte Einträge werden von allgemeinen Suchergebnissen und Auto-Ausfüllen-Vorschlägen ausgeschlossen. Bist du sicher, dass du diesen Eintrag archivieren möchtest?" + }, + "archiveBulkItems": { + "message": "Einträge archivieren", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archivierte Einträge werden von allgemeinen Suchergebnissen und Auto-Ausfüllen-Vorschlägen ausgeschlossen. Bist du sicher, dass du diese Einträge archivieren möchtest?" }, "businessUnit": { "message": "Geschäftsbereich" @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Fortfahren, ohne ein Upgrade durchzuführen" }, + "upgradeYourPlan": { + "message": "Tarif upgraden" + }, + "upgradeNow": { + "message": "Jetzt upgraden" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Durch das Ausfüllen dieses Formulars wird eine neue Families-Organisation erstellt. Du kannst deine kostenlose Organisation über die Administrator-Konsole upgraden." + }, "upgradeErrorMessage": { "message": "Bei der Verarbeitung deines Upgrades ist ein Fehler aufgetreten. Bitte versuche es erneut." + }, + "bitwardenFreeplanMessage": { + "message": "Du nutzt den Bitwarden Free-Tarif" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade für umfassende Sicherheit" + }, + "viewbusinessplans": { + "message": "Unternehmens-Tarife anzeigen" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index d5b8867fa21..fb022954df0 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index ef664d7d1a4..0ed7f46e4a5 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organisation. You can upgrade your Free organisation from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index e4c535d4349..cc2c1561e20 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organisation. You can upgrade your Free organisation from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 1962ac40d36..d96cef99644 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index d30509f861a..074513343e3 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 46be79e90ff..78323078a92 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 3728bfc656d..3eaa56371e4 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 60bad3f3f79..7928cae4c77 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "واحد کسب و کار" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 67932e8724c..68cfc419f44 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index d4cc52ceda7..c374ea6e751 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index f2afdfa0cb8..5c8b24a8b4d 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Affecter des tâches aux membres pour surveiller la progression" }, - "onceYouReviewApplications": { - "message": "Une fois que vous avez évalué et marqué des applications comme critiques, elles s'afficheront ici." + "onceYouReviewApps": { + "message": "Une fois que vous examinez les applications et marquez comme critiques, vous pouvez assigner des tâches aux membres pour résoudre les éléments à risque et suivre les progrès ici" }, "sendReminders": { "message": "Envoyer des rappels" @@ -1318,7 +1318,7 @@ "message": "Utilisez une clé d'accès générée qui vous connectera automatiquement sans mot de passe. La biométrie, comme la reconnaissance faciale ou les empreintes digitales, ou une autre méthode de sécurité FIDO2 vérifiera votre identité." }, "newPasskey": { - "message": "Nouvelle clé d'identification (passkey)" + "message": "Nouvelle clé d'accès" }, "learnMoreAboutPasswordless": { "message": "En savoir plus sur l'identification sans mots de passe" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Désarchiver" + }, + "itemsInArchive": { + "message": "Éléments dans l'archive" + }, "noItemsInArchive": { "message": "Aucun élément dans l'archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Les éléments archivés apparaîtront ici et seront exclus des résultats de recherche généraux et des suggestions de remplissage automatique." }, + "itemWasSentToArchive": { + "message": "L'élément a été envoyé à l'archive" + }, + "itemsWereSentToArchive": { + "message": "Les éléments ont été envoyés à l'archive" + }, + "itemUnarchived": { + "message": "L'élément a été désarchivé" + }, + "bulkArchiveItems": { + "message": "Éléments archivés" + }, + "bulkUnarchiveItems": { + "message": "Éléments désarchivés" + }, + "archiveItem": { + "message": "Archiver l'élément", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Les éléments archivés sont exclus des résultats de recherche généraux et des suggestions de remplissage automatique. Êtes-vous sûr de vouloir archiver cet élément ?" + }, + "archiveBulkItems": { + "message": "Archiver les éléments", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Les éléments archivés sont exclus des résultats de recherche généraux et des suggestions de remplissage automatique. Êtes-vous sûr de vouloir archiver ces éléments ?" + }, "businessUnit": { "message": "Unité d'affaires" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continuer sans mettre à niveau" }, + "upgradeYourPlan": { + "message": "Mettez votre forfait à niveau" + }, + "upgradeNow": { + "message": "Mettre à niveau maintenant" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Compléter ce formulaire créera une nouvelle organisation Familles. Vous pouvez mettre à niveau votre organisation gratuite à partir de la Console Admin." + }, "upgradeErrorMessage": { "message": "Nous avons rencontré une erreur lors du traitement de votre mise à niveau. Veuillez réessayer." + }, + "bitwardenFreeplanMessage": { + "message": "Vous avez le forfait Bitwarden Gratuit" + }, + "upgradeCompleteSecurity": { + "message": "Passez au forfait supérieur pour une sécurité complète" + }, + "viewbusinessplans": { + "message": "Voir les forfaits d'affaires" } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 31f5f928bd5..2079116a304 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 43142a33ea3..66fd9ef8afc 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "יחידת עסקים" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 73714cce120..f6e6e9f9a30 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index a98b4d684d3..91e7db0af7c 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Dodijeli članovima zadatke za praćenje napretka" }, - "onceYouReviewApplications": { - "message": "Ako nakon pregleda aplikacije neku označiš kao kritičnu, biti će prikazane ovdje." + "onceYouReviewApps": { + "message": "Nakon što pregledaš prijave i označiš kritične, možeš dodijeliti zadatke članovima za rješavanje rizičnih stavki i ovdje pratiti napredak" }, "sendReminders": { "message": "Pošalji podsjetnike" @@ -188,16 +188,16 @@ "message": "Označi aplikacije kao kritične" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Označi kao kritično" }, "applicationsSelected": { - "message": "applications selected" + "message": "odabranih aplikacija" }, "selectApplication": { - "message": "Select application" + "message": "Odaberi aplikaciju" }, "unselectApplication": { - "message": "Unselect application" + "message": "Poništi odabir aplikacije" }, "applicationsMarkedAsCriticalSuccess": { "message": "Aplikacije označene kao kritične" @@ -311,13 +311,13 @@ "message": "Pregledaj sada" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Daj prioritet kritičnim aplikacijama" }, "atRiskItems": { - "message": "At-risk items" + "message": "Rizične stavke" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Funkcionalnost „Označi kao kritično” bit će implementirana u budućem ažuriranju" }, "unmarkAsCritical": { "message": "Odznači kao kritično" @@ -2951,7 +2951,7 @@ "message": "Osiguraj da tvoj račun ima dovoljno raspoloživih sredstava za kupnju. Ako tvoj račun nema dovoljno sredstava za kupnju, sredstva će biti dopunjena iz tvojeg zadanog spremljenog načina plaćanja. Sredstva svojem računu možeš dodati na stranici Naplata." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Nemaš dovoljno kredita na računu za ovu kupnju. Kredit možeš dodati na svoj račun na stranici Naplata." }, "creditAppliedDesc": { "message": "Sredstva na tvojem računu mogu se koristiti za kupnju. Sva raspoloživa sredstva će automatski biti upotrijebljena za plaćanje kupnji napravljenih na tvojem računu." @@ -10015,7 +10015,7 @@ "message": "Pošaljite podatke o događajima svojoj Logscale instanci" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Pošalji podatke o događajima trezora svojoj Datadog instanci" }, "failedToSaveIntegration": { "message": "Spremanje integracije nije uspjelo. Pokušaj ponovno kasnije." @@ -11294,11 +11294,46 @@ "message": "Arhiviraj", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "Nema stavki u arhivi" }, - "archivedItemsDescription": { - "message": "Arhivirane stavke biti će prikazane ovdje i biti će izuzete iz rezultata općih pretraga i preporuka auto-ispune." + "noItemsInArchiveDesc": { + "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" }, "businessUnit": { "message": "Poslovna jedinica" @@ -11775,33 +11810,51 @@ "message": "Families" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Nadogradi na Families" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": " Nadogradi na Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Families nadogradnja uspješna!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Došlo je do pogreške prilikom izračuna poreza za tvoju lokaciju. Pokušaj ponovno." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Dobrodošli u Bitwarden" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Otključaj više sigurnosnih značajki uz Premium ili počni dijeliti stavke s obitelji pomoću Families" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Cijene ne uključuju porez i naplaćuju se godišnje." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Naziv tvoje organizacije prikazivat će se u pozivnicama koje pošalješ članovima." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Nastavi bez nadogradnje" + }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Došlo je do pogreške prilikom obrade nadogradnje. Pokušaj ponovno." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 504151297b2..f9affbb4f9c 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Rendeljünk a tagokhoz feladatokat az előrehaladás monitorozására." }, - "onceYouReviewApplications": { - "message": "Az alkalmazások áttekintése és kritikusnak jelölése után ezek itt jelennek meg." + "onceYouReviewApps": { + "message": "Miután az alkalmazásokat áttekintettük és kritikusként jelöltük meg azokat, feladatokat rendelhetünk a tagokhoz a kockázatos elemek megoldására és itt nyomon követhetjük a feldolgozást." }, "sendReminders": { "message": "Emlékeztető küldés" @@ -176,7 +176,7 @@ "message": "Amint a felhasználók elmentik a bejelentkezéseket, itt megjelennek az alkalmazások és megjelenítik a veszélyeztetett jelszavakat. Jelöljük meg a kritikus alkalmazásokat és értesítsük a felhasználókat a jelszavak frissítéséről." }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "Egyetlen alkalmazás sem lett megjelölve kritikusként." }, "noCriticalApplicationsDescription": { "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." @@ -188,16 +188,16 @@ "message": "Alkalmazások megjelölése kritikusként" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Megjelölés kritikusként" }, "applicationsSelected": { - "message": "applications selected" + "message": "alkalmazás lett kiválasztva." }, "selectApplication": { - "message": "Select application" + "message": "Alkalmazás kiválasztása" }, "unselectApplication": { - "message": "Unselect application" + "message": "Alkalmazás kiválasztás negszüntetése" }, "applicationsMarkedAsCriticalSuccess": { "message": "Kritikusként megjelölt alkalmazások" @@ -311,13 +311,13 @@ "message": "Áttekintés most" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Kritikus alkalmazások rangsorolása" }, "atRiskItems": { - "message": "At-risk items" + "message": "Kockázatos elemek" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "A kritikus funkcióként megjelölés egy jövőbeli frissítésben lesz megvalósítva." }, "unmarkAsCritical": { "message": "Ktritkus jelölés eltávolítása" @@ -2951,7 +2951,7 @@ "message": "Ellenőrizzük, hogy a fióknak elég hitelkerete van a vásárláshoz. Ha nincs elég keret, akkor az alapértelmezett fizetési mód kerül használatba a különbségnél. Hitelkeretet a Számlázás oldalon adhatunk hozzá." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Nincs elegendő fiók egyenleg ehhez a vásárláshoz. Feltölthetjük az egyenleget a Számlázás oldalon." }, "creditAppliedDesc": { "message": "A fiók hitelkeret vásárlásra használható. A rendelkezésre álló keret automatikusan ehhez a fiókhoz generálódó számlákra kerül alkalmazásra." @@ -10141,7 +10141,7 @@ "message": "hónap tagonként éves számlázással" }, "seats": { - "message": "Seats" + "message": "Helyek" }, "addOrganization": { "message": "Szervezet hozzáadása" @@ -11294,12 +11294,47 @@ "message": "Archívum", "description": "Verb" }, + "unArchive": { + "message": "Visszavétel archívumból" + }, + "itemsInArchive": { + "message": "Archiválandó elemek" + }, "noItemsInArchive": { "message": "Nincs elem az archívumban." }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Az archivált elemek itt jelennek meg és kizárásra kerülnek az általános keresési eredményekből és az automatikus kitöltési javaslatokból." }, + "itemWasSentToArchive": { + "message": "Az elem az archivumba került." + }, + "itemsWereSentToArchive": { + "message": "Az elemek az archivumba kerültek." + }, + "itemUnarchived": { + "message": "Az elemek visszavéelre kerültek az archivumból." + }, + "bulkArchiveItems": { + "message": "Az elemek archiválásra kerültek." + }, + "bulkUnarchiveItems": { + "message": "Az elemek visszavéelre kerültek az archivumból." + }, + "archiveItem": { + "message": "Elem archiválása", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Az archivált elemek ki vannak zárva az általános keresési eredményekből és az automatikus kitöltési javaslatokból. Biztosan archiválni szeretnénk ezt az elemet?" + }, + "archiveBulkItems": { + "message": "Elemek archiválása", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Az archivált elemek ki vannak zárva az általános keresési eredményekből és az automatikus kitöltési javaslatokból. Biztosan archiválni szeretnénk ezeket az elemeket?" + }, "businessUnit": { "message": "Üzleti egység" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Folytatás áttérés nélkül" }, + "upgradeYourPlan": { + "message": "Csomag áttérés" + }, + "upgradeNow": { + "message": "Áttérés most" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Az űrlap kitöltésével egy új Családok szervezet jön létre. Az Adminisztrációs konzolban lehet áttérni az Ingyenes szervezetről." + }, "upgradeErrorMessage": { "message": "Hiba történt az áttérés feldolgozása közben. Próbáljuk újra." + }, + "bitwardenFreeplanMessage": { + "message": "Jelenleg a Bitwarden Ingyenes csomaggal rendelkezünk." + }, + "upgradeCompleteSecurity": { + "message": "Áttérés a teljes biztonságért" + }, + "viewbusinessplans": { + "message": "Üzleti csomagok megtekintése" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index fd8bc0ee6c1..e1f4f314012 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -3,16 +3,16 @@ "message": "Semua aplikasi" }, "activity": { - "message": "Activity" + "message": "Aktivitas" }, "appLogoLabel": { "message": "Logo Bitwarden" }, "criticalApplications": { - "message": "Aplikasi genting" + "message": "Aplikasi penting" }, "noCriticalAppsAtRisk": { - "message": "Tidak ada aplikasi genting berisiko" + "message": "Tidak ada aplikasi penting berisiko" }, "accessIntelligence": { "message": "Akses Pintar" @@ -24,7 +24,7 @@ "message": "Petunjuk Sandi" }, "reviewAtRiskPasswords": { - "message": "Tinjau sandi berisiko (mis. lemah, tersingkap, atau digunakan ulang) lintas aplikasi. Pilih aplikasi paling genting Anda untuk mengutamakan aksi keamanan untuk pengguna Anda guna menyiasati sandi berisiko." + "message": "Tinjau sandi berisiko (lemah, bocor, atau digunakan ulang) lintas aplikasi. Pilih aplikasi paling genting Anda untuk mengutamakan aksi keamanan untuk pengguna Anda guna menangani sandi berisiko." }, "dataLastUpdated": { "message": "Data terakhir diperbarui pada: $DATE$", @@ -36,7 +36,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Anda belum membuat laporan" }, "notifiedMembers": { "message": "Anggota yang diberitahukan" @@ -63,7 +63,7 @@ "message": "Buat entri masuk baru" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "$PERCENT$% selesai", "placeholders": { "percent": { "content": "$1", @@ -72,7 +72,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "$COUNT$ dari $TOTAL$ tugas keamanan telah diselesaikan", "placeholders": { "count": { "content": "$1", @@ -85,28 +85,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "Progres perubahan sandi" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "Tetapkan tugas ke anggota untuk memantau progres" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Setelah meninjau aplikasi dan menandainya sebagai penting, Anda dapat menetapkan tugas kepada anggota untuk menyelesaikan item berisiko dan memantau kemajuan di sini" }, "sendReminders": { - "message": "Send reminders" + "message": "Kirim pengingat" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "Setelah Anda menandainya sebagai penting, itu akan muncul di sini." }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "Lihat anggota yang berisiko" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "Lihat aplikasi yang berisiko" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "$COUNT$ dari $TOTAL$ aplikasi penting berisiko karena sandi yang berisiko", "placeholders": { "count": { "content": "$1", @@ -119,7 +119,7 @@ } }, "criticalApplicationsWithCount": { - "message": "Semua aplikasi ($COUNT$)", + "message": "Aplikasi penting ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -128,7 +128,7 @@ } }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ aplikasi penting", "placeholders": { "count": { "content": "$1", @@ -137,7 +137,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ aplikasi dalam risiko", "placeholders": { "count": { "content": "$1", @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ sandi dalam risiko", "placeholders": { "count": { "content": "$1", @@ -173,61 +173,61 @@ } }, "noAppsInOrgDescription": { - "message": "Setelah pengguna menyimpan info masuk, aplikasi akan muncul di sini menampilkan sandi yang berisiko. Tandai aplikasi penting dan beri tahukan pengguna untuk memperbarui sandi." + "message": "Setelah pengguna menyimpan login, aplikasi akan muncul di sini menampilkan sandi yang berisiko. Tandai aplikasi penting dan peringatkan pengguna untuk memperbarui sandi." }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "Anda belum menandai aplikasi apa pun sebagai penting" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Pilih aplikasi paling penting untuk memprioritaskan tindakan keamanan agar pengguna dapat menangani sandi yang berisiko." }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "Pilih aplikasi penting" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Tandai sebagai apl penting" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Tandai sebagai penting" }, "applicationsSelected": { - "message": "applications selected" + "message": "aplikasi dipilih" }, "selectApplication": { - "message": "Select application" + "message": "Pilih aplikasi" }, "unselectApplication": { - "message": "Unselect application" + "message": "Batalkan pilih apl" }, "applicationsMarkedAsCriticalSuccess": { - "message": "Applications marked as critical" + "message": "Aplikasi ditandai sebagai penting" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Gagal menandai aplikasi sebagai penting" }, "application": { "message": "Aplikasi" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Sandi berisiko" }, "requestPasswordChange": { - "message": "Minta petunjuk kata sandi" + "message": "Minta perubahan sandi" }, "totalPasswords": { - "message": "Jumlah Kata Sandi" + "message": "Jumlah sandi" }, "searchApps": { "message": "Cari aplikasi" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Anggota berisiko" }, "membersWithAccessToAtRiskItemsForCriticalApps": { - "message": "Members with access to at-risk items for critical applications" + "message": "Anggota dengan akses ke item berisiko untuk apl penting" }, "membersAtRiskCount": { - "message": "$COUNT$ members at-risk", + "message": "$COUNT$ anggota berisiko", "placeholders": { "count": { "content": "$1", @@ -236,7 +236,7 @@ } }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Anggota berisiko ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -254,19 +254,19 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Anggota ini masuk ke aplikasi dengan sandi yang lemah, terekspos, atau sama." }, "atRiskMembersDescriptionNone": { - "message": "These are no members logging into applications with weak, exposed, or reused passwords." + "message": "Anggota ini masuk ke aplikasi dengan sandi yang lemah, terekspos, atau sama." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Aplikasi ini memiliki sandi yang lemah, terekspos, atau sama." }, "atRiskApplicationsDescriptionNone": { - "message": "These are no applications with weak, exposed, or reused passwords." + "message": "Aplikasi ini memiliki sandi yang lemah, terekspos, atau sama." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Anggota ini masuk ke $APPNAME$ dengan sandi yang lemah, terekspos, atau sama.", "placeholders": { "appname": { "content": "$1", @@ -275,7 +275,7 @@ } }, "atRiskMembersDescriptionWithAppNone": { - "message": "There are no at risk members for $APPNAME$.", + "message": "Tidak ada anggota yang berisiko untuk $APPNAME$.", "placeholders": { "appname": { "content": "$1", @@ -287,16 +287,16 @@ "message": "Jumlah Anggota" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Aplikasi berisiko" }, "totalApplications": { "message": "Semua aplikasi" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Aplikasi yang perlu ditinjau" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ aplikasi baru", "placeholders": { "count": { "content": "$1", @@ -305,25 +305,25 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Tinjau aplikasi baru untuk ditandai sebagai penting dan jaga keamanan organisasi Anda" }, "reviewNow": { - "message": "Review now" + "message": "Tinjau sekarang" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Prioritaskan aplikasi penting" }, "atRiskItems": { - "message": "At-risk items" + "message": "Item berisiko" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Fungsi tandai sebagai penting akan diterapkan pada pembaruan mendatang" }, "unmarkAsCritical": { - "message": "Unmark as critical" + "message": "Batalkan sebagai penting" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Successfully unmarked application as critical" + "message": "Berhasil membatalkan apl sebagai penting" }, "whatTypeOfItem": { "message": "Jenis barang apa ini?" @@ -351,10 +351,10 @@ "message": "Nama Pengguna" }, "password": { - "message": "Kata Sandi" + "message": "Sandi" }, "newPassword": { - "message": "Kata Sandi baru" + "message": "Sandi baru" }, "passphrase": { "message": "Frasa sandi" @@ -375,7 +375,7 @@ "message": "Nama Pemegang Kartu" }, "loginCredentials": { - "message": "Login credentials" + "message": "Kredensial login" }, "personalDetails": { "message": "Rincian pribadi" @@ -421,16 +421,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Situs web ditambahkan" }, "addWebsite": { - "message": "Add website" + "message": "Tambah situs web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Hapus situs web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Bawaan ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -440,7 +440,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Tampilkan deteksi kecocokan $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -449,7 +449,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Sembunyikan deteksi kecocokan $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -458,7 +458,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Isi otomatis saat halaman dimuat?" }, "number": { "message": "Nomor" @@ -473,7 +473,7 @@ "message": "Kode Keamanan (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Kode keamanan / CVV" }, "identityName": { "message": "Nama Identitas" @@ -491,7 +491,7 @@ "message": "Nomor Lisensi" }, "email": { - "message": "Surel" + "message": "Email" }, "phone": { "message": "Telepon" @@ -551,10 +551,10 @@ "message": "Dr" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Kartu kedaluwarsa" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Jika kartu telah diperbarui, ubah informasi kartu" }, "expirationMonth": { "message": "Bulan Kedaluwarsa" @@ -566,16 +566,16 @@ "message": "Kunci Autentikasi (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Buat verifikasi 2-langkah mudah" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden dapat menyimpan dan mengisi kode verifikasi 2 langkah. Salin dan tempel kunci ke kolom ini." }, "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." + "message": "Bitwarden dapat menyimpan dan mengisi kode verifikasi 2 langkah. Pilih ikon kamera untuk mengambil tangkapan layar kode QR autentikator situs web ini, atau salin dan tempel kuncinya ke kolom ini." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Pelajari lebih lanjut tentang autentikator" }, "folder": { "message": "Direktori" @@ -691,7 +691,7 @@ "description": "Toggling an expand/collapse state." }, "checkPassword": { - "message": "Periksa apakah kata sandi telah terekspos." + "message": "Periksa apakah sandi telah terekspos." }, "passwordExposed": { "message": "Sandi ini telah terekspos $VALUE$ kali dalam kebocoran data. Sebaiknya, anda mengubahnya.", @@ -703,7 +703,7 @@ } }, "passwordSafe": { - "message": "Kata sandi ini tidak ditemukan dalam kebocoran data yang diketahui. Kata sandi tersebut seharusnya aman untuk digunakan." + "message": "Sandi ini tidak ditemukan dalam pelanggaran data apa pun. Seharusnya aman digunakan." }, "save": { "message": "Simpan" @@ -878,79 +878,79 @@ "message": "Lihat Item" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "Login Baru", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "Kartu Baru", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "Identitas Baru", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "Catatan Baru", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "Kunci SSH Baru", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Teks Kirim baru", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "File Kirim baru", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "Ubah Login", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "Ubah Kartu", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "Ubah Identitas", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Ubah Catatan", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "Ubah kunci SSH", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Ubah Teks Kirim", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Ubah Berkas Kirim", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Lihat Login", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Lihat Kartu", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Lihat Identitas", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Lihat Catatan", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "Lihat kunci SSH", "description": "Header for view SSH key item type" }, "new": { @@ -997,7 +997,7 @@ "description": "Copy value to clipboard" }, "copyPassword": { - "message": "Salin Kata Sandi", + "message": "Salin sandi", "description": "Copy password to clipboard" }, "copyPassphrase": { @@ -1045,7 +1045,7 @@ "message": "Salin nomor telepon" }, "copyEmail": { - "message": "Salin alamat surat elektronik" + "message": "Salin email" }, "copyCompany": { "message": "Salin perusahaan" @@ -1285,19 +1285,19 @@ "message": "Perlu pilihan lainnya?" }, "loginWithMasterPassword": { - "message": "Masuk dengan kata sandi utama" + "message": "Masuk dengan sandi utama" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "Membaca kunci sandi..." }, "readingPasskeyLoadingInfo": { - "message": "Keep this window open and follow prompts from your browser." + "message": "Biarkan jendela ini terbuka dan ikuti petunjuk dari peramban Anda." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Autentikasi kunci sandi gagal. Coba lagi nanti." }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "Gunakan metode masuk berbeda" }, "logInWithPasskey": { "message": "Masuk dengan kunci sandi" @@ -1309,28 +1309,28 @@ "message": "Selamat datang kembali" }, "invalidPasskeyPleaseTryAgain": { - "message": "Invalid Passkey. Please try again." + "message": "Kunci Sandi Tidak Valid. Silakan coba lagi." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "2FA for passkeys is not supported. Update the app to log in." + "message": "2FA untuk kunci sandi tidak didukung. Perbarui aplikasi untuk masuk." }, "loginWithPasskeyInfo": { - "message": "Use a generated passkey that will automatically log you in without a password. Biometrics, like facial recognition or fingerprint, or another FIDO2 security method will verify your identity." + "message": "Gunakan kunci sandi yang dibuat khusus untuk login otomatis tanpa sandi. Biometrik, seperti pengenalan wajah atau sidik jari, atau metode keamanan FIDO2 lainnya, akan memverifikasi identitas Anda." }, "newPasskey": { - "message": "New passkey" + "message": "Kunci sandi baru" }, "learnMoreAboutPasswordless": { - "message": "Learn more about passwordless" + "message": "Pelajari lebih lanjut tentang tanpa sandi" }, "creatingPasskeyLoading": { - "message": "Creating passkey..." + "message": "Membaca kunci sandi..." }, "creatingPasskeyLoadingInfo": { - "message": "Keep this window open and follow prompts from your browser." + "message": "Biarkan jendela ini terbuka dan ikuti petunjuk dari peramban Anda." }, "errorCreatingPasskey": { - "message": "Error creating passkey" + "message": "Kesalahan membuat kunci sandi" }, "errorCreatingPasskeyInfo": { "message": "Terdapat masalah mengimpor kuncimu." @@ -1339,22 +1339,22 @@ "message": "Akun berhasil dibuat!" }, "customPasskeyNameInfo": { - "message": "Name your passkey to help you identify it." + "message": "Beri nama kunci sandi untuk membantu Anda mengidentifikasinya." }, "useForVaultEncryption": { - "message": "Use for vault encryption" + "message": "Gunakan untuk enkripsi brankas" }, "useForVaultEncryptionInfo": { - "message": "Log in and unlock on supported devices without your master password. Follow the prompts from your browser to finalize setup." + "message": "Masuk dan buka kunci di perangkat yang didukung tanpa sandi utama Anda. Ikuti petunjuk dari peramban Anda untuk menyelesaikan pengaturan." }, "useForVaultEncryptionErrorReadingPasskey": { - "message": "Error reading passkey. Try again or uncheck this option." + "message": "Terjadi kesalahan saat membaca kunci sandi. Coba lagi atau hapus centang opsi ini." }, "encryptionNotSupported": { - "message": "Encryption not supported" + "message": "Enkripsi tidak didukung" }, "enablePasskeyEncryption": { - "message": "Set up encryption" + "message": "Siapkan enkripsi" }, "usedForEncryption": { "message": "Digunakan untuk enkripsi" @@ -1411,7 +1411,7 @@ "message": "Masuk ke Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Masukkan kode yang dikirim ke surel Anda" + "message": "Masukkan kode yang dikirim ke email Anda" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Masukkan kode dari aplikasi autentikator Anda" @@ -1423,13 +1423,13 @@ "message": "Batas waktu otentikasi tercapai" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Sesi autentikasi telah habis waktu. Silakan mulai ulang proses login." }, "verifyYourIdentity": { "message": "Verifikasikan identitas Anda" }, "weDontRecognizeThisDevice": { - "message": "Kami tidak mengenali perangkat ini. Masukkan kode yang dikirim ke surel Anda untuk memverifikasi identitas Anda." + "message": "Kami tidak mengenali perangkat ini. Masukkan kode yang dikirim ke email Anda untuk memverifikasi identitas Anda." }, "continueLoggingIn": { "message": "Lanjutkan masuk" @@ -1459,28 +1459,28 @@ "message": "Apakah kami harus memanggil Anda?" }, "masterPass": { - "message": "Kata Sandi Utama" + "message": "Sandi utama" }, "masterPassDesc": { - "message": "Kata sandi utama adalah kata sandi yang Anda gunakan untuk mengakses brankas Anda. Sangat penting bahwa Anda tidak lupa kata sandi utama Anda. Tidak ada cara untuk memulihkan kata sandi jika Anda melupakannya." + "message": "Sandi utama adalah sandi yang digunakan untuk mengakses brankas Anda. Sangat penting untuk tidak melupakan sandi utama Anda. Tidak ada cara untuk memulihkan sandi jika Anda lupa." }, "masterPassImportant": { - "message": "Kata sandi utama tidak dapat dipulihkan jika Anda melupakannya!" + "message": "Sandi utama tidak dapat dipulihkan jika Anda melupakannya!" }, "masterPassHintDesc": { - "message": "Petunjuk kata sandi utama dapat membantu Anda mengingat kata sandi Anda jika Anda melupakannya." + "message": "Petunjuk sandi utama dapat membantu Anda mengingat sandi jika Anda melupakannya." }, "reTypeMasterPass": { - "message": "Ketik ulang Kata Sandi Utama" + "message": "Ketik ulang sandi utama" }, "masterPassHint": { - "message": "Petunjuk Kata Sandi Utama (pilihan)" + "message": "Petunjuk sandi utama (pilihan)" }, "newMasterPassHint": { - "message": "New master password hint (optional)" + "message": "Petunjuk sandi utama (opsional)" }, "masterPassHintLabel": { - "message": "Petunjuk Kata Sandi Utama" + "message": "Petunjuk sandi utama" }, "masterPassHintText": { "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", @@ -1514,16 +1514,16 @@ "message": "Dapatkan petunjuk sandi utama" }, "emailRequired": { - "message": "Alamat surel diperlukan." + "message": "Alamat email diperlukan." }, "invalidEmail": { - "message": "Alamat surel tidak valid." + "message": "Alamat email tidak valid." }, "masterPasswordRequired": { - "message": "Kata sandi utama diperlukan." + "message": "Sandi utama diperlukan." }, "confirmMasterPasswordRequired": { - "message": "Diperlukan pengetikan ulang kata sandi utama." + "message": "Pengetikan ulang sandi utama diperlukan." }, "masterPasswordMinlength": { "message": "Master password must be at least $VALUE$ characters long.", @@ -1560,7 +1560,7 @@ "message": "Please select an expiration date that is in the future." }, "emailAddress": { - "message": "Alamat Surel" + "message": "Alamat email" }, "yourVaultIsLockedV2": { "message": "Your vault is locked" @@ -1600,7 +1600,7 @@ } }, "invalidFilePassword": { - "message": "Kata sandi berkas tidak valid, harap menggunakan kata sandi yang anda masukkan saat anda membuat berkas ekspor." + "message": "Sandi berkas tidak valid, harap gunakan sandi yang Anda masukkan saat membuat berkas ekspor." }, "lockNow": { "message": "Kunci Sekarang" @@ -1784,7 +1784,7 @@ "message": "Open in new tab" }, "emailTitle": { - "message": "Surel" + "message": "Email" }, "emailDescV2": { "message": "Enter a code sent to your email." @@ -1847,7 +1847,7 @@ "message": "Access Token Refresh Error" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "Token penyegaran atau kunci API tidak ditemukan. Silakan coba keluar dan masuk kembali." }, "warning": { "message": "Peringatan" @@ -1856,13 +1856,13 @@ "message": "Konfirmasi Ekspor Brankas" }, "confirmSecretsExport": { - "message": "Confirm secrets export" + "message": "Konfirmasi ekspor rahasia" }, "exportWarningDesc": { "message": "Ekspor ini berisi data vault Anda dalam format yang tidak dienkripsi. Anda tidak boleh menyimpan atau mengirim file yang diekspor melalui saluran yang tidak aman (seperti email). Hapus segera setelah Anda selesai menggunakannya." }, "exportSecretsWarningDesc": { - "message": "This export contains your secrets data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + "message": "Ekspor ini berisi data rahasia dalam format yang tidak terenkripsi. Anda tidak boleh menyimpan atau mengirim berkas yang diekspor melalui saluran tidak aman (seperti email). Hapus berkas tersebut segera setelah Anda selesai menggunakannya." }, "encExportKeyWarningDesc": { "message": "Ekspor ini mengenkripsi data Anda menggunakan kunci enkripsi akun Anda. Jika Anda pernah memutar kunci enkripsi akun Anda, Anda harus mengekspor lagi karena Anda tidak akan dapat mendekripsi file ekspor ini." @@ -1874,40 +1874,40 @@ "message": "Ekspor" }, "exportFrom": { - "message": "Export from" + "message": "Ekspor dari" }, "exportVault": { "message": "Ekspor Brankas" }, "exportSecrets": { - "message": "Export secrets" + "message": "Ekspor rahasia" }, "fileFormat": { "message": "Format Berkas" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "Ekspor berkas ini akan dilindungi sandi dan memerlukan sandi berkas untuk mendekripsi." }, "exportPasswordDescription": { - "message": "Kata sandi ini akan digunakan untuk mengekspor dan mengimpor berkas ini" + "message": "Sandi ini akan digunakan untuk mengekspor dan mengimpor file ini" }, "confirmMasterPassword": { - "message": "Konfirmasi kata sandi utama" + "message": "Konfirmasi sandi utama" }, "confirmFormat": { "message": "Konfirmasi format" }, "filePassword": { - "message": "File kata sandi" + "message": "Sandi berkas" }, "confirmFilePassword": { - "message": "Konfirmasi file kata sandi" + "message": "Konfirmasi sandi berkas" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "Gunakan kunci enkripsi akun Anda, yang berasal dari nama pengguna dan Sandi Utama akun Anda, untuk mengenkripsi ekspor dan membatasi impor hanya ke akun Bitwarden saat ini." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "Tetapkan sandi berkas untuk mengenkripsi ekspor dan impor ke akun Bitwarden mana pun menggunakan sandi untuk dekripsi." }, "exportTypeHeading": { "message": "Jenis ekspor" @@ -1916,22 +1916,22 @@ "message": "Akun dibatasi" }, "passwordProtected": { - "message": "Dilindungi kata sandi" + "message": "Dilindungi sandi" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "\"Sandi berkas\" dan \"Konfirmasi sandi berkas\" tidak cocok." }, "confirmVaultImport": { "message": "Konfirmasi impor berangkas" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "Berkas ini dilindungi sandi. Silakan masukkan sandi berkas untuk mengimpor data." }, "exportSuccess": { "message": "Data brankas Anda telah diekspor." }, "passwordGenerator": { - "message": "Pembuat Kata Sandi" + "message": "Pembuat sandi" }, "minComplexityScore": { "message": "Skor Kompleksitas Minimum" @@ -1948,14 +1948,14 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Hindari karakter ambigu", "description": "Label for the avoid ambiguous characters checkbox." }, "length": { "message": "Panjang" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "Panjang sandi minimum" }, "uppercase": { "message": "Huruf Kapital (A-Z)", @@ -1986,32 +1986,32 @@ "message": "Sertakan Digit" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Persyaratan kebijakan perusahaan telah diterapkan pada pilihan generator Anda.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { - "message": "Riwayat Kata Sandi" + "message": "Riwayat sandi" }, "generatorHistory": { - "message": "Generator history" + "message": "Riwayat generator" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Hapus riwayat generator" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Jika Anda melanjutkan, semua entri akan dihapus secara permanen dari riwayat generator. Yakin ingin melanjutkan?" }, "noPasswordsInList": { "message": "Tidak ada sandi yang dapat dicantumkan." }, "clearHistory": { - "message": "Clear history" + "message": "Hapus riwayat" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Kosong" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Anda belum menghasilkan apa pun baru-baru ini" }, "clear": { "message": "Bersihkan", @@ -2021,13 +2021,13 @@ "message": "Akun Diperbarui" }, "changeEmail": { - "message": "Ubah Surel" + "message": "Ubah email" }, "changeEmailTwoFactorWarning": { "message": "Melanjutkan proses ini akan mengubah alamat email akun Anda. Tindakan ini tidak akan mengubah alamat email yang digunakan untuk autentikasi dua-faktor. Anda bisa mengubah alamat email tersebut di pengaturan Login Dua-Langkah." }, "newEmail": { - "message": "Surel Baru" + "message": "Email baru" }, "code": { "message": "Kode" @@ -2045,31 +2045,31 @@ "message": "Melanjutkan akan mengeluarkan Anda dari sesi saat ini, mengharuskan Anda untuk masuk kembali. Sesi aktif di perangkat lain dapat terus aktif hingga satu jam." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "Setelah mengubah sandi, Anda harus masuk dengan sandi baru. Sesi aktif di perangkat lain akan dihapus dalam waktu satu jam." }, "emailChanged": { - "message": "Surel Diubah" + "message": "Email disimpan" }, "logBackIn": { "message": "Harap masuk kembali." }, "currentSession": { - "message": "Current session" + "message": "Sesi saat ini" }, "requestPending": { - "message": "Request pending" + "message": "Permintaan tertunda" }, "logBackInOthersToo": { "message": "Harap masuk kembali. Jika Anda menggunakan aplikasi Bitwarden lain, keluarlah dan masuk kembali ke sana juga." }, "changeMasterPassword": { - "message": "Ubah Kata Sandi Utama" + "message": "Ubah sandi utama" }, "masterPasswordChanged": { - "message": "Kata Sandi Utama Berubah" + "message": "Sandi utama disimpan" }, "currentMasterPass": { - "message": "Kata Sandi Utama Saat Ini" + "message": "Sandi utama saat Ini" }, "newMasterPass": { "message": "Kata Sandi Utama Baru" @@ -2105,17 +2105,17 @@ } }, "kdfMemory": { - "message": "KDF memory (MB)", + "message": "Memori KDF (MB)", "description": "Memory refers to computer memory (RAM). MB is short for megabytes." }, "argon2Warning": { - "message": "Setting your KDF iterations, memory, and parallelism too high could result in poor performance when logging into (and unlocking) Bitwarden on slower or older devices. We recommend changing these individually in small increments and then test all of your devices." + "message": "Mengatur iterasi, memori, dan paralelisme KDF Anda terlalu tinggi dapat mengakibatkan kinerja yang buruk saat masuk (dan membuka kunci) Bitwarden pada perangkat yang lebih lambat atau lebih lama. Kami menyarankan Anda untuk mengubah pengaturan ini satu per satu secara bertahap, lalu menguji semua perangkat Anda." }, "kdfParallelism": { - "message": "KDF parallelism" + "message": "Paralelisme KDF" }, "argon2Desc": { - "message": "Higher KDF iterations, memory, and parallelism can help protect your master password from being brute forced by an attacker." + "message": "Iterasi KDF, memori, dan paralelisme yang lebih tinggi dapat membantu melindungi sandi utama Anda dari serangan brute forced oleh penyerang." }, "changeKdf": { "message": "Ubah KDF" @@ -2124,7 +2124,7 @@ "message": "Pengaturan Kunci Enkripsi Berubah" }, "dangerZone": { - "message": "Zona Bahaya" + "message": "Zona bahaya" }, "deauthorizeSessions": { "message": "Batalkan Otorisasi Sesi" @@ -2136,31 +2136,31 @@ "message": "Melanjutkan juga akan mengeluarkan Anda dari sesi saat ini, mengharuskan Anda untuk masuk kembali. Anda juga akan diminta untuk masuk dua langkah lagi, jika diaktifkan. Sesi aktif di perangkat lain dapat terus aktif hingga satu jam." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Login perangkat baru" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Matikan perlindungan login perangkat baru" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Aktifkan perlindungan login perangkat baru" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Lanjutkan di bawah ini untuk menonaktifkan email verifikasi yang dikirim bitwarden saat Anda masuk dari perangkat baru." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Lanjutkan di bawah ini agar bitwarden mengirimkan email verifikasi saat Anda masuk dari perangkat baru." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Dengan menonaktifkan perlindungan login perangkat baru, siapa pun yang memiliki sandi utama Anda dapat mengakses akun Anda dari perangkat apa pun. Untuk melindungi akun Anda tanpa email verifikasi, atur login dua langkah." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Perubahan perlindungan login perangkat baru disimpan" }, "sessionsDeauthorized": { "message": "Semua Sesi Dicabut Izinnya" }, "accountIsOwnedMessage": { - "message": "This account is owned by $ORGANIZATIONNAME$", + "message": "Akun ini dimiliki oleh $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -2205,7 +2205,7 @@ "message": "Akun Anda telah ditutup dan semua data terkait telah dihapus." }, "deleteOrganizationWarning": { - "message": "Deleting your organization is permanent. It cannot be undone." + "message": "Penghapusan organisasi Anda bersifat permanen. Tindakan ini tidak dapat dibatalkan." }, "myAccount": { "message": "Akun Saya" @@ -2221,11 +2221,11 @@ "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.)" }, "onboardingImportDataDetailsLink": { - "message": "new item", + "message": "item baru", "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", + "message": "login baru", "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": { @@ -2637,7 +2637,7 @@ "message": "Masukkan 6 digit kode verifikasi yang dihasilkan dari email" }, "sendEmail": { - "message": "Kirim Surel" + "message": "Kirim email" }, "twoFactorU2fAdd": { "message": "Tambahkan kunci keamanan FIDO U2F ke akun Anda" @@ -5406,23 +5406,23 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Buat Pengiriman Baru", + "message": "Kirim baru", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Kirim", + "message": "Ubah Kirim", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Dibuat Kirim", + "message": "Kirim disimpan", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Pengiriman diedit", + "message": "Kirim disimpan", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "Kirim Dihapus", + "message": "Kirim dihapus", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { @@ -5430,14 +5430,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "Anda yakin ingin menghapus Kirim ini selamanya?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Tanggal Penghapusan" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "Kirim ini akan dihapus selamanya pada tanggal ini.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index bf7b0203fae..0bd1eb4a4e4 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -36,7 +36,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Non hai ancora generato un report" }, "notifiedMembers": { "message": "Membri notificati" @@ -63,7 +63,7 @@ "message": "Crea nuovo elemento di login" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "$PERCENT$% completato", "placeholders": { "percent": { "content": "$1", @@ -72,7 +72,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "completate $COUNT$ attività relative alla sicurezza su $TOTAL$", "placeholders": { "count": { "content": "$1", @@ -85,28 +85,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "Modifica password in corso" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "Assegna compiti ai membri per monitorarne i progressi" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Dopo aver esaminato le applicazioni e contrassegnato quelle critiche, puoi assegnare attività ai membri per risolvere gli elementi a rischio e monitorare qui lo stato di avanzamento" }, "sendReminders": { - "message": "Send reminders" + "message": "Invia promemoria" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "Le applicazioni contrassegnate come critiche saranno visualizzate qui." }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "Visualizza membri a rischio" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "Visualizza applicazioni a rischio" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "$COUNT$ applicazioni critiche su $TOTAL$ sono a rischio a causa di password deboli o trapelate", "placeholders": { "count": { "content": "$1", @@ -128,7 +128,7 @@ } }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ applicazioni critiche", "placeholders": { "count": { "content": "$1", @@ -137,7 +137,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ applicazioni a rischio", "placeholders": { "count": { "content": "$1", @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ password a rischio", "placeholders": { "count": { "content": "$1", @@ -176,34 +176,34 @@ "message": "Quando gli utenti salvano i login, i relativi dati e le password a rischio sono mostrati qui. Contrassegna le applicazioni critiche e notifica agli utenti di aggiornare le password." }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "Non hai contrassegnato nessuna applicazione come critica" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Seleziona le tue applicazioni critiche più importanti per dare priorità alle azioni di sicurezza che i tuoi utenti devono completare per affrontare le password a rischio." }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "Seleziona applicazioni critiche" }, "markAppAsCritical": { "message": "Contrassegna l'applicazione come critica" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Contrassegna l'elemento come critico" }, "applicationsSelected": { - "message": "applications selected" + "message": "applicazioni selezionate" }, "selectApplication": { - "message": "Select application" + "message": "Seleziona applicazione" }, "unselectApplication": { - "message": "Unselect application" + "message": "Deseleziona" }, "applicationsMarkedAsCriticalSuccess": { "message": "Applicazioni contrassegnate come critiche" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Impossibile contrassegnare le applicazioni come critiche" }, "application": { "message": "Applicazione" @@ -224,10 +224,10 @@ "message": "Membri a rischio" }, "membersWithAccessToAtRiskItemsForCriticalApps": { - "message": "Members with access to at-risk items for critical applications" + "message": "Membri con accesso ad elementi a rischio per applicazioni critiche" }, "membersAtRiskCount": { - "message": "$COUNT$ members at-risk", + "message": "$COUNT$ membri a rischio", "placeholders": { "count": { "content": "$1", @@ -293,10 +293,10 @@ "message": "Applicazioni totali" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Applicazioni in attesa di revisione" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ nuove applicazioni", "placeholders": { "count": { "content": "$1", @@ -305,25 +305,25 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Esamina le nuove applicazioni per contrassegnare quelle critiche e mantenere sicura la tua organizzazione" }, "reviewNow": { - "message": "Review now" + "message": "Controlla adesso" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Priorità alle applicazioni critiche" }, "atRiskItems": { - "message": "At-risk items" + "message": "Elementi a rischio" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "La funzionalità per contrassegnare gli elementi critici sarà implementata in un aggiornamento futuro" }, "unmarkAsCritical": { "message": "Contrassegna l'elemento come non critico" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Successfully unmarked application as critical" + "message": "Applicazione impostata come non critica" }, "whatTypeOfItem": { "message": "Che tipo di elemento è questo?" @@ -898,11 +898,11 @@ "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Nuovo Send (testo)", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Nuovo Send (file)", "description": "Header for new file send" }, "editItemHeaderLogin": { @@ -918,39 +918,39 @@ "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Modifica nota", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "Modifica chiave SSH", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Modifica Send testuale", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Modifica Send con file", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Mostra login", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Mostra carta", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Mostra identità", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Mostra nota", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "Mostra chiave SSH", "description": "Header for view SSH key item type" }, "new": { @@ -1294,7 +1294,7 @@ "message": "Mantieni questa finestra aperta e segui le istruzioni del tuo browser." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Autenticazione con passkey non riuscita. Riprova." }, "useADifferentLogInMethod": { "message": "Usa un altro metodo di accesso" @@ -1591,7 +1591,7 @@ "message": "Password principale errata" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Password principale errata. Verifica che l'email sia corretta e che l'account sia stato creato su $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1609,28 +1609,28 @@ "message": "Non ci sono elementi da mostrare." }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Non ci sono elementi nel cestino" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Gli elementi cancellati appariranno qui e saranno eliminati definitivamente dopo 30 giorni" }, "noItemsInVault": { - "message": "No items in the vault" + "message": "La cassaforte è vuota" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "La cassaforte protegge non solo le password: archivia in modo sicuro anche passkey, identità, carte di pagamento e note." }, "emptyFavorites": { - "message": "You haven't favorited any items" + "message": "La lista dei preferiti è vuota" }, "emptyFavoritesDesc": { - "message": "Add frequently used items to favorites for quick access." + "message": "Aggiungi ai preferiti gli elementi che usi più spesso per un accesso rapido." }, "noSearchResults": { - "message": "No search results returned" + "message": "Nessun risultato" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "Elimina i filtri di ricerca o prova con altri termini" }, "noPermissionToViewAllCollectionItems": { "message": "Non hai i permessi necessari per visualizzare tutti gli elementi in questa raccolta." @@ -2340,7 +2340,7 @@ "message": "Cambia la lingua utilizzata dalla cassaforte web." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostra le icone dei siti e recupera gli URL di cambio password" }, "default": { "message": "Predefinito" @@ -2951,7 +2951,7 @@ "message": "Assicurati che il tuo account abbia abbastanza credito disponibile per questo acquisto. Se il tuo account non ha abbastanza credito disponibile, il tuo metodo di pagamento predefinito sarà utilizzato per la differenza. Puoi aggiungere credito al tuo account dalla sezione Fatturazione." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Non hai abbastanza credito per questo acquisto. Puoi aggiungere credito al tuo account dalla pagina di fatturazione." }, "creditAppliedDesc": { "message": "Il credito del tuo account può essere usato per effettuare acquisti. Ogni credito disponibile sarà automaticamente applicato alle fatture generate per questo account." @@ -4362,7 +4362,7 @@ "message": "Generazione delle tue informazioni sui rischi..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Avvia report" }, "updateBrowserDesc": { "message": "Stai utilizzando un browser non supportato. La cassaforte web potrebbe non funzionare correttamente." @@ -4931,10 +4931,10 @@ "message": "Organizzazione disabilitata" }, "organizationIsSuspended": { - "message": "Organization is suspended" + "message": "Organizzazione sospesa" }, "organizationIsSuspendedDesc": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + "message": "Non è possibile accedere agli elementi delle organizzazioni sospese. Contatta il proprietario dell'organizzazione per ricevere assistenza." }, "secretsAccessSuspended": { "message": "Non è possibile accedere alle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per assistenza." @@ -5322,11 +5322,11 @@ "message": "Identificativo SSO" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "message": "Fornisci questo ID ai membri della tua organizzazione per accedere con SSO. I membri possono saltare l'inserimento di questo identificatore durante l'accesso SSO se è configurato un dominio verificato.", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "claimedDomainsLearnMore": { - "message": "Learn more", + "message": "Scopri di più", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { @@ -5723,10 +5723,10 @@ "message": "A causa di una politica aziendale, non puoi salvare elementi nella tua cassaforte personale. Cambia l'opzione di proprietà in un'organizzazione e scegli tra le raccolte disponibili." }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "Impostazione predefinita per Desktop Autotype" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "Desktop Autotype abilitato per i membri. Ogni membro può scegliere di disattivarlo manualmente nel client desktop.", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { @@ -6894,7 +6894,7 @@ "message": "SSO disattivato" }, "emailMustLoginWithSso": { - "message": "$EMAIL$ must login with Single Sign-on", + "message": "$EMAIL$ deve accedere con Single Sign-on", "placeholders": { "email": { "content": "$1", @@ -7141,7 +7141,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata.", "placeholders": { "organization": { "content": "$1", @@ -7150,7 +7150,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata. Eventuali raccolte di elementi non saranno incluse.", "placeholders": { "organization": { "content": "$1", @@ -7313,7 +7313,7 @@ "message": "Segreto sconosciuto, potrebbe essere necessario richiedere l'autorizzazione per l'accesso." }, "unknownServiceAccount": { - "message": "Unknown machine account, you may need to request permission to access this machine account." + "message": "Account macchina sconosciuto, potrebbe essere necessario richiedere l'autorizzazione per accedere a questo account macchina." }, "unknownProject": { "message": "Progetto sconosciuto, potrebbe essere necessario richiedere l'autorizzazione per l'accesso." @@ -7706,7 +7706,7 @@ "message": "No" }, "connected": { - "message": "Connected" + "message": "Connesso" }, "members": { "message": "Membri" @@ -8666,7 +8666,7 @@ } }, "accessedProjectWithIdentifier": { - "message": "Accessed a project with identifier: $PROJECT_ID$.", + "message": "Accesso al progetto con identificatore $PROJECT_ID$.", "placeholders": { "project_id": { "content": "$1", @@ -8693,7 +8693,7 @@ } }, "nameUnavailableServiceAccountDeleted": { - "message": "Deleted machine account Id: $SERVICE_ACCOUNT_ID$", + "message": "Account macchina con ID $SERVICE_ACCOUNT_ID$ eliminato", "placeholders": { "service_account_id": { "content": "$1", @@ -8711,7 +8711,7 @@ } }, "addedUserToServiceAccountWithId": { - "message": "Added user: $USER_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Utente $USER_ID$ aggiunto all'account macchina con identificatore $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -8724,7 +8724,7 @@ } }, "removedUserToServiceAccountWithId": { - "message": "Removed user: $USER_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Utente $USER_ID$ rimosso dall'account macchina con identificatore $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -8737,7 +8737,7 @@ } }, "removedGroupFromServiceAccountWithId": { - "message": "Removed group: $GROUP_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Gruppo $GROUP_ID$ rimosso dall'account macchina con identificatore $SERVICE_ACCOUNT_ID$", "placeholders": { "group_id": { "content": "$1", @@ -8750,7 +8750,7 @@ } }, "serviceAccountCreatedWithId": { - "message": "Created machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Account macchina con identificatore $SERVICE_ACCOUNT_ID$ creato", "placeholders": { "service_account_id": { "content": "$1", @@ -8759,7 +8759,7 @@ } }, "addedGroupToServiceAccountId": { - "message": "Added group: $GROUP_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Gruppo $GROUP_ID$ aggiunto all'account macchina con identificatore $SERVICE_ACCOUNT_ID$", "placeholders": { "group_id": { "content": "$1", @@ -8772,7 +8772,7 @@ } }, "serviceAccountDeletedWithId": { - "message": "Deleted machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Account macchina con identificatore $SERVICE_ACCOUNT_ID$ eliminato", "placeholders": { "service_account_id": { "content": "$1", @@ -9383,7 +9383,7 @@ } }, "limitCollectionCreationEnabled": { - "message": "Turned on Restrict collection creation setting $ID$.", + "message": "Attivata l'impostazione di limitazione della creazione di raccolte $ID$.", "placeholders": { "id": { "content": "$1", @@ -9392,7 +9392,7 @@ } }, "limitCollectionCreationDisabled": { - "message": "Turned off Restrict collection creation setting $ID$.", + "message": "Limitazione della creazione di raccolte $ID$ disattivata.", "placeholders": { "id": { "content": "$1", @@ -9401,7 +9401,7 @@ } }, "limitCollectionDeletionEnabled": { - "message": "Turned on Restrict collection deletion setting $ID$.", + "message": "Attivata l'impostazione di limitazione dell'eliminazione di raccolte $ID$.", "placeholders": { "id": { "content": "$1", @@ -9410,7 +9410,7 @@ } }, "limitCollectionDeletionDisabled": { - "message": "Turned off Restrict collection deletion setting $ID$.", + "message": "Limitazione dell'eliminazione di raccolte $ID$ disattivata.", "placeholders": { "id": { "content": "$1", @@ -9419,7 +9419,7 @@ } }, "limitItemDeletionEnabled": { - "message": "Turned on Restrict item deletion setting $ID$.", + "message": "Attivata l'impostazione di limitazione dell'eliminazione di elementi $ID$.", "placeholders": { "id": { "content": "$1", @@ -9428,7 +9428,7 @@ } }, "limitItemDeletionDisabled": { - "message": "Turned off Restrict item deletion setting $ID$.", + "message": "Limitazione dell'eliminazione di elementi $ID$ disattivata.", "placeholders": { "id": { "content": "$1", @@ -9437,7 +9437,7 @@ } }, "allowAdminAccessToAllCollectionItemsEnabled": { - "message": "Turned on Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Gestione di tutte le raccolte e degli elementi $ID$ per proprietari e amministratori attivata.", "placeholders": { "id": { "content": "$1", @@ -9446,7 +9446,7 @@ } }, "allowAdminAccessToAllCollectionItemsDisabled": { - "message": "Turned off Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Gestione di tutte le raccolte e degli elementi $ID$ per proprietari e amministratori disattivata.", "placeholders": { "id": { "content": "$1", @@ -9617,7 +9617,7 @@ "message": "Assegna" }, "assignTasks": { - "message": "Assign tasks" + "message": "Assegna attività" }, "assignToCollections": { "message": "Assegna alle raccolte" @@ -10015,16 +10015,16 @@ "message": "Invia i dati dell'evento all'istanza Logscale" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Invia i dati dell'evento della cassaforte all'istanza di Datadog" }, "failedToSaveIntegration": { "message": "Impossibile salvare l'integrazione. Riprova più tardi." }, "mustBeOrgOwnerToPerformAction": { - "message": "You must be the organization owner to perform this action." + "message": "Devi essere il proprietario dell'organizzazione per eseguire questa azione." }, "failedToDeleteIntegration": { - "message": "Failed to delete integration. Please try again later." + "message": "Impossibile eliminare l'integrazione. Riprova più tardi." }, "deviceIdMissing": { "message": "ID dispositivo mancante" @@ -10051,7 +10051,7 @@ } }, "updateIntegrationButtonDesc": { - "message": "Update $INTEGRATION$", + "message": "Aggiorna $INTEGRATION$", "placeholders": { "integration": { "content": "$1", @@ -10123,7 +10123,7 @@ "message": "Token portatore" }, "repositoryNameHint": { - "message": "Name of the repository to ingest into" + "message": "Nome del repository di destinazione" }, "index": { "message": "Indice" @@ -11257,10 +11257,10 @@ "message": "Cambia parola d'accesso a rischio" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Questo login è a rischio e non contiene un sito web. Aggiungi un sito web e cambia la password per maggiore sicurezza." }, "missingWebsite": { - "message": "Missing website" + "message": "Sito web mancante" }, "removeUnlockWithPinPolicyTitle": { "message": "Rimuovi sblocco con PIN" @@ -11284,21 +11284,56 @@ "message": "Le organizzazioni gratuite possono avere fino a 2 raccolte. Aggiorna ad un piano a pagamento per crearne di più." }, "searchArchive": { - "message": "Search archive" + "message": "Cerca nell'archivio" }, "archiveNoun": { - "message": "Archive", + "message": "Archivio", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Archivia", "description": "Verb" }, - "noItemsInArchive": { - "message": "No items in archive" + "unArchive": { + "message": "Togli dall'archivio" }, - "archivedItemsDescription": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "itemsInArchive": { + "message": "Elementi archiviati" + }, + "noItemsInArchive": { + "message": "Nessun elemento nell'archivio" + }, + "noItemsInArchiveDesc": { + "message": "Gli elementi archiviati appariranno qui e saranno esclusi dai risultati di ricerca e dall'auto-riempimento." + }, + "itemWasSentToArchive": { + "message": "Elemento archiviato" + }, + "itemsWereSentToArchive": { + "message": "Elementi archiviati" + }, + "itemUnarchived": { + "message": "Elemento rimosso dall'archivio" + }, + "bulkArchiveItems": { + "message": "Elementi archiviati" + }, + "bulkUnarchiveItems": { + "message": "Elementi rimossi dall'archivio" + }, + "archiveItem": { + "message": "Archivia elemento", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Gli elementi archiviati sono esclusi dai risultati di ricerca e dall'auto-riempimento. Vuoi davvero archiviare questo elemento?" + }, + "archiveBulkItems": { + "message": "Archivia elementi", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Gli elementi archiviati sono esclusi dai risultati di ricerca e dall'auto-riempimento. Vuoi davvero archiviare questi elementi?" }, "businessUnit": { "message": "Business Unit" @@ -11408,10 +11443,10 @@ "message": "Estensione di Bitwarden installata!" }, "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" + "message": "Apri l'estensione Bitwarden" }, "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "message": "L'estensione Bitwarden è installata! Clicca sul pulsante dell'estensione sulla barra del browser per accedere e avviare l'auto-riempimento." }, "openExtensionToAutofill": { "message": "Apri l'estensione cliccando sul tasto della barra degli strumenti e accedi con i tuoi dati per attivare il riempimento automatico." @@ -11461,10 +11496,10 @@ "description": "Error message shown when trying to add credit to a trialing organization without a billing address." }, "aboutThisSetting": { - "message": "About this setting" + "message": "Informazioni su questa opzione" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden userà gli URL memorizzati in ogni login per mostrare, se possibile, l'icona del sito Web e l'URL di modifica password per facilitare la modifica delle credenziali. Nessuna informazione è raccolta o archiviata per il funzionamento di questo servizio." }, "billingAddress": { "message": "Indirizzo di fatturazione" @@ -11631,43 +11666,43 @@ "message": "Conferma dominio Key Connector" }, "requiredToVerifyBankAccountWithStripe": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Il pagamento con conto corrente bancario è disponibile solo per i clienti negli Stati Uniti. Sarà necessario verificare il conto corrente. Faremo un micro-versamento entro 1-2 giorni lavorativi. La mancata verifica del conto bancario risulterà come un mancato pagamento e causerà la sospensione del tuo abbonamento." }, "verifyBankAccountWithStripe": { - "message": "We have made a micro-deposit to your bank account. This may take 1-2 business days. When you see the deposit in your account, you can verify your bank account. Failure to verify your bank account will result in a missed payment and your subscription will be suspended." + "message": "Abbiamo effettuato un micro-versamento sul tuo conto bancario. L'operazione potrebbe essere visibile in 1-2 giorni lavorativi. Quando vedrai il versamento sul conto bancario, potrai verificarlo. La mancata verifica del conto bancario risulterà come un mancato pagamento e causerà la sospensione del tuo abbonamento." }, "verifyNow": { - "message": "Verify now." + "message": "Verifica adesso." }, "additionalStorageGB": { - "message": "Additional storage GB" + "message": "Spazio di archiviazione aggiuntivo (GB)" }, "additionalServiceAccountsV2": { - "message": "Additional machine accounts" + "message": "Account macchina aggiuntivi" }, "secretsManagerSeats": { - "message": "Secrets Manager seats" + "message": "Postazioni Secrets Manager" }, "additionalStorage": { - "message": "Additional Storage" + "message": "Spazio di archiviazione aggiuntivo" }, "expandPurchaseDetails": { - "message": "Expand purchase details" + "message": "Espandi i dettagli dell'acquisto" }, "collapsePurchaseDetails": { - "message": "Collapse purchase details" + "message": "Comprimi i dettagli dell'acquisto" }, "familiesMembership": { - "message": "Families membership" + "message": "Abbonamento famiglie" }, "planDescPremium": { - "message": "Complete online security" + "message": "Sicurezza online completa" }, "planDescFamiliesV2": { - "message": "Premium security for your family" + "message": "Sicurezza Premium per la tua famiglia" }, "planDescFreeV2": { - "message": "Share with $COUNT$ other user", + "message": "Condividi con altri $COUNT$ utenti", "placeholders": { "count": { "content": "$1", @@ -11676,37 +11711,37 @@ } }, "planDescEnterpriseV2": { - "message": "Advanced capabilities for any organization" + "message": "Capacità avanzate per qualsiasi organizzazione" }, "planNameCustom": { - "message": "Custom plan" + "message": "Piano personalizzato" }, "planDescCustom": { - "message": "Bitwarden scales with businesses of all sizes to secure passwords and sensitive information. If you're part of a large enterprise, contact sales to request a quote." + "message": "Bitwarden si adatta a imprese e organizzazioni di tutte le dimensioni, e utilizza le migliori tecnologie per proteggere password e informazioni sensibili. Se fai parte di una grande azienda, contatta l'ufficio vendite per chiedere un preventivo." }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "Autenticatore per 2FA incorporato" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Monitoraggio delle violazioni" }, "andMoreFeatures": { - "message": "And more!" + "message": "E molto altro!" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Archiviazione file sicura" }, "familiesUnlimitedSharing": { - "message": "Unlimited sharing - choose who sees what" + "message": "Condivisione illimitata e granulare: decidi tu chi vede cosa" }, "familiesUnlimitedCollections": { - "message": "Unlimited family collections" + "message": "Collezioni illimitate per gli abbonamenti famiglia" }, "familiesSharedStorage": { - "message": "Shared storage for important family info" + "message": "Archiviazione condivisa per documenti importanti della famiglia" }, "limitedUsersV2": { - "message": "Up to $COUNT$ members", + "message": "Fino a $COUNT$ membri", "placeholders": { "count": { "content": "$1", @@ -11715,7 +11750,7 @@ } }, "limitedCollectionsV2": { - "message": "Up to $COUNT$ collections", + "message": "Fino a $COUNT$ collezioni", "placeholders": { "count": { "content": "$1", @@ -11724,13 +11759,13 @@ } }, "alwaysFree": { - "message": "Always free" + "message": "Gratis per sempre" }, "twoSecretsIncluded": { - "message": "2 secrets" + "message": "2 segreti" }, "projectsIncludedV2": { - "message": "$COUNT$ project(s)", + "message": "$COUNT$ progetti", "placeholders": { "count": { "content": "$1", @@ -11739,13 +11774,13 @@ } }, "secureItemSharing": { - "message": "Secure item sharing" + "message": "Condivisione sicura" }, "scimSupport": { - "message": "SCIM support" + "message": "Supporto SCIM" }, "includedMachineAccountsV2": { - "message": "$COUNT$ machine accounts", + "message": "$COUNT$ account macchina", "placeholders": { "count": { "content": "$1", @@ -11754,54 +11789,72 @@ } }, "enterpriseSecurityPolicies": { - "message": "Enterprise security policies" + "message": "Politiche di sicurezza Enterprise" }, "selfHostOption": { - "message": "Self-host option" + "message": "Opzione self-host" }, "complimentaryFamiliesPlan": { - "message": "Complimentary families plan for all users" + "message": "Piani famiglia complementari per tutti gli utenti" }, "strengthenCybersecurity": { - "message": "Strengthen cybersecurity" + "message": "Cybersicurezza rafforzata" }, "boostProductivity": { - "message": "Boost productivity" + "message": "Produttività migliorata" }, "seamlessIntegration": { - "message": "Seamless integration" + "message": "Integrazione perfetta" }, "families": { - "message": "Families" + "message": "Famiglie" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Passa al piano Famiglia" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Passa a Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Hai fatto l'upgrade al piano Famiglia!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Si è verificato un errore nel calcolo dell'imposta per la tua posizione. Riprova in un secondo momento." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Bitwarden ti dà il benvenuto" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Sblocca più funzionalità di sicurezza con Premium, o inizia a condividere oggetti con il piano Famiglia" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "I prezzi non includono le imposte e sono fatturati annualmente." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Il nome della tua organizzazione apparirà negli inviti che invii ai membri." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Ignora e continua" + }, + "upgradeYourPlan": { + "message": "Aggiorna il tuo piano" + }, + "upgradeNow": { + "message": "Effettua l'upgrade" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Il completamento di questo modulo creerà una nuova organizzazione per le famiglie. Puoi fare l'upgrade della tua organizzazione gratuita dalla console di amministrazione." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Errore nell'elaborazione dell'upgrade. Fai un altro tentativo dopo aver verificato di aver inserito correttamente i dati." + }, + "bitwardenFreeplanMessage": { + "message": "Hai il piano Bitwarden Free" + }, + "upgradeCompleteSecurity": { + "message": "Fai l'upgrade per una maggiore sicurezza" + }, + "viewbusinessplans": { + "message": "Vedi i piani Business" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index b70e7fa6e9f..46ea6ff4433 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 41ac992cd75..f8969bcd10a 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 7d4d047617d..af314c36f83 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index a44f4763d27..1620bb6a30e 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index c0929501c00..49933357bc6 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index d9175466f1f..f16be59a175 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Tiklīdz lietotnes būs pārskatītas un atzīmētas kā būtiskas, dalībniekiem varēs piešķirt uzdevumus atrisināt riskam pakļautos vienumus un šeit pārskatīt virzību" }, "sendReminders": { "message": "Send reminders" @@ -188,16 +188,16 @@ "message": "Atzīmēt lietotni kā kritisku" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Atzīmēt kā būtisku" }, "applicationsSelected": { - "message": "applications selected" + "message": "lietotnes atlasītas" }, "selectApplication": { - "message": "Select application" + "message": "Atlasīt lietotni" }, "unselectApplication": { - "message": "Unselect application" + "message": "Atcelt lietotnes atlasīšanu" }, "applicationsMarkedAsCriticalSuccess": { "message": "Lietotnes, kas atzīmētas kā kritiskas" @@ -311,13 +311,13 @@ "message": "Izskatīt tagad" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Paaugstināt būtisko lietotņu svarīgumu" }, "atRiskItems": { - "message": "At-risk items" + "message": "Riskam pakļautie vienumi" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Iespēja atzīmēt kā būtisku tiks ieviesta nākotnes atjauninājumā" }, "unmarkAsCritical": { "message": "Noņemt kritiskuma atzīmi" @@ -2951,7 +2951,7 @@ "message": "Lūgums pārliecināties, ka kontā ir pieejams pietiekami daudz kredīta šim pirkumam. Ja kontā nav pieejams pietiekami daudz kredīta, tiks izmantots noklusējuma norēķinu veids, lai segtu starpību. Kredītu kontam var pievienot norēķinu sadaļā." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Šim pirkumam nav pietiekami daudz konta kredītu. To var pievienot sadaļā \"Norēķini\"." }, "creditAppliedDesc": { "message": "Konta kredīts var tikt izmantots, lai veiktu pirkumus. Viss pieejamais kredīts tiks automātiski izmantots kontam veidotajiem rēķiniem." @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Atcelt arhivēšanu" + }, + "itemsInArchive": { + "message": "Vienumi arhīvā" + }, "noItemsInArchive": { "message": "Arhīvā nav vienumu" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Šeit parādīsies arhivētie vienumi, un tie netiks iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos." }, + "itemWasSentToArchive": { + "message": "Vienums tika ievietots arhīvā" + }, + "itemsWereSentToArchive": { + "message": "Vienumi tika ievietoti arhīvā" + }, + "itemUnarchived": { + "message": "Vienums tika izņemts no arhīva" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Arhivēt vienumu", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Arhivētie vienumi netiek iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos. Vai tiešām ahrivēt šo vienumu?" + }, + "archiveBulkItems": { + "message": "Arhivēt vienumus", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Arhivētie vienumi netiek iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos. Vai tiešām ahrivēt šos vienumus?" + }, "businessUnit": { "message": "Uzņēmējdarbības vienība" }, @@ -11772,16 +11807,16 @@ "message": "Plūdena iekļaušana" }, "families": { - "message": "Families" + "message": "Ģimenes" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Uzlabot uz ģimeņu plānu" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Uzlabot uz Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Konts tika uzlabots uz ģimeņu plānu." }, "taxCalculationError": { "message": "There was an error calculating tax for your location. Please try again." @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Uzlabot savu plānu" + }, + "upgradeNow": { + "message": "Uzlabot tagad" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Šīs veidlapas pabeigšana izveidos jaunu ģimeņu apvienību. Uzlabot savu bezmaksas apvienību var pārvaldības konsolē." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "Tev ir Bitwarden bezmaksas plāns" + }, + "upgradeCompleteSecurity": { + "message": "Uzlabo pilnīgas drošības iegūšanai" + }, + "viewbusinessplans": { + "message": "Apskatīt uzņēmējdarbības plānus" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 65c0ff94b29..d400df253e8 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 446cb859574..69dabfbe9ad 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 7d4d047617d..af314c36f83 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 22a2d8f4834..a37fb08322f 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index edb18ba019d..477ee9e1150 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index b51b563d8ef..8891df75c62 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Leden taken toewijzen om de voortgang te controleren" }, - "onceYouReviewApplications": { - "message": "Als je toepassingen als belangrijk markeert, verschijnen ze hier." + "onceYouReviewApps": { + "message": "Zodra je applicaties beoordeelt en ze als kritiek markeert, kun je leden taken toewijzen om risico-items op te lossen en de voortgang hier te controleren" }, "sendReminders": { "message": "Herinneringen versturen" @@ -11294,11 +11294,46 @@ "message": "Archiveren", "description": "Verb" }, + "unArchive": { + "message": "Dearchiveren" + }, + "itemsInArchive": { + "message": "Items in archief" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "noItemsInArchiveDesc": { + "message": "Gearchiveerde items verschijnen hier en worden uitgesloten van algemene zoekresultaten en automatisch invulsuggesties." + }, + "itemWasSentToArchive": { + "message": "Item naar archief verzonden" + }, + "itemsWereSentToArchive": { + "message": "Item naar archief verzonden" + }, + "itemUnarchived": { + "message": "Item uit het archief gehaald" + }, + "bulkArchiveItems": { + "message": "Items gearchiveerd" + }, + "bulkUnarchiveItems": { + "message": "Item gedearchiveerd" + }, + "archiveItem": { + "message": "Item archiveren", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Gearchiveerde items worden uitgesloten van algemene zoekresultaten en automatische invulsuggesties. Weet je zeker dat je dit item wilt archiveren?" + }, + "archiveBulkItems": { + "message": "Items archiveren", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Gearchiveerde items worden uitgesloten van algemene zoekresultaten en automatische invulsuggesties. Weet je zeker dat je deze items wilt archiveren?" }, "businessUnit": { "message": "Bedrijfseenheid" @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Doorgaan zonder opwaarderen" }, + "upgradeYourPlan": { + "message": "Upgrade je abonnement" + }, + "upgradeNow": { + "message": "Nu upgraden" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Met het invullen van dit formulier maak je een nieuwe Familie-organisatie. Je kunt je gratis organisatie upgraden vanuit de Admin Console." + }, "upgradeErrorMessage": { "message": "Er is een fout opgetreden tijdens het verwerken van het opwaarderen. Probeer het opnieuw." + }, + "bitwardenFreeplanMessage": { + "message": "Je hebt het gratis Bitwarden-abonnement" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade voor volledige beveiliging" + }, + "viewbusinessplans": { + "message": "Bedrijfsabonnementen bekijken" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index ce9f12c6190..6c349c29ff0 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 7d4d047617d..af314c36f83 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index e254083efd9..1f48e445f7f 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Jednostka Biznesowa" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index f24a136d5e8..ba9ad6fa8cf 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -1,12 +1,12 @@ { "allApplications": { - "message": "Todas as aplicações" + "message": "Todos os aplicativos" }, "activity": { - "message": "Activity" + "message": "Atividade" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo do Bitwarden" }, "criticalApplications": { "message": "Aplicativos críticos" @@ -15,19 +15,19 @@ "message": "Nenhum aplicativo crítico em risco" }, "accessIntelligence": { - "message": "Acessar a Inteligência" + "message": "Inteligência de acesso" }, "riskInsights": { - "message": "Intuições de risco" + "message": "Critérios de risco" }, "passwordRisk": { - "message": "Risco de senha" + "message": "Risco de senhas" }, "reviewAtRiskPasswords": { - "message": "Revise as senhas de risco (fracas, expostas ou reutilizadas) em todos os aplicativos. Selecione seus aplicativos mais críticos para priorizar ações de segurança para seus usuários resolverem senhas de risco." + "message": "Revise senhas em risco (fracas, expostas, ou reutilizadas) em todos os aplicativos. Selecione seus aplicativos mais críticos para priorizar ações de segurança para que seus usuários resolvem senhas em risco." }, "dataLastUpdated": { - "message": "Dados atualizados pela última vez: $DATE$", + "message": "Última atualização dos dados: $DATE$", "placeholders": { "date": { "content": "$1", @@ -36,22 +36,22 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Você não criou um relatório ainda" }, "notifiedMembers": { "message": "Membros notificados" }, "revokeMembers": { - "message": "Remover membro" + "message": "Revogar membro" }, "restoreMembers": { - "message": "Restaurar membro" + "message": "Restaurar membros" }, "cannotRestoreAccessError": { "message": "Não é possível restaurar acesso à organização" }, "allApplicationsWithCount": { - "message": "Todas as aplicações ($COUNT$)", + "message": "Todas os aplicativos ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,10 +60,10 @@ } }, "createNewLoginItem": { - "message": "Criar item de \"login\"" + "message": "Criar credencial" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "$PERCENT$% concluído", "placeholders": { "percent": { "content": "$1", @@ -72,7 +72,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "$COUNT$ tarefas de segurança concluídas das $TOTAL$", "placeholders": { "count": { "content": "$1", @@ -85,28 +85,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "Progresso de alteração de senha" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "Atribuir tarefas a membros para monitorar progresso" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { - "message": "Send reminders" + "message": "Enviar lembretes" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "Ao marcar aplicativos como críticos, eles aparecerão aqui." }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "Visualizar membros em risco" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "Visualizar aplicativos em risco" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "$COUNT$ aplicativos críticos dos $TOTAL$ estão em risco devido a senhas em risco", "placeholders": { "count": { "content": "$1", @@ -128,7 +128,7 @@ } }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ aplicativos críticos", "placeholders": { "count": { "content": "$1", @@ -137,7 +137,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ aplicativos em risco", "placeholders": { "count": { "content": "$1", @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ senhas em risco", "placeholders": { "count": { "content": "$1", @@ -173,43 +173,43 @@ } }, "noAppsInOrgDescription": { - "message": "Como os usuários salvam as credenciais, os aplicativos aparecem aqui, mostrando qualquer senha de risco. Marque aplicativos críticos e notifique os usuários a atualizar senhas." + "message": "Quando usuários salvam credenciais, aplicativos aparecem aqui, mostrando quaisquer senhas em risco. Marque apps como críticos e notifique usuários para que atualizem as senhas." }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "Você não marcou nenhum aplicativo como crítico" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Selecione os seus aplicativos mais críticos para priorizar ações de segurança de correção de senhas em risco dos seus usuários." }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "Selecionar aplicativos críticos" }, "markAppAsCritical": { "message": "Marcar aplicativo como crítico" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Marcar como crítico" }, "applicationsSelected": { - "message": "applications selected" + "message": "aplicativos selecionados" }, "selectApplication": { - "message": "Select application" + "message": "Selecionar aplicativo" }, "unselectApplication": { - "message": "Unselect application" + "message": "Desselecionar aplicativo" }, "applicationsMarkedAsCriticalSuccess": { - "message": "Aplicações marcadas como críticas" + "message": "Aplicativos marcados como críticos" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Falha ao marcar aplicativos como críticos" }, "application": { "message": "Aplicativo" }, "atRiskPasswords": { - "message": "Senhas de risco" + "message": "Senhas em risco" }, "requestPasswordChange": { "message": "Solicitar alteração de senha" @@ -221,13 +221,13 @@ "message": "Procurar aplicativos" }, "atRiskMembers": { - "message": "Membros de risco" + "message": "Membros em risco" }, "membersWithAccessToAtRiskItemsForCriticalApps": { - "message": "Members with access to at-risk items for critical applications" + "message": "Membros com acesso a itens em risco de aplicativos críticos" }, "membersAtRiskCount": { - "message": "$COUNT$ members at-risk", + "message": "$COUNT$ membros em risco", "placeholders": { "count": { "content": "$1", @@ -245,7 +245,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "Aplicações em risco ($COUNT$)", + "message": "Aplicativos em risco ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -254,19 +254,19 @@ } }, "atRiskMembersDescription": { - "message": "Esses membros estão logando em aplicativos com senhas fracas, expostas ou reutilizadas." + "message": "Esses membros estão conectando-se em aplicativos com senhas fracas, expostas, ou reutilizadas." }, "atRiskMembersDescriptionNone": { - "message": "These are no members logging into applications with weak, exposed, or reused passwords." + "message": "Não há nenhum membro se conectando em aplicativos com senhas fracas, expostas, ou reutilizadas." }, "atRiskApplicationsDescription": { - "message": "Esses aplicativos têm senhas fracas, expostas ou reutilizadas." + "message": "Esses aplicativos têm senhas fracas, expostas, ou reutilizadas." }, "atRiskApplicationsDescriptionNone": { "message": "Não há aplicativos com senhas fracas, expostas ou reutilizadas." }, "atRiskMembersDescriptionWithApp": { - "message": "Esses membros estão logando no $APPNAME$ com senhas fracas, expostas ou reutilizadas.", + "message": "Esses membros estão conectando-se no $APPNAME$ com senhas fracas, expostas, ou reutilizadas.", "placeholders": { "appname": { "content": "$1", @@ -287,16 +287,16 @@ "message": "Total de membros" }, "atRiskApplications": { - "message": "Aplicações de risco" + "message": "Aplicativos em risco" }, "totalApplications": { - "message": "Todos os aplicativos" + "message": "Total de aplicativos" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Aplicativos que precisam de revisão" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ aplicativos novos", "placeholders": { "count": { "content": "$1", @@ -305,25 +305,25 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Revise aplicativos novos para marcar como críticos e manter sua organização segura" }, "reviewNow": { - "message": "Review now" + "message": "Revisar agora" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Priorizar aplicativos críticos" }, "atRiskItems": { - "message": "At-risk items" + "message": "Itens em risco" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "A funcionalidade de marcar como crítico será implementada em uma atualização futura" }, "unmarkAsCritical": { "message": "Desmarcar como crítico" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Successfully unmarked application as critical" + "message": "Aplicativo desmarcado com sucesso como crítico" }, "whatTypeOfItem": { "message": "Que tipo de item é este?" @@ -363,13 +363,13 @@ "message": "Notas" }, "privateNote": { - "message": "Nota privada" + "message": "Anotação privada" }, "note": { - "message": "Nota" + "message": "Anotação" }, "customFields": { - "message": "Campos Personalizados" + "message": "Campos personalizados" }, "cardholderName": { "message": "Nome do titular do cartão" @@ -381,7 +381,7 @@ "message": "Detalhes pessoais" }, "identification": { - "message": "Identificação" + "message": "Identidade" }, "contactInfo": { "message": "Informação de contato" @@ -411,7 +411,7 @@ "message": "Site (URI)" }, "websiteUriCount": { - "message": "Site (URI) $COUNT$", + "message": "$COUNT$° site (URI)", "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": { @@ -427,7 +427,7 @@ "message": "Adicionar site" }, "deleteWebsite": { - "message": "Excluir site" + "message": "Apagar site" }, "defaultLabel": { "message": "Padrão ($VALUE$)", @@ -440,7 +440,7 @@ } }, "showMatchDetection": { - "message": "Exibir detecção de correspondência $WEBSITE$", + "message": "Mostrar detecção de correspondência $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -470,13 +470,13 @@ "message": "Vencimento" }, "securityCode": { - "message": "Código de Segurança (CVV)" + "message": "Código de segurança (CVV)" }, "securityCodeSlashCVV": { "message": "Código de segurança / CVV" }, "identityName": { - "message": "Nome de Identidade" + "message": "Nome na identidade" }, "company": { "message": "Empresa" @@ -485,10 +485,10 @@ "message": "Cadastro de Pessoas Físicas (CPF)" }, "passportNumber": { - "message": "Número do Passaporte" + "message": "Número do passaporte" }, "licenseNumber": { - "message": "Número da Licença" + "message": "Número da licença" }, "email": { "message": "E-mail" @@ -545,25 +545,25 @@ "message": "Sra" }, "mx": { - "message": "Mx" + "message": "Sre" }, "dr": { "message": "Dr" }, "cardExpiredTitle": { - "message": "Cartão expirado" + "message": "Cartão vencido" }, "cardExpiredMessage": { "message": "Se você o renovou, atualize as informações do cartão" }, "expirationMonth": { - "message": "Mês de Vencimento" + "message": "Mês de vencimento" }, "expirationYear": { - "message": "Ano de Vencimento" + "message": "Ano de vencimento" }, "authenticatorKeyTotp": { - "message": "Chave de Autenticação (TOTP)" + "message": "Chave do autenticador (TOTP)" }, "totpHelperTitle": { "message": "Tornar a verificação em duas etapas fácil" @@ -612,7 +612,7 @@ "message": "Não atribuído" }, "noneFolder": { - "message": "Nenhuma Pasta", + "message": "Sem pasta", "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { @@ -620,10 +620,10 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "addFolder": { - "message": "Adicionar Pasta" + "message": "Adicionar pasta" }, "editFolder": { - "message": "Editar Pasta" + "message": "Editar pasta" }, "editWithName": { "message": "Editar $ITEM$: $NAME$", @@ -645,10 +645,10 @@ "message": "Nome da pasta" }, "folderHintText": { - "message": "Aninhe uma pasta adicionando o nome da pasta pai seguido de uma \"/\". Exemplo: Social/Fóruns" + "message": "Agrupe uma pasta adicionando o nome da pasta mãe seguido de uma \"/\". Exemplo: Social/Fóruns" }, "deleteFolderPermanently": { - "message": "Você tem certeza que deseja excluir esta pasta permanentemente?" + "message": "Tem certeza que quer apagar esta pasta para sempre?" }, "baseDomain": { "message": "Domínio de base", @@ -673,7 +673,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Detecção de Correspondência", + "message": "Detecção de correspondência", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -684,10 +684,10 @@ "message": "Nunca" }, "toggleVisibility": { - "message": "Alternar Visibilidade" + "message": "Habilitar visibilidade" }, "toggleCollapse": { - "message": "Alternar Colapso", + "message": "Guardar/mostrar", "description": "Toggling an expand/collapse state." }, "checkPassword": { @@ -733,16 +733,16 @@ "message": "Editar" }, "searchCollection": { - "message": "Pesquisar Coleção" + "message": "Pesquisar coleção" }, "searchFolder": { - "message": "Pesquisar Pasta" + "message": "Pesquisar pasta" }, "searchFavorites": { - "message": "Pesquisar Favoritos" + "message": "Pesquisar favoritos" }, "searchLogin": { - "message": "Buscar credenciais", + "message": "Pesquisar credenciais", "description": "Search Login type" }, "searchCard": { @@ -750,33 +750,33 @@ "description": "Search Card type" }, "searchIdentity": { - "message": "Buscar identidades", + "message": "Pesquisar identidades", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Buscar notas seguras", + "message": "Pesquisar anotações seguras", "description": "Search Secure Note type" }, "searchVault": { - "message": "Pesquisar no Cofre" + "message": "Pesquisar cofre" }, "searchMyVault": { - "message": "Buscar no meu cofre" + "message": "Pesquisar meu cofre" }, "searchOrganization": { - "message": "Buscar na organização" + "message": "Pesquisar organização" }, "searchMembers": { - "message": "Buscar membros" + "message": "Pesquisar membros" }, "searchGroups": { "message": "Buscar grupos" }, "resetSearch": { - "message": "Redefinir busca" + "message": "Apagar pesquisa" }, "allItems": { - "message": "Todos os Itens" + "message": "Todos os itens" }, "favorites": { "message": "Favoritos" @@ -794,16 +794,16 @@ "message": "Identidade" }, "typeSecureNote": { - "message": "Nota Segura" + "message": "Anotação segura" }, "typeNote": { - "message": "Nota" + "message": "Anotação" }, "typeSshKey": { "message": "Chave SSH" }, "typeLoginPlural": { - "message": "Logins" + "message": "Credenciais" }, "typeCardPlural": { "message": "Cartões" @@ -812,7 +812,7 @@ "message": "Identidades" }, "typeSecureNotePlural": { - "message": "Notas Seguras" + "message": "Anotações seguras" }, "folders": { "message": "Pastas" @@ -821,16 +821,16 @@ "message": "Coleções" }, "firstName": { - "message": "Primeiro Nome" + "message": "Primeiro nome" }, "middleName": { - "message": "Nome do Meio" + "message": "Nome do meio" }, "lastName": { - "message": "Último Nome" + "message": "Sobrenome" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "address": { "message": "Endereço" @@ -851,7 +851,7 @@ "message": "Estado" }, "zipPostalCode": { - "message": "CEP / Código Postal" + "message": "CEP / Código postal" }, "country": { "message": "País" @@ -869,88 +869,88 @@ "message": "Novo item" }, "addItem": { - "message": "Adicionar Item" + "message": "Adicionar item" }, "editItem": { - "message": "Editar Item" + "message": "Editar item" }, "viewItem": { - "message": "Visualizar Item" + "message": "Visualizar item" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "Nova credencial", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "Novo cartão", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "Nova identidade", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "Nova anotação", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "Nova chave SSH", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "Novo Send de texto", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "Novo Send de arquivo", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "Editar credencial", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "Editar cartão", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "Editar identidade", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "Editar anotação", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "Editar chave SSH", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "Editar Send de texto", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "Editar Send de arquivo", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "Visualizar credencial", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "Visualizar cartão", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "Visualizar identidade", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "Visualizar anotação", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "Visualizar chave SSH", "description": "Header for view SSH key item type" }, "new": { @@ -977,7 +977,7 @@ "message": "Compartilhar" }, "moveToOrganization": { - "message": "Mover para a Organização" + "message": "Mover para organização" }, "valueCopied": { "message": "$VALUE$ copiado(a)", @@ -993,30 +993,30 @@ "message": "Copiado com sucesso" }, "copyValue": { - "message": "Copiar Valor", + "message": "Copiar valor", "description": "Copy value to clipboard" }, "copyPassword": { - "message": "Copiar Senha", + "message": "Copiar senha", "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copiar senha", + "message": "Copiar frase secreta", "description": "Copy passphrase to clipboard" }, "passwordCopied": { "message": "Senha copiada" }, "copyUsername": { - "message": "Copiar Nome de Usuário", + "message": "Copiar nome do usuário", "description": "Copy username to clipboard" }, "copyNumber": { - "message": "Copiar Número", + "message": "Copiar número", "description": "Copy credit card number" }, "copySecurityCode": { - "message": "Copiar Código de Segurança", + "message": "Copiar código de segurança", "description": "Copy credit card security code (CVV)" }, "copyUri": { @@ -1036,7 +1036,7 @@ "message": "Copiar site" }, "copyNotes": { - "message": "Copiar Notas" + "message": "Copiar anotações" }, "copyAddress": { "message": "Copiar endereço" @@ -1051,13 +1051,13 @@ "message": "Copiar empresa" }, "copySSN": { - "message": "Cadastro de Pessoas Físicas" + "message": "Copiar número de CPF" }, "copyPassportNumber": { "message": "Copiar número do passaporte" }, "copyLicenseNumber": { - "message": "Copiar número da CNH" + "message": "Copiar número da licença" }, "copyPrivateKey": { "message": "Copiar chave privada" @@ -1095,10 +1095,10 @@ "message": "Meus itens" }, "myVault": { - "message": "Meu Cofre" + "message": "Meu cofre" }, "allVaults": { - "message": "Todos os Cofres" + "message": "Todos os cofres" }, "vault": { "message": "Cofre" @@ -1107,22 +1107,22 @@ "message": "Cofres" }, "vaultItems": { - "message": "Itens do Cofre" + "message": "Itens do cofre" }, "filter": { - "message": "Filtro" + "message": "Filtrar" }, "deleteSelected": { - "message": "Excluir Selecionados" + "message": "Apagar selecionados" }, "moveSelected": { - "message": "Mover Selecionados" + "message": "Mover selecionados" }, "selectAll": { - "message": "Selecionar Todos" + "message": "Marcar tudo" }, "unselectAll": { - "message": "Desmarcar Todos" + "message": "Desmarcar tudo" }, "launch": { "message": "Abrir" @@ -1137,7 +1137,7 @@ "message": "Tem certeza que deseja excluir esse anexo?" }, "attachmentSaved": { - "message": "O anexo foi salvo." + "message": "Anexo salvo" }, "file": { "message": "Arquivo" @@ -1152,7 +1152,7 @@ "message": "Item adicionado" }, "editedItem": { - "message": "Item editado" + "message": "Item salvo" }, "movedItemToOrg": { "message": "$ITEMNAME$ movido para $ORGNAME$", @@ -1186,13 +1186,13 @@ } }, "deleteItem": { - "message": "Excluir Item" + "message": "Apagar item" }, "deleteFolder": { - "message": "Excluir pasta" + "message": "Apagar pasta" }, "deleteAttachment": { - "message": "Excluir anexo" + "message": "Apagar anexo" }, "deleteItemConfirmation": { "message": "Você tem certeza que deseja enviar este item para a lixeira?" @@ -1210,7 +1210,7 @@ "message": "Você tem certeza que deseja substituir a senha atual?" }, "editedFolder": { - "message": "Pasta editada" + "message": "Pasta salva" }, "addedFolder": { "message": "Pasta adicionada" @@ -1219,10 +1219,10 @@ "message": "Você tem certeza que deseja excluir esta pasta?" }, "deletedFolder": { - "message": "Pasta excluída" + "message": "Pasta apagada" }, "editInfo": { - "message": "Editar info" + "message": "Editar informações" }, "access": { "message": "Acesso" @@ -1243,13 +1243,13 @@ "message": "A sua sessão expirou." }, "restartRegistration": { - "message": "Reiniciar registro" + "message": "Reiniciar cadastro" }, "expiredLink": { "message": "Link expirado" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Por favor, reinicie o registro ou tente fazer login." + "message": "Reinicie o cadastro ou tente conectar-se." }, "youMayAlreadyHaveAnAccount": { "message": "Você pode já ter uma conta" @@ -1276,46 +1276,46 @@ "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." }, "loginWithDevice": { - "message": "Fazer login com dispositivo" + "message": "Conectar-se com dispositivo" }, "loginWithDeviceEnabledNote": { - "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" + "message": "O login com dispositivo deve estar ativado nas configurações do aplicativo do Bitwarden. Precisa de outra opção?" }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" }, "loginWithMasterPassword": { - "message": "Entrar com senha mestra" + "message": "Entrar com senha mestre" }, "readingPasskeyLoading": { - "message": "Lendo a senha..." + "message": "Lendo a chave de acesso..." }, "readingPasskeyLoadingInfo": { "message": "Mantenha esta janela aberta e siga as instruções do seu navegador." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "A autenticação da chave de acesso falhou. Tente novamente." }, "useADifferentLogInMethod": { - "message": "Use um método de login diferente" + "message": "Usar um método de entrada diferente" }, "logInWithPasskey": { - "message": "Iniciar sessão com a chave de acesso" + "message": "Entrar com chave de acesso" }, "useSingleSignOn": { "message": "Usar login único" }, "welcomeBack": { - "message": "Bem vindo de volta" + "message": "Boas-vindas de volta" }, "invalidPasskeyPleaseTryAgain": { - "message": "Senha inválida. Por favor, tente novamente." + "message": "Chave de acesso inválida. Tente novamente." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "2FA para senhas não é suportada. Atualize o aplicativo para iniciar a sessão." + "message": "A 2FA não é suportada para chaves de acesso. Atualize o app para entrar." }, "loginWithPasskeyInfo": { - "message": "Use uma senha gerada que fará o login automaticamente sem uma senha. Biometrias como reconhecimento facial ou impressão digital, ou outro método de segurança FIDO2 verificarão sua identidade." + "message": "Use uma chave de acesso gerada que te conectará automaticamente sem uma senha. Biometrias como reconhecimento facial ou impressão digital, ou outro método de segurança FIDO2 verificarão sua identidade." }, "newPasskey": { "message": "Nova chave de acesso" @@ -1345,10 +1345,10 @@ "message": "Usar para criptografia do cofre" }, "useForVaultEncryptionInfo": { - "message": "Faça login e desbloqueie em dispositivos suportados sem a sua senha mestra. Siga as instruções do seu navegador para finalizar a instalação." + "message": "Conecte-se e desbloqueie em dispositivos suportados sem a sua senha mestre. Siga as instruções do seu navegador para finalizar a configuração." }, "useForVaultEncryptionErrorReadingPasskey": { - "message": "Erro ao ler a senha. Tente novamente ou desmarque esta opção." + "message": "Erro ao ler a chave de acesso. Tente novamente ou desmarque esta opção." }, "encryptionNotSupported": { "message": "Criptografia não suportada" @@ -1357,10 +1357,10 @@ "message": "Configurar criptografia" }, "usedForEncryption": { - "message": "Usado para criptografia" + "message": "Usada para criptografia" }, "loginWithPasskeyEnabled": { - "message": "Iniciar sessão com a chave de acesso ativada" + "message": "Entrar com chave de acesso ativado" }, "passkeySaved": { "message": "$NAME$ salvo", @@ -1378,13 +1378,13 @@ "message": "Remover chave de acesso" }, "removePasskeyInfo": { - "message": "Se todas as chaves de acesso forem removidas, não será mais possível fazer login em novos dispositivos sem sua senha mestra." + "message": "Se todas as chaves de acesso forem removidas, não será mais possível entrar em novos dispositivos sem sua senha mestre." }, "passkeyLimitReachedInfo": { "message": "Limite de chaves de acesso atingido. Remova uma chave de acesso para adicionar outra." }, "tryAgain": { - "message": "Tente Novamente" + "message": "Tentar novamente" }, "createAccount": { "message": "Criar conta" @@ -1402,28 +1402,28 @@ "message": "Novo por aqui?" }, "startTrial": { - "message": "Iniciar Período de Testes" + "message": "Iniciar período de teste" }, "logIn": { - "message": "Iniciar sessão" + "message": "Entrar" }, "logInToBitwarden": { - "message": "Inicie a sessão no Bitwarden" + "message": "Entrar no Bitwarden" }, "enterTheCodeSentToYourEmail": { "message": "Digite o código enviado por e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Insira o código do seu aplicativo autenticador" + "message": "Digite o código do seu aplicativo autenticador" }, "pressYourYubiKeyToAuthenticate": { - "message": "Pressione seu YubiKey para autenticar" + "message": "Pressione sua YubiKey para autenticar" }, "authenticationTimeout": { "message": "Tempo de autenticação esgotado" }, "authenticationSessionTimedOut": { - "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de “login”." + "message": "A sessão de autenticação expirou. Reinicie o processo de entrada." }, "verifyYourIdentity": { "message": "Verifique sua identidade" @@ -1432,19 +1432,19 @@ "message": "Não reconhecemos este dispositivo. Digite o código enviado por e-mail para verificar a sua identidade." }, "continueLoggingIn": { - "message": "Continue acessando" + "message": "Continuar acessando" }, "whatIsADevice": { "message": "O que é um dispositivo?" }, "aDeviceIs": { - "message": "Um dispositivo é uma instalação única do aplicativo Bitwarden onde você se conectou. Reinstalar, limpar dados do aplicativo ou limpar seus cookies pode resultar em um dispositivo aparecendo várias vezes." + "message": "Um dispositivo é uma instalação única do aplicativo Bitwarden em qual você se conectou. Reinstalar, limpar os dados do aplicativo ou limpar seus cookies pode resultar em um dispositivo aparecendo várias vezes." }, "logInInitiated": { "message": "Login iniciado" }, "logInRequestSent": { - "message": "Pedido enviado" + "message": "Solicitação enviada" }, "submit": { "message": "Enviar" @@ -1459,28 +1459,28 @@ "message": "Como devemos chamá-lo?" }, "masterPass": { - "message": "Senha mestra" + "message": "Senha mestre" }, "masterPassDesc": { "message": "A senha mestra é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha mestra. Não há maneira de recuperar a senha caso você se esqueça." }, "masterPassImportant": { - "message": "Senhas mestres não podem ser recuperadas se você esquecê-la!" + "message": "Sua senha mestre não pode ser recuperada se esquecê-la!" }, "masterPassHintDesc": { "message": "Uma dica de senha mestra pode ajudá-lo(a) a lembrar a senha caso você esqueça." }, "reTypeMasterPass": { - "message": "Digite novamente a senha mestra" + "message": "Digite novamente a senha mestre" }, "masterPassHint": { - "message": "Dica da senha mestra (opcional)" + "message": "Dica da senha mestre (opcional)" }, "newMasterPassHint": { - "message": "Nova dica de senha mestra (opcional)" + "message": "Nova dica de senha mestre (opcional)" }, "masterPassHintLabel": { - "message": "Dica da senha mestra" + "message": "Dica da senha mestre" }, "masterPassHintText": { "message": "Se você esquecer sua senha, a dica da senha pode ser enviada ao seu e-mail. $CURRENT$/$MAXIMUM$ caracteres máximos.", @@ -1499,13 +1499,13 @@ "message": "Configurações" }, "accountEmail": { - "message": "Email da conta" + "message": "E-mail da conta" }, "requestHint": { - "message": "Pedir dica" + "message": "Solicitar dica" }, "requestPasswordHint": { - "message": "Dica da senha mestra" + "message": "Dica da senha mestre" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" @@ -1523,10 +1523,10 @@ "message": "A senha mestra é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "A senha mestra é necessária." + "message": "A senha mestre é obrigatória." }, "masterPasswordMinlength": { - "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", + "message": "A senha mestre deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1557,7 +1557,7 @@ "message": "Ocorreu um erro inesperado." }, "expirationDateError": { - "message": "Por favor, selecione uma data de expiração que seja no futuro." + "message": "Selecione uma data de vencimento que seja no futuro." }, "emailAddress": { "message": "Endereço de e-mail" @@ -1591,7 +1591,7 @@ "message": "Senha mestra inválida" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Senha mestre inválida. Confirme se seu e-mail está correto e sua conta foi criada em $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1600,7 +1600,7 @@ } }, "invalidFilePassword": { - "message": "Senha do arquivo inválida, por favor informe a senha utilizada quando criou o arquivo de exportação." + "message": "Senha do arquivo inválida, informe a senha utilizada quando criou o arquivo de exportação." }, "lockNow": { "message": "Bloquear agora" @@ -1609,34 +1609,34 @@ "message": "Não há itens para listar." }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Nenhum item na lixeira" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Os itens que você apagar aparecerão aqui, e serão apagados para sempre depois de 30 dias" }, "noItemsInVault": { - "message": "No items in the vault" + "message": "Nenhum item no cofre" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "O cofre protege mais do que só suas senhas. Armazene credenciais, identidades, cartões, e anotações com segurança aqui." }, "emptyFavorites": { - "message": "You haven't favorited any items" + "message": "Você não favoritou nenhum item" }, "emptyFavoritesDesc": { - "message": "Add frequently used items to favorites for quick access." + "message": "Adicione itens usados frequentemente aos favoritos para acesso rápido." }, "noSearchResults": { - "message": "No search results returned" + "message": "Nenhum resultado de pesquisa" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "Limpar filtros ou tentar outro termo de pesquisa" }, "noPermissionToViewAllCollectionItems": { - "message": "Você não tem permissão para visualizar todos os itens desta coleção." + "message": "Você não tem permissão para visualizar todos os itens nesta coleção." }, "youDoNotHavePermissions": { - "message": "Você não tem permissões para essa coleção" + "message": "Você não pode acessar esta coleção" }, "noCollectionsInList": { "message": "Não há coleções para listar." @@ -1684,10 +1684,10 @@ "message": "aplicativo web" }, "notificationSentDevicePart2": { - "message": "Certifique-se de que a frase Biométrica corresponde à abaixo antes de aprovar." + "message": "Certifique-se de que a frase biométrica corresponde à de baixo antes de aprovar." }, "notificationSentDeviceComplete": { - "message": "Desbloqueie o Bitwarden em seu dispositivo. Certifique-se de que a frase biométrica corresponda à abaixo antes de aprovar." + "message": "Desbloqueie o Bitwarden em seu dispositivo. Certifique-se de que a frase biométrica corresponda à de baixo antes de aprovar." }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para seu dispositivo." @@ -1718,13 +1718,13 @@ "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use seu código de recuperação" + "message": "Usar código de recuperação" }, "insertU2f": { "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." }, "loginUnavailable": { - "message": "Sessão indisponível" + "message": "Entrada indisponível" }, "noTwoStepProviders": { "message": "Esta conta tem a autenticação em duas etapas ativada. No entanto, nenhum dos provedores de autenticação em duas etapas configurados são suportados por este navegador web." @@ -1733,10 +1733,10 @@ "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como um aplicativo de autenticação)." }, "twoStepOptions": { - "message": "Opções de login em duas etapas" + "message": "Opções de autenticação em duas etapas" }, "selectTwoStepLoginMethod": { - "message": "Selecionar método de login em duas etapas" + "message": "Selecionar método de autenticação em duas etapas" }, "recoveryCodeTitle": { "message": "Código de recuperação" @@ -1748,17 +1748,17 @@ "message": "Aplicativo de autenticação" }, "authenticatorAppDescV2": { - "message": "Insira um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", + "message": "Digite um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { "message": "Chave de segurança Yubico OTP" }, "yubiKeyDesc": { - "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." + "message": "Utilize um dispositivo YubiKey 4, 5, ou NEO." }, "duoDescV2": { - "message": "Insira um código gerado pelo Duo Security.", + "message": "Digite um código gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1766,22 +1766,22 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "Utilize qualquer chave de segurança ativada por FIDO U2F para acessar à sua conta." + "message": "Utilize qualquer chave de segurança com FIDO U2F para acessar sua conta." }, "u2fTitle": { "message": "Chave de segurança FIDO U2F" }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn" + "message": "Chave de acesso" }, "webAuthnDesc": { - "message": "Utilize qualquer chave de segurança ativada por WebAuthn para acessar a sua conta." + "message": "Utilize a biometria do seu dispositivo ou uma chave de segurança compatível com o FIDO2." }, "webAuthnMigrated": { - "message": "(Migrado de FIDO)" + "message": "(Migrada do FIDO)" }, "openInNewTab": { - "message": "Abrir numa nova aba" + "message": "Abrir em uma nova aba" }, "emailTitle": { "message": "E-mail" @@ -1805,7 +1805,7 @@ "message": "Edite as coleções com as quais este item está sendo compartilhado. Somente usuários da organização com acesso a estas coleções poderão ver esse item." }, "deleteSelectedItemsDesc": { - "message": "Você selecionou $COUNT$ item(ns) para excluir. Tem certeza que deseja excluir todos estes itens?", + "message": "$COUNT$ item(ns) serão enviados para a lixeira.", "placeholders": { "count": { "content": "$1", @@ -1814,7 +1814,7 @@ } }, "deleteSelectedCollectionsDesc": { - "message": "$COUNT$ coleção(ões) serão excluídas permanentemente.", + "message": "$COUNT$ coleção(ões) serão apagadas para sempre.", "placeholders": { "count": { "content": "$1", @@ -1838,13 +1838,13 @@ "message": "Código de verificação (TOTP)" }, "copyVerificationCode": { - "message": "Copiar Código de Verificação" + "message": "Copiar código de verificação" }, "copyUuid": { - "message": "Copiar URL" + "message": "Copiar UUID" }, "errorRefreshingAccessToken": { - "message": "Erro ao Atualizar Token" + "message": "Erro ao acessar token de recarregamento" }, "errorRefreshingAccessTokenDesc": { "message": "Nenhum token de atualização ou chave de API foi encontrado. Tente sair e entrar novamente." @@ -1853,7 +1853,7 @@ "message": "Aviso" }, "confirmVaultExport": { - "message": "Confirmar Exportação de Cofre" + "message": "Confirmar exportação do cofre" }, "confirmSecretsExport": { "message": "Confirmar exportação de segredos" @@ -1862,7 +1862,7 @@ "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo." }, "exportSecretsWarningDesc": { - "message": "Esta exportação contém seus dados de segredos em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua imediatamente após terminar de usá-lo." + "message": "Esta exportação contém seus dados de segredos em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague-o imediatamente após terminar de usá-lo." }, "encExportKeyWarningDesc": { "message": "Esta exportação criptografa seus dados usando a chave de criptografia da sua conta. Se você rotacionar a chave de criptografia da sua conta, você deve exportar novamente, já que você não será capaz de descriptografar este arquivo de exportação." @@ -1877,34 +1877,34 @@ "message": "Exportar de" }, "exportVault": { - "message": "Exportar Cofre" + "message": "Exportar cofre" }, "exportSecrets": { "message": "Exportar segredos" }, "fileFormat": { - "message": "Formato do Arquivo" + "message": "Formato do arquivo" }, "fileEncryptedExportWarningDesc": { - "message": "Esta exportação de arquivo será protegida por senha e exigirá a senha do arquivo para descriptografar." + "message": "Este arquivo de exportação será protegido por senha e precisará da mesma para ser descriptografado." }, "exportPasswordDescription": { "message": "Esta senha será usada para exportar e importar este arquivo" }, "confirmMasterPassword": { - "message": "Confirme a Senha Mestra" + "message": "Confirme a senha mestre" }, "confirmFormat": { - "message": "Confirmar Formato" + "message": "Confirmar formato" }, "filePassword": { - "message": "Senha do Arquivo" + "message": "Senha do arquivo" }, "confirmFilePassword": { "message": "Confirmar senha do arquivo" }, "accountRestrictedOptionDescription": { - "message": "Use sua chave criptográfica da conta, derivada do nome de usuário e Senha Mestra da sua conta, para criptografar a exportação e restringir importação para apenas a conta atual do Bitwarden." + "message": "Use a chave de criptografia da sua conta, derivada do nome de usuário e senha mestre da sua conta, para criptografar a exportação e restringir a importação para apenas a conta atual do Bitwarden." }, "passwordProtectedOptionDescription": { "message": "Defina uma senha para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografar." @@ -1913,38 +1913,38 @@ "message": "Tipo da exportação" }, "accountRestricted": { - "message": "Conta restrita" + "message": "Restrita à conta" }, "passwordProtected": { - "message": "Protegido por Senha" + "message": "Protegido por senha" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "\"Senha do arquivo\" e \"Confirmação de senha\" não correspondem." + "message": "\"Senha do arquivo\" e \"Confirmar senha do arquivo\" não correspondem." }, "confirmVaultImport": { - "message": "Confirmar Importação do Cofre" + "message": "Confirmar importação do cofre" }, "confirmVaultImportDesc": { - "message": "Este arquivo é protegido por senha. Por favor, digite a senha do arquivo para importar os dados." + "message": "Este arquivo é protegido por senha. Digite a senha do arquivo para importar os dados." }, "exportSuccess": { - "message": "Os dados do seu cofre foram exportados." + "message": "Dados do cofre exportados" }, "passwordGenerator": { - "message": "Gerador de Senha" + "message": "Gerador de senha" }, "minComplexityScore": { - "message": "Pontuação Mínima de Complexidade" + "message": "Pontuação de complexidade mínima" }, "minNumbers": { - "message": "Números Mínimos" + "message": "Mínimo de números" }, "minSpecial": { - "message": "Especiais Mínimos", + "message": "Mínimo de especiais", "description": "Minimum special characters" }, "ambiguous": { - "message": "Evitar Caracteres Ambíguos", + "message": "Evitar caracteres ambíguos", "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { @@ -1970,27 +1970,27 @@ "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { - "message": "Número de Palavras" + "message": "Número de palavras" }, "wordSeparator": { - "message": "Separador de Palavra" + "message": "Separador das palavras" }, "capitalize": { "message": "Iniciais em Maiúsculas", "description": "Make the first letter of a word uppercase." }, "includeNumber": { - "message": "Incluir Número" + "message": "Incluir número" }, "generatorPolicyInEffect": { "message": "Os requisitos de política empresarial foram aplicados às suas opções de gerador.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { - "message": "Histórico de Senha" + "message": "Histórico de senhas" }, "generatorHistory": { "message": "Histórico do gerador" @@ -1999,7 +1999,7 @@ "message": "Limpar histórico do gerador" }, "cleargGeneratorHistoryDescription": { - "message": "Se continuar, todas as entradas serão permanentemente excluídas do histórico do gerador. Tem certeza que deseja continuar?" + "message": "Se continuar, todos os itens serão apagados para sempre do histórico do gerador. Tem certeza que deseja continuar?" }, "noPasswordsInList": { "message": "Não existem senhas para listar." @@ -2018,16 +2018,16 @@ "description": "To clear something out. Example: To clear browser history." }, "accountUpdated": { - "message": "Conta Atualizada" + "message": "Conta salva" }, "changeEmail": { - "message": "Alterar E-mail" + "message": "Alterar e-mail" }, "changeEmailTwoFactorWarning": { - "message": "Prosseguir irá alterar o endereço de e-mail da sua conta. Isso não mudará o endereço de e-mail usado para autenticação de dois fatores. Você pode alterar esse endereço de e-mail nas configurações de Login em Duas Etapas." + "message": "Prosseguir irá alterar o endereço de e-mail da sua conta. Isso não mudará o endereço de e-mail usado para autenticação de dois fatores. Você pode alterar esse endereço de e-mail nas configurações de autenticação de duas etapas." }, "newEmail": { - "message": "Novo E-mail" + "message": "Novo e-mail" }, "code": { "message": "Código" @@ -2045,7 +2045,7 @@ "message": "O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "Ao alterar sua senha, você precisará entrar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectados dentro de uma hora." }, "emailChanged": { "message": "E-mail salvo" @@ -2063,28 +2063,28 @@ "message": "Por favor, reinicie a sessão. Se estiver usando outros aplicativos do Bitwarden, encerre a sessão e reinicie também." }, "changeMasterPassword": { - "message": "Alterar Senha Mestra" + "message": "Alterar senha mestre" }, "masterPasswordChanged": { - "message": "Senha Mestra Alterada" + "message": "Senha mestre salva" }, "currentMasterPass": { - "message": "Senha mestra atual" + "message": "Senha mestre atual" }, "newMasterPass": { - "message": "Nova senha mestra" + "message": "Nova senha mestre" }, "confirmNewMasterPass": { - "message": "Confirme a nova senha mestra" + "message": "Confirmar nova senha mestra" }, "encKeySettings": { "message": "Configurações da chave de criptografia" }, "kdfAlgorithm": { - "message": "Algoritmo KDF" + "message": "Algoritmo da KDF" }, "kdfIterations": { - "message": "Iterações KDF" + "message": "Iterações da KDF" }, "kdfIterationsDesc": { "message": "As iterações KDF mais altas podem ajudar a proteger a sua senha mestra de ser descoberta pela força bruta de um invasor. Recomendamos um valor de $VALUE$ ou mais.", @@ -2096,7 +2096,7 @@ } }, "kdfIterationsWarning": { - "message": "Configurar as suas iterações KDF muito alta pode resultar em baixo desempenho ao iniciar sessão (e desbloquear) no Bitwarden em dispositivos com CPUs mais lentas. Recomendamos que você aumente o valor em incrementos de $INCREMENT$ e, em seguida, teste em todos os seus dispositivos.", + "message": "Usar iterações de KDF muito altas pode resultar em baixo desempenho ao entrar (e desbloquear) no Bitwarden em dispositivos com CPUs mais lentas. Recomendamos que você aumente o valor em incrementos de $INCREMENT$ e, em seguida, teste em todos os seus dispositivos.", "placeholders": { "increment": { "content": "$1", @@ -2105,17 +2105,17 @@ } }, "kdfMemory": { - "message": "Memória KDF (MB)", + "message": "Memória da KDF (MB)", "description": "Memory refers to computer memory (RAM). MB is short for megabytes." }, "argon2Warning": { - "message": "Configurar as suas iterações KDF, memória e paralelismo muito altos pode resultar em baixo desempenho ao iniciar (e desbloquear) o Bitwarden em dispositivos mais lentos ou mais antigos. Recomendamos alterá-los individualmente em pequenos incrementos e, em seguida, testar todos os seus dispositivos." + "message": "Usar valores altos para as iterações, memória, e paralelismo da KDF pode resultar em baixo desempenho ao entrar (e desbloquear) o Bitwarden em dispositivos mais lentos ou antigos. Recomendamos alterar estes valores individualmente em incrementos pequenos, e então, testar em todos os seus dispositivos." }, "kdfParallelism": { - "message": "Paralelismo KDF" + "message": "Paralelismo da KDF" }, "argon2Desc": { - "message": "Mais iterações KDF, memória e paralelismo podem ajudar a proteger sua senha mestra de ser descoberta por força bruta por um invasor." + "message": "Mais iterações KDF, memória e paralelismo podem ajudar a proteger sua senha mestre de ser descoberta por força bruta por um invasor." }, "changeKdf": { "message": "Alterar KDF" @@ -2133,31 +2133,31 @@ "message": "Preocupado por ter iniciado a sessão em outro dispositivo? Prossiga abaixo para desautorizar todos os computadores e dispositivos que tenha usado. Esta medida de segurança é recomendada se usou um computador público ou guardou acidentalmente a sua senha num dispositivo que não lhe pertence. Esta ação também apagará todas as sessões anteriores registadas iniciadas com autenticação em duas etapas." }, "deauthorizeSessionsWarning": { - "message": "O processo também desconectará você da sua sessão atual, exigindo que você inicie a sessão novamente. Você também será solicitado a efetuar login em duas etapas novamente, se estiver ativado. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "O processo também desconectará você da sua sessão atual, exigindo que você se conecte novamente. Você também será solicitado a efetuar a autenticação em duas etapas novamente, se estiver ativada. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "newDeviceLoginProtection": { - "message": "Novo login de dispositivo" + "message": "Entrada de dispositivos novos" }, "turnOffNewDeviceLoginProtection": { - "message": "Desativar nova proteção de login de dispositivo" + "message": "Desativar proteção de entrada de dispositivos novos" }, "turnOnNewDeviceLoginProtection": { - "message": "Ative a nova proteção de login de dispositivo" + "message": "Ativar proteção de entrada de dispositivos novos" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Continue abaixo para desativar os e-mails de verificação que o Bitwarden enviará quando você fizer “login” a partir de um novo dispositivo." + "message": "Continue abaixo para desativar os e-mails de verificação que o Bitwarden enviará quando se conectar a partir de um novo dispositivo." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Prossiga abaixo para o Bitwarden enviar e-mails de verificação quando você fizer o “login” a partir de um novo dispositivo." + "message": "Prossiga abaixo para que o Bitwarden envie e-mails de verificação quando você se conectar a partir de um novo dispositivo." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "Com a nova proteção de login de dispositivo desativada, qualquer pessoa com a sua senha mestra pode acessar a sua conta de qualquer dispositivo. Para proteger sua conta sem e-mails de verificação, configure o login em duas etapas." + "message": "Com a proteção de autenticação de dispositivos novos desativada, qualquer um com a sua senha mestre pode acessar sua conta de qualquer dispositivo. Para proteger sua conta sem e-mails de verificação, configure a autenticação em duas etapas." }, "accountNewDeviceLoginProtectionSaved": { - "message": "Mudanças na proteção de novo “login” de dispositivo foram salvas" + "message": "Alterações na proteção na entrada de dispositivos novos salvas" }, "sessionsDeauthorized": { - "message": "Todas as Sessões Desautorizadas" + "message": "Todas as sessões desautorizadas" }, "accountIsOwnedMessage": { "message": "Esta conta pertence a $ORGANIZATIONNAME$", @@ -2187,45 +2187,45 @@ "message": "Limpando o seu cofre permanentemente. Não pode ser desfeito." }, "vaultPurged": { - "message": "O seu cofre foi limpo." + "message": "O cofre foi limpo." }, "deleteAccount": { - "message": "Excluir a Conta" + "message": "Apagar conta" }, "deleteAccountDesc": { - "message": "Prossiga abaixo para excluir sua conta e todos os dados associados." + "message": "Prossiga abaixo para apagar sua conta e todos os dados do cofre." }, "deleteAccountWarning": { "message": "A exclusão de sua conta é permanente. Não pode ser desfeito." }, "accountDeleted": { - "message": "Conta Excluída" + "message": "Conta apagada" }, "accountDeletedDesc": { - "message": "A sua conta foi fechada e todos os dados associados foram excluídos." + "message": "A sua conta foi fechada e todos os dados associados foram apagados." }, "deleteOrganizationWarning": { - "message": "A exclusão da organização é permanente. Não pode ser desfeita." + "message": "O apagamento da organização é permanente. Não pode ser desfeito." }, "myAccount": { - "message": "Minha Conta" + "message": "Minha conta" }, "tools": { "message": "Ferramentas" }, "importData": { - "message": "Importar Dados" + "message": "Importar dados" }, "onboardingImportDataDetailsPartOne": { - "message": "Se você não tem dados para importar, você pode criar uma ", + "message": "Se você não tem dados para importar, você pode criar um ", "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.)" }, "onboardingImportDataDetailsLink": { - "message": "Novo item", + "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": "novo login", + "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": { @@ -2233,17 +2233,17 @@ "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." }, "onboardingImportDataDetailsPartTwoWithOrgs": { - "message": " em vez disso, você pode precisar esperar até que o seu administrador confirme a sua associação à organização.", + "message": " em vez disso. Pode ser necessário esperar até que o seu administrador confirme a sua associação à organização.", "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. You may need to wait until your administrator confirms your organization membership." }, "importError": { "message": "Erro de importação" }, "importErrorDesc": { - "message": "Houve um problema com os dados que você tentou importar. Por favor, resolva os erros listados abaixo em seu arquivo de origem e tente novamente." + "message": "Houve um problema com os dados que você tentou importar. Resolva os erros listados abaixo em seu arquivo de origem e tente novamente." }, "importSuccess": { - "message": "Os dados foram importados com sucesso para o seu cofre." + "message": "Dados importados com sucesso" }, "importSuccessNumberOfItems": { "message": "Um total de $AMOUNT$ itens foram importados.", @@ -2288,10 +2288,10 @@ "message": "Selecione uma coleção" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "Selecione esta opção caso queira importar os conteúdos importados do arquivo movidos para uma coleção" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "Selecione esta opção caso queira importar os conteúdos importados do arquivo movidos para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -2303,7 +2303,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Selecionar Arquivo" + "message": "Escolher arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -2340,22 +2340,22 @@ "message": "Altere o idioma usado pelo cofre web." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostrar ícones de sites e obter URLs de alteração de senha" }, "default": { "message": "Padrão" }, "domainRules": { - "message": "Regras de Domínio" + "message": "Regras de domínios" }, "domainRulesDesc": { "message": "Se você tiver a mesma credencial em vários domínios de sites diferentes, poderá marcar o site como \"equivalente\". Domínios \"globais\" são aqueles já criados para você pelo Bitwarden." }, "globalEqDomains": { - "message": "Domínios Equivalentes Globais" + "message": "Domínios equivalentes globais" }, "customEqDomains": { - "message": "Domínios Equivalentes Personalizados" + "message": "Domínios equivalentes personalizados" }, "exclude": { "message": "Excluir" @@ -2367,7 +2367,7 @@ "message": "Personalizar" }, "newCustomDomain": { - "message": "Novo Domínio Personalizado" + "message": "Novo domínio personalizado" }, "newCustomDomainDesc": { "message": "Digite uma lista de domínios separados por vírgulas. Apenas domínios \"base\" são permitidos. Não insira subdomínios. Por exemplo, digite \"google.com.br\" em vez de \"www.google.com.br\". Você também pode digitar \"androidapp://package.name\" para associar um aplicativo Android a outros domínios de site." @@ -2382,50 +2382,50 @@ } }, "domainsUpdated": { - "message": "Domínios atualizados" + "message": "Domínios salvos" }, "twoStepLogin": { - "message": "Login em Duas Etapas" + "message": "Autenticação em duas etapas" }, "twoStepLoginEnforcement": { - "message": "Requerer Login em Duas Etapas" + "message": "Obrigatoriedade da autenticação em duas etapas" }, "twoStepLoginDesc": { "message": "Proteja a sua conta exigindo uma etapa adicional ao iniciar sessão." }, "twoStepLoginTeamsDesc": { - "message": "Ative o login em duas etapas para sua organização." + "message": "Ative a autenticação em duas etapas para sua organização." }, "twoStepLoginEnterpriseDescStart": { - "message": "Reforçar as opções de login em duas etapas do Bitwarden para membros usando o ", + "message": "Aplique as opções de autenticação em duas etapas do Bitwarden para membros usando a ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { - "message": "Política de login em duas etapas" + "message": "Política de autenticação em duas etapas" }, "twoStepLoginOrganizationDuoDesc": { - "message": "Para aplicar o Login em Duas Etapas pelo Duo, use as opções abaixo." + "message": "Para aplicar a autenticação em duas etapas pelo Duo, use as opções abaixo." }, "twoStepLoginOrganizationSsoDesc": { - "message": "Se você tem SSO configurado ou planeja ter, o Login em Duas Etapas já pode ser requerido por meio do seu Provedor de Identidade." + "message": "Se você tem SSO configurado ou planeja ter, a autenticação em duas etapas já pode ser aplicada por meio do seu provedor de identidade." }, "twoStepLoginRecoveryWarning": { - "message": "A configuração de login em duas etapas pode bloqueá-lo permanentemente da sua conta no Bitwarden. Um código de recuperação permite que você acesse sua conta no caso de não poder mais usar seu provedor de login em duas etapas normalmente (exemplo: você perde seu dispositivo). O suporte do Bitwarden não será capaz de ajudá-lo se você perder o acesso à sua conta. Recomendamos que você anote ou imprima o código de recuperação e o mantenha em um lugar seguro." + "message": "A configuração de autenticação em duas etapas pode bloqueá-lo permanentemente da sua conta no Bitwarden. Um código de recuperação permite que você acesse sua conta no caso de não poder mais usar seu provedor de login em duas etapas normalmente (exemplo: você perde seu dispositivo). O suporte do Bitwarden não será capaz de ajudá-lo se você perder o acesso à sua conta. Recomendamos que você anote ou imprima o código de recuperação e o mantenha em um lugar seguro." }, "restrictedItemTypePolicy": { - "message": "Remove card item type" + "message": "Remover tipo de item de cartão" }, "restrictedItemTypePolicyDesc": { - "message": "Do not allow members to create card item types. Existing cards will be automatically removed." + "message": "Não permitir que membros criem tipos de itens de cartões. Cartões existentes serão apagados automaticamente." }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "Não é possível importar tipos de item de cartão" }, "restrictCardTypeImportDesc": { - "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + "message": "Uma política configurada por uma ou mais organizações impede que você importe cartões em seus cofres." }, "yourSingleUseRecoveryCode": { - "message": "Seu código de recuperação de uso único pode ser usado para desativar o login em duas etapas no caso de você perder acesso ao seu provedor de login em duas etapas. O Bitwarden recomenda que você anote o código de recuperação e o mantenha em um lugar seguro." + "message": "Seu código de recuperação de uso único pode ser usado para desativar a autenticação em duas etapas no caso de você perder acesso ao seu provedor de login em duas etapas. O Bitwarden recomenda que você anote o código de recuperação e o mantenha em um lugar seguro." }, "viewRecoveryCode": { "message": "Ver código de recuperação" @@ -2435,13 +2435,13 @@ "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { - "message": "Habilitar" + "message": "Ativar" }, "enabled": { - "message": "Habilitado" + "message": "Ativado" }, "restoreAccess": { - "message": "Recuperar acesso" + "message": "Restaurar acesso" }, "premium": { "message": "Premium", @@ -2451,22 +2451,22 @@ "message": "Assinatura Premium" }, "premiumRequired": { - "message": "Requer assinatura premium" + "message": "Requer assinatura Premium" }, "premiumRequiredDesc": { "message": "É necessário ter uma conta premium para usar esse recurso." }, "youHavePremiumAccess": { - "message": "Você tem acesso premium" + "message": "Você tem acesso Premium" }, "alreadyPremiumFromOrg": { - "message": "Você já tem acesso às funcionalidades premium por causa de uma organização da qual é um membro." + "message": "Você já tem acesso às funcionalidades do Premium por causa de uma organização da qual é um membro." }, "manage": { "message": "Gerenciar" }, "manageCollection": { - "message": "Gerenciar Coleção" + "message": "Gerenciar coleção" }, "viewItems": { "message": "Visualizar itens" @@ -2484,7 +2484,7 @@ "message": "Desabilitar" }, "orgUserDetailsNotFound": { - "message": "Member details not found." + "message": "Detalhes de membro não encontrados." }, "revokeAccess": { "message": "Revogar acesso" @@ -2493,13 +2493,13 @@ "message": "Revogar" }, "twoStepLoginProviderEnabled": { - "message": "Este provedor de login em duas etapas está ativado em sua conta." + "message": "Este provedor de autenticação em duas etapas está ativo em sua conta." }, "twoStepLoginAuthDesc": { "message": "Insira a sua senha mestra para modificar as configurações de login em duas etapas." }, "twoStepAuthenticatorInstructionPrefix": { - "message": "Baixe um app autenticador como" + "message": "Baixe um app autenticador como o" }, "twoStepAuthenticatorInstructionInfix1": { "message": "," @@ -2520,16 +2520,16 @@ } }, "continueToExternalUrlDesc": { - "message": "Você está saindo do Bitwarden e lançando um site externo em uma nova janela." + "message": "Você está saindo do Bitwarden e abrindo um site externo em uma nova janela." }, "twoStepContinueToBitwardenUrlTitle": { "message": "Continuar para bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { - "message": "O Bitwarden Authenticator permite que você armazene as chaves de autenticador e gera códigos TOTP para fluxos de verificação de 2 etapas. Saiba mais no site bitwarden.com." + "message": "O Bitwarden Authenticator permite que você armazene as chaves de autenticador e gere códigos TOTP para fluxos de verificação de 2 etapas. Saiba mais no site bitwarden.com." }, "twoStepAuthenticatorScanCodeV2": { - "message": "Escaneie o código QR abaixo com o seu aplicativo de autenticação ou insira a chave." + "message": "Leia o código QR abaixo com o seu app de autenticação ou insira a chave." }, "twoStepAuthenticatorQRCanvasError": { "message": "Não foi possível carregar o código QR. Tente novamente ou use a chave abaixo." @@ -2544,10 +2544,10 @@ "message": "Caso você precise adicioná-lo a outro dispositivo, abaixo está o código QR (ou chave) exigido pelo aplicativo autenticador." }, "twoStepDisableDesc": { - "message": "Tem certeza que deseja desativar este provedor de login em duas etapas?" + "message": "Tem certeza que deseja desativar este provedor de autenticação em duas etapas?" }, "twoStepDisabled": { - "message": "Provedor de login em duas etapas desativado." + "message": "Provedor de autenticação em duas etapas desativado." }, "twoFactorYubikeyAdd": { "message": "Adicionar um novo Yubikey à sua conta" @@ -2565,7 +2565,7 @@ "message": "Salve o formulário." }, "twoFactorYubikeyWarning": { - "message": "Devido as limitações da plataforma, YubiKeys não podem ser usados em todos os aplicativos do Bitwarden. Você deve habilitar outro provedor de login em duas etapas, para que você possa acessar a sua conta quando YubiKeys não puderem ser usados. Plataformas suportadas:" + "message": "Devido as limitações da plataforma, YubiKeys não podem ser usadas em todos os aplicativos do Bitwarden. Você deve ativar outro provedor de autenticação em duas etapas, para que você possa acessar a sua conta quando YubiKeys não puderem ser usadas. Plataformas suportadas:" }, "twoFactorYubikeySupportUsb": { "message": "Cofre Web, aplicativo de desktop, CLI e todas as extensões do navegador em um dispositivo com uma porta USB que pode aceitar o seu YubiKey." @@ -2592,7 +2592,7 @@ } }, "webAuthnkeyX": { - "message": "Chave WebAuthn $INDEX$", + "message": "$INDEX$ª Chave WebAuthn", "placeholders": { "index": { "content": "$1", @@ -2625,7 +2625,7 @@ "message": "Segredo do cliente" }, "twoFactorDuoApiHostname": { - "message": "Nome do domínio da API" + "message": "Servidor da API" }, "twoFactorEmailDesc": { "message": "Siga estas etapas para configurar o login em duas etapas com e-mail:" @@ -2667,16 +2667,16 @@ "message": "Salvar o formulário." }, "twoFactorU2fWarning": { - "message": "Devido as limitações da plataforma, o FIDO U2F não pode ser usado em todas as aplicações do Bitwarden. Deve configurar outro provedor de login em duas etapas para poder acessar a sua conta quando o FIDO U2F não puder ser usado. Plataformas suportadas:" + "message": "Devido às limitações da plataforma, o FIDO U2F não pode ser usado em todos os aplicativos do Bitwarden. Deve configurar outro provedor de autenticação em duas etapas para poder acessar a sua conta quando o FIDO U2F não puder ser usado. Plataformas suportadas:" }, "twoFactorU2fSupportWeb": { - "message": "Cofre web e extensões de navegador em um desktop/laptop com um navegador habilitado para U2F (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." + "message": "Cofre web e extensões de navegador em um desktop/laptop com um navegador que suporte U2F (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." }, "twoFactorU2fWaiting": { "message": "Esperando que você toque no botão da sua chave de segurança" }, "twoFactorU2fClickSave": { - "message": "Clique no botão \"Salvar\" abaixo para ativar essa chave de segurança para o login em duas etapas." + "message": "Clique no botão \"Salvar\" abaixo para ativar essa chave de segurança para a autenticação em duas etapas." }, "twoFactorU2fProblemReadingTryAgain": { "message": "Houve um problema ao ler a chave de segurança. Tente novamente." @@ -2685,7 +2685,7 @@ "message": "Seu código de recuperação de login em duas etapas do Bitwarden" }, "twoFactorRecoveryNoCode": { - "message": "Você ainda não habilitou nenhum provedor de login em duas etapas. Depois de ativar um provedor de login em duas etapas, você pode conferir aqui o seu código de recuperação." + "message": "Você ainda não ativou nenhum provedor de autenticação em duas etapas. Depois de ativar um provedor de autenticação em duas etapas, você pode conferir aqui o seu código de recuperação." }, "printCode": { "message": "Imprimir código", @@ -2695,24 +2695,24 @@ "message": "Relatórios" }, "reportsDesc": { - "message": "Identifique e feche as lacunas de segurança em suas contas online clicando nos relatórios abaixo.", + "message": "Identifique e resolva falhas de segurança em suas contas on-line clicando nos relatórios abaixo.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "Identifique e feche as brechas de segurança nas contas da sua organização clicando nos relatórios abaixo.", + "message": "Identifique e resolva falhas de segurança nas contas da sua organização clicando nos relatórios abaixo.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { - "message": "Relatório de sites inseguros" + "message": "Sites sem segurança" }, "unsecuredWebsitesReportDesc": { - "message": "Usar sites inseguros com o esquema http:// pode ser perigoso. Se o site permitir, você deve sempre acessá-lo utilizando o esquema https:// para que a sua conexão seja criptografada." + "message": "URLs que começam com http:// não utilizam a melhor criptografia disponível. Mude os URIs dessas credenciais para https:// para navegação mais segura." }, "unsecuredWebsitesFound": { - "message": "Sites inseguros encontrados" + "message": "Sites sem segurança encontrados" }, "unsecuredWebsitesFoundReportDesc": { - "message": "Encontramos $COUNT$ item(ns) em seu cofre com URIs não segura(s). Se o site permitir, altere o esquema da URI para https://.", + "message": "Encontramos $COUNT$ itens em seu(s) $VAULT$ com URIs sem segurança. Se o site permitir, altere o esquema da URI para https://.", "placeholders": { "count": { "content": "$1", @@ -2728,16 +2728,16 @@ "message": "Nenhum item no seu cofre tem URIs inseguros." }, "inactive2faReport": { - "message": "Relatório de 2FA Inativo" + "message": "Autenticação em duas etapas inativa" }, "inactive2faReportDesc": { - "message": "A autenticação de duas etapas (2FA) é uma configuração de segurança importante que ajuda a proteger suas contas. Se o site oferecer, você deve sempre ativar a autenticação de duas etapas." + "message": "A autenticação em duas etapas adiciona uma camada de proteção às suas contas. Configure a autenticação em duas etapas usando o Bitwarden Authenticator para estas contas ou use um método alternativo." }, "inactive2faFound": { - "message": "Credenciais Sem 2FA Encontradas" + "message": "Credenciais encontradas sem autenticação em duas etapas" }, "inactive2faFoundReportDesc": { - "message": "Encontramos $COUNT$ site(s) no seu $VAULT$ que pode(m) não estar configurado com o login em duas etapas (de acordo com 2fa. irectory). Para proteger ainda mais essas contas, você deve configurar o login em duas etapas.", + "message": "Encontramos $COUNT$ site(s) em seu(s) $VAULT$ que pode(m) não estar configurado com a autenticação em duas etapas (de acordo com 2fa.directory). Para proteger ainda mais essas contas, você deve configurar a autenticação em duas etapas.", "placeholders": { "count": { "content": "$1", @@ -2756,16 +2756,16 @@ "message": "Instruções" }, "exposedPasswordsReport": { - "message": "Relatório de senhas expostas" + "message": "Senhas expostas" }, "exposedPasswordsReportDesc": { "message": "As senhas expostas em um vazamento de dados são alvos fáceis para os atacantes. Altere estas senhas para evitar possíveis invasões." }, "exposedPasswordsFound": { - "message": "Senhas Expostas Encontradas" + "message": "Senhas expostas encontradas" }, "exposedPasswordsFoundReportDesc": { - "message": "Encontramos no seu cofre $COUNT$ item(ns) com senha(s) que foi(ram) exposta(s) em violações de dado conhecida. Você deve alterá-las para usar uma nova senha.", + "message": "Encontramos $COUNT$ itens em seu(s) cofres $VAULT$ com senhas expostas em vazamentos conhecidos de dados. Você deve alterá-las para uma nova senha.", "placeholders": { "count": { "content": "$1", @@ -2781,10 +2781,10 @@ "message": "Nenhum item no seu cofre tem senhas que foram expostas em violações de dados conhecidas." }, "checkExposedPasswords": { - "message": "Verificar Senhas Expostas" + "message": "Conferir senhas expostas" }, "timesExposed": { - "message": "Vezes expostas" + "message": "Vezes exposta" }, "exposedXTimes": { "message": "Exposta $COUNT$ vez(es)", @@ -2796,16 +2796,16 @@ } }, "weakPasswordsReport": { - "message": "Relatório de Senhas Fracas" + "message": "Senhas fracas" }, "weakPasswordsReportDesc": { - "message": "Senhas fracas podem ser facilmente descobertas por hackers e ferramentas automatizadas que são usadas para quebrar senhas. O gerador de senhas do Bitwarden pode ajudá-lo a criar senhas fortes." + "message": "Senhas fracas podem ser facilmente descobertas por invasores. Altere essas para senhas mais fortes usando o gerador de senha." }, "weakPasswordsFound": { - "message": "Senhas Fracas Encontradas" + "message": "Senhas fracas encontradas" }, "weakPasswordsFoundReportDesc": { - "message": "Encontramos $COUNT$ item(ns) no seu cofre com senha(s) que não é/são fortes. Você deve atualizá-las para usar senhas mais fortes.", + "message": "Encontramos $COUNT$ item(ns) em seu(s) $VAULT$ com senhas que não são fortes. Você deve atualizá-las para usar senhas mais fortes.", "placeholders": { "count": { "content": "$1", @@ -2824,16 +2824,16 @@ "message": "Fraqueza" }, "reusedPasswordsReport": { - "message": "Relatório de Senhas Reutilizadas" + "message": "Senhas reutilizadas" }, "reusedPasswordsReportDesc": { - "message": "Se um serviço que você usa for comprometido, a reutilização da mesma senha em outro local pode permitir que hackers acessem facilmente mais de suas contas online. Você deve usar uma senha exclusiva para cada conta ou serviço." + "message": "Ao reutilizar senhas, fica mais fácil que um invasor entre em várias contas. Altere estas senhas para que cada uma seja única." }, "reusedPasswordsFound": { - "message": "Senhas Reutilizadas Encontradas" + "message": "Senhas reutilizadas encontradas" }, "reusedPasswordsFoundReportDesc": { - "message": "Nós encontramos $COUNT$ senha(s) que esta(ão) sendo reutilizadas no seu cofre. Você deve alterá-los para um valor único.", + "message": "Encontramos $COUNT$ senhas que estão sendo reutilizadas em seu(s) $VAULT$. Você deve alterá-las para um valor único.", "placeholders": { "count": { "content": "$1", @@ -2849,7 +2849,7 @@ "message": "Nenhuma credencial no seu cofre tem senhas que estão sendo reutilizadas." }, "timesReused": { - "message": "Vezes reutilizadas" + "message": "Vezes reutilizada" }, "reusedXTimes": { "message": "Reutilizada $COUNT$ vez(es)", @@ -2861,16 +2861,16 @@ } }, "dataBreachReport": { - "message": "Relatório de Violação de Dados" + "message": "Vazamento de dados" }, "breachDesc": { - "message": "Uma \"brecha\" é um incidente em que os dados de um site foram acessados ilegalmente por hackers e liberados publicamente. Revise os tipos de dados que foram comprometidos (endereços de e-mail, senhas, cartões de crédito etc.) e tome as medidas adequadas, como a alteração de senhas." + "message": "Contas comprometidas podem expor sua informação pessoal. Dê segurança a contas vazadas ativando o 2FA ou criando uma senha mais forte." }, "breachCheckUsernameEmail": { "message": "Verifique qualquer nome de usuário ou endereço de e-mail que você usa." }, "checkBreaches": { - "message": "Verificar Brechas" + "message": "Conferir brechas" }, "breachUsernameNotFound": { "message": "$USERNAME$ não foi encontrado em nenhuma violação de dados conhecida.", @@ -2882,7 +2882,7 @@ } }, "goodNews": { - "message": "Boas Notícias", + "message": "Boas notícias", "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { @@ -2899,7 +2899,7 @@ } }, "breachFound": { - "message": "Contas com Brechas Encontradas" + "message": "Contas comprometidas encontradas" }, "compromisedData": { "message": "Dados comprometidos" @@ -2908,13 +2908,13 @@ "message": "Site" }, "affectedUsers": { - "message": "Usuários Afetados" + "message": "Usuários afetados" }, "breachOccurred": { - "message": "Ocorreu uma Brecha" + "message": "Ocorreu uma brecha" }, "breachReported": { - "message": "Brecha Reportada" + "message": "Brecha reportada" }, "reportError": { "message": "Ocorreu um erro ao tentar carregar o relatório. Tente novamente" @@ -2926,18 +2926,18 @@ "message": "Plano de cobrança" }, "paymentType": { - "message": "Tipo de Pagamento" + "message": "Tipo de pagamento" }, "accountCredit": { - "message": "Crédito da Conta", + "message": "Crédito da conta", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "accountBalance": { - "message": "Saldo da Conta", + "message": "Saldo da conta", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "addCredit": { - "message": "Adicionar Crédito", + "message": "Adicionar crédito", "description": "Add more credit to your account's balance." }, "amount": { @@ -2951,7 +2951,7 @@ "message": "Por favor, certifique-se de que sua conta tenha crédito suficiente para esta compra. Se sua conta não tiver crédito suficiente disponível, seu método de pagamento padrão será usado para completar a diferença. Você pode adicionar crédito à sua conta na página de Cobrança." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Você não tem crédito suficiente na conta para esta compra. Você pode adicionar crédito à sua conta na página de Cobrança." }, "creditAppliedDesc": { "message": "O crédito da sua conta pode ser usado para efetuar compras. Qualquer crédito disponível será automaticamente usado em faturas geradas nesta conta." @@ -2961,19 +2961,19 @@ "description": "Another way of saying \"Get a Premium membership\"" }, "premiumUpdated": { - "message": "Você atualizou para premium." + "message": "Você se tornou Premium." }, "premiumUpgradeUnlockFeatures": { - "message": "Atualize a sua conta para uma conta premium e desbloqueie ótimos recursos adicionais." + "message": "Faça upgrade da sua conta para uma conta Premium e desbloqueie ótimos recursos adicionais." }, "premiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." }, "premiumSignUpTwoStepOptions": { - "message": "Opções adicionais de login em duas etapas, como YubiKey, FIDO U2F e Duo." + "message": "Opções adicionais de autenticação em duas etapas, como YubiKey, e Duo." }, "premiumSignUpEmergency": { - "message": "Acesso de Emergência" + "message": "Acesso de emergência" }, "premiumSignUpReports": { "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." @@ -2985,7 +2985,7 @@ "message": "Prioridade no suporte ao cliente." }, "premiumSignUpFuture": { - "message": "Todos os recursos premium no futuro. Mais em breve!" + "message": "Todos os recursos Premium no futuro. Mais em breve!" }, "premiumPrice": { "message": "Tudo por apenas $PRICE$ /ano!", @@ -2997,7 +2997,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "Seja premium por apenas $PRICE$ /ano, ou obtenha contas premium para $FAMILYPLANUSERCOUNT$ usuários e compartilhamento familiar ilimitado com um ", + "message": "Seja Premium por apenas $PRICE$ por ano, ou obtenha contas premium para $FAMILYPLANUSERCOUNT$ usuários e compartilhamento familiar ilimitado com um ", "placeholders": { "price": { "content": "$1", @@ -3010,7 +3010,7 @@ } }, "bitwardenFamiliesPlan": { - "message": "Bitwarden plano Família." + "message": "Plano Bitwarden Families." }, "addons": { "message": "Complementos" @@ -3019,7 +3019,7 @@ "message": "Acesso Premium" }, "premiumAccessDesc": { - "message": "Você pode adicionar acesso premium a todos os membros da sua organização por $PRICE$ /$INTERVAL$.", + "message": "Você pode adicionar acesso Premium a todos os membros da sua organização a $PRICE$ por $INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -3032,7 +3032,7 @@ } }, "additionalStorageGb": { - "message": "Armazenamento Adicional (GB)" + "message": "Armazenamento adicional (GB)" }, "additionalStorageGbDesc": { "message": "# de GB adicional" @@ -3055,10 +3055,10 @@ } }, "showPricingSummary": { - "message": "Show pricing summary" + "message": "Mostrar resumo de preços" }, "hidePricingSummary": { - "message": "Hide pricing summary" + "message": "Ocultar resumo de preços" }, "summary": { "message": "Resumo" @@ -3095,40 +3095,40 @@ "message": "Seu método de pagamento será cobrado por qualquer assinatura não paga." }, "paymentChargedWithTrial": { - "message": "Seu plano vem com um teste gratuito de 7 dias. Seu cartão não será cobrado até que o período de teste termine e de forma recorrente a cada $INTERVAL$. Você pode cancelar a qualquer momento." + "message": "Seu plano vem com um teste gratuito de 7 dias. Seu cartão não será cobrado até que o período de teste termine. Você pode cancelar a qualquer momento." }, "paymentInformation": { - "message": "Informação de Pagamento" + "message": "Informações de pagamento" }, "billingInformation": { - "message": "Informações de Pagamento" + "message": "Informações de cobrança" }, "billingTrialSubLabel": { "message": "Seu método de pagamento não será cobrado durante o teste gratuito de 7 dias." }, "creditCard": { - "message": "Cartão de Crédito" + "message": "Cartão de crédito" }, "paypalClickSubmit": { - "message": "Clique no botão PayPal para entrar na sua conta do PayPal e, em seguida, clique no botão Enviar abaixo para continuar." + "message": "Clique no botão do PayPal para entrar na sua conta do PayPal e, em seguida, clique no botão Enviar abaixo para continuar." }, "cancelSubscription": { - "message": "Cancelar Assinatura" + "message": "Cancelar assinatura" }, "subscriptionExpiration": { - "message": "Sua assinatura expirou" + "message": "Sua assinatura venceu" }, "subscriptionCanceled": { "message": "A assinatura foi cancelada." }, "pendingCancellation": { - "message": "Cancelamento Pendente" + "message": "Cancelamento pendente" }, "subscriptionPendingCanceled": { "message": "A assinatura foi marcada para ser cancelada no final do período de faturamento atual." }, "reinstateSubscription": { - "message": "Restabelecer Assinatura" + "message": "Restabelecer assinatura" }, "reinstateConfirmation": { "message": "Você tem certeza que deseja remover a solicitação de cancelamento pendente e restabelecer sua assinatura?" @@ -3143,40 +3143,40 @@ "message": "A assinatura foi cancelada." }, "neverExpires": { - "message": "Nunca Expirar" + "message": "Nunca vence" }, "status": { "message": "Estado" }, "nextCharge": { - "message": "Próxima Cobrança" + "message": "Próxima cobrança" }, "details": { "message": "Detalhes" }, "downloadLicense": { - "message": "Baixar Licença" + "message": "Baixar licença" }, "viewBillingToken": { - "message": "Ver Token de Cobrança" + "message": "Ver token de cobrança" }, "updateLicense": { - "message": "Atualizar Licença" + "message": "Atualizar licença" }, "manageSubscription": { - "message": "Gerenciar Assinatura" + "message": "Gerenciar assinatura" }, "launchCloudSubscription": { - "message": "Iniciar Assinatura na Nuvem" + "message": "Lançar assinatura na nuvem" }, "storage": { "message": "Armazenamento" }, "addStorage": { - "message": "Adicionar Armazenamento" + "message": "Adicionar armazenamento" }, "removeStorage": { - "message": "Remover Armazenamento" + "message": "Remover armazenamento" }, "subscriptionStorage": { "message": "A sua assinatura tem um total de $MAX_STORAGE$ GB de armazenamento de arquivos criptografados. Você está usando $USED_STORAGE$ no momento.", @@ -3192,25 +3192,25 @@ } }, "paymentMethod": { - "message": "Forma de Pagamento" + "message": "Método de pagamento" }, "noPaymentMethod": { "message": "Nenhum método de pagamento selecionado." }, "addPaymentMethod": { - "message": "Adicionar Forma de Pagamento" + "message": "Adicionar método de pagamento" }, "changePaymentMethod": { - "message": "Alterar Forma de Pagamento" + "message": "Alterar método de pagamento" }, "invoices": { "message": "Faturas" }, "noUnpaidInvoices": { - "message": "Sem faturas não pagas." + "message": "Nenhuma fatura sem pagar." }, "noPaidInvoices": { - "message": "Sem faturas pagas." + "message": "Nenhuma fatura paga." }, "paid": { "message": "Pago", @@ -3245,10 +3245,10 @@ } }, "gbStorageAdd": { - "message": "GB de Armazenamento Para Adicionar" + "message": "GB de armazenamento para adicionar" }, "gbStorageRemove": { - "message": "GB de Armazenamento Para Remover" + "message": "GB de armazenamento para remover" }, "storageAddNote": { "message": "A adição de armazenamento resultará em ajustes no valor total da fatura e será cobrado imediatamente pela forma de pagamento registrada. A primeira cobrança será rateada pelo restante do ciclo de faturamento atual." @@ -3266,10 +3266,10 @@ } }, "contactSupport": { - "message": "Contato com o Suporte ao Cliente" + "message": "Contatar suporte ao cliente" }, "contactSupportShort": { - "message": "Entrar em contato com Suporte" + "message": "Entrar em contato com o suporte" }, "updatedPaymentMethod": { "message": "Atualizar forma de pagamento." @@ -3278,7 +3278,7 @@ "message": "Comprar Premium" }, "licenseFile": { - "message": "Arquivo de Licença" + "message": "Arquivo da licença" }, "licenseFileDesc": { "message": "Seu arquivo de licença terá o nome de algo como $FILE_NAME$", @@ -3290,7 +3290,7 @@ } }, "uploadLicenseFilePremium": { - "message": "Para atualizar sua conta para uma assinatura premium, você precisa fazer o upload de um arquivo de licença válido." + "message": "Para fazer upgrade da sua conta para uma assinatura Premium, você precisa enviar um arquivo de licença válido." }, "uploadLicenseFileOrg": { "message": "Para criar uma organização hospedada localmente, você precisa fazer o upload de um arquivo de licença válido." @@ -3302,31 +3302,31 @@ "message": "As organizações permitem que você compartilhe partes do seu cofre com outras pessoas, além de gerenciar usuários relacionados para uma entidade específica, como uma família, uma equipe pequena ou uma empresa grande." }, "generalInformation": { - "message": "Informação Geral" + "message": "Informações gerais" }, "organizationName": { - "message": "Nome da Organização" + "message": "Nome da organização" }, "accountOwnedBusiness": { "message": "Esta conta pertence a uma empresa." }, "billingEmail": { - "message": "E-mail de Cobrança" + "message": "E-mail de cobrança" }, "businessName": { - "message": "Nome da Empresa" + "message": "Nome da empresa" }, "chooseYourPlan": { - "message": "Escolhe Seu Plano" + "message": "Escolha seu plano" }, "users": { "message": "Usuários" }, "userSeats": { - "message": "Vagas de Usuário" + "message": "Vagas de usuários" }, "additionalUserSeats": { - "message": "Vagas de Usuário Adicionais" + "message": "Vagas de usuários adicionais" }, "userSeatsDesc": { "message": "# de assentos de usuário" @@ -3373,7 +3373,7 @@ "message": "Para empresas e outras organizações de equipe." }, "planNameTeamsStarter": { - "message": "Equipes iniciates" + "message": "Teams Starter" }, "planNameEnterprise": { "message": "Empresarial" @@ -3382,7 +3382,7 @@ "message": "Para empresas e outras organizações de grande porte." }, "freeForever": { - "message": "Grátis para Sempre" + "message": "Grátis para sempre" }, "includesXUsers": { "message": "inclui $COUNT$ usuários", @@ -3394,7 +3394,7 @@ } }, "additionalUsers": { - "message": "Usuários Adicionais" + "message": "Usuários adicionais" }, "costPerUser": { "message": "$COST$ por usuário", @@ -3436,7 +3436,7 @@ "message": "Adicione e compartilhe com usuários ilimitados" }, "createUnlimitedCollections": { - "message": "Crie Coleções ilimitadas" + "message": "Crie coleções ilimitadas" }, "gbEncryptedFileStorage": { "message": "$SIZE$ de armazenamento encriptado", @@ -3448,16 +3448,16 @@ } }, "onPremHostingOptional": { - "message": "Hospedagem Local (opcional)" + "message": "Hospedagem local (opcional)" }, "usersGetPremium": { - "message": "Usuários obtém acesso a Funcionalidades Premium" + "message": "Usuários recebem acesso a recursos Premium" }, "controlAccessWithGroups": { - "message": "Controle o acesso do usuário com Grupos" + "message": "Controle o acesso de usuários com grupos" }, "syncUsersFromDirectory": { - "message": "Sincronize seus usuários e Grupos de um diretório" + "message": "Sincronize seus usuários e grupos por um diretório" }, "trackAuditLogs": { "message": "Acompanhe as ações do usuário com os registros de auditoria" @@ -3496,7 +3496,7 @@ } }, "trialPaidInfoMessage": { - "message": "Seu $PLAN$ de 7 dias será convertido em uma assinatura paga após 7 dias.", + "message": "Seu $PLAN$ de teste de 7 dias será convertido em uma assinatura paga após 7 dias.", "placeholders": { "plan": { "content": "$1", @@ -3517,16 +3517,16 @@ "message": "Anual" }, "basePrice": { - "message": "Preço Base" + "message": "Preço base" }, "organizationCreated": { - "message": "Organização Criada" + "message": "Organização criada" }, "organizationReadyToGo": { "message": "A sua nova organização está pronta!" }, "organizationUpgraded": { - "message": "Sua organização foi atualizada." + "message": "Um upgrade foi feito na organização" }, "leave": { "message": "Sair" @@ -3538,19 +3538,19 @@ "message": "Você saiu da organização." }, "defaultCollection": { - "message": "Coleção Padrão" + "message": "Coleção padrão" }, "getHelp": { - "message": "Obter Ajuda" + "message": "Obter ajuda" }, "getApps": { - "message": "Obtenha os Aplicativos" + "message": "Baixe os apps" }, "loggedInAs": { "message": "Sessão iniciada como" }, "eventLogs": { - "message": "Registro de Eventos" + "message": "Registro de eventos" }, "people": { "message": "Pessoas" @@ -3559,28 +3559,28 @@ "message": "Políticas" }, "singleSignOn": { - "message": "Logon Único" + "message": "Autenticação única" }, "editPolicy": { - "message": "Editar Política" + "message": "Editar política" }, "groups": { "message": "Grupos" }, "newGroup": { - "message": "Novo Grupo" + "message": "Novo grupo" }, "addGroup": { - "message": "Adicionar Grupo" + "message": "Adicionar grupo" }, "editGroup": { - "message": "Editar Grupo" + "message": "Editar grupo" }, "deleteGroupConfirmation": { "message": "Você tem certeza que deseja excluir este grupo?" }, "deleteMultipleGroupsConfirmation": { - "message": "Você tem certeza que deseja excluir os seguintes $QUANTITY$ grupo(s)?", + "message": "Você tem certeza que deseja apagar os seguintes $QUANTITY$ grupo(s)?", "placeholders": { "quantity": { "content": "$1", @@ -3592,43 +3592,43 @@ "message": "Você tem certeza que deseja remover este(a) usuário(a)?" }, "removeOrgUserConfirmation": { - "message": "Quando um membro é removido, ele não tem mais acesso aos dados da organização, e esta ação é irreversível. Para adicionar o membro de volta à organização, ele deve ser convidado e integrado novamente." + "message": "Quando um membro é removido, ele já não mais acesso aos dados da organização, e esta ação é irreversível. Para adicionar o membro de volta à organização, ele deve ser convidado e integrado novamente." }, "revokeUserConfirmation": { - "message": "Quando um membro é revogado, ele não tem mais acesso aos dados da organização. Para restaurar rapidamente o acesso ao membro vá para a aba Revogada." + "message": "Quando um membro é revogado, ele não tem mais acesso aos dados da organização. Para restaurar rapidamente o acesso ao membro vá para a aba Revogados." }, "removeUserConfirmationKeyConnector": { - "message": "Aviso! Este usuário precisa do Conector de Chave para gerenciar sua criptografia. Remover este usuário de sua organização desativará permanentemente sua conta. Essa ação não pode ser desfeita. Você quer prosseguir?" + "message": "Alerta! Este usuário precisa do Conector de Chave para gerenciar sua criptografia. Remover este usuário de sua organização desativará permanentemente sua conta. Essa ação não pode ser desfeita. Você quer prosseguir?" }, "externalId": { - "message": "ID externa" + "message": "ID externo" }, "externalIdDesc": { - "message": "O ID externo pode ser usado como referência ou vincular esse recurso a um sistema externo, como um diretório de usuários." + "message": "O ID externo pode ser usado como uma referência sem criptografia usada pelo Conector de Diretório e API do Bitwarden." }, "ssoExternalId": { - "message": "SSO External ID" + "message": "ID externo do SSO" }, "ssoExternalIdDesc": { - "message": "SSO External ID is an unencrypted reference between Bitwarden and your configured SSO provider." + "message": "O ID Externo do SSO é uma referência não criptografada entre o Bitwarden e seu provedor de SSO configurado." }, "nestCollectionUnder": { - "message": "Aninhar coleção em" + "message": "Agrupar coleção sob" }, "accessControl": { - "message": "Controle de Acesso" + "message": "Controle de acesso" }, "readOnly": { - "message": "Somente Leitura" + "message": "Somente leitura" }, "newCollection": { - "message": "Nova Coleção" + "message": "Nova coleção" }, "addCollection": { - "message": "Adicionar Coleção" + "message": "Adicionar coleção" }, "editCollection": { - "message": "Editar Coleção" + "message": "Editar coleção" }, "collectionInfo": { "message": "Informações da coleção" @@ -3652,7 +3652,7 @@ "message": "Convide um novo usuário para sua organização digitando o endereço de e-mail da conta Bitwarden dele abaixo. Se ele não tiver uma conta no Bitwarden, ele será solicitado a criar uma nova conta." }, "inviteMultipleEmailDesc": { - "message": "Você pode convidar até $COUNT$ usuários por vez. Utilize a vírgula para separar uma lista de endereços de e-mail.", + "message": "Você pode convidar até $COUNT$ usuários por vez, separando-os com uma vírgula.", "placeholders": { "count": { "content": "$1", @@ -3679,13 +3679,13 @@ "message": "Confirmado" }, "clientOwnerEmail": { - "message": "Email do Proprietário do Cliente" + "message": "Email do proprietário do cliente" }, "owner": { "message": "Proprietário" }, "ownerDesc": { - "message": "O maior usuário de acesso que pode gerenciar todos os aspectos da sua organização." + "message": "Gerencie todos os aspectos da sua organização, incluindo cobrança e assinaturas" }, "clientOwnerDesc": { "message": "Este usuário deve ser independente do Provedor. Se o Provedor estiver desassociado da organização, este usuário manterá a propriedade da organização." @@ -3694,22 +3694,22 @@ "message": "Administrador" }, "adminDesc": { - "message": " Os administradores podem acessar e gerenciar todos os itens, coleções e usuários em sua organização." + "message": "Gerencie o acesso à organização, todas as coleções, membros, relatórios, e configurações de segurança" }, "user": { "message": "Usuário" }, "userDesc": { - "message": "Um usuário comum com acesso às coleções da sua organização." + "message": "Acesse e adicione itens a coleções atribuídas" }, "all": { "message": "Todos" }, "addAccess": { - "message": "Adicionar Acesso" + "message": "Adicionar acesso" }, "addAccessFilter": { - "message": "Adicionar Filtro de Acesso" + "message": "Adicionar filtro de acesso" }, "refresh": { "message": "Atualizar" @@ -3724,7 +3724,7 @@ "message": "Desconhecido" }, "loadMore": { - "message": "Carregar Mais" + "message": "Carregar mais" }, "mobile": { "message": "Celular", @@ -3739,34 +3739,34 @@ "description": "Desktop app" }, "webVault": { - "message": "Cofre Web" + "message": "Cofre web" }, "webApp": { - "message": "Web app" + "message": "App web" }, "cli": { "message": "CLI" }, "bitWebVault": { - "message": "Cofre Web do Bitwarden" + "message": "Cofre web do Bitwarden" }, "bitSecretsManager": { - "message": "Gerenciador de Segredos Bitwarden" + "message": "Gerenciador de Segredos do Bitwarden" }, "loggedIn": { - "message": "Conectado(a)." + "message": "Conectou" }, "changedPassword": { - "message": "Senha da conta alterada." + "message": "Senha da conta alterada" }, "enabledUpdated2fa": { - "message": "Habilitado/atualizado o login em duas etapas." + "message": "Autenticação em duas etapas salva" }, "disabled2fa": { - "message": "Desabilitar login em duas etapas." + "message": "Autenticação em duas etapas desativada" }, "recovered2fa": { - "message": "Conta recuperada do login em duas etapas." + "message": "Conta recuperada da autenticação em duas etapas." }, "failedLogin": { "message": "Falha na tentativa de login com senha incorreta." @@ -3788,13 +3788,13 @@ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "exportedVault": { - "message": "Cofre exportado." + "message": "Cofre exportado" }, "exportedOrganizationVault": { - "message": "Cofre da organização exportado." + "message": "Exportou o cofre da organização." }, "editedOrgSettings": { - "message": "Configurações de organização editadas." + "message": "Editou as configurações da organização." }, "createdItemId": { "message": "Item criado $ID$.", @@ -3824,7 +3824,7 @@ } }, "movedItemIdToOrg": { - "message": "Item $ID$ movido para uma organização.", + "message": "Moveu o item $ID$ para uma organização.", "placeholders": { "id": { "content": "$1", @@ -3833,10 +3833,10 @@ } }, "viewAllLogInOptions": { - "message": "Ver todas as opções de “login”" + "message": "Ver todas as opções de autenticação" }, "viewAllLoginOptions": { - "message": "Ver todas as opções de login" + "message": "Ver todas as opções de autenticação" }, "viewedItemId": { "message": "Item $ID$ visualizado.", @@ -3866,7 +3866,7 @@ } }, "viewedCardNumberItemId": { - "message": "Número do cartão visualizado para o item $ID$.", + "message": "Visualizou o número do cartão do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3956,7 +3956,7 @@ } }, "deletedCollections": { - "message": "Coleções excluídas" + "message": "Apagou as coleções" }, "deletedCollectionId": { "message": "Coleção excluída $ID$.", @@ -4004,7 +4004,7 @@ } }, "deletedManyGroups": { - "message": "$QUANTITY$ grupo(s) excluídos.", + "message": "Apagou $QUANTITY$ grupo(s).", "placeholders": { "quantity": { "content": "$1", @@ -4031,7 +4031,7 @@ } }, "revokedUserId": { - "message": "Acesso revogado da organização para $ID$.", + "message": "Acesso de $ID$ revogado da organização.", "placeholders": { "id": { "content": "$1", @@ -4040,7 +4040,7 @@ } }, "restoredUserId": { - "message": "Acesso restaurado da organização para $ID$.", + "message": "Acesso de $ID$ restaurado à organização.", "placeholders": { "id": { "content": "$1", @@ -4133,7 +4133,7 @@ } }, "createdOrganizationId": { - "message": "A organização $ID$ foi criada.", + "message": "Criou a organização $ID$.", "placeholders": { "id": { "content": "$1", @@ -4142,7 +4142,7 @@ } }, "addedOrganizationId": { - "message": "A organização $ID$ foi adicionada.", + "message": "Adicionou a organização $ID$.", "placeholders": { "id": { "content": "$1", @@ -4151,7 +4151,7 @@ } }, "removedOrganizationId": { - "message": "Organização $ID$ removida.", + "message": "Removeu a organização $ID$.", "placeholders": { "id": { "content": "$1", @@ -4160,7 +4160,7 @@ } }, "accessedClientVault": { - "message": "Cofre da organização $ID$ acessado.", + "message": "Acessou o cofre da organização $ID$.", "placeholders": { "id": { "content": "$1", @@ -4172,22 +4172,22 @@ "message": "Dispositivo" }, "loginStatus": { - "message": "Status do login" + "message": "Estado de autenticação" }, "firstLogin": { "message": "Primeiro acesso" }, "trusted": { - "message": "Confiável" + "message": "Confiado" }, "needsApproval": { "message": "Precisa de aprovação" }, "areYouTryingtoLogin": { - "message": "Você está tentando fazer login?" + "message": "Você está tentando se conectar?" }, "logInAttemptBy": { - "message": "Tentativa de login por $EMAIL$", + "message": "Tentativa de autenticação por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -4196,10 +4196,10 @@ } }, "deviceType": { - "message": "Tipo de dispositivo" + "message": "Tipo do dispositivo" }, "ipAddress": { - "message": "Endereço IP" + "message": "Endereço de IP" }, "confirmLogIn": { "message": "Confirmar acesso" @@ -4211,7 +4211,7 @@ "message": "Este pedido não é mais válido." }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "Solicitação de autenticação aprovada para $EMAIL$ em $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -4224,13 +4224,13 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente entrar com o dispositivo novamente." }, "loginRequestHasAlreadyExpired": { - "message": "O pedido de login já expirou." + "message": "A solicitação de autenticação já expirou." }, "justNow": { - "message": "Agora mesmo" + "message": "Agora há pouco" }, "requestedXMinutesAgo": { "message": "Solicitado há $MINUTES$ minutos", @@ -4245,7 +4245,7 @@ "message": "Criando conta em" }, "checkYourEmail": { - "message": "Verifique seu e-mail" + "message": "Confira seu e-mail" }, "followTheLinkInTheEmailSentTo": { "message": "Siga o link no e-mail enviado para" @@ -4254,7 +4254,7 @@ "message": "e continue criando a sua conta." }, "noEmail": { - "message": "Sem e-mail?" + "message": "Nenhum e-mail?" }, "goBack": { "message": "Voltar" @@ -4272,28 +4272,28 @@ "message": "Ocorreu um erro." }, "userAccess": { - "message": "Acesso de Usuário" + "message": "Acesso do usuário" }, "userType": { - "message": "Tipo de Usuário" + "message": "Tipo do usuário" }, "groupAccess": { - "message": "Grupo de Acesso" + "message": "Acesso a grupos" }, "groupAccessUserDesc": { - "message": "Edite os grupos aos quais este usuário pertence." + "message": "Conceda acesso ao membro a coleções adicionado-o a um ou mais grupos." }, "invitedUsers": { - "message": "Usuário(a)(s) convidado(a)(s)." + "message": "Usuário(s) convidado(s)" }, "resendInvitation": { - "message": "Reenviar o Convite" + "message": "Reenviar convite" }, "resendEmail": { - "message": "Reenviar E-mail" + "message": "Reenviar e-mail" }, "hasBeenReinvited": { - "message": "$USER$ foi convidado(a).", + "message": "$USER$ reconvidado", "placeholders": { "user": { "content": "$1", @@ -4305,10 +4305,10 @@ "message": "Confirmar" }, "confirmUser": { - "message": "Confirmar Usuário" + "message": "Confirmar usuário" }, "hasBeenConfirmed": { - "message": "$USER$ foi confirmado(a).", + "message": "$USER$ confirmado.", "placeholders": { "user": { "content": "$1", @@ -4317,19 +4317,19 @@ } }, "confirmUsers": { - "message": "Confirmar Usuários" + "message": "Confirmar membros" }, "usersNeedConfirmed": { - "message": "Você tem usuários que aceitaram o convite, mas ainda precisam ser confirmados. Os usuários não terão acesso à organização até que sejam confirmados." + "message": "Você tem membros que aceitaram o convite, mas ainda precisam ser confirmados. Os usuários não terão acesso à organização até que sejam confirmados." }, "startDate": { - "message": "Data de Início" + "message": "Data de início" }, "endDate": { - "message": "Data do Término" + "message": "Data de término" }, "verifyEmail": { - "message": "Verificar E-mail" + "message": "Verificar e-mail" }, "verifyEmailDesc": { "message": "Confirme o endereço de e-mail da sua conta para desbloquear o acesso a todos os recursos." @@ -4341,7 +4341,7 @@ "message": "Verifique sua caixa de entrada do e-mail para obter o código de verificação." }, "emailVerified": { - "message": "O seu e-mail foi verificado." + "message": "E-mail da conta verificado" }, "emailVerifiedV2": { "message": "E-mail verificado" @@ -4350,31 +4350,31 @@ "message": "Não é possível confirmar o seu e-mail. Tente enviar um novo e-mail de verificação." }, "emailVerificationRequired": { - "message": "Verificação de E-mail Necessária" + "message": "Verificação de e-mail obrigatória" }, "emailVerificationRequiredDesc": { "message": "Você precisa verificar o seu e-mail para usar este recurso." }, "updateBrowser": { - "message": "Atualizar Navegador" + "message": "Atualize o navegador" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "Gerando suas informações de risco..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Executar relatório" }, "updateBrowserDesc": { "message": "Você está usando um navegador da Web não suportado. O cofre web pode não funcionar corretamente." }, "youHaveAPendingLoginRequest": { - "message": "Você tem uma solicitação de login pendente de outro dispositivo." + "message": "Você tem uma solicitação de autenticação pendente de outro dispositivo." }, "reviewLoginRequest": { - "message": "Revisar solicitação de login" + "message": "Revisar solicitação de autenticação" }, "loginRequest": { - "message": "Login request" + "message": "Solicitação de autenticação" }, "freeTrialEndPromptCount": { "message": "Seu teste gratuito termina em $COUNT$ dias.", @@ -4386,7 +4386,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, seu período de teste gratuito termina em $COUNT$ dias.", + "message": "$ORGANIZATION$, seu teste gratuito termina em $COUNT$ dias.", "placeholders": { "count": { "content": "$2", @@ -4411,7 +4411,7 @@ "message": "Seu teste gratuito termina amanhã." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, seu período de teste gratuito termina hoje.", + "message": "$ORGANIZATION$, seu teste gratuito termina hoje.", "placeholders": { "organization": { "content": "$1", @@ -4426,10 +4426,10 @@ "message": "Clique aqui para adicionar um método de pagamento." }, "joinOrganization": { - "message": "Junte-se a Organização" + "message": "Juntar-se à organização" }, "joinOrganizationName": { - "message": "Entrar em $ORGANIZATIONNAME$", + "message": "Juntar-se à $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -4441,10 +4441,10 @@ "message": "Você foi convidado para participar da organização listada acima. Para aceitar o convite, você precisa iniciar sessão ou criar uma nova conta no Bitwarden." }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Termine de juntar-se nessa organização definindo uma senha mestra." + "message": "Termine de juntar-se nessa organização definindo uma senha mestre." }, "inviteAccepted": { - "message": "Convite Aceito" + "message": "Convite aceito" }, "inviteAcceptedDesc": { "message": "Você pode acessar essa organização quando um administrador confirmar sua associação. Enviaremos um e-mail quando isso acontecer." @@ -4468,16 +4468,16 @@ "message": "Lembrar e-mail" }, "recoverAccountTwoStepDesc": { - "message": "Se você não puder acessar sua conta por meio de seus métodos normais de login em duas etapas, poderá usar seu código de recuperação de login em duas etapas para desativar a funcionalidade de duas etapas da sua conta." + "message": "Se você não puder acessar sua conta por meio de seus métodos normais de autenticação em duas etapas, poderá usar seu código de recuperação para desativar a funcionalidade de duas etapas da sua conta." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Faça o login abaixo usando seu código de recuperação de uso único. Isso irá desativar todos os provedores de duas etapas na sua conta." + "message": "Autentique-se abaixo usando seu código de recuperação de uso único. Isso irá desativar todos os provedores de duas etapas na sua conta." }, "recoverAccountTwoStep": { - "message": "Recuperar login em duas etapas da conta" + "message": "Recuperar autenticação em duas etapas da conta" }, "twoStepRecoverDisabled": { - "message": "O login em duas etapas foi desativado em sua conta." + "message": "A autenticação em duas etapas foi desativada da sua conta." }, "learnMore": { "message": "Saiba mais" @@ -4489,22 +4489,22 @@ "message": "Se a sua conta existir, enviamos um e-mail para você com mais instruções." }, "deleteRecoverConfirmDesc": { - "message": "Você pediu para excluir a sua conta no Bitwarden. Clique no botão abaixo para confirmar." + "message": "Você pediu para apagar a sua conta do Bitwarden. Clique no botão abaixo para confirmar." }, "deleteRecoverOrgConfirmDesc": { - "message": "Você pediu para excluir a sua organização do Bitwarden." + "message": "Você pediu para apagar a sua organização do Bitwarden." }, "myOrganization": { - "message": "Minha Organização" + "message": "Minha organização" }, "organizationInfo": { "message": "Informações da organização" }, "deleteOrganization": { - "message": "Excluir Organização" + "message": "Apagar organização" }, "deletingOrganizationContentWarning": { - "message": "Digite a senha mestra para confirmar a exclusão de $ORGANIZATION$ e todos os dados associados. Os dados do cofre no $ORGANIZATION$ incluem:", + "message": "Digite a senha mestre para confirmar o apagamento de $ORGANIZATION$ e todos os dados associados. Os dados do cofre no $ORGANIZATION$ incluem:", "placeholders": { "organization": { "content": "$1", @@ -4513,10 +4513,10 @@ } }, "deletingOrganizationActiveUserAccountsWarning": { - "message": "As contas de usuários permanecerão ativas após a exclusão, mas não estarão mais associadas a essa organização." + "message": "As contas de usuários permanecerão ativas após apagar, mas não estarão mais associadas a essa organização." }, "deletingOrganizationIsPermanentWarning": { - "message": "A exclusão de $ORGANIZATION$ é permanente e irreversível.", + "message": "Apagar $ORGANIZATION$ é permanente e irreversível.", "placeholders": { "organization": { "content": "$1", @@ -4525,16 +4525,16 @@ } }, "organizationDeleted": { - "message": "Organização Excluida" + "message": "Organização apagada" }, "organizationDeletedDesc": { "message": "A organização e todos os dados associados foram excluídos." }, "organizationUpdated": { - "message": "Organização atualizada" + "message": "Organização salva" }, "taxInformation": { - "message": "Informações de Impostos" + "message": "Informações de tributos" }, "taxInformationDesc": { "message": "Para clientes dentro dos EUA, o código postal (ZIP code) é necessário para satisfazer os requisitos fiscais das vendas. para outros países você pode opcionalmente fornecer um número de identificação fiscal (VAT/GST) e/ou um endereço para aparecer nas suas faturas." @@ -4544,7 +4544,7 @@ "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { - "message": "Atualizar Plano", + "message": "Alterar plano", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlanUpgrade": { @@ -4562,13 +4562,13 @@ } }, "viewInvoice": { - "message": "Ver Fatura" + "message": "Ver fatura" }, "downloadInvoice": { - "message": "Baixar Fatura" + "message": "Baixar fatura" }, "verifyBankAccount": { - "message": "Verificar Conta Bancária" + "message": "Verificar conta bancária" }, "verifyBankAccountDesc": { "message": "Fizemos dois micro-depósitos em sua conta bancária (pode demorar de 1 a 2 dias úteis para aparecer). Insira esses valores para confirmar a conta bancária." @@ -4577,13 +4577,13 @@ "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você será solicitado a confirmar sua conta bancária. Vamos fazer dois micro-depósitos nos próximos 1-2 dias úteis. Insira esses valores na página de faturamento da organização para confirmar a conta bancária." }, "verifyBankAccountFailureWarning": { - "message": "A não verificação da conta bancária resultará em um pagamento não atendido e sua assinatura será desativada." + "message": "A falha na verificação da conta bancária resultará em um pagamento não atendido e sua assinatura será suspensa." }, "verifiedBankAccount": { - "message": "A conta bancária foi verificada." + "message": "Conta bancária verificada" }, "bankAccount": { - "message": "Conta Bancária" + "message": "Conta bancária" }, "amountX": { "message": "Montante $COUNT$", @@ -4596,23 +4596,23 @@ } }, "routingNumber": { - "message": "Routing Number", + "message": "Número de roteamento", "description": "Bank account routing number" }, "accountNumber": { - "message": "Numero da Conta" + "message": "Numero da conta" }, "accountHolderName": { - "message": "Nome do Titular da Conta" + "message": "Nome do titular da conta" }, "bankAccountType": { - "message": "Tipo de Conta" + "message": "Tipo da conta" }, "bankAccountTypeCompany": { - "message": "Empresa (Profissional)" + "message": "Empresa (negócio)" }, "bankAccountTypeIndividual": { - "message": "Individual (Pessoal)" + "message": "Individual (pessoal)" }, "enterInstallationId": { "message": "Insira o seu ID de instalação" @@ -4621,28 +4621,28 @@ "message": "Defina um limite de vagas para sua assinatura. Quando esse limite for atingido, você não poderá convidar novos usuários." }, "limitSmSubscriptionDesc": { - "message": "Defina um limite de assento para sua assinatura do Gerenciador Secretos. Uma vez que este limite for atingido, você não poderá convidar novos membros." + "message": "Defina um limite de vagas para sua assinatura do Gerenciador de Segredos. Ao atingir este limite, você não poderá convidar novos membros." }, "maxSeatLimit": { - "message": "Limite Máximo de Vaga (opcional)", + "message": "Limite de vagas (opcional)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { - "message": "Custo de vaga máximo potencial" + "message": "Custo de vaga potencial máximo" }, "addSeats": { - "message": "Adicionar Vagas", + "message": "Adicionar vagas", "description": "Seat = User Seat" }, "removeSeats": { - "message": "Remover Vagas", + "message": "Remover vagas", "description": "Seat = User Seat" }, "subscriptionDesc": { "message": "Ajustes em sua assinatura resultarão em alterações rateadas em seus totais de cobrança. Se os usuários recém-convidados excederem o número de vagas de sua assinatura, você receberá imediatamente uma cobrança proporcional pelos usuários adicionais." }, "subscriptionUserSeats": { - "message": "Sua assinatura permite um total de $COUNT$ usuários.", + "message": "Sua assinatura permite um total de $COUNT$ membros.", "placeholders": { "count": { "content": "$1", @@ -4654,7 +4654,7 @@ "message": "Assinatura Limite (Opcional)" }, "subscriptionSeats": { - "message": "Vagas de Assinatura" + "message": "Vagas da assinatura" }, "subscriptionUpdated": { "message": "Assinatura atualizada" @@ -4663,7 +4663,7 @@ "message": "Assinatura atualizada. Agora você tem acesso ao Gerenciador de Segredos." }, "additionalOptions": { - "message": "Opções Adicionais" + "message": "Opções adicionais" }, "additionalOptionsDesc": { "message": "Para ajuda adicional no gerenciamento de sua assinatura, entre em contato com o suporte ao cliente." @@ -4675,7 +4675,7 @@ "message": "Se você quiser adicionar mais" }, "smStandaloneTrialSeatCountUpdateMessageFragment2": { - "message": "assentos sem a oferta empacotada, por favor contacte" + "message": "vagas sem a oferta empacotada, contate" }, "subscriptionUserSeatsLimitedAutoscale": { "message": "Ajustes em sua assinatura resultarão em alterações rateadas em seus totais de cobrança. Se os usuários recém-convidados excederem o número de vagas de sua assinatura, você receberá imediatamente uma cobrança proporcional para os usuários adicionais até que seu limite de $MAX$ de vaga seja atingido.", @@ -4696,7 +4696,7 @@ } }, "subscriptionFreePlan": { - "message": "Você não pode convidar mais do que $COUNT$ usuários sem atualizar seu plano.", + "message": "Você não pode convidar mais do que $COUNT$ usuários sem melhorar seu plano.", "placeholders": { "count": { "content": "$1", @@ -4705,7 +4705,7 @@ } }, "subscriptionUpgrade": { - "message": "Você não pode convidar mais de $COUNT$ membros sem atualizar seu plano.", + "message": "Você não pode convidar mais de $COUNT$ membros sem melhorar seu plano.", "placeholders": { "count": { "content": "$1", @@ -4732,7 +4732,7 @@ } }, "subscriptionSeatMaxReached": { - "message": "Você não pode convidar mais de $COUNT$ membro(s) sem atualizar seu plano.", + "message": "Você não pode convidar mais de $COUNT$ membros sem aumentar as suas vagas da assinatura.", "placeholders": { "count": { "content": "$1", @@ -4741,10 +4741,10 @@ } }, "seatsToAdd": { - "message": "Vagas Para Adicionar" + "message": "Vagas a adicionar" }, "seatsToRemove": { - "message": "Vagas Para Remover" + "message": "Vagas a remover" }, "seatsAddNote": { "message": "A adição de assentos de usuário resultará em ajustes no total da cobrança, e será cobrada imediatamente pela sua forma de pagamento registrada. A primeira cobrança será rateada pelo restante do ciclo do faturamento atual." @@ -4817,10 +4817,10 @@ "message": "Depois de atualizar sua chave de criptografia, é necessário encerrar e iniciar a sessão em todos os aplicativos do Bitwarden que você está usando atualmente (como o aplicativo móvel ou as extensões do navegador). Não encerrar e iniciar sessão (que baixa sua nova chave de criptografia) pode resultar em corrupção de dados. Nós tentaremos desconectá-lo automaticamente, mas isso pode demorar um pouco." }, "updateEncryptionKeyAccountExportWarning": { - "message": "Any account restricted exports you have saved will become invalid." + "message": "Quaisquer exportações restritas pela conta que você tem salvas se tornarão inválidas." }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "A criptografia legada não é mais suportada. Entre em contato com o suporte para recuperar a sua conta." }, "subscription": { "message": "Assinatura" @@ -4832,13 +4832,13 @@ "message": "Atualizar" }, "upgradeOrganization": { - "message": "Atualizar Organização" + "message": "Fazer upgrade da organização" }, "upgradeOrganizationDesc": { "message": "Este recurso não está disponível para organizações gratuitas. Mude para um plano pago para desbloquear mais recursos." }, "createOrganizationStep1": { - "message": "Criar Organização: Passo 1" + "message": "Criar organização: 1° passo" }, "createOrganizationCreatePersonalAccount": { "message": "Antes de criar sua organização, primeiro você precisa criar uma conta pessoal gratuita." @@ -4850,13 +4850,13 @@ "message": "Você selecionou nada." }, "receiveMarketingEmailsV2": { - "message": "Obtenha conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." + "message": "Receba conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." }, "subscribe": { - "message": "Subscribe" + "message": "Inscreva-se" }, "unsubscribe": { - "message": "Cancelar subscrição" + "message": "Desinscreva-se" }, "atAnyTime": { "message": "a qualquer momento." @@ -4886,10 +4886,10 @@ "message": "Tempo Limite do Cofre" }, "vaultTimeout1": { - "message": "Tempo esgotado" + "message": "Tempo limite" }, "vaultTimeoutDesc": { - "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e execute a ação selecionada." + "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e executar a ação selecionada." }, "vaultTimeoutLogoutDesc": { "message": "Escolha quando seu cofre será desconectado." @@ -4913,7 +4913,7 @@ "message": "4 horas" }, "onRefresh": { - "message": "Quando Reiniciar o Navegador" + "message": "Ao recarregar o navegador" }, "dateUpdated": { "message": "Atualizado", @@ -4924,17 +4924,17 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Senha Atualizada", + "message": "Senha atualizada", "description": "ex. Date this password was updated" }, "organizationIsDisabled": { - "message": "Organização está desabilitada." + "message": "Organização suspensa" }, "organizationIsSuspended": { - "message": "Organization is suspended" + "message": "A organização está suspensa" }, "organizationIsSuspendedDesc": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + "message": "Itens em organizações suspensas não podem ser acessados. Contate o proprietário da sua organização para obter ajuda." }, "secretsAccessSuspended": { "message": "As organizações suspensas não podem ser acessadas. Entre em contato com o proprietário da organização para obter assistência." @@ -4983,16 +4983,16 @@ "description": "ex. A very weak password. Scale: Very Weak -> Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Senha Mestra Fraca" + "message": "Senha mestre fraca" }, "weakMasterPasswordDesc": { - "message": "A senha mestra que você selecionou está fraca. Você deve usar uma senha mestra forte (ou uma frase-passe) para proteger a sua conta Bitwarden adequadamente. Tem certeza que deseja usar esta senha mestra?" + "message": "Senha fraca identificada. Você deve usar uma senha mestra forte para proteger a sua conta. Tem certeza que quer usar esta senha mestre?" }, "rotateAccountEncKey": { "message": "Também rodar a chave de encriptação da minha conta" }, "rotateEncKeyTitle": { - "message": "Rodar Chave de Encriptação" + "message": "Rotacionar chave de criptografia" }, "rotateEncKeyConfirmation": { "message": "Você tem certeza que quer rodar a chave de encriptação da sua conta?" @@ -5001,7 +5001,7 @@ "message": "Este item tem anexos de arquivos antigos que precisam ser corrigidos." }, "attachmentFixDescription": { - "message": "Este anexo utiliza criptografia desatualizada. Selecione 'Corrigir' para baixar, re-criptografar e recarregar o anexo." + "message": "Este anexo utiliza criptografia desatualizada. Selecione 'Corrigir' para baixar, recriptografar e reenviar o anexo." }, "fix": { "message": "Corrigir", @@ -5019,17 +5019,17 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Por favor, certifique-se de que o seu cofre esteja desbloqueado e a frase de identificação corresponda ao outro dispositivo." + "message": "Certifique-se de que o seu cofre esteja desbloqueado e a frase biométrica corresponda ao outro dispositivo." }, "fingerprintPhraseHeader": { - "message": "Frase de identificação" + "message": "Frase biométrica" }, "dontAskFingerprintAgain": { - "message": "Não peça para verificar a frase biométrica novamente", + "message": "Nunca pedir para verificar a frase biométrica de usuários convidados (não recomendado)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "Você será notificado assim que o pedido for aprovado" + "message": "Você será notificado assim que a solicitação ser aprovada" }, "free": { "message": "Gratuito", @@ -5058,10 +5058,10 @@ "description": "'OAuth 2.0' is a programming protocol. It should probably not be translated." }, "viewApiKey": { - "message": "Ver chave API" + "message": "Visualizar chave da API" }, "rotateApiKey": { - "message": "Girar chave API" + "message": "Rotacionar chave da API" }, "selectOneCollection": { "message": "Você deve selecionar pelo menos uma coleção." @@ -5070,7 +5070,7 @@ "message": "Não foi possível cobrar no seu cartão. Por favor, veja e pague a fatura pendente listada abaixo." }, "minLength": { - "message": "Comprimento Mínimo" + "message": "Comprimento mínimo" }, "clone": { "message": "Clonar" @@ -5079,7 +5079,7 @@ "message": "Requisitos de senha mestra" }, "masterPassPolicyDesc": { - "message": "Defina os requisitos mínimos para a força da senha mestra." + "message": "Defina os requisitos para a força da senha mestre." }, "passwordStrengthScore": { "message": "Pontuação de força da senha $SCORE$", @@ -5091,19 +5091,19 @@ } }, "twoStepLoginPolicyTitle": { - "message": "Exigir login em duas etapas" + "message": "Exigir autenticação em duas etapas" }, "twoStepLoginPolicyDesc": { "message": "Exigir que os usuários definam a autenticação de dois passos nas suas contas pessoais." }, "twoStepLoginPolicyWarning": { - "message": "Os membros da organização que não possuam a autenticação de dois passos ativa para sua conta pessoal serão removidos da organização e receberão um e-mail notificando-os da mudança." + "message": "Membros da organização que não são proprietários ou administradores e não têm a autenticação em duas etapas configurada em sua conta serão removidos da organização e receberão um e-mail notificando-os sobre a mudança." }, "twoStepLoginPolicyUserWarning": { "message": "Você é um membro de uma organização que exige que a autenticação de dois passos seja ativada na sua conta de usuário. Se desativar todos os serviços de autenticação de dois passos, você será automaticamente removido dessas organizações." }, "passwordGeneratorPolicyDesc": { - "message": "Defina os requisitos mínimos para configuração do gerador de senhas." + "message": "Defina requisitos para o gerador de senhas." }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" @@ -5148,23 +5148,23 @@ "message": "A sua nova senha mestra não cumpre aos requisitos da política." }, "minimumNumberOfWords": { - "message": "Número Mínimo de Palavras" + "message": "Número mínimo de palavras" }, "overridePasswordTypePolicy": { "message": "Tipo de senha", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { - "message": "Preferência do Usuário" + "message": "Preferência do usuário" }, "vaultTimeoutAction": { - "message": "Ação de Tempo Limite do Cofre" + "message": "Ação do tempo limite do cofre" }, "vaultTimeoutActionLockDesc": { - "message": "Um cofre bloqueado requer que você reinsira a sua senha mestra para entrar novamente." + "message": "A senha mestre ou outro método de desbloqueio é necessário para acessar seu cofre novamente." }, "vaultTimeoutActionLogOutDesc": { - "message": "Uma sessão encerrada com o cofre requer que você autentique-se novamente para acessá-lo de novo." + "message": "Reautenticação é necessária para acessar seu cofre novamente." }, "lock": { "message": "Bloquear", @@ -5175,25 +5175,25 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "Pesquisar na Lixeira" + "message": "Pesquisar na lixeira" }, "permanentlyDelete": { - "message": "Excluir Permanentemente" + "message": "Apagar para sempre" }, "permanentlyDeleteSelected": { - "message": "Excluir Permanentemente Selecionados" + "message": "Apagar selecionados para sempre" }, "permanentlyDeleteItem": { - "message": "Excluir o Item Permanentemente" + "message": "Apagar item para sempre" }, "permanentlyDeleteItemConfirmation": { "message": "Você tem certeza que deseja excluir permanentemente esse item?" }, "permanentlyDeletedItem": { - "message": "Item Permanentemente Excluído" + "message": "Item apagado para sempre" }, "permanentlyDeletedItems": { - "message": "Itens Permanentemente Excluídos" + "message": "Itens apagados para sempre" }, "permanentlyDeleteSelectedItemsDesc": { "message": "Você selecionou $COUNT$ item(ns) para excluir permanentemente. Tem certeza que deseja excluir permanentemente todos estes itens?", @@ -5205,7 +5205,7 @@ } }, "permanentlyDeletedItemId": { - "message": "Item $ID$ Excluído Permanentemente.", + "message": "Item $ID$ apagado para sempre", "placeholders": { "id": { "content": "$1", @@ -5217,16 +5217,16 @@ "message": "Restaurar" }, "restoreSelected": { - "message": "Restaurar Selecionados" + "message": "Restaurar selecionados" }, "restoredItem": { - "message": "Item Restaurado" + "message": "Item restaurado" }, "restoredItems": { - "message": "Itens Restaurados" + "message": "Itens restaurados" }, "restoredItemId": { - "message": "Item $ID$ restaurado.", + "message": "Item $ID$ restaurado", "placeholders": { "id": { "content": "$1", @@ -5238,10 +5238,10 @@ "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de Ação de Tempo Limite" + "message": "Confirmação de ação do tempo limite" }, "hidePasswords": { - "message": "Esconder Senhas" + "message": "Ocultar senhas" }, "countryPostalCodeRequiredDesc": { "message": "Exigimos essa informação apenas para o cálculo do imposto sobre as vendas e informação financeira." @@ -5256,31 +5256,31 @@ "message": "Informações de impostos atualizadas." }, "setMasterPassword": { - "message": "Definir Senha Mestra" + "message": "Configurar senha mestre" }, "identifier": { "message": "Identificador" }, "organizationIdentifier": { - "message": "Identificador da Organização" + "message": "Identificador da organização" }, "ssoLogInWithOrgIdentifier": { - "message": "Faça o login usando o portal de login único da sua organização. Por favor, insira o identificador da sua organização para começar." + "message": "Entre usando o portal de autenticação única da sua organização. Digite o identificador de SSO da sua organização para começar." }, "singleSignOnEnterOrgIdentifier": { - "message": "Insira o identificador SSO da sua organização para começar" + "message": "Digite o identificador de SSO da sua organização para começar" }, "singleSignOnEnterOrgIdentifierText": { - "message": "Para fazer login com seu provedor SSO, insira o identificador SSO da sua organização para começar. Talvez seja necessário inserir este identificador SSO quando fizer login a partir de um novo dispositivo." + "message": "Para entrar com seu provedor de SSO, digite o identificador de SSO da sua organização para começar. Talvez seja necessário digitar este identificador de SSO quando entrar com um novo dispositivo." }, "enterpriseSingleSignOn": { - "message": "Iniciar Sessão Empresarial Única" + "message": "Autenticação única empresarial" }, "ssoHandOff": { "message": "Agora você pode fechar esta aba e continuar na extensão." }, "youSuccessfullyLoggedIn": { - "message": "Você logou na sua conta com sucesso" + "message": "Você entrou na sua conta com sucesso" }, "thisWindowWillCloseIn5Seconds": { "message": "Esta janela será fechada automaticamente em 5 segundos" @@ -5292,10 +5292,10 @@ "message": "Recursos para Todas as Equipes, além de:" }, "includeAllTeamsStarterFeatures": { - "message": "Recursos para todas as equipes iniciantes, além de:" + "message": "Todos os recursos do Teams Starter, mais:" }, "chooseMonthlyOrAnnualBilling": { - "message": "Escolha faturamento mensal ou anual" + "message": "Escolha cobrança mensal ou anual" }, "abilityToAddMoreThanNMembers": { "message": "Capacidade de adicionar mais que $COUNT$ membros", @@ -5310,23 +5310,23 @@ "message": "Autenticação SSO via SAML2.0 e OpenID Connect" }, "includeEnterprisePolicies": { - "message": "Políticas Empresariais" + "message": "Políticas empresariais" }, "ssoValidationFailed": { - "message": "Falha na Validação SSO" + "message": "Falha na validação do SSO" }, "ssoIdentifierRequired": { - "message": "O Identificador da Organização é obrigatório." + "message": "O identificador de SSO da organização é obrigatório." }, "ssoIdentifier": { - "message": "Identificador SSO" + "message": "Identificador de SSO" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "message": "Forneça este ID aos seus membros para acessarem com o SSO. Os membros podem pular a digitação deste identificador durante o SSO se um domínio reivindicado estiver configurado. ", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "claimedDomainsLearnMore": { - "message": "Learn more", + "message": "Saiba mais", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { @@ -5339,47 +5339,47 @@ "message": "Vincular SSO" }, "singleOrg": { - "message": "Organização Única" + "message": "Organização única" }, "singleOrgDesc": { - "message": "Restringir os usuários de poderem entrar em outras organizações." + "message": "Restrinja os usuários de poderem entrar em outras organizações." }, "singleOrgPolicyDesc": { - "message": "Restringir membros de ingressarem em outras organizações. Essa política é necessária para organizações que tenham habilitado a verificação de domínio." + "message": "Restrinja membros de entrar em outras organizações. Essa política é necessária para organizações que tenham ativado a verificação de domínio." }, "singleOrgBlockCreateMessage": { "message": "Sua organização atual tem uma política que não permite que você entre em mais de uma organização. Por favor, entre em contato com os administradores da sua organização ou cadastre-se a partir de uma conta do Bitwarden diferente." }, "singleOrgPolicyMemberWarning": { - "message": "Membros não conformes serão colocados no estado revogado até que saiam de todas as outras organizações. Administradores estão isentos e podem restaurar os membros assim que cumprir." + "message": "Membros não adequados serão colocados no estado revogado até que saiam de todas as outras organizações. Administradores estão isentos e podem restaurar os membros assim que se adequarem." }, "requireSso": { - "message": "Autenticação de Acesso Único" + "message": "Exigir autenticação única" }, "requireSsoPolicyDesc": { - "message": "Exige que os usuários façam login com o método de Login Único da Empresa." + "message": "Exija que os usuários entrem com o método de autenticação única empresarial." }, "prerequisite": { "message": "Pré-requisito" }, "requireSsoPolicyReq": { - "message": "A política das empresas da Organização Única tem de ser viabilizada antes da ativação desta política." + "message": "A política empresarial da organização única tem que estar ativada antes de ativar esta política." }, "requireSsoPolicyReqError": { - "message": "Política da Organização Única não ativada." + "message": "Política de organização única não configurada." }, "requireSsoExemption": { - "message": "Os Proprietários e Administradores da Organização estão isentos da aplicação desta política." + "message": "Os proprietários e administradores estão isentos da aplicação desta política." }, "limitSendViews": { - "message": "Limitar visualização" + "message": "Limitar visualizações" }, "limitSendViewsHint": { - "message": "Ninguém pode visualizar este envio depois que o limite foi atingido.", + "message": "Ninguém pode visualizar este Send depois que o limite foi atingido.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ Visualizações restantes", + "message": "$ACCESSCOUNT$ visualizações restantes", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -5389,7 +5389,7 @@ } }, "sendDetails": { - "message": "Enviar detalhes", + "message": "Detalhes do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeTextToShare": { @@ -5402,11 +5402,11 @@ "message": "Texto" }, "sendPasswordDescV3": { - "message": "Adicione uma senha opcional para os destinatários acessarem este Envio.", + "message": "Adicione uma senha opcional para os destinatários acessarem este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Criar Novo Send", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -5414,15 +5414,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send Criado", + "message": "Send salvo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send Editado", + "message": "Send salvo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "Send Excluído", + "message": "Send apagado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { @@ -5430,25 +5430,25 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Tem certeza de que deseja excluir permanentemente este Envio?", + "message": "Tem certeza de que quer apagar este Send para sempre?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { - "message": "Data de Exclusão" + "message": "Data de apagamento" }, "deletionDateDescV2": { - "message": "O envio será permanentemente excluído nesta data.", + "message": "O Send será apagado para sempre nesta data.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Data de Validade" + "message": "Data de validade" }, "expirationDateDesc": { - "message": "Se definido, o acesso a este Send expirará na data e hora especificadas.", + "message": "Se configurado, o acesso a este Send expirará no horário especificado.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "Contagem Máxima de Acessos" + "message": "Número máximo de acessos" }, "disabled": { "message": "Desativado" @@ -5464,14 +5464,14 @@ "message": "Copiar link" }, "copySendLink": { - "message": "Copiar Link do Send", + "message": "Copiar link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remover Senha" + "message": "Remover senha" }, "removedPassword": { - "message": "Senha Removida" + "message": "Senha removida" }, "removePasswordConfirmation": { "message": "Você tem certeza que deseja remover a senha?" @@ -5484,7 +5484,7 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "pendingDeletion": { - "message": "Exclusão pendente" + "message": "Apagamento pendente" }, "hideTextByDefault": { "message": "Ocultar texto por padrão" @@ -5501,7 +5501,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { - "message": "Não sabe a senha? Peça ao Remetente a senha necessária para acessar esse Send.", + "message": "Não sabe a senha? Peça ao remetente a senha necessária para acessar esse Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendHiddenByDefault": { @@ -5512,11 +5512,11 @@ "message": "Baixar anexos" }, "sendAccessPasswordTitle": { - "message": "Enter the password to view this Send", + "message": "Digite a senha para visualizar este Send", "description": "Title of the Send password authentication screen." }, "sendAccessContentTitle": { - "message": "View Send", + "message": "Visualizar Send", "description": "Title of the Send view content screen." }, "sendAccessUnavailable": { @@ -5532,16 +5532,16 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "emergencyAccess": { - "message": "Acesso de Emergência" + "message": "Acesso de emergência" }, "emergencyAccessDesc": { - "message": "Conceda e gerencie o acesso de emergência para contatos confiáveis. Contatos confiáveis podem solicitar acesso a Visualizar ou Assumir o Controle da sua conta em caso de emergência. Visite a nossa página de ajuda para obter mais informações e detalhes sobre como o compartilhamento de conhecimento zero funciona." + "message": "Conceda e gerencie o acesso de emergência para contatos confiáveis. Contatos confiáveis podem solicitar acesso a visualizar ou assumir o controle da sua conta em caso de emergência. Visite a nossa página de ajuda para obter mais informações e detalhes sobre como o compartilhamento de conhecimento zero funciona." }, "emergencyAccessOwnerWarning": { - "message": "Você é o Proprietário de uma ou mais organizações. Se você conceder acesso a um contato de emergência, eles serão capazes de usar todas as suas permissões como Proprietário após uma concessão." + "message": "Você é o Proprietário de uma ou mais organizações. Se você conceder o assumir controle a um contato de emergência, eles serão capazes de usar todas as suas permissões como Proprietário ao assumir controle." }, "trustedEmergencyContacts": { - "message": "Contatos de emergência confiáveis" + "message": "Contatos de emergência confiados" }, "noTrustedContacts": { "message": "Você ainda não adicionou nenhum contato de emergência, convide um contato confiável para começar." @@ -5553,7 +5553,7 @@ "message": "Designado como contato de emergência" }, "noGrantedAccess": { - "message": "Você ainda não foi designado como um contato de emergência para ninguém." + "message": "Você ainda não foi designado como um contato de emergência de ninguém." }, "inviteEmergencyContact": { "message": "Convidar contato de emergência" @@ -5562,25 +5562,25 @@ "message": "Editar contato de emergência" }, "inviteEmergencyContactDesc": { - "message": "Convide um novo contato de emergência digitando o endereço de e-mail da conta Bitwarden abaixo. Se eles não tiverem uma conta no Bitwarden, eles serão solicitados a criar uma nova conta." + "message": "Convide um novo contato de emergência digitando o endereço de e-mail da sua conta Bitwarden abaixo. Se não tiverem uma conta no Bitwarden, serão solicitados a criar uma nova conta." }, "emergencyAccessRecoveryInitiated": { - "message": "Acesso de Emergência Iniciado" + "message": "Acesso de emergência iniciado" }, "emergencyAccessRecoveryApproved": { - "message": "Acesso de Emergência Aprovado" + "message": "Acesso de emergência aprovado" }, "viewDesc": { - "message": "Você pode ver todos os itens no seu próprio cofre." + "message": "Pode ver todos os itens no seu próprio cofre." }, "takeover": { - "message": "Assumir o Controle" + "message": "Assumir controle" }, "takeoverDesc": { - "message": "Pode redefinir a sua conta com uma nova senha mestra." + "message": "Pode redefinir a sua conta com uma nova senha mestre." }, "waitTime": { - "message": "Tempo de Espera" + "message": "Tempo de espera" }, "waitTimeDesc": { "message": "Tempo necessário antes de conceder acesso automaticamente." @@ -5601,13 +5601,13 @@ "message": "Usuário convidado." }, "acceptEmergencyAccess": { - "message": "Você foi convidado para se tornar um contato de emergência para o usuário listado acima. Para aceitar o convite, você precisa iniciar sessão ou criar uma nova conta no Bitwarden." + "message": "Você foi convidado para se tornar um contato de emergência para o usuário listado acima. Para aceitar o convite, você precisa entrar ou criar uma nova conta no Bitwarden." }, "emergencyInviteAcceptFailed": { - "message": "Não foi possível aceitar o convite. Peça ao usuário para enviar um novo convite." + "message": "Não é possível aceitar o convite. Peça ao usuário para enviar um novo convite." }, "emergencyInviteAcceptFailedShort": { - "message": "Não foi possível aceitar o convite. $DESCRIPTION$", + "message": "Não é possível aceitar o convite. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -5619,7 +5619,7 @@ "message": "Você pode acessar as opções de emergência para esse usuário após a confirmação da sua identidade. Enviaremos um e-mail a você quando isso acontecer." }, "requestAccess": { - "message": "Solicitar Acesso" + "message": "Solicitar acesso" }, "requestAccessConfirmation": { "message": "Tem certeza que deseja solicitar acesso de emergência? Você receberá acesso após $WAITTIME$ dia(s) ou sempre que o usuário aprovar manualmente a solicitação.", @@ -5643,10 +5643,10 @@ "message": "Aprovar" }, "reject": { - "message": "Rejeitar" + "message": "Recusar" }, "approveAccessConfirmation": { - "message": "Tem certeza de que deseja aprovar o acesso de emergência? Isto permitirá que $USER$ possa $ACTION$ da sua conta.", + "message": "Tem certeza de que deseja aprovar o acesso de emergência? Isto permitirá que $USER$ possa $ACTION$ sua conta.", "placeholders": { "user": { "content": "$1", @@ -5659,16 +5659,16 @@ } }, "emergencyApproved": { - "message": "Acesso de emergência aprovado." + "message": "Acesso de emergência aprovado" }, "emergencyRejected": { - "message": "Acesso de emergência rejeitado" + "message": "Acesso de emergência recusado" }, "grantorDetailsNotFound": { - "message": "Grantor details not found" + "message": "Detalhes do condecente não encontrados" }, "passwordResetFor": { - "message": "Redefinição de senha para $USER$. Agora você pode acessar usando a nova senha.", + "message": "Senha redefinida para $USER$. Agora você pode acessar usando a nova senha.", "placeholders": { "user": { "content": "$1", @@ -5677,74 +5677,74 @@ } }, "organizationDataOwnership": { - "message": "Enforce organization data ownership" + "message": "Aplicar propriedade de dados da organização" }, "organizationDataOwnershipDesc": { - "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "message": "Exigir que todos os itens sejam propriedade de uma organização, removendo a opção de armazenar itens ao nível da conta.", "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "message": "Todos os itens serão propriedade e salvos na organização, ativando controles, visibilidade, e relatórios em toda a organização. Ao ativar, a coleção padrão estará disponível para que cada membro possa armazenar itens. Aprenda mais sobre gerenciar o", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { - "message": "credential lifecycle", + "message": "ciclo de vida credencial", "description": "This will be used as a hyperlink" }, "organizationDataOwnershipWarningTitle": { - "message": "Are you sure you want to proceed?" + "message": "Tem certeza que quer prosseguir?" }, "organizationDataOwnershipWarning1": { - "message": "will remain accessible to members" + "message": "continuará acessível para membros" }, "organizationDataOwnershipWarning2": { - "message": "will not be automatically selected when creating new items" + "message": "não será selecionado automaticamente ao criar itens" }, "organizationDataOwnershipWarning3": { - "message": "cannot be managed from the Admin Console until the user is offboarded" + "message": "não pode ser gerenciado pelo Console de Admin até que o usuário seja removido" }, "organizationDataOwnershipWarningContentTop": { - "message": "By turning this policy off, the default collection: " + "message": "Ao desligar esta política, a coleção padrão: " }, "organizationDataOwnershipWarningContentBottom": { - "message": "Learn more about the ", + "message": "Saiba mais sobre o ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "personalOwnership": { - "message": "Propriedade Pessoal" + "message": "Remover cofre individual" }, "personalOwnershipPolicyDesc": { - "message": "Exigir que os usuários salvem itens de cofre em uma organização removendo a opção de propriedade pessoal." + "message": "Exigir que os usuários salvem itens em uma organização removendo a opção de cofre individual." }, "personalOwnershipExemption": { - "message": "Os proprietários e administradores da organização estão isentos da aplicação desta política." + "message": "Os proprietários e administradores da organização são isentos da aplicação desta política." }, "personalOwnershipSubmitError": { - "message": "Devido a uma Política Empresarial, você está restrito de salvar itens para seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as Coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "Configuração padrão da digitação automática no computador" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "Ative a digitação automática por padrão pros membros. Os membros podem desativar a digitação automática manualmente no app de computador.", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { - "message": "Desabilitar Send" + "message": "Remover Send" }, "disableSendPolicyDesc": { - "message": "Não permite que usuários criem ou editem um Send no Bitwarden. Excluir um Send existente ainda é permitido.", + "message": "Não permitir que usuários criem ou editem Sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { "message": "Os usuários da organização que podem gerenciar as políticas da organização estão isentos da aplicação desta política." }, "sendDisabled": { - "message": "Send desabilitado", + "message": "Send removido", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Devido a uma política corporativa, você só é capaz de excluir um Send existente.", + "message": "Devido a uma política empresarial, você só é capaz de apagar um Send existente.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { @@ -5752,18 +5752,18 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { - "message": "Definir opções para a criação e edição de Sends.", + "message": "Configure opções para a criação e edição de Sends.", "description": "'Sends' is a plural noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsExemption": { "message": "Os usuários da organização que podem gerenciar as políticas da organização estão isentos da aplicação desta política." }, "disableHideEmail": { - "message": "Não permitir que os usuários ocultem seus endereços de e-mail dos destinatários ao criar ou editar um Send.", + "message": "Sempre mostrar o endereço de e-mail do membro com destinatários ao criar ou editar um Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "modifiedPolicyId": { - "message": "Política modificada $ID$.", + "message": "Modificou a política $ID$.", "placeholders": { "id": { "content": "$1", @@ -5772,27 +5772,27 @@ } }, "planPrice": { - "message": "Valor do plano" + "message": "Preço do plano" }, "estimatedTax": { - "message": "Impostos estimados" + "message": "Estimativa de tributos" }, "custom": { "message": "Personalizado" }, "customDesc": { - "message": "Permite controle mais granular das permissões de usuário para configurações avançadas." + "message": "Conceder permissões personalizadas aos membros" }, "customDescNonEnterpriseStart": { - "message": "Papéis personalizados é um ", + "message": "Cargos personalizados são um ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseLink": { - "message": "funcionalidade empresarial", + "message": "recurso empresarial", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseEnd": { - "message": ". Contacte a nossa equipe de suporte para atualizar a sua assinatura", + "message": ". Contate a nossa equipe de suporte para fazer upgrade da sua assinatura", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { @@ -5805,43 +5805,43 @@ "message": "Permissão" }, "accessEventLogs": { - "message": "Acessar Registro de Eventos" + "message": "Acessar registro de eventos" }, "accessImportExport": { - "message": "Acessar Importar/Exportar" + "message": "Acessar importação e exportação" }, "accessReports": { - "message": "Acessar Relatórios" + "message": "Acessar relatórios" }, "missingPermissions": { "message": "Você não tem a permissão necessária para executar esta ação." }, "manageAllCollections": { - "message": "Gerenciar Todas as Coleções" + "message": "Gerenciar todas as coleções" }, "createNewCollections": { - "message": "Criar Novas Coleções" + "message": "Criar novas coleções" }, "editAnyCollection": { - "message": "Editar Qualquer Coleção" + "message": "Editar qualquer coleção" }, "deleteAnyCollection": { - "message": "Excluir Qualquer Coleção" + "message": "Apagar qualquer coleção" }, "manageGroups": { - "message": "Gerenciar Grupos" + "message": "Gerenciar grupos" }, "managePolicies": { - "message": "Gerenciar Políticas" + "message": "Gerenciar políticas" }, "manageSso": { "message": "Gerenciar SSO" }, "manageUsers": { - "message": "Gerenciar Usuários" + "message": "Gerenciar usuários" }, "manageAccountRecovery": { - "message": "Gerencie recuperação de conta" + "message": "Gerenciar recuperação de conta" }, "disableRequiredError": { "message": "Você deve desativar manualmente a política $POLICYNAME$ antes que esta política possa ser desativada.", @@ -5856,10 +5856,10 @@ "message": "Uma política de organização está afetando suas opções de propriedade." }, "personalOwnershipPolicyInEffectImports": { - "message": "Uma política da organização desativou a importação de itens para o seu cofre pessoal." + "message": "Uma política da organização bloqueou a importação de itens em seu cofre pessoal." }, "personalOwnershipCheckboxDesc": { - "message": "Desativar propriedade pessoal para usuários da organização" + "message": "Remover propriedade individual para usuários da organização" }, "send": { "message": "Send", @@ -5870,7 +5870,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineLearnMore": { - "message": "Saiba mais", + "message": "Saiba mais sobre o", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more about** Bitwarden Send or sign up to try it today.'" }, "sendVaultCardProductDesc": { @@ -5893,34 +5893,34 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'" }, "developmentDevOpsAndITTeamsChooseBWSecret": { - "message": "Desenvolvimento, DevOps e equipes de TI escolhem o Gerenciador de Segredos do Bitwarden para gerenciar e implantar seus segredos de infraestrutura e máquina de forma segura." + "message": "Desenvolvimento, DevOps e equipes de TI escolhem o Gerenciador de Segredos do Bitwarden para gerenciar e implementar seus segredos de infraestrutura e máquina de forma segura." }, "centralizeSecretsManagement": { "message": "Centralize o gerenciamento de segredos." }, "centralizeSecretsManagementDescription": { - "message": "Armazene e gerencie com segurança segredos em um único local para impedir sprawl secreto em sua organização." + "message": "Armazene e gerencie com segurança segredos em um único local para impedir dispersão de segredos em sua organização." }, "preventSecretLeaks": { - "message": "Prevenir fugas secretas." + "message": "Impeça vazamentos de segredos." }, "preventSecretLeaksDescription": { "message": "Proteja segredos com criptografia de ponta a ponta. Não há mais segredos de codificação rígida ou compartilhamento através de arquivos .env." }, "enhanceDeveloperProductivity": { - "message": "Melhorar a produtividade do desenvolvedor." + "message": "Melhore a produtividade dos desenvolvedores." }, "enhanceDeveloperProductivityDescription": { - "message": "Recuperar e implantar segredos programaticamente em tempo de execução para que os desenvolvedores possam se concentrar no que mais importa, como melhorar a qualidade do código." + "message": "Recupere e implemente segredos programaticamente em tempo de execução para que os desenvolvedores possam se concentrar no que mais importa, como melhorar a qualidade do código." }, "strengthenBusinessSecurity": { - "message": "Fortalecer a segurança do negócio." + "message": "Fortaleça a segurança empresarial." }, "strengthenBusinessSecurityDescription": { - "message": "Mantenha controle apertado sobre o acesso de máquina e humano a segredos com integrações SSO, logs de eventos e rotação de acesso." + "message": "Mantenha controle rígido sobre o acesso de máquina e humano a segredos com integrações de SSO, registros de eventos e rotação de acesso." }, "tryItNow": { - "message": "Experimente agora" + "message": "Experimentar agora" }, "sendRequest": { "message": "Enviar solicitação" @@ -5929,31 +5929,31 @@ "message": "Adicione uma anotação" }, "bitwardenSecretsManager": { - "message": "Gerenciador de Segredos Bitwarden" + "message": "Gerenciador de Segredos do Bitwarden" }, "moreProductsFromBitwarden": { "message": "Mais produtos do Bitwarden" }, "requestAccessToSecretsManager": { - "message": "Solicitar acesso ao gerente secreto" + "message": "Solicitar acesso ao Gerenciador de Segredos" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { "message": "Você precisa de aprovação do seu administrador para testar o Gerenciador de Segredos." }, "smAccessRequestEmailSent": { - "message": "Solicitação de acesso ao e-mail gerente de segredos enviada aos administradores." + "message": "Solicitação de acesso para o gerenciador de segredos enviada ao e-mail dos administradores." }, "requestAccessSMDefaultEmailContent": { - "message": "Olá,\n\nestou solicitando uma assinatura do Bitwarden Secrets Manager para a nossa equipe. O vosso apoio significaria muito!\n\nO Gerenciador de Segredos do Bitwarden é uma solução de gerenciamento de segredos criptografados de ponta a ponta para armazenamento seguro, Compartilhar e implantar credenciais de máquina como chaves API, senhas de banco de dados e certificados de autenticação.\n\nGerenciador de segredos nos ajudará a:\n\n- Melhorar a segurança\n- Operações de streaming\n- Evitar fugas de segredos dispendiosas\n\nPara solicitar uma avaliação gratuita para nossa equipe, por favor, entre em contato com o Bitwarden.\n\nObrigado pela sua ajuda!" + "message": "Olá,\n\nEstou solicitando uma assinatura do Gerenciador de Segredos do Bitwarden para a nossa equipe. O vosso apoio significaria muito!\n\nO Gerenciador de Segredos do Bitwarden é uma solução de gerenciamento de segredos criptografados de ponta a ponta para armazenamento seguro, compartilhamento, e implementação de credenciais de máquina como chaves de API, senhas de banco de dados e certificados de autenticação.\n\nEle nos ajudará a:\n\n- Melhorar a segurança\n- Otimizar o fluxo\n- Impedir caros vazamentos de segredos\n\nPara solicitar uma avaliação gratuita para nossa equipe, entre em contato com o Bitwarden.\n\nObrigado pela sua ajuda!" }, "giveMembersAccess": { "message": "Dar acesso aos membros:" }, "viewAndSelectTheMembers": { - "message": "veja e selecione os membros que você deseja dar acesso ao Gerenciador de Segredos." + "message": "visualize e selecione os membros que você deseja dar acesso ao Gerenciador de Segredos." }, "openYourOrganizations": { - "message": "Abrir sua organização" + "message": "Abrir o da sua organização" }, "usingTheMenuSelect": { "message": "Usando o menu, selecione" @@ -5962,7 +5962,7 @@ "message": "para conceder acesso aos membros selecionados." }, "sendVaultCardTryItNow": { - "message": "teste agora", + "message": "experimente-o agora", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, or **try it now**.'" }, "sendAccessTaglineOr": { @@ -5974,7 +5974,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or **sign up** to try it today.'" }, "sendAccessTaglineTryToday": { - "message": "para testar hoje mesmo.", + "message": "para experimentá-lo hoje mesmo.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendAccessCreatorIdentifier": { @@ -5987,7 +5987,7 @@ } }, "viewSend": { - "message": "Ver Enviar", + "message": "Visualizar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "viewSendHiddenEmailWarning": { @@ -5998,22 +5998,22 @@ "message": "A data de validade fornecida não é válida." }, "deletionDateIsInvalid": { - "message": "A data de exclusão fornecida não é válida." + "message": "A data de apagamento fornecida não é válida." }, "expirationDateAndTimeRequired": { "message": "Uma data e hora de expiração são obrigatórias." }, "deletionDateAndTimeRequired": { - "message": "Uma data e hora de exclusão são obrigatórias." + "message": "Uma data e hora de apagamento são obrigatórias." }, "dateParsingError": { - "message": "Ocorreu um erro ao salvar as suas datas de exclusão e validade." + "message": "Ocorreu um erro ao salvar as suas datas de apagamento e validade." }, "hideYourEmail": { "message": "Oculte seu endereço de e-mail dos visualizadores." }, "webAuthnFallbackMsg": { - "message": "Para verificar seu 2FA, por favor, clique no botão abaixo." + "message": "Para verificar seu 2FA, clique no botão abaixo." }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" @@ -6028,13 +6028,13 @@ "message": "O WebAuthn não é suportado neste navegador." }, "webAuthnSuccess": { - "message": "WebAuthn verificado com sucesso!
Você pode fechar esta guia." + "message": "WebAuthn verificado com sucesso! Você pode fechar esta aba." }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Sua nova senha não pode ser a mesma que a sua atual." + "message": "Sua senha nova não pode ser a mesma que a sua atual." }, "hintEqualsPassword": { - "message": "Sua dica de senha senha não pode ser a mesma que a sua senha." + "message": "Sua dica de senha não pode ser a mesma que a sua senha." }, "enrollAccountRecovery": { "message": "Inscrever-se na recuperação de conta" @@ -6043,13 +6043,13 @@ "message": "Inscrito na recuperação de conta" }, "withdrawAccountRecovery": { - "message": "Retirar da recuperação de conta" + "message": "Retirar-se da recuperação de conta" }, "enrollPasswordResetSuccess": { - "message": "Inscrição com sucesso!" + "message": "Inscrito com sucesso!" }, "withdrawPasswordResetSuccess": { - "message": "Retirada com sucesso!" + "message": "Retirou-se com sucesso!" }, "eventEnrollAccountRecovery": { "message": "O usuário $ID$ se inscreveu na recuperação de conta.", @@ -6061,7 +6061,7 @@ } }, "eventWithdrawAccountRecovery": { - "message": "O usuário $ID$ retirou da recuperação de conta.", + "message": "O usuário $ID$ retirou-se da recuperação de conta.", "placeholders": { "id": { "content": "$1", @@ -6070,7 +6070,7 @@ } }, "eventAdminPasswordReset": { - "message": "Redefinir senha mestra para o usuário $ID$.", + "message": "Senha mestre do usuário $ID$ redefinida.", "placeholders": { "id": { "content": "$1", @@ -6079,7 +6079,7 @@ } }, "eventResetSsoLink": { - "message": "Redefinir link Sso para o usuário $ID$", + "message": "Link de SSO redefinido para o usuário $ID$", "placeholders": { "id": { "content": "$1", @@ -6088,7 +6088,7 @@ } }, "firstSsoLogin": { - "message": "$ID$ se conectou usando o Sso pela primeira vez", + "message": "$ID$ conectou-se usando o SSO pela primeira vez", "placeholders": { "id": { "content": "$1", @@ -6097,10 +6097,10 @@ } }, "resetPassword": { - "message": "Redefinir Senha" + "message": "Redefinir senha" }, "resetPasswordLoggedOutWarning": { - "message": "O processo desconectará $NAME$ de sua sessão atual, exigindo que eles iniciem a sessão novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", + "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles entrem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", "placeholders": { "name": { "content": "$1", @@ -6109,7 +6109,7 @@ } }, "emergencyAccessLoggedOutWarning": { - "message": "Proceeding will log $NAME$ out of their current session, requiring them to log back in. Active sessions on other devices may continue to remain active for up to one hour.", + "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles entrem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", "placeholders": { "name": { "content": "$1", @@ -6121,10 +6121,10 @@ "message": "este usuário" }, "resetPasswordMasterPasswordPolicyInEffect": { - "message": "Uma ou mais políticas da organização exigem que a senha mestra cumpra aos seguintes requisitos:" + "message": "Uma ou mais políticas da organização exigem que a senha mestre cumpra aos seguintes requisitos:" }, "changePasswordDelegationMasterPasswordPolicyInEffect": { - "message": "One or more organization policies require the master password to meet the following requirements:" + "message": "Uma ou mais políticas da organização exigem que a senha mestre cumpra aos seguintes requisitos:" }, "resetPasswordSuccess": { "message": "Senha redefinida com sucesso!" @@ -8944,7 +8944,7 @@ "message": "Atualizar as definições do KDF" }, "loginInitiated": { - "message": "Sessão iniciada" + "message": "Autenticação iniciada" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Lembre-se deste dispositivo para permanecer conectado" @@ -9194,7 +9194,7 @@ "message": "Problemas em efetuar login?" }, "loginApproved": { - "message": "Sessão aprovada" + "message": "Autenticação aprovada" }, "userEmailMissing": { "message": "E-mail do usuário ausente" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Unidades de Negócio" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index cf323ead519..b4d0e2b5a6a 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Atribuir tarefas aos membros para monitorizar o progresso" }, - "onceYouReviewApplications": { - "message": "Depois de analisar as aplicações e marcá-las como críticas, estas serão apresentadas aqui." + "onceYouReviewApps": { + "message": "Depois de analisar as aplicações e marcá-las como críticas, pode atribuir tarefas aos membros para resolver itens em risco e monitorizar o progresso aqui" }, "sendReminders": { "message": "Enviar lembretes" @@ -11294,12 +11294,47 @@ "message": "Arquivar", "description": "Verb" }, + "unArchive": { + "message": "Desarquivar" + }, + "itemsInArchive": { + "message": "Itens no arquivo" + }, "noItemsInArchive": { "message": "Nenhum item no arquivo" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático." }, + "itemWasSentToArchive": { + "message": "O item foi movido para o arquivo" + }, + "itemsWereSentToArchive": { + "message": "Os itens foram movidos para o arquivo" + }, + "itemUnarchived": { + "message": "O item foi desarquivado" + }, + "bulkArchiveItems": { + "message": "Itens arquivados" + }, + "bulkUnarchiveItems": { + "message": "Itens desarquivados" + }, + "archiveItem": { + "message": "Arquivar item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Os itens arquivados são excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático. Tem a certeza de que pretende arquivar este item?" + }, + "archiveBulkItems": { + "message": "Arquivar itens", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Os itens arquivados são excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático. Tem a certeza de que pretende arquivar estes itens?" + }, "businessUnit": { "message": "Unidade de negócio" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continuar sem atualizar" }, + "upgradeYourPlan": { + "message": "Atualize o seu plano" + }, + "upgradeNow": { + "message": "Atualizar agora" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Ao preencher este formulário, será criada uma nova organização Familiar. Pode atualizar a sua organização gratuita a partir da Consola de administração." + }, "upgradeErrorMessage": { "message": "Ocorreu um erro durante o processamento da sua atualização. Por favor, tente novamente." + }, + "bitwardenFreeplanMessage": { + "message": "Tem o plano gratuito do Bitwarden" + }, + "upgradeCompleteSecurity": { + "message": "Atualize para segurança total" + }, + "viewbusinessplans": { + "message": "Ver planos empresariais" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 2bd6f6e5497..cee47198bf7 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 0bca6612f7a..b061ba2f652 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Архивировать", "description": "Verb" }, + "unArchive": { + "message": "Разархивировать" + }, + "itemsInArchive": { + "message": "Элементы в архиве" + }, "noItemsInArchive": { "message": "В архиве нет элементов" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Архивированные элементы появятся здесь и будут исключены из общих результатов поиска и предложений автозаполнения." }, + "itemWasSentToArchive": { + "message": "Элемент был отправлен в архив" + }, + "itemsWereSentToArchive": { + "message": "Элементы были отправлены в архив" + }, + "itemUnarchived": { + "message": "Элемент был разархивирован" + }, + "bulkArchiveItems": { + "message": "Элементы архивированы" + }, + "bulkUnarchiveItems": { + "message": "Элементы разархивированы" + }, + "archiveItem": { + "message": "Архивировать элемент", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Архивированные элементы исключены из общих результатов поиска и предложений автозаполнения. Вы уверены, что хотите архивировать этот элемент?" + }, + "archiveBulkItems": { + "message": "Архивировать элементы", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Архивированные элементы исключены из общих результатов поиска и предложений автозаполнения. Вы уверены, что хотите архивировать эти элементы?" + }, "businessUnit": { "message": "Бизнес-единица" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 5891fdc50a2..8681e95cf79 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index f8c5591fb60..160afd0083b 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -36,7 +36,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Ešte ste nevytvorili report" }, "notifiedMembers": { "message": "Notified members" @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Pre sledovanie progresu, priraďte členom úlohy" }, - "onceYouReviewApplications": { - "message": "Tu sa zobrazia aplikácie, ktoré pri kontrole označíte za kritické." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Poslať upomienky" @@ -188,22 +188,22 @@ "message": "Označiť aplikáciu ako kritickú" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Označiť za kritické" }, "applicationsSelected": { - "message": "applications selected" + "message": "vybrané aplikácie" }, "selectApplication": { - "message": "Select application" + "message": "Vybrať aplikáciu" }, "unselectApplication": { - "message": "Unselect application" + "message": "Nevybrať aplikáciu" }, "applicationsMarkedAsCriticalSuccess": { "message": "Aplikácie označené ako kritické" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Nepodarilo sa označiť aplikácie za kritické" }, "application": { "message": "Aplikácia" @@ -293,10 +293,10 @@ "message": "Všetkých aplikácii" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Aplikácie vyžadujú kontrolu" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ nových aplikácií", "placeholders": { "count": { "content": "$1", @@ -305,19 +305,19 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Skontrolujte nové aplikácie a ich označenie za kritické a udržujte tak vašu organizáciu v bezpečí" }, "reviewNow": { - "message": "Review now" + "message": "Skontrolovať teraz" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Uprednostniť kritické aplikácie" }, "atRiskItems": { - "message": "At-risk items" + "message": "Ohrozené položky" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Funkcia označovania za kritické bude implementovaná v budúcej aktualizácii" }, "unmarkAsCritical": { "message": "Zrušiť označenie za kritické" @@ -2951,7 +2951,7 @@ "message": "Prosím uistite sa, že váš účet má k dispozícii dostatok kreditu pre tento nákup. Ak konto nemá k dispozícii dostatok kreditu, rozdiel sa zaplatí vašou predvolenou platobnou metódou. Kredit si môžete pridať na stránke fakturácie." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Na tento nakúp nemáte na vašom účte dostatočný kredit. Kredit môžete pridať na stránke fakturácie." }, "creditAppliedDesc": { "message": "Kredit na vašom účte sa dá použiť na nákupy. Akýkoľvek dostupný kredit bude automaticky použitý na zaplatenie faktúr pre tento účet." @@ -4362,7 +4362,7 @@ "message": "Generuje sa váš prehľad o rizikách..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Generovať report" }, "updateBrowserDesc": { "message": "Používate nepodporovaný prehliadač. Webový trezor nemusí úplne fungovať." @@ -10015,7 +10015,7 @@ "message": "Pošlite dáta z denníka udalostí do vašej inštancie Logscale" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Pošlite dáta z denníka udalostí do vašej inštancie Datadog" }, "failedToSaveIntegration": { "message": "Nepodarilo sa uložiť integráciu. Prosím skúste to neskôr." @@ -11294,11 +11294,46 @@ "message": "Archivovať", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "Žiadne položky v archíve" }, - "archivedItemsDescription": { - "message": "Tu sa zobrazia archivované položky, ktoré budú vylúčené zo všeobecného vyhľadávania a z návrhov automatického vypĺňania." + "noItemsInArchiveDesc": { + "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" }, "businessUnit": { "message": "Organizačná jednotka" @@ -11772,36 +11807,54 @@ "message": "Seamless integration" }, "families": { - "message": "Families" + "message": "Rodiny" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Povýšiť na verziu Rodiny" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Povýšiť na verziu Prémium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Povýšili ste na verziu Rodiny!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Pri výpočte dane pre vašu lokalitu došlo k chybe. Prosím skúste to znova." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Vítajte v Bitwardene" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Odomknite ďalšie bezpečnostné funkcie s Prémium, alebo začnite zdieľať položky s predplatným Rodiny" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Ceny sú uvedené bez dane a účtujú sa ročne." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Názov vašej organizácie sa objaví v pozvánkach ktoré zašlete členom." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Pokračovať bez povýšenia" + }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Pri spracovaní povýšenia došlo k chybe. Prosím skúste to znova." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 8bf7f77a67a..3c478d03339 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 60ca583aae5..bf47c17694c 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index 9d8cf01f128..6f0c0678ba1 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -36,7 +36,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Још увек нисте направили извештај" }, "notifiedMembers": { "message": "Обавештени чланови" @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Доделите задатке чланова да прате напредак" }, - "onceYouReviewApplications": { - "message": "Једном када прегледате апликације и означите их као критичне, оне ће се овде приказати." + "onceYouReviewApps": { + "message": "Када прегледате апликације и означите их као критичне, можете доделити задатке члановима за решавање ризичних ставки и пратити напредак овде" }, "sendReminders": { "message": "Пошаљи подсетнике" @@ -188,22 +188,22 @@ "message": "Означите апликацију као критичну" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Постави као критично" }, "applicationsSelected": { "message": "applications selected" }, "selectApplication": { - "message": "Select application" + "message": "Бирање апликације" }, "unselectApplication": { - "message": "Unselect application" + "message": "Скини одабирања апликације" }, "applicationsMarkedAsCriticalSuccess": { "message": "Апликације означене као критичне" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Означавање апликација као критичних није успело" }, "application": { "message": "Апликација" @@ -293,7 +293,7 @@ "message": "Укупно апликација" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Апликације које треба прегледати" }, "newApplicationsWithCount": { "message": "$COUNT$ new applications", @@ -305,19 +305,19 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Прегледајте нове апликације да бисте их означили као критичне и заштитили своју организацију" }, "reviewNow": { - "message": "Review now" + "message": "Прегледај сада" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Дајте приоритет критичним апликацијама" }, "atRiskItems": { - "message": "At-risk items" + "message": "Ставке под ризиком" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Означи као критичну функционалност ће бити имплементирана у будућем ажурирању" }, "unmarkAsCritical": { "message": "Уклони као критично" @@ -1294,7 +1294,7 @@ "message": "Држите овај прозор отворен и пратите упутства из прегледача." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Потврда приступачног кључа није успела. Покушајте поново." }, "useADifferentLogInMethod": { "message": "Користи други начин пријављивања" @@ -2951,7 +2951,7 @@ "message": "Уверите се да је на вашем рачуну доступно довољно кредита за ову куповину. Ако на вашем рачуну нема довољно кредита, за разлику ће се користити ваш подразумевани начин плаћања у евиденцији. На свој рачун можете да додате кредит на страници Обрачун." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Немате довољно кредита на рачуну за ову куповину. Можете да додате кредит на свој налог са странице Обрачун." }, "creditAppliedDesc": { "message": "Кредит вашег рачуна може се користити за куповину. Сав расположиви кредит аутоматски ће се применити на фактуре генерисане за овај рачун." @@ -4362,7 +4362,7 @@ "message": "Генерисање прегледа вашег ризика..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Покрените извештај" }, "updateBrowserDesc": { "message": "Користите неподржани веб прегледач. Веб сеф можда неће правилно функционисати." @@ -11294,11 +11294,46 @@ "message": "Архива", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "Нема ставка у архиви" }, - "archivedItemsDescription": { - "message": "Архивиране ставке ће се овде појавити и бити искључени из општих резултата претраге и сугестија о ауто-пуњењу." + "noItemsInArchiveDesc": { + "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" }, "businessUnit": { "message": "Пословна јединица" @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 622c09587a8..71fd1245b9d 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -90,14 +90,14 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Skicka påminnelser" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "När du markerar applikationer som kritiska kommer de att visas här." }, "viewAtRiskMembers": { "message": "Visa medlemmar i riskzonen" @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ lösenord i riskzonen", "placeholders": { "count": { "content": "$1", @@ -188,22 +188,22 @@ "message": "Markera app som kritisk" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Markera som kritisk" }, "applicationsSelected": { - "message": "applications selected" + "message": "applikationer markerade" }, "selectApplication": { - "message": "Select application" + "message": "Välj applikation" }, "unselectApplication": { - "message": "Unselect application" + "message": "Avmarkera applikation" }, "applicationsMarkedAsCriticalSuccess": { "message": "Applikationer markerade som kritiska" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Misslyckades med att markera applikationer som kritiska" }, "application": { "message": "Applikation" @@ -293,10 +293,10 @@ "message": "Totalt antal applikationer" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Applikationer som behöver granskning" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ nya applikationer", "placeholders": { "count": { "content": "$1", @@ -305,19 +305,19 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Granska nya applikationer för att markera som kritiska och hålla din organisation säker" }, "reviewNow": { - "message": "Review now" + "message": "Granska nu" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Prioritera kritiska applikationer" }, "atRiskItems": { - "message": "At-risk items" + "message": "Objekt i riskzonen" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Markera som kritisk funktionalitet kommer att implementeras i en framtida uppdatering" }, "unmarkAsCritical": { "message": "Avmarkera som kritisk" @@ -1294,7 +1294,7 @@ "message": "Håll det här fönstret öppet och följ anvisningarna från din webbläsare." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Autentisering med inloggningsnyckel misslyckades. Försök igen." }, "useADifferentLogInMethod": { "message": "Använd en annan inloggningsmetod" @@ -1612,7 +1612,7 @@ "message": "Inga objekt i papperskorgen" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Objekt som du tar bort kommer att visas här och raderas permanent efter 30 dagar" }, "noItemsInVault": { "message": "Inga objekt i valvet" @@ -4362,7 +4362,7 @@ "message": "Skapa din riskinsikt..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Kör rapport" }, "updateBrowserDesc": { "message": "Du använder en webbläsare som inte stöds. Webbvalvet kanske inte fungerar som det ska." @@ -9617,7 +9617,7 @@ "message": "Tilldela" }, "assignTasks": { - "message": "Assign tasks" + "message": "Tilldela uppgifter" }, "assignToCollections": { "message": "Tilldela till samlingar" @@ -11294,11 +11294,46 @@ "message": "Arkivera", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Objekt i arkivet" + }, "noItemsInArchive": { "message": "Inga objekt i arkivet" }, - "archivedItemsDescription": { - "message": "Arkiverade objekt kommer att visas här och kommer att uteslutas från allmänna sökresultat och förslag för autofyll." + "noItemsInArchiveDesc": { + "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + }, + "itemWasSentToArchive": { + "message": "Objektet skickades till arkivet" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Objekt arkiverade" + }, + "bulkUnarchiveItems": { + "message": "Objekt avarkiverade" + }, + "archiveItem": { + "message": "Arkivera objekt", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Arkivera objekt", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" }, "businessUnit": { "message": "Affärsenhet" @@ -11772,36 +11807,54 @@ "message": "Sömlös integration" }, "families": { - "message": "Families" + "message": "Familjer" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Uppgradera till Familjer" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Uppgradera till Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Du har uppgraderat till Familjer!" }, "taxCalculationError": { "message": "There was an error calculating tax for your location. Please try again." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Välkommen till Bitwarden" }, "individualUpgradeDescriptionMessage": { "message": "Unlock more security features with Premium, or start sharing items with Families" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Priser exklusive moms och faktureras årligen." }, "organizationNameDescription": { "message": "Your organization name will appear in invitations you send to members." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Fortsätt utan att uppgradera" + }, + "upgradeYourPlan": { + "message": "Uppgradera ditt abonnemang" + }, + "upgradeNow": { + "message": "Uppgradera nu" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Vi stötte på ett fel vid bearbetningen av din uppgradering. Försök igen." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json index f59295b7342..a42967cb0e2 100644 --- a/apps/web/src/locales/ta/messages.json +++ b/apps/web/src/locales/ta/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "வணிகப் பிரிவு" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 7d4d047617d..af314c36f83 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 0f3ed45b728..4d82bbd57e6 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Business Unit" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 106ed3fadd3..ca3ba2339b3 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,11 +11294,46 @@ "message": "Arşivle", "description": "Verb" }, + "unArchive": { + "message": "Arşivden çıkar" + }, + "itemsInArchive": { + "message": "Arşivdeki kayıtlar" + }, "noItemsInArchive": { "message": "Arşivde kayıt yok" }, - "archivedItemsDescription": { - "message": "Arşivlenen kayıtlar burada görünecek ve genel arama sonuçlarından ve otomatik doldurma önerilerinden hariç tutulacaktır." + "noItemsInArchiveDesc": { + "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Kaydı arşivle", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" }, "businessUnit": { "message": "İş Birimi" @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Planınızı yükseltin" + }, + "upgradeNow": { + "message": "Şimdi yükselt" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index afd38eb74d1..de943a8d564 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "Assign members tasks to monitor progress" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Once you review applications and mark them as critical, you can assign tasks to members to resolve at-risk items and monitor progress here" }, "sendReminders": { "message": "Send reminders" @@ -11294,12 +11294,47 @@ "message": "Archive", "description": "Verb" }, + "unArchive": { + "message": "Unarchive" + }, + "itemsInArchive": { + "message": "Items in archive" + }, "noItemsInArchive": { "message": "No items in archive" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { "message": "Бізнес-підрозділ" }, @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "Continue without upgrading" }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + }, "upgradeErrorMessage": { "message": "We encountered an error while processing your upgrade. Please try again." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 52a25a8a1bb..c22cf017f18 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -24,7 +24,7 @@ "message": "Mật khẩu rủi ro" }, "reviewAtRiskPasswords": { - "message": "Kiểm tra các mật khẩu có nguy cơ (yếu, bị lộ hoặc được sử dụng lại) trên các ứng dụng. Chọn các ứng dụng quan trọng nhất của bạn để ưu tiên các biện pháp bảo mật cho người dùng nhằm giải quyết các mật khẩu có nguy cơ." + "message": "Kiểm tra các mật khẩu có rủi ro (yếu, bị lộ hoặc được sử dụng lại) trên các ứng dụng. Chọn các ứng dụng quan trọng nhất của bạn để ưu tiên các biện pháp bảo mật cho người dùng nhằm giải quyết các mật khẩu có rủi ro." }, "dataLastUpdated": { "message": "Dữ liệu được cập nhật lần cuối: $DATE$", @@ -36,7 +36,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Bạn chưa tạo báo cáo nào" }, "notifiedMembers": { "message": "Các thành viên được thông báo" @@ -63,7 +63,7 @@ "message": "Tạo mục đăng nhập mới" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "Hoàn thành $PERCENT$%", "placeholders": { "percent": { "content": "$1", @@ -72,7 +72,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "Hoàn thành $COUNT$ trên tổng số $TOTAL$ tác vụ bảo mật", "placeholders": { "count": { "content": "$1", @@ -85,19 +85,19 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "Tiến trình thay đổi mật khẩu" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "Giao tác vụ cho thành viên để theo dõi tiến trình" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "Sau khi bạn xem xét các ứng dụng và đánh dấu chúng là nghiêm trọng, bạn có thể giao nhiệm vụ cho các thành viên để xử lý các mục có rủi ro và theo dõi tiến độ tại đây" }, "sendReminders": { - "message": "Send reminders" + "message": "Gửi lời nhắc" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "Khi bạn đánh dấu các ứng dụng là quan trọng, chúng sẽ hiển thị tại đây." }, "viewAtRiskMembers": { "message": "Xem các thành viên gặp rủi ro" @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ mật khẩu có rủi ro", "placeholders": { "count": { "content": "$1", @@ -188,22 +188,22 @@ "message": "Đánh dấu các ứng dụng quan trọng" }, "markAsCritical": { - "message": "Mark as critical" + "message": "Đánh dấu là quan trọng" }, "applicationsSelected": { - "message": "applications selected" + "message": "ứng dụng đã chọn" }, "selectApplication": { - "message": "Select application" + "message": "Chọn ứng dụng" }, "unselectApplication": { - "message": "Unselect application" + "message": "Bỏ chọn ứng dụng" }, "applicationsMarkedAsCriticalSuccess": { "message": "Các ứng dụng được đánh dấu là quan trọng" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Không thể đánh dấu các ứng dụng là quan trọng" }, "application": { "message": "Ứng dụng" @@ -224,7 +224,7 @@ "message": "Các thành viên có rủi ro" }, "membersWithAccessToAtRiskItemsForCriticalApps": { - "message": "Members with access to at-risk items for critical applications" + "message": "Thành viên có quyền truy cập vào các mục có nguy cơ dành cho các ứng dụng quan trọng" }, "membersAtRiskCount": { "message": "$COUNT$ thành viên gặp rủi ro", @@ -293,10 +293,10 @@ "message": "Tổng số ứng dụng" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Ứng dụng cần xem lại" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ ứng dụng mới", "placeholders": { "count": { "content": "$1", @@ -305,19 +305,19 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Xem lại các ứng dụng mới để đánh dấu là quan trọng và giữ an toàn cho tổ chức của bạn" }, "reviewNow": { - "message": "Review now" + "message": "Đánh giá ngay" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Ưu tiên các ứng dụng quan trọng" }, "atRiskItems": { - "message": "At-risk items" + "message": "Các mục có nguy cơ" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Chức năng đánh dấu là quan trọng sẽ được triển khai trong bản cập nhật sau" }, "unmarkAsCritical": { "message": "Bỏ đánh dấu là nghiêm trọng" @@ -1294,7 +1294,7 @@ "message": "Giữ cửa sổ này mở và làm theo lời nhắc từ trình duyệt của bạn." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Xác thực khóa bảo mật không thành công. Vui lòng thử lại." }, "useADifferentLogInMethod": { "message": "Dùng phương thức đăng nhập khác" @@ -2951,7 +2951,7 @@ "message": "Vui lòng đảm bảo tài khoản của bạn có đủ số dư để thực hiện giao dịch này. Nếu tài khoản của bạn không đủ số dư, phương thức thanh toán mặc định đã đăng ký sẽ được sử dụng để thanh toán phần chênh lệch. Bạn có thể nạp tiền vào tài khoản từ trang Thanh toán." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Bạn không có đủ tín dụng trong tài khoản cho giao dịch mua này. Bạn có thể thêm tín dụng vào tài khoản từ trang Thanh toán." }, "creditAppliedDesc": { "message": "Số dư trong tài khoản của bạn có thể được sử dụng để thực hiện các giao dịch mua hàng. Số dư khả dụng sẽ được tự động áp dụng cho các hóa đơn được tạo ra cho tài khoản này." @@ -4362,7 +4362,7 @@ "message": "Đang tạo báo cáo phân tích rủi ro của bạn..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Chạy báo cáo" }, "updateBrowserDesc": { "message": "Bạn đang sử dụng trình duyệt web không được hỗ trợ. Kho lưu trữ web có thể không hoạt động đúng cách." @@ -9617,7 +9617,7 @@ "message": "Gán" }, "assignTasks": { - "message": "Assign tasks" + "message": "Giao tác vụ" }, "assignToCollections": { "message": "Gán vào bộ sưu tập" @@ -10015,7 +10015,7 @@ "message": "Gửi dữ liệu sự kiện đến thực thể Logscale của bạn" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Gửi dữ liệu sự kiện kho bảo mật đến phiên bản Datadog của bạn" }, "failedToSaveIntegration": { "message": "Không thể lưu tích hợp. Vui lòng thử lại sau." @@ -11294,12 +11294,47 @@ "message": "Lưu trữ", "description": "Verb" }, + "unArchive": { + "message": "Hủy lưu trữ" + }, + "itemsInArchive": { + "message": "Các mục trong kho lưu trữ" + }, "noItemsInArchive": { "message": "Không có mục nào trong kho lưu trữ" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "Các mục đã lưu trữ sẽ hiển thị ở đây và sẽ bị loại khỏi kết quả tìm kiếm và gợi ý tự động điền." }, + "itemWasSentToArchive": { + "message": "Mục đã được chuyển vào kho lưu trữ" + }, + "itemsWereSentToArchive": { + "message": "Các mục đã được chuyển vào lưu trữ" + }, + "itemUnarchived": { + "message": "Mục đã được bỏ lưu trữ" + }, + "bulkArchiveItems": { + "message": "Các mục đã được lưu trữ" + }, + "bulkUnarchiveItems": { + "message": "Các mục đã được bỏ lưu trữ" + }, + "archiveItem": { + "message": "Lưu trữ mục", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Các mục đã lưu trữ sẽ bị loại khỏi kết quả tìm kiếm chung và gợi ý tự động điền. Bạn có chắc chắn muốn lưu trữ mục này không?" + }, + "archiveBulkItems": { + "message": "Lưu trữ các mục", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Các mục đã lưu trữ sẽ bị loại trừ khỏi kết quả tìm kiếm chung và gợi ý tự động điền. Bạn có chắc chắn muốn lưu trữ các mục này không?" + }, "businessUnit": { "message": "Bộ phận kinh doanh" }, @@ -11772,36 +11807,54 @@ "message": "Tích hợp liền mạch" }, "families": { - "message": "Families" + "message": "Gia đình" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Nâng cấp lên gói Gia đình" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Nâng cấp lên gói Cao cấp" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Bạn đã nâng cấp lên Gói Gia đình!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Đã xảy ra lỗi khi tính thuế cho vị trí của bạn. Vui lòng thử lại." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Chào mừng đến với Bitwarden" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Mở khóa thêm các tính năng bảo mật với Premium hoặc bắt đầu chia sẻ mục với Gói Gia đình" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Giá chưa bao gồm thuế và được thanh toán hằng năm." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Tên tổ chức của bạn sẽ hiển thị trong các lời mời bạn gửi đến các thành viên." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Tiếp tục mà không nâng cấp" + }, + "upgradeYourPlan": { + "message": "Nâng cấp gói của bạn" + }, + "upgradeNow": { + "message": "Nâng cấp ngay" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Hoàn tất biểu mẫu này sẽ tạo một tổ chức Gia đình mới. Bạn có thể nâng cấp tổ chức Miễn phí của mình từ Bảng điều khiển quản trị." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Chúng tôi gặp lỗi khi xử lý nâng cấp của bạn. Vui lòng thử lại." + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index ab1cf570462..14a668922ec 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -63,7 +63,7 @@ "message": "创建新的登录项目" }, "percentageCompleted": { - "message": "$PERCENT$% 已完成", + "message": "完成 $PERCENT$%", "placeholders": { "percent": { "content": "$1", @@ -90,8 +90,8 @@ "assignMembersTasksToMonitorProgress": { "message": "分配成员任务以监测进度" }, - "onceYouReviewApplications": { - "message": "您审查应用程序并将其标记为关键后,它们将显示在这里。" + "onceYouReviewApps": { + "message": "审查新应用程序并将其标记为关键后,您可以在这里将任务分配给成员以解决存在风险的项目并监测进度" }, "sendReminders": { "message": "发送提醒" @@ -188,16 +188,16 @@ "message": "标记应用程序为关键" }, "markAsCritical": { - "message": "Mark as critical" + "message": "标记为关键" }, "applicationsSelected": { - "message": "applications selected" + "message": "已选择的应用程序" }, "selectApplication": { - "message": "Select application" + "message": "选择应用程序" }, "unselectApplication": { - "message": "Unselect application" + "message": "取消选择应用程序" }, "applicationsMarkedAsCriticalSuccess": { "message": "标记为关键的应用程序" @@ -311,13 +311,13 @@ "message": "立即审查" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "关键应用程序优先" }, "atRiskItems": { - "message": "At-risk items" + "message": "存在风险的项目" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "标记为关键功能将在未来更新中实现" }, "unmarkAsCritical": { "message": "取消标记为关键" @@ -851,7 +851,7 @@ "message": "州 / 省" }, "zipPostalCode": { - "message": "邮政编码" + "message": "ZIP / 邮政编码" }, "country": { "message": "国家" @@ -2951,7 +2951,7 @@ "message": "请确保您的账户有足够的信用额度来用于此购买。如果您的账户信用额度不足,您的默认付款方式将用于补足差额。您可以从「计费」页面向您的账户添加信用额度。" }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "您没有足够的账户信用额度来用于此购买。您可以从「计费」页面向您的账户添加信用额度。" }, "creditAppliedDesc": { "message": "您账户的信用额度可用于进行消费。任何可用的信用额度将用于自动抵扣此账户的账单。" @@ -11294,12 +11294,47 @@ "message": "归档", "description": "Verb" }, + "unArchive": { + "message": "取消归档" + }, + "itemsInArchive": { + "message": "归档中的项目" + }, "noItemsInArchive": { "message": "归档中没有项目" }, - "archivedItemsDescription": { + "noItemsInArchiveDesc": { "message": "已归档的项目将显示在此处,并将被排除在一般搜索结果和自动填充建议之外。" }, + "itemWasSentToArchive": { + "message": "项目已发送到归档" + }, + "itemsWereSentToArchive": { + "message": "项目已发送到归档" + }, + "itemUnarchived": { + "message": "项目已取消归档" + }, + "bulkArchiveItems": { + "message": "项目已归档" + }, + "bulkUnarchiveItems": { + "message": "项目已取消归档" + }, + "archiveItem": { + "message": "归档项目", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "已归档的项目将被排除在一般搜索结果和自动填充建议之外。确定要归档此项目吗?" + }, + "archiveBulkItems": { + "message": "归档项目", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "已归档的项目将被排除在一般搜索结果和自动填充建议之外。确定要归档这些项目吗?" + }, "businessUnit": { "message": "业务单元" }, @@ -11411,7 +11446,7 @@ "message": "打开 Bitwarden 扩展" }, "bitwardenExtensionInstalledOpenExtension": { - "message": "Bitwarden 扩展已安装!打开扩展以登录并开始自动填充。" + "message": "Bitwarden 扩展已安装!请打开扩展登录并开始自动填充。" }, "openExtensionToAutofill": { "message": "打开扩展以登录并开始自动填充。" @@ -11801,7 +11836,25 @@ "continueWithoutUpgrading": { "message": "继续但不升级" }, + "upgradeYourPlan": { + "message": "升级您的方案" + }, + "upgradeNow": { + "message": "立即升级" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "完成此表单将创建一个新的家庭组织。您可以从管理控制台升级您的免费组织。" + }, "upgradeErrorMessage": { "message": "我们在处理您的升级时遇到错误。请重试。" + }, + "bitwardenFreeplanMessage": { + "message": "您拥有 Bitwarden 免费方案" + }, + "upgradeCompleteSecurity": { + "message": "升级以获得全面的安全防护" + }, + "viewbusinessplans": { + "message": "查看商业方案" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index dee1bf7196e..16d5a3c4b67 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -3,25 +3,25 @@ "message": "所有應用程式" }, "activity": { - "message": "Activity" + "message": "活動" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Bitwarden 圖示" }, "criticalApplications": { "message": "重要應用程式" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "沒有關鍵應用程式處於風險中" }, "accessIntelligence": { "message": "存取資訊" }, "riskInsights": { - "message": "Risk Insights" + "message": "風險洞察" }, "passwordRisk": { - "message": "Password Risk" + "message": "密碼風險" }, "reviewAtRiskPasswords": { "message": "檢視全部應用中具有風險的密碼 (弱、被暴露或重複使用)。選擇最重要的應用程式並優先採取安全措施,幫助使用者解決具有風險的密碼。" @@ -36,16 +36,16 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "您尚未建立報告" }, "notifiedMembers": { "message": "已被通知的成員" }, "revokeMembers": { - "message": "Revoke members" + "message": "撤銷成員" }, "restoreMembers": { - "message": "Restore members" + "message": "還原成員" }, "cannotRestoreAccessError": { "message": "無法還原組織存取" @@ -63,7 +63,7 @@ "message": "新增登入項目" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "完成 $PERCENT$%", "placeholders": { "percent": { "content": "$1", @@ -72,7 +72,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "已完成 $COUNT$ / $TOTAL$ 個安全任務", "placeholders": { "count": { "content": "$1", @@ -85,28 +85,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "密碼變更進度" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "指派成員任務以監控進度" }, - "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, they will display here." + "onceYouReviewApps": { + "message": "在您檢視應用程式並將其標記為關鍵後,您可以指派任務給成員,以解決有風險的項目,並在此監控進度" }, "sendReminders": { - "message": "Send reminders" + "message": "發送提醒" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "一旦您標記應用程式為關鍵,它們將顯示在此。" }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "檢視有風險的成員" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "檢視有風險的應用程式" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "$COUNT$ / $TOTAL$ 個關鍵應用程式因密碼風險而處於風險中", "placeholders": { "count": { "content": "$1", @@ -128,7 +128,7 @@ } }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ 個關鍵應用程式", "placeholders": { "count": { "content": "$1", @@ -137,7 +137,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ 個有風險的應用程式", "placeholders": { "count": { "content": "$1", @@ -146,7 +146,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ 個有風險的密碼", "placeholders": { "count": { "content": "$1", @@ -176,34 +176,34 @@ "message": "在使用者儲存登入後,應用程式將會顯示在這裡,並同時顯示具有風險的密碼。標註重要應用程式並通知使用者以更新密碼。" }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "您尚未將任何應用程式標記為關鍵" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "選擇您最關鍵的應用程式,以優先處理安全行動,讓使用者解決有風險的密碼。" }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "選擇重要應用程式" }, "markAppAsCritical": { "message": "標註應用程式為重要" }, "markAsCritical": { - "message": "Mark as critical" + "message": "標註應用程式為重要" }, "applicationsSelected": { - "message": "applications selected" + "message": "已選擇的應用程式" }, "selectApplication": { - "message": "Select application" + "message": "選取應用程式" }, "unselectApplication": { - "message": "Unselect application" + "message": "取消選擇應用程式" }, "applicationsMarkedAsCriticalSuccess": { - "message": "Applications marked as critical" + "message": "被標註重要的應用程式" }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "標記應用程式為關鍵失敗" }, "application": { "message": "應用程式" @@ -212,7 +212,7 @@ "message": "具有風險的密碼" }, "requestPasswordChange": { - "message": "Request password change" + "message": "請求更改密碼" }, "totalPasswords": { "message": "全部密碼" @@ -224,10 +224,10 @@ "message": "具有風險的成員" }, "membersWithAccessToAtRiskItemsForCriticalApps": { - "message": "Members with access to at-risk items for critical applications" + "message": "擁有關鍵應用程式中有風險項目存取權的成員" }, "membersAtRiskCount": { - "message": "$COUNT$ members at-risk", + "message": "$COUNT$ 位有風險的成員", "placeholders": { "count": { "content": "$1", @@ -236,7 +236,7 @@ } }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "有風險的成員 ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -254,19 +254,19 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "這些成員正在使用弱密碼、外洩密碼或重複密碼登入應用程式。" }, "atRiskMembersDescriptionNone": { - "message": "These are no members logging into applications with weak, exposed, or reused passwords." + "message": "目前沒有成員使用弱密碼、外洩密碼或重複密碼登入應用程式。" }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "這些應用程式存在弱密碼、外洩密碼或重複密碼問題。" }, "atRiskApplicationsDescriptionNone": { - "message": "These are no applications with weak, exposed, or reused passwords." + "message": "目前沒有應用程式存在弱密碼、外洩密碼或重複密碼問題。" }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "這些成員正在使用弱密碼、外洩密碼或重複密碼登入 $APPNAME$。", "placeholders": { "appname": { "content": "$1", @@ -275,7 +275,7 @@ } }, "atRiskMembersDescriptionWithAppNone": { - "message": "There are no at risk members for $APPNAME$.", + "message": "$APPNAME$ 沒有有風險的成員。", "placeholders": { "appname": { "content": "$1", @@ -293,10 +293,10 @@ "message": "應用程式總數" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "需要檢視的應用程式" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ 個新應用程式", "placeholders": { "count": { "content": "$1", @@ -305,25 +305,25 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "檢視新應用程式以標記為關鍵,並維護組織安全" }, "reviewNow": { - "message": "Review now" + "message": "立即審查" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "優先處理關鍵應用程式" }, "atRiskItems": { - "message": "At-risk items" + "message": "有風險的項目" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "標記為關鍵功能將在未來更新中實現" }, "unmarkAsCritical": { - "message": "Unmark as critical" + "message": "取消標記為關鍵" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Successfully unmarked application as critical" + "message": "已成功取消將應用程式標記為關鍵" }, "whatTypeOfItem": { "message": "這是什麼類型的項目?" @@ -390,7 +390,7 @@ "message": "支付卡詳細資料" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "$BRAND$ 詳細資訊", "placeholders": { "brand": { "content": "$1", @@ -402,7 +402,7 @@ "message": "項目歷史記錄" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "驗證器金鑰" }, "autofillOptions": { "message": "自動填入選項" @@ -440,7 +440,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "顯示偵測到的吻合 $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -449,7 +449,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "隱藏偵測到的吻合 $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -566,16 +566,16 @@ "message": "驗證器金鑰 (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "無縫兩步驟驗證" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden 可以儲存並填入兩步驟驗證碼。複製金鑰並貼上到此欄位。" }, "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." + "message": "Bitwarden 可以儲存並填入兩步驟驗證碼。選擇相機圖示來截取此網站的驗證器QR code,或手動複製金鑰並貼上到此欄位。" }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "了解更多驗證程式" }, "folder": { "message": "資料夾" @@ -626,7 +626,7 @@ "message": "編輯資料夾" }, "editWithName": { - "message": "Edit $ITEM$: $NAME$", + "message": "編輯 $ITEM$:$NAME$", "placeholders": { "item": { "content": "$1", @@ -645,10 +645,10 @@ "message": "資料夾名稱" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "在資料夾名稱後面使用「/」來建立樹狀結構。\n例如:社交網路/論壇" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "您確定要永久刪除此資料夾嗎?" }, "baseDomain": { "message": "基底網域", @@ -712,7 +712,7 @@ "message": "取消" }, "later": { - "message": "Later" + "message": "以後再說" }, "canceled": { "message": "已取消" @@ -773,7 +773,7 @@ "message": "搜尋群組" }, "resetSearch": { - "message": "Reset search" + "message": "重設搜尋" }, "allItems": { "message": "所有項目" @@ -797,7 +797,7 @@ "message": "安全筆記" }, "typeNote": { - "message": "Note" + "message": "備註" }, "typeSshKey": { "message": "SSH 金鑰" @@ -878,79 +878,79 @@ "message": "檢視項目" }, "newItemHeaderLogin": { - "message": "New Login", + "message": "新增登入資訊", "description": "Header for new login item type" }, "newItemHeaderCard": { - "message": "New Card", + "message": "新增支付卡", "description": "Header for new card item type" }, "newItemHeaderIdentity": { - "message": "New Identity", + "message": "新增身分", "description": "Header for new identity item type" }, "newItemHeaderNote": { - "message": "New Note", + "message": "新增備註", "description": "Header for new note item type" }, "newItemHeaderSshKey": { - "message": "New SSH key", + "message": "新增 SSH 金鑰", "description": "Header for new SSH key item type" }, "newItemHeaderTextSend": { - "message": "New Text Send", + "message": "新增文字 Send", "description": "Header for new text send" }, "newItemHeaderFileSend": { - "message": "New File Send", + "message": "新增檔案 Send", "description": "Header for new file send" }, "editItemHeaderLogin": { - "message": "Edit Login", + "message": "編輯登入資訊", "description": "Header for edit login item type" }, "editItemHeaderCard": { - "message": "Edit Card", + "message": "編輯支付卡", "description": "Header for edit card item type" }, "editItemHeaderIdentity": { - "message": "Edit Identity", + "message": "編輯身分", "description": "Header for edit identity item type" }, "editItemHeaderNote": { - "message": "Edit Note", + "message": "編輯備註", "description": "Header for edit note item type" }, "editItemHeaderSshKey": { - "message": "Edit SSH key", + "message": "編輯 SSH 金鑰", "description": "Header for edit SSH key item type" }, "editItemHeaderTextSend": { - "message": "Edit Text Send", + "message": "編輯文字 Send", "description": "Header for edit text send" }, "editItemHeaderFileSend": { - "message": "Edit File Send", + "message": "編輯檔案 Send", "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "View Login", + "message": "檢視登入資訊", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "View Card", + "message": "檢視支付卡", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "View Identity", + "message": "檢視身分", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "View Note", + "message": "檢視備註", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "View SSH key", + "message": "檢視 SSH 金鑰", "description": "Header for view SSH key item type" }, "new": { @@ -1001,7 +1001,7 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "複製密碼片語", "description": "Copy passphrase to clipboard" }, "passwordCopied": { @@ -1024,7 +1024,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "複製 $FIELD$", "placeholders": { "field": { "content": "$1", @@ -1057,25 +1057,25 @@ "message": "複製護照號碼" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "複製許可證號碼" }, "copyPrivateKey": { - "message": "Copy private key" + "message": "複製私密金鑰" }, "copyPublicKey": { - "message": "Copy public key" + "message": "複製公開金鑰" }, "copyFingerprint": { - "message": "Copy fingerprint" + "message": "複製指紋" }, "copyName": { - "message": "Copy name" + "message": "複製名稱" }, "cardNumber": { - "message": "card number" + "message": "支付卡號碼" }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "複製 $FIELD$,$CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -1092,7 +1092,7 @@ "message": "我" }, "myItems": { - "message": "My Items" + "message": "個人文章" }, "myVault": { "message": "我的密碼庫" @@ -1168,7 +1168,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "項目已移到 $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -1177,7 +1177,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "項目已移到 $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -1243,16 +1243,16 @@ "message": "您的登入工作階段已逾期。" }, "restartRegistration": { - "message": "Restart registration" + "message": "重新啟動註冊" }, "expiredLink": { - "message": "Expired link" + "message": "過期連結" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "請重新啟動註冊流程或是重試登入。" }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "您可能已經有帳號" }, "logOutConfirmation": { "message": "您確定要登出嗎?" @@ -1282,7 +1282,7 @@ "message": "必須先在 Bitwarden 應用程式設定中開啟後,才可以使用裝置登入。要改用其他選項嗎?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "需要另一個選項嗎?" }, "loginWithMasterPassword": { "message": "使用主密碼登入" @@ -1294,19 +1294,19 @@ "message": "保持此視窗打開,然後按照瀏覽器的提示進行操作。" }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "通行金鑰驗證失敗。請再試一次。" }, "useADifferentLogInMethod": { "message": "改用不同的登入方式" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "使用密碼金鑰登入" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "使用單一登入" }, "welcomeBack": { - "message": "Welcome back" + "message": "歡迎回來" }, "invalidPasskeyPleaseTryAgain": { "message": "無效的密碼金鑰,請再試一次。" @@ -1411,13 +1411,13 @@ "message": "登入 Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "輸入傳送到您電子郵件信箱的驗證碼" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "請輸入您驗證器應用程式中的代碼" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "請輕觸您的 YubiKey 以進行驗證" }, "authenticationTimeout": { "message": "驗證逾時" @@ -1426,25 +1426,25 @@ "message": "此驗證工作階段已逾時。請重試登入。" }, "verifyYourIdentity": { - "message": "Verify your Identity" + "message": "驗證您的身分" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "我們無法辨識這部裝置。請輸入傳送到您電子郵件的驗證碼,以驗證您的身分。" }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "繼續登入" }, "whatIsADevice": { - "message": "What is a device?" + "message": "什麼是裝置?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "裝置是您登入 Bitwarden 應用程式的唯一安裝環境。重新安裝、清除應用程式資料或清除 Cookie 可能導致裝置出現多次。" }, "logInInitiated": { "message": "登入已發起" }, "logInRequestSent": { - "message": "Request sent" + "message": "已傳送請求" }, "submit": { "message": "送出" @@ -1477,7 +1477,7 @@ "message": "主密碼提示(選用)" }, "newMasterPassHint": { - "message": "New master password hint (optional)" + "message": "新增主密碼提示(選用)" }, "masterPassHintLabel": { "message": "主密碼提示" @@ -1499,7 +1499,7 @@ "message": "設定" }, "accountEmail": { - "message": "Account email" + "message": "帳號電子郵件" }, "requestHint": { "message": "請求提示" @@ -1508,7 +1508,7 @@ "message": "請求密碼提示" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "輸入您帳號的電子郵件,您的密碼提示會傳送給您" }, "getMasterPasswordHint": { "message": "取得主密碼提示" @@ -1591,7 +1591,7 @@ "message": "無效的主密碼" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "主密碼無效。請確認你的電子郵件正確,且帳號是於 $HOST$ 建立的。", "placeholders": { "host": { "content": "$1", @@ -1609,28 +1609,28 @@ "message": "沒有可列出的項目。" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "垃圾桶中沒有項目" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "您刪除的項目會在此顯示,並會在 30 天之後永久刪除" }, "noItemsInVault": { - "message": "No items in the vault" + "message": "密碼庫中沒有項目" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "除了密碼之外,您也可以儲存安全的登入資訊、身分資訊、支付卡及筆記在您的密碼庫。" }, "emptyFavorites": { - "message": "You haven't favorited any items" + "message": "您尚未將任何項目設為收藏" }, "emptyFavoritesDesc": { - "message": "Add frequently used items to favorites for quick access." + "message": "將常用項目加入收藏以快速存取。" }, "noSearchResults": { - "message": "No search results returned" + "message": "沒有搜尋結果" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "清除過濾器或更換另一個搜尋條件" }, "noPermissionToViewAllCollectionItems": { "message": "您沒有檢視此集合中所有項目的權限。" @@ -1663,10 +1663,10 @@ "message": "通知已傳送至您的裝置。" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "在你的裝置或其他裝置上解鎖 Bitwarden" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "來自 $EMAIL$ 的存取嘗試", "placeholders": { "email": { "content": "$1", @@ -1675,19 +1675,19 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "確認訪問" }, "denyAccess": { - "message": "Deny access" + "message": "拒絕訪問權限" }, "notificationSentDeviceAnchor": { "message": "網頁應用程式" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "在核准前請確保您的指紋短語與下面完全相符。" }, "notificationSentDeviceComplete": { - "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + "message": "在您的裝置上解鎖 Bitwarden。批准前請確認指紋短語與下方所示相符。" }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" @@ -1711,10 +1711,10 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "30 天內不要再於這部裝置上詢問" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "選擇其他方式", "description": "Select another two-step login method" }, "useYourRecoveryCode": { @@ -1736,19 +1736,19 @@ "message": "兩步驟登入選項" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "選取兩步驟登入方式" }, "recoveryCodeTitle": { "message": "復原碼" }, "invalidRecoveryCode": { - "message": "Invalid recovery code" + "message": "無效的還原代碼" }, "authenticatorAppTitle": { "message": "驗證器應用程式" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "輸入驗證器應用程式產生的驗證碼,例如 Bitwarden 驗證器。", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { @@ -1758,7 +1758,7 @@ "message": "使用 YubiKey 存取您的帳戶。支援 YubiKey 4 系列、5 系列以及 NEO 裝置。" }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "輸入 Duo 應用程式產生的驗證碼。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1781,13 +1781,13 @@ "message": "(遷移自 FIDO)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "在新分頁開啟" }, "emailTitle": { "message": "電子郵件" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "輸入寄送到您電子郵件信箱的驗證碼。" }, "continue": { "message": "繼續" @@ -1844,10 +1844,10 @@ "message": "複製 UUID" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "存取權杖更新失敗" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "未找到存取權杖或 API 密鑰。請重試登出再登入。" }, "warning": { "message": "警告" @@ -1948,7 +1948,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "避免易混淆的字元", "description": "Label for the avoid ambiguous characters checkbox." }, "length": { @@ -1986,20 +1986,20 @@ "message": "包含數字" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "企業原則之要求已在您的產生器選項中生效。", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { "message": "密碼歷史記錄" }, "generatorHistory": { - "message": "Generator history" + "message": "產生器歷史記錄" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "清除產生器歷史記錄" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "若繼續,所有產生器曾經產生的記錄會被刪除。您確定要繼續?" }, "noPasswordsInList": { "message": "沒有可列出的密碼。" @@ -2011,7 +2011,7 @@ "message": "沒有可顯示的內容" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "您最近未產生任何密碼" }, "clear": { "message": "清除", @@ -2045,7 +2045,7 @@ "message": "接下來會登出目前工作階段,並要求您重新登入帳戶。其他裝置上的工作階段最多會保持一個小時。" }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "變更密碼後,你需要使用新密碼重新登入。其他裝置上的工作階段會在一小時內登出。" }, "emailChanged": { "message": "電子郵件已儲存" @@ -2057,7 +2057,7 @@ "message": "目前工作階段" }, "requestPending": { - "message": "Request pending" + "message": "等待請求" }, "logBackInOthersToo": { "message": "請重新登入。若您還在使用其他 Bitwarden 應用程式,也請登出後再重新登入。" @@ -2136,25 +2136,25 @@ "message": "接下來會登出目前的工作階段,並要求您重新登入。若您有設定兩步驟登入,也需重新驗證。其他裝置上的活動工作階段最多會保持一個小時。" }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "新裝置登入" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "關閉新裝置登入保護" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "啟用新裝置登入保護" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "請在下方繼續操作,以關閉 Bitwarden 在您從新裝置登入時發送的驗證電子郵件。" }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "請在下方繼續操作,以啟用 Bitwarden 在您從新裝置登入時發送的驗證電子郵件。" }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "當新裝置登入保護關閉時,任何知道您主密碼的人都可以從任何裝置存取您的帳號。若要在不使用驗證電子郵件的情況下保護帳號,請設定兩步驟登入。" }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "新裝置登入保護變更已儲存" }, "sessionsDeauthorized": { "message": "已取消所有工作階段授權" @@ -2205,7 +2205,7 @@ "message": "您的帳戶已經關閉,所有關聯的資料也已經被刪除。" }, "deleteOrganizationWarning": { - "message": "Deleting your organization is permanent. It cannot be undone." + "message": "刪除組織是永久性的。這無法撤銷。" }, "myAccount": { "message": "我的帳戶" @@ -2225,7 +2225,7 @@ "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", + "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": { @@ -2276,7 +2276,7 @@ "message": "解密匯出的檔案時發生錯誤,您的加密金鑰與匯出資料時使用的金鑰不同。" }, "destination": { - "message": "Destination" + "message": "目的" }, "learnAboutImportOptions": { "message": "瞭解更多匯入選項" @@ -2288,10 +2288,10 @@ "message": "選擇一個集合" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "若你希望將匯入檔案的內容移至集合,請選擇此選項" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "若你希望將匯入檔案的內容移至資料夾,請選擇此選項" }, "importUnassignedItemsError": { "message": "檔案包含未指派的項目。" @@ -2340,7 +2340,7 @@ "message": "變更網頁版密碼庫使用的語言。" }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "顯示網站圖示並取得變更密碼網址" }, "default": { "message": "預設" @@ -2413,19 +2413,19 @@ "message": "啟用兩步驟登入可能會將您永久鎖定在您的 Bitwarden 帳戶外。如果您無法正常使用兩步驟登入方式(例如,您遺失了裝置),則可以使用復原碼存取您的帳戶。 如果您失去帳戶的存取權限,Bitwarden 也無法幫助您。所以我們建議您記下或列印復原碼,並將其妥善保存。" }, "restrictedItemTypePolicy": { - "message": "Remove card item type" + "message": "移除支付卡項目類型" }, "restrictedItemTypePolicyDesc": { - "message": "Do not allow members to create card item types. Existing cards will be automatically removed." + "message": "不允許成員建立支付卡項目類型。現有支付卡將自動移除。" }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "無法匯入支付卡項目類別" }, "restrictCardTypeImportDesc": { - "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + "message": "由於一或多個組織設有政策,您無法匯入支付卡至您的密碼庫。" }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "您的單次使用恢復碼可用於在失去兩步驟登入提供者存取權時關閉兩步驟登入。Bitwarden 建議您將恢復碼寫下並妥善保管。" }, "viewRecoveryCode": { "message": "檢視復原碼" @@ -2466,31 +2466,31 @@ "message": "管理" }, "manageCollection": { - "message": "Manage collection" + "message": "管理所有集合" }, "viewItems": { - "message": "View items" + "message": "檢視項目" }, "viewItemsHidePass": { - "message": "View items, hidden passwords" + "message": "檢視項目、隱藏密碼" }, "editItems": { "message": "編輯項目" }, "editItemsHidePass": { - "message": "Edit items, hidden passwords" + "message": "編輯項目、隱藏密碼" }, "disable": { "message": "停用" }, "orgUserDetailsNotFound": { - "message": "Member details not found." + "message": "找不到成員詳細資料。" }, "revokeAccess": { "message": "撤銷存取權限" }, "revoke": { - "message": "Revoke" + "message": "撤銷" }, "twoStepLoginProviderEnabled": { "message": "您的帳戶已啟用此兩步驟登入方式。" @@ -2526,19 +2526,19 @@ "message": "繼續前往 bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { - "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website." + "message": "您可以使用 Bitwarden 驗證器儲存驗證器金鑰,並為兩步驟驗證流程產生 TOTP 代碼。前往 bitwarden.com 網站以了解更多資訊。" }, "twoStepAuthenticatorScanCodeV2": { "message": "使用驗證應用程式掃描下方的 QR 碼,或輸入金鑰。" }, "twoStepAuthenticatorQRCanvasError": { - "message": "Could not load QR code. Try again or use the key below." + "message": "無法載入 QR 碼。請再試一次或使用下方金鑰。" }, "key": { "message": "金鑰" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Verification code" + "message": "驗證碼" }, "twoStepAuthenticatorReaddDesc": { "message": "若您需要將其加入其他裝置,以下是您的驗證器應用程式所需要的 QR Code(或金鑰)。" @@ -2737,7 +2737,7 @@ "message": "發現未啟用 2FA 的登入" }, "inactive2faFoundReportDesc": { - "message": "We found $COUNT$ website(s) in your $VAULT$ that may not be configured with two-step login (according to 2fa.directory). To further protect these accounts, you should set up two-step login.", + "message": "我們在您的密碼庫中找到 $COUNT$ 個可能未設定兩步驟登入的網站(依據 twofactorauth.org)。若要進一步保護這些帳號,您應啟用兩步驟登入。", "placeholders": { "count": { "content": "$1", @@ -2784,7 +2784,7 @@ "message": "檢查洩露的密碼" }, "timesExposed": { - "message": "Times exposed" + "message": "暴露次數" }, "exposedXTimes": { "message": "已暴露 $COUNT$ 次", @@ -2821,7 +2821,7 @@ "message": "您的密碼庫中沒有項目具有弱式密碼。" }, "weakness": { - "message": "Weakness" + "message": "弱" }, "reusedPasswordsReport": { "message": "重複使用密碼" @@ -2833,7 +2833,7 @@ "message": "發現重複使用的密碼" }, "reusedPasswordsFoundReportDesc": { - "message": "We found $COUNT$ passwords that are being reused in your $VAULT$. You should change them to a unique value.", + "message": "我們在您的密碼庫中找到了 $COUNT$ 組密碼重複使用。您應該將它們變更為不同的密碼。", "placeholders": { "count": { "content": "$1", @@ -2951,7 +2951,7 @@ "message": "請確保您的帳戶有足夠的餘額用於此次購買,若您的帳戶餘額不足,則會以您預設的付款方式補足差額。您可以透過計費頁面對您的帳戶儲值餘額。" }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "您的帳號餘額不足以完成此購買。您可以在帳單頁面為帳號加值。" }, "creditAppliedDesc": { "message": "您帳戶的餘額可用於消費。任何可用的餘額將用於自動繳納此帳戶的帳單。" @@ -3055,10 +3055,10 @@ } }, "showPricingSummary": { - "message": "Show pricing summary" + "message": "顯示價格摘要" }, "hidePricingSummary": { - "message": "Hide pricing summary" + "message": "隱藏價格摘要" }, "summary": { "message": "摘要" @@ -3158,7 +3158,7 @@ "message": "下載授權證" }, "viewBillingToken": { - "message": "View Billing Token" + "message": "檢視帳單權杖" }, "updateLicense": { "message": "更新授權" @@ -3207,10 +3207,10 @@ "message": "帳單" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "沒有未付款發票。" }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "無帳單。" }, "paid": { "message": "已付款", @@ -3487,7 +3487,7 @@ } }, "trialSecretsManagerThankYou": { - "message": "Thanks for signing up for Bitwarden Secrets Manager for $PLAN$!", + "message": "感謝您申請 Bitwarden 機密管理 $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -3607,10 +3607,10 @@ "message": "外部 ID 可用於參考,或將此資源與使用者目錄等外部系統連結起來。" }, "ssoExternalId": { - "message": "SSO External ID" + "message": "SSO 外部 ID" }, "ssoExternalIdDesc": { - "message": "SSO External ID is an unencrypted reference between Bitwarden and your configured SSO provider." + "message": "SSO 外部 ID 是 Bitwarden 與您設定的 SSO 提供者之間的一個未加密參考。" }, "nestCollectionUnder": { "message": "將集合嵌套在" @@ -3661,10 +3661,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "您還有 1 個邀請名額。" }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "您沒有剩餘邀請名額。" }, "userUsingTwoStep": { "message": "此使用者正在使用兩步驟登入保護帳戶。" @@ -3742,7 +3742,7 @@ "message": "網頁版密碼庫" }, "webApp": { - "message": "Web app" + "message": "網路應用程式" }, "cli": { "message": "CLI 命令列介面" @@ -3833,7 +3833,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "檢視所有登入選項" }, "viewAllLoginOptions": { "message": "檢視所有登入選項" @@ -4121,7 +4121,7 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "已取消連結 SSO" }, "unlinkedSsoUser": { "message": "已為使用者 $ID$ 取消連結 SSO。", @@ -4178,16 +4178,16 @@ "message": "首次登入" }, "trusted": { - "message": "Trusted" + "message": "已信任" }, "needsApproval": { - "message": "Needs approval" + "message": "需要批准" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "您正在嘗試登入嗎?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "來自 $EMAIL$ 的登入嘗試", "placeholders": { "email": { "content": "$1", @@ -4196,22 +4196,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "裝置類型" }, "ipAddress": { - "message": "IP Address" + "message": "IP 位址" }, "confirmLogIn": { - "message": "Confirm login" + "message": "確認登入" }, "denyLogIn": { - "message": "Deny login" + "message": "拒絕登入" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "此請求已失效。" }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "登入請求已由 $DEVICE$ 上的 $EMAIL$ 批准", "placeholders": { "email": { "content": "$1", @@ -4224,7 +4224,7 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "您拒絕了來自其他裝置的登入嘗試。如果這是您本人,請嘗試再次使用該裝置登入。" }, "loginRequestHasAlreadyExpired": { "message": "登入要求已逾期。" @@ -4233,7 +4233,7 @@ "message": "剛剛" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "$MINUTES$ 分鐘前已發起要求", "placeholders": { "minutes": { "content": "$1", @@ -4248,10 +4248,10 @@ "message": "查看你的電子郵件" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "跟隨電子郵件中的連結" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "並繼續建立您的帳號" }, "noEmail": { "message": "沒有電子郵件?" @@ -4260,7 +4260,7 @@ "message": "返回" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "來編輯您的電子郵件位址。" }, "view": { "message": "檢視" @@ -4344,7 +4344,7 @@ "message": "帳戶電子郵件已驗證" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "電子郵件已驗證" }, "emailVerifiedFailed": { "message": "無法驗證電子郵件。請嘗試傳送一封新的驗證電子郵件。" @@ -4359,22 +4359,22 @@ "message": "更新瀏覽器" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "正在生成您的風險洞察..." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "執行報告" }, "updateBrowserDesc": { "message": "未支援您使用的瀏覽器。網頁版密碼庫可能無法正常運作。" }, "youHaveAPendingLoginRequest": { - "message": "You have a pending login request from another device." + "message": "您有來自其他裝置的待處理登入請求。" }, "reviewLoginRequest": { - "message": "Review login request" + "message": "檢視登入請求" }, "loginRequest": { - "message": "Login request" + "message": "已要求登入" }, "freeTrialEndPromptCount": { "message": "您的免費試用將於 $COUNT$ 天後結束。", @@ -4441,7 +4441,7 @@ "message": "您已被邀請加入以上組織。若想接受邀請,您需要登入或建立新的 Bitwarden 帳戶。" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "設定主密碼以完成加入這個組織" }, "inviteAccepted": { "message": "邀請已接受" @@ -4471,7 +4471,7 @@ "message": "若您無法透過一般的兩步驟登入方式存取您的帳戶,您可以使用兩步驟登入復原碼以停用帳戶上的所有兩步驟登入方式。" }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "請使用您的單次使用恢復碼在下方登入。這將關閉帳號上的所有兩步驟提供者。" }, "recoverAccountTwoStep": { "message": "復原帳戶的兩步驟登入" @@ -4675,7 +4675,7 @@ "message": "如果你想新增額外的" }, "smStandaloneTrialSeatCountUpdateMessageFragment2": { - "message": "seats without the bundled offer, please contact" + "message": "座位未包含捆綁優惠,請聯絡" }, "subscriptionUserSeatsLimitedAutoscale": { "message": "調整訂閱將會依比例變更您的計費總額。若新邀請的成員超過您的訂閱席位,您將立即收到依比例收取的額外使用者費用,直到您達到 $MAX$ 席位限制。", @@ -4732,7 +4732,7 @@ } }, "subscriptionSeatMaxReached": { - "message": "You cannot invite more than $COUNT$ members without increasing your subscription seats.", + "message": "在不增加訂閱座位數的情況下,您不能邀請超過 $COUNT$ 位成員。", "placeholders": { "count": { "content": "$1", @@ -4762,7 +4762,7 @@ } }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "編輯 $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4771,7 +4771,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "重新排序 $LABEL$。使用方向鍵來往上或下移動。", "placeholders": { "label": { "content": "$1", @@ -4780,7 +4780,7 @@ } }, "reorderFieldUp": { - "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "message": "往上移動 $LABEL$,位置 $LENGTH$ 之 $INDEX$", "placeholders": { "label": { "content": "$1", @@ -4797,7 +4797,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "往下移動 $LABEL$,位置 $LENGTH$ 之 $INDEX$", "placeholders": { "label": { "content": "$1", @@ -4817,10 +4817,10 @@ "message": "更新加密金鑰後,您需要登出並重新登入目前使用的所有 Bitwarden 應用程式(如行動應用程式或瀏覽器擴充套件)。登出和重新登入(這會下載新的加密金鑰)失敗可能會導致資料損毀。我們將嘗試自動登出,但可能會有所延遲。" }, "updateEncryptionKeyAccountExportWarning": { - "message": "Any account restricted exports you have saved will become invalid." + "message": "您保存的任何受限制匯出帳號將失效。" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "不再支援舊版加密。請聯繫支援團隊以恢復您的帳號。" }, "subscription": { "message": "訂閱" @@ -4850,7 +4850,7 @@ "message": "您未選取任何内容。" }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "獲得來自 Bitwarden 的公告、建議及研究資訊電子郵件。" }, "subscribe": { "message": "訂閱" @@ -4862,7 +4862,7 @@ "message": "於任何時間。" }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "若是繼續,則代表您同意" }, "and": { "message": "和" @@ -4931,10 +4931,10 @@ "message": "組織已停用" }, "organizationIsSuspended": { - "message": "Organization is suspended" + "message": "組織已停用" }, "organizationIsSuspendedDesc": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。" }, "secretsAccessSuspended": { "message": "無法存取已停用的組織。請聯絡您組織的擁有者以獲取協助。" @@ -5029,7 +5029,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "一旦您的請求被通過,您會獲得通知。" }, "free": { "message": "免費", @@ -5082,7 +5082,7 @@ "message": "設定主密碼強度要求。" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "密碼強度分數 $SCORE$", "placeholders": { "score": { "content": "$1", @@ -5268,10 +5268,10 @@ "message": "若要使用組織的單一登入入口登入。請先輸入您的組織識別碼。" }, "singleSignOnEnterOrgIdentifier": { - "message": "Enter your organization's SSO identifier to begin" + "message": "輸入您組織的 SSO 識別碼以開始" }, "singleSignOnEnterOrgIdentifierText": { - "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device." + "message": "要使用 SSO 提供者登入,請輸入您組織的 SSO 識別碼以開始。您可能需要在新裝置登入時再次輸入此 SSO 識別碼。" }, "enterpriseSingleSignOn": { "message": "企業單一登入" @@ -5322,11 +5322,11 @@ "message": "SSO 識別" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "message": "提供此 ID 給您的成員以使用 SSO 登入。如果已設定認領網域,成員在 SSO 登入時可跳過輸入此識別碼。", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "claimedDomainsLearnMore": { - "message": "Learn more", + "message": "了解更多", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { @@ -5345,13 +5345,13 @@ "message": "限制成員加入其他組織。" }, "singleOrgPolicyDesc": { - "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification." + "message": "限制成員加入其他組織。此政策為已啟用網域驗證的組織所必需。" }, "singleOrgBlockCreateMessage": { "message": "您目前的組織原則不允許您加入多個組織。請聯絡您的組織管理員或從其他 Bitwarden 帳戶註冊。" }, "singleOrgPolicyMemberWarning": { - "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met." + "message": "不符合規範的成員將被置於撤銷狀態,直到他們離開所有其他組織。管理員不受此限制,並可在符合規範後恢復成員資格。" }, "requireSso": { "message": "要求單一登入驗證" @@ -5372,14 +5372,14 @@ "message": "組織擁有者與管理員不受此原則的執行影響。" }, "limitSendViews": { - "message": "Limit views" + "message": "限制查看" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "在達到限額後,沒有人能查看此 Send。", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "剩餘 $ACCESSCOUNT$ 次查看次數", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -5402,7 +5402,7 @@ "message": "文字" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "新增一個用於收件人存取此 Send 的可選密碼。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -5430,14 +5430,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "您確定要永久刪除此 Send 嗎?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "刪除日期" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "此 Send 將在指定的日期後被永久刪除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5487,7 +5487,7 @@ "message": "等待刪除" }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "默認隱藏文字" }, "expired": { "message": "已逾期" @@ -5512,11 +5512,11 @@ "message": "下載附件" }, "sendAccessPasswordTitle": { - "message": "Enter the password to view this Send", + "message": "輸入密碼以查看此 Send 內容", "description": "Title of the Send password authentication screen." }, "sendAccessContentTitle": { - "message": "View Send", + "message": "檢視 Send", "description": "Title of the Send view content screen." }, "sendAccessUnavailable": { @@ -5665,7 +5665,7 @@ "message": "已拒絕緊急存取" }, "grantorDetailsNotFound": { - "message": "Grantor details not found" + "message": "找不到授權人詳細資料" }, "passwordResetFor": { "message": "$USER$ 的密碼已重設。您現在可以使用新密碼登入了。", @@ -5677,37 +5677,37 @@ } }, "organizationDataOwnership": { - "message": "Enforce organization data ownership" + "message": "強制組織資料所有權" }, "organizationDataOwnershipDesc": { - "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "message": "要求所有項目由組織擁有,移除在帳號層級儲存項目的選項。", "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "message": "所有項目將由組織擁有並儲存,啟用組織範圍的控管、可見性及報告。啟用後,每位成員將有預設集合可用於儲存項目。瞭解更多關於管理", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { - "message": "credential lifecycle", + "message": "憑證生命週期", "description": "This will be used as a hyperlink" }, "organizationDataOwnershipWarningTitle": { - "message": "Are you sure you want to proceed?" + "message": "您確定要繼續嗎?" }, "organizationDataOwnershipWarning1": { - "message": "will remain accessible to members" + "message": "將保持成員可存取" }, "organizationDataOwnershipWarning2": { - "message": "will not be automatically selected when creating new items" + "message": "在建立新項目時不會自動選取" }, "organizationDataOwnershipWarning3": { - "message": "cannot be managed from the Admin Console until the user is offboarded" + "message": "在使用者離職前,無法從管理控制台管理" }, "organizationDataOwnershipWarningContentTop": { - "message": "By turning this policy off, the default collection: " + "message": "關閉此政策後,預設集合:" }, "organizationDataOwnershipWarningContentBottom": { - "message": "Learn more about the ", + "message": "了解更多 ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "personalOwnership": { @@ -5723,10 +5723,10 @@ "message": "由於某個企業原則,您被限制為儲存項目至您的個人密碼庫。將擁有權變更為組織,並從可用的集合中選擇。" }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "桌面自動填入預設設定" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "預設為成員啟用桌面自動填入。成員可在桌面端手動關閉自動填入。", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { @@ -5893,73 +5893,73 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'" }, "developmentDevOpsAndITTeamsChooseBWSecret": { - "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets." + "message": "開發、DevOps 及 IT 團隊選擇 Bitwarden Secrets Manager 來安全管理和部署其基礎設施及機器憑證。" }, "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": "提升開發者生產力。" }, "enhanceDeveloperProductivityDescription": { - "message": "Programmatically retrieve and deploy secrets at runtime so developers can focus on what matters most, like improving code quality." + "message": "在執行時以程式方式擷取和部署憑證,讓開發人員能專注於最重要的事情,例如提升程式碼品質。" }, "strengthenBusinessSecurity": { "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": "立即體驗" }, "sendRequest": { - "message": "Send request" + "message": "傳送請求" }, "addANote": { "message": "新增備註" }, "bitwardenSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "Bitwarden 密鑰管理" }, "moreProductsFromBitwarden": { "message": "更多來自 Bitwarden 的產品" }, "requestAccessToSecretsManager": { - "message": "Request access to Secrets Manager" + "message": "請求存取 Secrets Manager" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { - "message": "You need approval from your administrator to try Secrets Manager." + "message": "您需要管理員批准才能使用 Secrets Manager。" }, "smAccessRequestEmailSent": { - "message": "Access request for secrets manager email sent to admins." + "message": "Secrets Manager 存取請求已透過電子郵件發送給管理員。" }, "requestAccessSMDefaultEmailContent": { - "message": "Hi,\n\nI am requesting a subscription to Bitwarden Secrets Manager for our team. Your support would mean a great deal!\n\nBitwarden Secrets Manager is an end-to-end encrypted secrets management solution for securely storing, sharing, and deploying machine credentials like API keys, database passwords, and authentication certificates.\n\nSecrets Manager will help us to:\n\n- Improve security\n- Streamline operations\n- Prevent costly secret leaks\n\nTo request a free trial for our team, please reach out to Bitwarden.\n\nThank you for your help!" + "message": "您好,\n\n我想為我們的團隊申請 Bitwarden Secrets Manager 的訂閱,您的支援對我們非常重要!\n\nBitwarden Secrets Manager 是一套端對端加密的憑證管理解決方案,可安全地儲存、分享及部署機器憑證,例如 API 金鑰、資料庫密碼及驗證憑證。\n\nSecrets Manager 將協助我們:\n\n- 提升安全性\n- 精簡操作流程\n- 防止高成本的憑證外洩\n\n如需為我們的團隊申請免費試用,請聯絡 Bitwarden。\n\n感謝您的協助!" }, "giveMembersAccess": { - "message": "Give members access:" + "message": "授予成員存取權:" }, "viewAndSelectTheMembers": { - "message": "view and select the members you want to give access to Secrets Manager." + "message": "檢視並選取您想授予 Secrets Manager 存取權的成員。" }, "openYourOrganizations": { - "message": "Open your organization's" + "message": "開啟您組織的" }, "usingTheMenuSelect": { - "message": "Using the menu, select" + "message": "使用選單,選擇" }, "toGrantAccessToSelectedMembers": { - "message": "to grant access to selected members." + "message": "以授予選取成員存取權。" }, "sendVaultCardTryItNow": { "message": "立即嘗試", @@ -5987,7 +5987,7 @@ } }, "viewSend": { - "message": "View Send", + "message": "檢視 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "viewSendHiddenEmailWarning": { @@ -6010,7 +6010,7 @@ "message": "儲存刪除日期和逾期日期時發生錯誤。" }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "對查看者隱藏您的電子郵件地址。" }, "webAuthnFallbackMsg": { "message": "要驗證您的 2FA,請點選下方的按鈕。" @@ -6019,10 +6019,10 @@ "message": "驗證 WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "讀取安全金鑰" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "等待安全金鑰操作中……" }, "webAuthnNotSupported": { "message": "此瀏覽器不支援 WebAuthn。" @@ -6031,7 +6031,7 @@ "message": "WebAuthn 驗證成功!您可以關閉此分頁。" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "你的新密碼不能與目前的密碼相同。" }, "hintEqualsPassword": { "message": "密碼提示不能與您的密碼相同。" @@ -6109,7 +6109,7 @@ } }, "emergencyAccessLoggedOutWarning": { - "message": "Proceeding will log $NAME$ out of their current session, requiring them to log back in. Active sessions on other devices may continue to remain active for up to one hour.", + "message": "接下來會將 $NAME$ 登出目前的工作階段,並要求他們重新登入帳號。其他裝置上的活動工作階段最多會保持一個小時。", "placeholders": { "name": { "content": "$1", @@ -6124,7 +6124,7 @@ "message": "一個或多個組織原則要求主密碼須符合下列條件:" }, "changePasswordDelegationMasterPasswordPolicyInEffect": { - "message": "One or more organization policies require the master password to meet the following requirements:" + "message": "一個或多個組織原則要求主密碼須符合下列條件:" }, "resetPasswordSuccess": { "message": "密碼重設成功!" @@ -6232,32 +6232,32 @@ "message": "已排除,不適用於此動作" }, "nonCompliantMembersTitle": { - "message": "Non-compliant members" + "message": "不符合規範的成員" }, "nonCompliantMembersError": { - "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" + "message": "不符合「單一組織」或「兩步驟登入」政策的成員,在遵守政策要求前無法恢復。" }, "fingerprint": { "message": "指紋" }, "fingerprintPhrase": { - "message": "Fingerprint phrase:" + "message": "指紋短語:" }, "error": { "message": "錯誤" }, "decryptionError": { - "message": "Decryption error" + "message": "解密發生錯誤" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden 無法解密您密碼庫中下面的項目。" }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "聯絡客戶支援部門", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "來避免更多資料遺失。", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6392,7 +6392,7 @@ "message": "新增" }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "主密碼設定成功" }, "updatedMasterPassword": { "message": "主密碼已儲存" @@ -6401,10 +6401,10 @@ "message": "更新主密碼" }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "變更你的主密碼以完成帳號復原。" }, "updateMasterPasswordSubtitle": { - "message": "Your master password does not meet this organization’s requirements. Change your master password to continue." + "message": "你的主密碼不符合此組織的要求。請變更主密碼以繼續。" }, "updateMasterPasswordWarning": { "message": "您的主密碼最近被您的組織管理者變更過。您必須現在更新主密碼才能存取密碼庫。繼續操作會登出您目前的工作階段,並要求您重新登入帳戶。其他裝置上的活動工作階段最多會保持一個小時。" @@ -6416,19 +6416,19 @@ "message": "您的主密碼不符合一個或多個組織政策規定。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能持續長達一小時。" }, "automaticAppLogin": { - "message": "Automatically log in users for allowed applications" + "message": "自動登入允許的應用程式使用者" }, "automaticAppLoginDesc": { - "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + "message": "從已設定的身份提供者啟動的應用程式,其登入表單將自動填入並提交。" }, "automaticAppLoginIdpHostLabel": { - "message": "Identity provider host" + "message": "身份提供者主機" }, "automaticAppLoginIdpHostDesc": { - "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + "message": "輸入您的身份提供者主機 URL。若有多個 URL,請以逗號分隔。" }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has updated your decryption options. Please set a master password to access your vault." + "message": "您的組織已更新您的解密選項。請設定主密碼以存取您的密碼庫。" }, "maximumVaultTimeout": { "message": "密碼庫逾時時間" @@ -6462,7 +6462,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "最多 $HOURS$ 小時 $MINUTES$ 分鐘", "placeholders": { "hours": { "content": "$1", @@ -6618,10 +6618,10 @@ "message": "驗證憑證" }, "spUniqueEntityId": { - "message": "Set a unique SP entity ID" + "message": "設定唯一的 SP 實體 ID" }, "spUniqueEntityIdDesc": { - "message": "Generate an identifier that is unique to your organization" + "message": "生成一個對您的組織唯一的識別碼" }, "idpEntityId": { "message": "實體 ID" @@ -6657,19 +6657,19 @@ "message": "免費的 Bitwarden 家庭方案" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "受贊助家庭" }, "noSponsoredFamiliesMessage": { - "message": "No sponsored families" + "message": "沒有受贊助家庭" }, "nosponsoredFamiliesDetails": { - "message": "Sponsored non-member families plans will display here" + "message": "受贊助非成員家庭方案將顯示於此" }, "sponsorshipFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "您組織的成員符合免費 Bitwarden 家庭方案資格。您可以為非 Bitwarden 組織成員的員工贊助免費 Bitwarden 家庭方案。贊助非成員需要您組織中有可用的座位。" }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "當您移除有效的贊助後,該座位將在受贊助組織的續訂日期後於您的組織中可用。" }, "sponsoredFamiliesEligible": { "message": "您與家庭成員可使用免費的 Bitwarden 家庭方案。就算不在上班時間,也可以使用您的私人電子郵件來兌換此方案,以保障您的資料安全。" @@ -6678,28 +6678,28 @@ "message": "立即兌換您的免費 Bitwarden 家庭方案,即使不在上班時間也能夠保障您的資料安全。" }, "sponsoredFamiliesIncludeMessage": { - "message": "The Bitwarden for Families plan includes" + "message": "Bitwarden 家庭方案內容包含" }, "sponsoredFamiliesPremiumAccess": { "message": "最多 6 位使用者的付費方案存取權限" }, "sponsoredFamiliesSharedCollectionsForFamilyMembers": { - "message": "Shared collections for family members" + "message": "家庭成員的共享集合" }, "memberFamilies": { - "message": "Member families" + "message": "成員家庭" }, "noMemberFamilies": { - "message": "No member families" + "message": "沒有成員家庭" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "已兌換家庭方案的成員將顯示於此" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "您組織的成員符合免費 Bitwarden 家庭方案資格。在此可查看已贊助家庭組織的成員。" }, "organizationHasMemberMessage": { - "message": "A sponsorship cannot be sent to $EMAIL$ because they are a member of your organization.", + "message": "無法向 $EMAIL$ 發送贊助,因為他們是您組織的成員。", "placeholders": { "email": { "content": "$1", @@ -6759,7 +6759,7 @@ "message": "已兌換帳戶" }, "revokeAccountMessage": { - "message": "Revoke account $NAME$", + "message": "撤銷帳號 $NAME$", "placeholders": { "name": { "content": "$1", @@ -6825,16 +6825,16 @@ "message": "必須填入驗證碼。" }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "驗證已被取消或時間超過。請再試一次。" }, "invalidVerificationCode": { "message": "無效的驗證碼" }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "以下組織的成員已不再需要主密碼。請與你的組織管理員確認下方的網域。" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector 網域" }, "leaveOrganization": { "message": "離開組織" @@ -6894,7 +6894,7 @@ "message": "已停用 SSO" }, "emailMustLoginWithSso": { - "message": "$EMAIL$ must login with Single Sign-on", + "message": "$EMAIL$ 必須使用單一登入 (SSO) 登入", "placeholders": { "email": { "content": "$1", @@ -6948,7 +6948,7 @@ "message": "檢視計費同步權杖" }, "generateBillingToken": { - "message": "Generate billing token" + "message": "產生計費權杖" }, "copyPasteBillingSync": { "message": "請將本權杖複製後,貼至您自架組織的「計費同步」設定當中。" @@ -6957,7 +6957,7 @@ "message": "您的計費同步權杖可以讀取及編輯此組織的訂閱設定。" }, "manageBillingTokenSync": { - "message": "Manage Billing Token" + "message": "管理帳單權杖" }, "setUpBillingSync": { "message": "設定計費同步" @@ -7023,7 +7023,7 @@ "message": "計費同步權杖" }, "automaticBillingSyncDesc": { - "message": "Automatic sync unlocks Families sponsorships and allows you to sync your license without uploading a file. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "自動同步可解鎖家庭贊助,並允許您在不上傳檔案的情況下同步授權。在 Bitwarden 雲端伺服器更新後,請選擇「同步授權」以套用更改。" }, "active": { "message": "生效中" @@ -7093,7 +7093,7 @@ "message": "若 Entity ID 非 URL,則必須填入。" }, "offerNoLongerValid": { - "message": "This offer is no longer valid. Contact your organization administrators for more information." + "message": "此優惠已不再有效。請聯絡您的組織" }, "openIdOptionalCustomizations": { "message": "自訂(選填)" @@ -7123,7 +7123,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫(包含附件)。組織密碼庫的項目不包含在內。", "placeholders": { "email": { "content": "$1", @@ -7141,7 +7141,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織密碼庫。", "placeholders": { "organization": { "content": "$1", @@ -7150,7 +7150,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "只會匯出與 $ORGANIZATION$ 相關的組織密碼庫,「我的項目」集合將不會包含在內。", "placeholders": { "organization": { "content": "$1", @@ -7203,25 +7203,25 @@ "message": "產生使用者名稱" }, "generateEmail": { - "message": "Generate email" + "message": "生成電子郵件" }, "generatePassword": { "message": "產生密碼" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "產生密碼短語" }, "passwordGenerated": { - "message": "Password generated" + "message": "已產生密碼" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "已產生密碼" }, "usernameGenerated": { "message": "已產生使用者名稱" }, "emailGenerated": { - "message": "Email generated" + "message": "已產生電子郵件" }, "spinboxBoundariesHint": { "message": "值必須介於 $MIN$ 及 $MAX$。", @@ -7238,7 +7238,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " 使用 $RECOMMENDED$ 或更多個字元產生更強的密碼。", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -7248,7 +7248,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " 使用 $RECOMMENDED$ 或更多個單字產生強的密碼短語。", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -7271,7 +7271,7 @@ "message": "使用您的網域設定的 Catch-all 收件匣。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此電子郵件" }, "random": { "message": "隨機", @@ -7281,26 +7281,26 @@ "message": "隨機單字" }, "usernameGenerator": { - "message": "Username generator" + "message": "使用者名稱產生器" }, "useThisPassword": { "message": "使用此密碼" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "使用此密碼" }, "useThisUsername": { "message": "使用此使用者名稱" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "已產生安全的密碼!請不要忘記同時更新您網站上的密碼。" }, "useGeneratorHelpTextPartOne": { "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'" }, "service": { @@ -7310,13 +7310,13 @@ "message": "未知的項目,您可能需要要求權限才能存取此項目。" }, "unknownSecret": { - "message": "Unknown secret, you may need to request permission to access this secret." + "message": "未知憑證,您可能需要請求存取權限。" }, "unknownServiceAccount": { - "message": "Unknown machine account, you may need to request permission to access this machine account." + "message": "未知機器帳號,您可能需要請求存取權限。" }, "unknownProject": { - "message": "Unknown project, you may need to request permission to access this project." + "message": "未知專案,您可能需要請求存取權限。" }, "cannotSponsorSelf": { "message": "您無法為已經啟用的帳戶兌換。請輸入其他信箱。" @@ -7379,7 +7379,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "選擇一個所選服務支援的網域", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -7411,7 +7411,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "無效的 $SERVICENAME$ API 權杖", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -7421,7 +7421,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "無效的 $SERVICENAME$ API 權杖:$ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -7435,7 +7435,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ 拒絕了你的請求。請聯絡你的服務提供者以取得協助。", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -7445,7 +7445,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ 拒絕了你的請求:$ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -7459,7 +7459,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "無法獲得 $SERVICENAME$ 的轉送電子郵件帳號。", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -7489,7 +7489,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "發生未知的 $SERVICENAME$ 錯誤。", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -7499,7 +7499,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "未知的轉送服務提供商:$SERVICENAME$。", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -7545,7 +7545,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations", + "message": "透過 SCIM 自動提供使用者與群組給您偏好的身份提供者。查看支援的整合", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { @@ -7667,10 +7667,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "您需注意上方的 1 個欄位。" }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "您需注意上方的 $COUNT$ 個欄位。", "placeholders": { "count": { "content": "$1", @@ -7679,19 +7679,19 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "連接到 Duo 服務時發生錯誤。使用不同的兩階段認證或聯繫 Duo 來獲得支援。" }, "duoRequiredByOrgForAccount": { - "message": "Duo two-step login is required for your account." + "message": "您的帳號要求使用 Duo 兩步驟驗證登入。" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "您的帳號需要使用 Duo 兩步驟登入。請依照以下步驟完成登入。" }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "請依照以下步驟完成登入" }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "請依照以下步驟使用你的安全金鑰完成登入。" }, "launchDuo": { "message": "啟動 Duo" @@ -7706,7 +7706,7 @@ "message": "關閉" }, "connected": { - "message": "Connected" + "message": "已連線" }, "members": { "message": "成員" @@ -8020,7 +8020,7 @@ "description": "Notifies that a service account has been updated" }, "typeOrSelectProjects": { - "message": "Type or select projects", + "message": "輸入或選擇項目", "description": "Instructions for selecting projects for a service account" }, "newSaTypeToFilter": { @@ -8107,7 +8107,7 @@ "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token", + "message": "建立存取權杖", "description": "Button label for creating a new access token." }, "expires": { @@ -8206,7 +8206,7 @@ "message": "將成員加入到此群組,即可授予他們對不同分類的存取權限。" }, "restrictedCollectionAssignmentDesc": { - "message": "You can only assign collections you manage." + "message": "您只能指派您管理的集合。" }, "selectMembers": { "message": "選擇成員" @@ -8317,7 +8317,7 @@ } }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verification required for this action. Set a PIN to continue." + "message": "此操作需要驗證。設定 PIN 碼以繼續。" }, "setPin": { "message": "設定 PIN 碼" @@ -8344,7 +8344,7 @@ "message": "使用生物辨識" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "輸入傳送到你的電子郵件的驗證碼。" }, "resendCode": { "message": "重新傳送驗證碼" @@ -8362,7 +8362,7 @@ "message": "選擇群組" }, "userPermissionOverrideHelperDesc": { - "message": "Permissions set for a member will replace permissions set by that member's group." + "message": "為成員設定的權限將取代該成員所在群組設定的權限。" }, "noMembersOrGroupsAdded": { "message": "未新增任何成員或群組" @@ -8377,7 +8377,7 @@ "message": "邀請成員" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "新增贊助" }, "needsConfirmation": { "message": "待確認" @@ -8467,7 +8467,7 @@ "message": "檔案上傳" }, "upload": { - "message": "Upload" + "message": "上傳" }, "acceptedFormats": { "message": "接受的格式:" @@ -8497,7 +8497,7 @@ "message": "手動上傳" }, "manualBillingTokenUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here. This will not automatically unlock Families sponsorships." + "message": "如果您不想選擇帳單同步,請在此手動上傳授權。這將不會自動解鎖家庭贊助。" }, "syncLicense": { "message": "同步授權" @@ -8563,7 +8563,7 @@ "message": "群組/使用者" }, "kdfSettingsChangeLogoutWarning": { - "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." + "message": "繼續操作會登出您所有活動工作階段。您需要重新登入並完成兩步驟登入設定。 我們建議在變更加密設定之前匯出您的密碼庫,以防止資料遺失。" }, "secretsManager": { "message": "機密管理員" @@ -8603,7 +8603,7 @@ "message": "嘗試讀取匯入檔案時發生錯誤" }, "accessedSecretWithId": { - "message": "Accessed a secret with identifier: $SECRET_ID$", + "message": "已存取識別碼為 $SECRET_ID$ 的憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8621,7 +8621,7 @@ } }, "editedSecretWithId": { - "message": "Edited a secret with identifier: $SECRET_ID$", + "message": "已編輯識別碼為 $SECRET_ID$ 的憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8630,7 +8630,7 @@ } }, "deletedSecretWithId": { - "message": "Deleted a secret with identifier: $SECRET_ID$", + "message": "已刪除識別碼為 $SECRET_ID$ 的憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8639,7 +8639,7 @@ } }, "permanentlyDeletedSecretWithId": { - "message": "Permanently deleted a secret with identifier: $SECRET_ID$", + "message": "永久刪除識別碼為 $SECRET_ID$ 的憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8648,7 +8648,7 @@ } }, "restoredSecretWithId": { - "message": "Restored a secret with identifier: $SECRET_ID$", + "message": "還原識別碼為 $SECRET_ID$ 的憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8657,7 +8657,7 @@ } }, "createdSecretWithId": { - "message": "Created a new secret with identifier: $SECRET_ID$", + "message": "建立識別碼為 $SECRET_ID$ 的新憑證", "placeholders": { "secret_id": { "content": "$1", @@ -8666,7 +8666,7 @@ } }, "accessedProjectWithIdentifier": { - "message": "Accessed a project with identifier: $PROJECT_ID$.", + "message": "已存取識別碼為 $PROJECT_ID$ 的專案", "placeholders": { "project_id": { "content": "$1", @@ -8675,7 +8675,7 @@ } }, "nameUnavailableProjectDeleted": { - "message": "Deleted project Id: $PROJECT_ID$", + "message": "刪除專案 ID:$PROJECT_ID$", "placeholders": { "project_id": { "content": "$1", @@ -8684,7 +8684,7 @@ } }, "nameUnavailableSecretDeleted": { - "message": "Deleted secret Id: $SECRET_ID$", + "message": "刪除憑證 ID:$SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8693,7 +8693,7 @@ } }, "nameUnavailableServiceAccountDeleted": { - "message": "Deleted machine account Id: $SERVICE_ACCOUNT_ID$", + "message": "刪除機器帳號 ID:$SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -8702,7 +8702,7 @@ } }, "editedProjectWithId": { - "message": "Edited a project with identifier: $PROJECT_ID$", + "message": "編輯識別碼為 $PROJECT_ID$ 的專案", "placeholders": { "project_id": { "content": "$1", @@ -8711,7 +8711,7 @@ } }, "addedUserToServiceAccountWithId": { - "message": "Added user: $USER_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "將使用者 $USER_ID$ 新增至識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號", "placeholders": { "user_id": { "content": "$1", @@ -8724,7 +8724,7 @@ } }, "removedUserToServiceAccountWithId": { - "message": "Removed user: $USER_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "將使用者 $USER_ID$ 從識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號移除", "placeholders": { "user_id": { "content": "$1", @@ -8737,7 +8737,7 @@ } }, "removedGroupFromServiceAccountWithId": { - "message": "Removed group: $GROUP_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "將群組 $GROUP_ID$ 從識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號移除", "placeholders": { "group_id": { "content": "$1", @@ -8750,7 +8750,7 @@ } }, "serviceAccountCreatedWithId": { - "message": "Created machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "建立識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號", "placeholders": { "service_account_id": { "content": "$1", @@ -8759,7 +8759,7 @@ } }, "addedGroupToServiceAccountId": { - "message": "Added group: $GROUP_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "將群組 $GROUP_ID$ 新增至識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號", "placeholders": { "group_id": { "content": "$1", @@ -8772,7 +8772,7 @@ } }, "serviceAccountDeletedWithId": { - "message": "Deleted machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "刪除識別碼為 $SERVICE_ACCOUNT_ID$ 的機器帳號", "placeholders": { "service_account_id": { "content": "$1", @@ -8781,7 +8781,7 @@ } }, "deletedProjectWithId": { - "message": "Deleted a project with identifier: $PROJECT_ID$", + "message": "刪除識別碼為 $PROJECT_ID$ 的專案", "placeholders": { "project_id": { "content": "$1", @@ -8790,7 +8790,7 @@ } }, "createdProjectWithId": { - "message": "Created a new project with identifier: $PROJECT_ID$", + "message": "建立識別碼為 $PROJECT_ID$ 的新專案", "placeholders": { "project_id": { "content": "$1", @@ -8947,16 +8947,16 @@ "message": "登入已啟動" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "記住此裝置來讓未來的登入體驗更簡易" }, "deviceApprovalRequired": { "message": "裝置需要取得核准。請在下面選擇一個核准選項:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "需要核准裝置" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "選擇下面的一個核准選項" }, "rememberThisDevice": { "message": "記住這個裝置" @@ -8971,10 +8971,10 @@ "message": "要求管理員核准" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "無法完成登入" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "你需要在受信任的裝置上登入,或請管理員為你指派密碼。" }, "trustedDeviceEncryption": { "message": "可信任的裝置加密" @@ -8983,11 +8983,11 @@ "message": "可信任的裝置" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "成員在使用 SSO 登入時不需要主密碼。主密碼將由儲存在裝置上的加密金鑰取代,使該裝置成為受信任裝置。成員建立帳號並首次登入的裝置將被視為受信任。新裝置需要經由現有受信任裝置或管理員批准。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "單一組織", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { @@ -9003,11 +9003,11 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "帳號復原管理", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "使用此選項時,政策將會啟用。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -9019,7 +9019,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "$TOTAL$ 不足", "placeholders": { "total": { "content": "$1", @@ -9086,16 +9086,16 @@ "message": "核准要求" }, "deviceApproved": { - "message": "Device approved" + "message": "裝置核准" }, "deviceRemoved": { - "message": "Device removed" + "message": "裝置移除" }, "removeDevice": { - "message": "Remove device" + "message": "移除設備" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "是否要移除這個裝置?" }, "noDeviceRequests": { "message": "沒有裝置要求" @@ -9152,7 +9152,7 @@ "message": "要求了裝置核准。" }, "tdeOffboardingPasswordSet": { - "message": "User set a master password during TDE offboarding." + "message": "使用者在 TDE 離職流程中設定了主密碼。" }, "startYour7DayFreeTrialOfBitwardenFor": { "message": "為 $ORG$ 開始您的 Bitwarden 7 天免費試用", @@ -9164,7 +9164,7 @@ } }, "startYour7DayFreeTrialOfBitwardenSecretsManagerFor": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for $ORG$", + "message": "為 $ORG$ 開始您的 Bitwarden 機密管理 7 天免費試用", "placeholders": { "org": { "content": "$1", @@ -9200,7 +9200,7 @@ "message": "缺少使用者電子郵件地址" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "未找到使用中帳號的電子郵件。正在將您登出。" }, "deviceTrusted": { "message": "裝置已信任" @@ -9287,23 +9287,23 @@ "message": "分類管理" }, "collectionManagementDescription": { - "message": "Configure the collection behavior for the organization" + "message": "設定組織的集合行為" }, "allowAdminAccessToAllCollectionItemsDescription": { - "message": "Allow owners and admins to manage all collections and items from the Admin Console" + "message": "允許擁有者和管理員從管理控制台管理所有集合與項目" }, "restrictCollectionCreationDescription": { - "message": "Restrict collection creation to owners and admins" + "message": "限制集合建立權限僅限擁有者和管理員" }, "restrictCollectionDeletionDescription": { - "message": "Restrict collection deletion to owners and admins" + "message": "限制集合刪除權限僅限擁有者和管理員" }, "restrictItemDeletionDescriptionStart": { - "message": "Restrict item deletion to members with the ", + "message": "限制項目刪除權限僅限擁有特定權限的成員", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "restrictItemDeletionDescriptionEnd": { - "message": " permission", + "message": "權限", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "updatedCollectionManagement": { @@ -9383,7 +9383,7 @@ } }, "limitCollectionCreationEnabled": { - "message": "Turned on Restrict collection creation setting $ID$.", + "message": "啟用「限制集合建立」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9392,7 +9392,7 @@ } }, "limitCollectionCreationDisabled": { - "message": "Turned off Restrict collection creation setting $ID$.", + "message": "關閉「限制集合建立」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9401,7 +9401,7 @@ } }, "limitCollectionDeletionEnabled": { - "message": "Turned on Restrict collection deletion setting $ID$.", + "message": "啟用「限制集合刪除」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9410,7 +9410,7 @@ } }, "limitCollectionDeletionDisabled": { - "message": "Turned off Restrict collection deletion setting $ID$.", + "message": "關閉「限制集合刪除」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9419,7 +9419,7 @@ } }, "limitItemDeletionEnabled": { - "message": "Turned on Restrict item deletion setting $ID$.", + "message": "啟用「限制項目刪除」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9428,7 +9428,7 @@ } }, "limitItemDeletionDisabled": { - "message": "Turned off Restrict item deletion setting $ID$.", + "message": "關閉「限制項目刪除」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9437,7 +9437,7 @@ } }, "allowAdminAccessToAllCollectionItemsEnabled": { - "message": "Turned on Allow owners and admins to manage all collections and items setting $ID$.", + "message": "啟用「允許擁有者和管理員管理所有集合與項目」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9446,7 +9446,7 @@ } }, "allowAdminAccessToAllCollectionItemsDisabled": { - "message": "Turned off Allow owners and admins to manage all collections and items setting $ID$.", + "message": "關閉「允許擁有者和管理員管理所有集合與項目」設定 $ID$", "placeholders": { "id": { "content": "$1", @@ -9462,7 +9462,7 @@ "message": "安裝瀏覽器擴充套件" }, "installBrowserExtensionDetails": { - "message": "Use the extension to quickly save logins and auto-fill forms without opening the web app." + "message": "使用擴充功能可快速儲存登入資料並自動填入表單,無需開啟網頁應用程式。" }, "projectAccessUpdated": { "message": "專案存取權限已更新" @@ -9483,22 +9483,22 @@ "message": "有限的分類的存取權限" }, "readOnlyCollectionAccess": { - "message": "You do not have access to manage this collection." + "message": "您無權管理此集合。" }, "grantManageCollectionWarningTitle": { - "message": "Missing Manage Collection Permissions" + "message": "缺少「管理集合」權限" }, "grantManageCollectionWarning": { - "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." + "message": "授予「管理集合」權限以允許完整的集合管理,包括刪除集合。" }, "grantCollectionAccess": { - "message": "Grant groups or members access to this collection." + "message": "授予群組或成員存取此集合的權限。" }, "grantCollectionAccessMembersOnly": { - "message": "Grant members access to this collection." + "message": "授予成員存取此集合的權限。" }, "adminCollectionAccess": { - "message": "Administrators can access and manage collections." + "message": "管理員可以存取並管理集合。" }, "serviceAccountAccessUpdated": { "message": "Service account access updated" @@ -9508,31 +9508,31 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "URI 匹配偵測是 Bitwarden 用來識別自動填入建議的方式。", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "「正則表達式」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "「開頭為」是進階選項,可能會增加憑證外洩的風險。", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "深入了解匹配偵測", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "進階選項", "description": "Advanced option placeholder for uri option component" }, "warningCapitalized": { - "message": "Warning", + "message": "警告", "description": "Warning (should maintain locale-relevant capitalization)" }, "maintainYourSubscription": { - "message": "To maintain your subscription for $ORG$, ", + "message": "為了維持您在 $ORG$ 的訂閱, ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method.'", "placeholders": { "org": { @@ -9549,16 +9549,16 @@ "message": "組織資訊" }, "confirmationDetails": { - "message": "Confirmation details" + "message": "確認詳情" }, "smFreeTrialThankYou": { - "message": "Thank you for signing up for Bitwarden Secrets Manager!" + "message": "感謝您註冊 Bitwarden Secrets Manager!" }, "smFreeTrialConfirmationEmail": { "message": "我們已向你的電子郵件地址傳送了一封確認電子郵件" }, "sorryToSeeYouGo": { - "message": "Sorry to see you go! Help improve Bitwarden by sharing why you're canceling.", + "message": "很遺憾您要離開!請透過分享取消原因來協助改善 Bitwarden。", "description": "A message shown to users as part of an offboarding survey asking them to provide more information on their subscription cancelation." }, "selectCancellationReason": { @@ -9566,7 +9566,7 @@ "description": "Used as a form field label for a select input on the offboarding survey." }, "anyOtherFeedback": { - "message": "Is there any other feedback you'd like to share?", + "message": "您還有其他想提供的意見嗎?", "description": "Used as a form field label for a textarea input on the offboarding survey." }, "missingFeatures": { @@ -9593,7 +9593,7 @@ "message": "免費 1 年" }, "newWebApp": { - "message": "Welcome to the new and improved web app. Learn more about what’s changed." + "message": "歡迎使用全新改良的網頁應用程式。瞭解更多變更內容。" }, "releaseBlog": { "message": "閱讀發佈部落格" @@ -9611,37 +9611,37 @@ "message": "你無法將自己新增至群組。" }, "cannotAddYourselfToCollections": { - "message": "You cannot add yourself to collections." + "message": "您無法將自己加入集合。" }, "assign": { "message": "指派" }, "assignTasks": { - "message": "Assign tasks" + "message": "指派任務" }, "assignToCollections": { - "message": "Assign to collections" + "message": "指派至集合" }, "assignToTheseCollections": { - "message": "Assign to these collections" + "message": "指派至這些集合" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "只有可以檢視集合的組織成員才能看到其中的項目。" }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "只有可以檢視集合的組織成員才能看到其中的項目。" }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "選擇要指派的集合" }, "noCollectionsAssigned": { - "message": "No collections have been assigned" + "message": "尚未指派任何集合" }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "指派集合成功" }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "您已經選擇 $TOTAL_COUNT$ 個項目。由於您沒有編輯權限,無法更新其中的 $READONLY_COUNT$ 個項目。", "placeholders": { "total_count": { "content": "$1", @@ -9663,7 +9663,7 @@ "message": "項目" }, "assignedSeats": { - "message": "Assigned seats" + "message": "指定席位" }, "assigned": { "message": "已指派" @@ -9678,37 +9678,37 @@ "message": "取消連結組織" }, "manageSeats": { - "message": "MANAGE SEATS" + "message": "管理座位" }, "manageSeatsDescription": { - "message": "Adjustments to seats will be reflected in the next billing cycle." + "message": "席次調整將反映於下一個帳單週期。" }, "unassignedSeatsDescription": { "message": "未分配的訂閱席位" }, "purchaseSeatDescription": { - "message": "Additional seats purchased" + "message": "已購買額外席次" }, "assignedSeatCannotUpdate": { - "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + "message": "無法更新已指派的席次。請聯絡你們組織的擁有者以取得協助。" }, "subscriptionUpdateFailed": { - "message": "Subscription update failed" + "message": "訂閱更新失敗" }, "trial": { "message": "試用", "description": "A subscription status label." }, "pastDue": { - "message": "Past due", + "message": "逾期", "description": "A subscription status label" }, "subscriptionExpired": { - "message": "Subscription expired", + "message": "訂購授權逾期", "description": "The date header used when a subscription is past due." }, "pastDueWarningForChargeAutomatically": { - "message": "You have a grace period of $DAYS$ days from your subscription expiration date to maintain your subscription. Please resolve the past due invoices by $SUSPENSION_DATE$.", + "message": "自訂閱到期日起,你有 $DAYS$ 天的寬限期可維持訂閱。請於 $SUSPENSION_DATE$ 前結清逾期發票。", "placeholders": { "days": { "content": "$1", @@ -9722,7 +9722,7 @@ "description": "A warning shown to the user when their subscription is past due and they are charged automatically." }, "pastDueWarningForSendInvoice": { - "message": "You have a grace period of $DAYS$ days from the date your first unpaid invoice is due to maintain your subscription. Please resolve the past due invoices by $SUSPENSION_DATE$.", + "message": "自第一張未付款發票的到期日起,你有 $DAYS$ 天的寬限期可維持訂閱。請於 $SUSPENSION_DATE$ 前結清逾期發票。", "placeholders": { "days": { "content": "$1", @@ -9736,11 +9736,11 @@ "description": "A warning shown to the user when their subscription is past due and they pay via invoice." }, "unpaidInvoice": { - "message": "Unpaid invoice", + "message": "未付賬單", "description": "The header of a warning box shown to a user whose subscription is unpaid." }, "toReactivateYourSubscription": { - "message": "To reactivate your subscription, please resolve the past due invoices.", + "message": "若要重新啟用你的訂閱,請結清逾期發票。", "description": "The body of a warning box shown to a user whose subscription is unpaid." }, "cancellationDate": { @@ -9748,7 +9748,7 @@ "description": "The date header used when a subscription is cancelled." }, "machineAccountsCannotCreate": { - "message": "Machine accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." + "message": "無法在已停用的組織中建立機器帳號。請聯絡你們組織的擁有者以取得協助。" }, "machineAccount": { "message": "機器帳戶", @@ -9759,11 +9759,11 @@ "description": "The title for the section that deals with machine accounts." }, "newMachineAccount": { - "message": "新增機器賬戶", + "message": "新增機器帳號", "description": "Title for creating a new machine account." }, "machineAccountsNoItemsMessage": { - "message": "Create a new machine account to get started automating secret access.", + "message": "建立新的機器帳號,以開始自動化機密的存取。", "description": "Message to encourage the user to start creating machine accounts." }, "machineAccountsNoItemsTitle": { @@ -9779,11 +9779,11 @@ "description": "Title for the action to delete a single machine account." }, "viewMachineAccount": { - "message": "檢視機器賬戶", + "message": "檢視機器帳號", "description": "Action to view the details of a machine account." }, "deleteMachineAccountDialogMessage": { - "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "message": "刪除機器帳號 $MACHINE_ACCOUNT$ 為永久動作且無法復原。", "placeholders": { "machine_account": { "content": "$1", @@ -9792,10 +9792,10 @@ } }, "deleteMachineAccountsDialogMessage": { - "message": "Deleting machine accounts is permanent and irreversible." + "message": "刪除機器帳號為永久動作且無法復原。" }, "deleteMachineAccountsConfirmMessage": { - "message": "刪除 $COUNT$ 個機器賬戶", + "message": "刪除 $COUNT$ 個機器帳號", "placeholders": { "count": { "content": "$1", @@ -9814,50 +9814,50 @@ "description": "Placeholder text for searching machine accounts." }, "editMachineAccount": { - "message": "編輯機器賬戶", + "message": "編輯機器帳號", "description": "Title for editing a machine account." }, "machineAccountName": { - "message": "機器賬戶名稱", + "message": "機器帳號名稱", "description": "Label for the name of a machine account" }, "machineAccountCreated": { - "message": "機器賬戶已建立", + "message": "機器帳號已建立", "description": "Notifies that a new machine account has been created" }, "machineAccountUpdated": { - "message": "機器賬戶已更新", + "message": "機器帳號已更新", "description": "Notifies that a machine account has been updated" }, "projectMachineAccountsDescription": { - "message": "Grant machine accounts access to this project." + "message": "授予機器帳號存取此專案的權限。" }, "projectMachineAccountsSelectHint": { - "message": "Type or select machine accounts" + "message": "輸入或選取機器帳號" }, "projectEmptyMachineAccountAccessPolicies": { - "message": "Add machine accounts to grant access" + "message": "新增機器帳號以授予存取權" }, "machineAccountPeopleDescription": { - "message": "Grant groups or people access to this machine account." + "message": "授予群組或人員存取此機器帳號的權限。" }, "machineAccountProjectsDescription": { - "message": "Assign projects to this machine account. " + "message": "將專案指派給此機器帳號。" }, "createMachineAccount": { - "message": "建立機器賬戶" + "message": "建立機器帳號" }, "maPeopleWarningMessage": { - "message": "Removing people from a machine account does not remove the access tokens they created. For security best practice, it is recommended to revoke access tokens created by people removed from a machine account." + "message": "從機器帳號移除人員不會一併移除其建立的存取權杖。基於安全性最佳實務,建議撤銷已被移除人員所建立的存取權杖。" }, "smAccessRemovalWarningMaTitle": { - "message": "移除對此機器賬戶的存取權限" + "message": "移除對此機器帳號的存取權限" }, "smAccessRemovalWarningMaMessage": { - "message": "此動作將移除您對此機器賬戶的存取權限" + "message": "此動作將移除您對此機器帳號的存取權限。" }, "machineAccountsIncluded": { - "message": "$COUNT$ machine accounts included", + "message": "已包含 $COUNT$ 個機器帳號", "placeholders": { "count": { "content": "$1", @@ -9866,7 +9866,7 @@ } }, "additionalMachineAccountCost": { - "message": "$COST$ per month for additional machine accounts", + "message": "每月 $COST$ 可新增機器帳號", "placeholders": { "cost": { "content": "$1", @@ -9875,10 +9875,10 @@ } }, "additionalMachineAccounts": { - "message": "Additional machine accounts" + "message": "額外機器帳號" }, "includedMachineAccounts": { - "message": "Your plan comes with $COUNT$ machine accounts.", + "message": "你的方案包含 $COUNT$ 個機器帳號。", "placeholders": { "count": { "content": "$1", @@ -9887,7 +9887,7 @@ } }, "addAdditionalMachineAccounts": { - "message": "You can add additional machine accounts for $COST$ per month.", + "message": "你可以每月 $COST$ 新增機器帳號。", "placeholders": { "cost": { "content": "$1", @@ -9896,22 +9896,22 @@ } }, "limitMachineAccounts": { - "message": "Limit machine accounts (optional)" + "message": "限制機器帳號數量(選填)" }, "limitMachineAccountsDesc": { - "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + "message": "為機器帳號設定上限。達到上限後,你將無法再建立新的機器帳號。" }, "machineAccountLimit": { - "message": "Machine account limit (optional)" + "message": "機器帳號上限(選填)" }, "maxMachineAccountCost": { - "message": "Max potential machine account cost" + "message": "機器帳號的最高潛在費用" }, "machineAccountAccessUpdated": { - "message": "機器賬戶存取權限已更新" + "message": "機器帳號存取權限已更新" }, "restrictedGroupAccessDesc": { - "message": "You cannot add yourself to a group." + "message": "你無法將自己新增至群組。" }, "deleteProvider": { "message": "刪除提供者" @@ -9929,7 +9929,7 @@ } }, "deleteProviderWarningDescription": { - "message": "You must unlink all clients before you can delete $ID$.", + "message": "在刪除 $ID$ 之前,必須先取消連結所有用戶端。", "placeholders": { "id": { "content": "$1", @@ -9941,19 +9941,19 @@ "message": "提供者已刪除" }, "providerDeletedDesc": { - "message": "The Provider and all associated data has been deleted." + "message": "已刪除該供應商及其所有相關資料。" }, "deleteProviderRecoverConfirmDesc": { - "message": "You have requested to delete this Provider. Use the button below to confirm." + "message": "你已提出刪除此供應商的要求。請使用下方按鈕確認。" }, "deleteProviderWarning": { - "message": "Deleting your provider is permanent. It cannot be undone." + "message": "刪除你的供應商為永久動作,無法復原。" }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "指定目標集合時發生錯誤。" }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "指定目標資料夾時發生錯誤。" }, "integrationsAndSdks": { "message": "整合和軟體開發工具包", @@ -9963,7 +9963,7 @@ "message": "整合" }, "integrationsDesc": { - "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service." + "message": "自動將 Bitwarden 機密管理中的機密同步到第三方服務。" }, "sdks": { "message": "軟體開發工具包" @@ -9972,77 +9972,77 @@ "message": "使用 Bitwarden 機密管理軟體開發工具包於下列程式語言來建立你自己的應用程式。" }, "ssoDescStart": { - "message": "Configure", + "message": "設定", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "for Bitwarden using the implementation guide for your Identity Provider.", + "message": "於 Bitwarden,並依你的身分識別提供者的實作指南進行設定。", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { - "message": "User provisioning" + "message": "使用者佈建" }, "scimIntegration": { "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "已設定", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", + "message": "(跨網域身分識別管理系統,SCIM),並依你的身分識別提供者的實作指南,自動將使用者與群組佈建到 Bitwarden。", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { - "message": "Bitwarden Directory Connector" + "message": "Bitwarden 目錄連接器" }, "bwdcDesc": { - "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." + "message": "依你的身分識別提供者的實作指南,設定 Bitwarden 目錄連接器以自動佈建使用者與群組。" }, "eventManagement": { - "message": "Event management" + "message": "事件管理" }, "eventManagementDesc": { - "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." + "message": "依你的平台實作指南,將 Bitwarden 的事件記錄整合至你的 SIEM(安全資訊與事件管理)系統。" }, "deviceManagement": { - "message": "Device management" + "message": "裝置管理" }, "deviceManagementDesc": { - "message": "Configure device management for Bitwarden using the implementation guide for your platform." + "message": "依你的平台實作指南,為 Bitwarden 設定裝置管理。" }, "crowdstrikeEventIntegrationDesc": { - "message": "Send event data to your Logscale instance" + "message": "將事件資料傳送至你的 Logscale 執行個體" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "將密碼庫事件資料傳送至你的 Datadog 執行個體" }, "failedToSaveIntegration": { - "message": "Failed to save integration. Please try again later." + "message": "整合設定儲存失敗。請稍後再試。" }, "mustBeOrgOwnerToPerformAction": { - "message": "You must be the organization owner to perform this action." + "message": "必須是組織擁有者才能執行此動作。" }, "failedToDeleteIntegration": { - "message": "Failed to delete integration. Please try again later." + "message": "刪除整合失敗。請稍後再試。" }, "deviceIdMissing": { - "message": "Device ID is missing" + "message": "缺少裝置 ID" }, "deviceTypeMissing": { - "message": "Device type is missing" + "message": "缺少裝置類型" }, "deviceCreationDateMissing": { - "message": "Device creation date is missing" + "message": "缺少裝置建立日期" }, "desktopRequired": { - "message": "Desktop required" + "message": "需要桌面版" }, "reopenLinkOnDesktop": { - "message": "Reopen this link from your email on a desktop." + "message": "請在桌面裝置上重新開啟您電子郵件中的此連結。" }, "connectIntegrationButtonDesc": { - "message": "Connect $INTEGRATION$", + "message": "連接 $INTEGRATION$", "placeholders": { "integration": { "content": "$1", @@ -10051,7 +10051,7 @@ } }, "updateIntegrationButtonDesc": { - "message": "Update $INTEGRATION$", + "message": "更新 $INTEGRATION$", "placeholders": { "integration": { "content": "$1", @@ -10060,7 +10060,7 @@ } }, "integrationCardTooltip": { - "message": "Launch $INTEGRATION$ implementation guide.", + "message": "啟動 $INTEGRATION$ 實作指南。", "placeholders": { "integration": { "content": "$1", @@ -10087,7 +10087,7 @@ } }, "integrationCardAriaLabel": { - "message": "open $INTEGRATION$ implementation guide in a new tab.", + "message": "在新分頁中開啟 $INTEGRATION$ 實作指南。", "placeholders": { "integration": { "content": "$1", @@ -10105,7 +10105,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "set up $INTEGRATION$ implementation guide in a new tab.", + "message": "在新分頁中設定 $INTEGRATION$ 實作指南。", "placeholders": { "integration": { "content": "$1", @@ -10114,19 +10114,19 @@ } }, "createNewClientToManageAsProvider": { - "message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle." + "message": "建立新的客戶組織以作為提供者管理。額外座位將在下一個帳單週期反映。" }, "url": { "message": "URL" }, "bearerToken": { - "message": "Bearer Token" + "message": "Bearer 權杖" }, "repositoryNameHint": { - "message": "Name of the repository to ingest into" + "message": "要匯入的儲存庫名稱" }, "index": { - "message": "Index" + "message": "索引" }, "selectAPlan": { "message": "選擇一個計劃" @@ -10135,10 +10135,10 @@ "message": "35% 折扣" }, "monthPerMember": { - "message": "month per member" + "message": "每位成員每月" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "每位成員每月(按年計費)" }, "seats": { "message": "席位" @@ -10147,13 +10147,13 @@ "message": "新增組織" }, "createdNewClient": { - "message": "Successfully created new client" + "message": "成功建立新客戶" }, "noAccess": { "message": "無存取權限" }, "collectionAdminConsoleManaged": { - "message": "This collection is only accessible from the admin console" + "message": "此集合僅能從管理控制台存取" }, "organizationOptionsMenu": { "message": "切換組織選單" @@ -10168,31 +10168,31 @@ "message": "從提供者入口網站管理計費" }, "continueSettingUp": { - "message": "Continue setting up Bitwarden" + "message": "繼續設定 Bitwarden" }, "continueSettingUpFreeTrial": { "message": "繼續設定您的 Bitwarden 免費試用" }, "continueSettingUpPasswordManager": { - "message": "Continue setting up Bitwarden Password Manager" + "message": "繼續設定您的 Bitwarden 密碼管理器" }, "continueSettingUpFreeTrialPasswordManager": { "message": "繼續設定您的 Bitwarden 密碼管理器免費試用" }, "continueSettingUpSecretsManager": { - "message": "Continue setting up Bitwarden Secrets Manager" + "message": "繼續設定您的 Bitwarden 機密管理免費試用" }, "continueSettingUpFreeTrialSecretsManager": { "message": "繼續設定您的 Bitwarden 機密管理免費試用" }, "enterTeamsOrgInfo": { - "message": "Enter your Teams organization information" + "message": "輸入您的團隊組織資訊" }, "enterFamiliesOrgInfo": { - "message": "Enter your Families organization information" + "message": "輸入您的家庭組織資訊" }, "enterEnterpriseOrgInfo": { - "message": "Enter your Enterprise organization information" + "message": "輸入您的企業組織資訊" }, "viewItemsIn": { "message": "檢視項目位於 $NAME$", @@ -10247,10 +10247,10 @@ "message": "代管服務供應商" }, "managedServiceProvider": { - "message": "Managed service provider" + "message": "代管服務供應商" }, "multiOrganizationEnterprise": { - "message": "Multi-organization enterprise" + "message": "多組織企業" }, "orgSeats": { "message": "組織席位" @@ -10274,7 +10274,7 @@ "message": "透過監控報告以彌補安全漏洞" }, "upgradeOrganizationCloseSecurityGapsDesc": { - "message": "Stay ahead of security vulnerabilities by upgrading to a paid plan for enhanced monitoring." + "message": "透過升級至付費方案以增強監控,搶先防範安全漏洞。" }, "approveAllRequests": { "message": "核准所有請求" @@ -10292,16 +10292,16 @@ "message": "已更新稅務資訊" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "無效的稅號,如果您認為這是錯誤,請聯絡支援。" }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "我們無法驗證您的稅號,如果您認為這是錯誤,請聯絡支援。" }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "無效的稅號,如果您認為這是錯誤,請聯絡支援。" }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "預覽發票時發生錯誤。請稍後再試。" }, "unverified": { "message": "未驗證" @@ -10313,17 +10313,17 @@ "message": "檢視秘密" }, "noClients": { - "message": "There are no clients to list" + "message": "沒有可列出的客戶" }, "providerBillingEmailHint": { - "message": "This email address will receive all invoices pertaining to this provider", + "message": "此電子郵件地址將接收所有與此提供者相關的發票", "description": "A hint that shows up on the Provider setup page to inform the admin the billing email will receive the provider's invoices." }, "upgradeOrganizationEnterprise": { - "message": "Identify security risks by auditing member access" + "message": "透過審核成員存取權來識別安全風險" }, "onlyAvailableForEnterpriseOrganization": { - "message": "Quickly view member access across the organization by upgrading to an Enterprise plan." + "message": "升級至企業方案,可快速檢視組織內的成員存取情況。" }, "date": { "message": "日期" @@ -10335,46 +10335,46 @@ "message": "成員存取" }, "memberAccessReportDesc": { - "message": "Ensure members have access to the right credentials and their accounts are secure. Use this report to obtain a CSV of member access and account configurations." + "message": "確保成員存取正確的憑證並保護其帳號安全。使用此報告可取得成員存取權及帳號設定的 CSV 檔。" }, "memberAccessReportPageDesc": { - "message": "Audit organization member access across groups, collections, and collection items. The CSV export provides a detailed breakdown per member, including information on collection permissions and account configurations." + "message": "審核組織成員在群組、集合及集合項目中的存取權。CSV 匯出將提供每位成員的詳細分析,包括集合權限及帳號設定資訊。" }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(無集合)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(無集合權限)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(無群組)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "開啟" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "關閉" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "開啟" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "關閉" }, "higherKDFIterations": { - "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." + "message": "更高的 KDF 疊代次數、記憶體占用與平行數量可以避免您的主密碼遭到攻擊者的暴力破解。" }, "incrementsOf100,000": { - "message": "increments of 100,000" + "message": "以 100,000 為增量" }, "smallIncrements": { - "message": "small increments" + "message": "小幅增量" }, "kdfIterationRecommends": { - "message": "We recommend 600,000 or more" + "message": "我們建議使用 600,000 或以上" }, "kdfToHighWarningIncreaseInIncrements": { - "message": "For older devices, setting your KDF too high may lead to performance issues. Increase the value in $VALUE$ and test your devices.", + "message": "對於較舊的裝置,將 KDF 設定過高可能導致效能問題。請在 $VALUE$ 中增加數值並測試您的裝置。", "placeholders": { "value": { "content": "$1", @@ -10383,31 +10383,31 @@ } }, "providerReinstate": { - "message": " Contact Customer Support to reinstate your subscription." + "message": "請聯絡客服以恢復您的訂閱。" }, "secretPeopleDescription": { - "message": "Grant groups or people access to this secret. Permissions set for people will override permissions set by groups." + "message": "授予群組或人員對此憑證的存取權。對人員設定的權限將覆蓋群組設定的權限。" }, "secretPeopleEmptyMessage": { - "message": "Add people or groups to share access to this secret" + "message": "新增人員或群組以分享此憑證的存取權" }, "secretMachineAccountsDescription": { - "message": "Grant machine accounts access to this secret." + "message": "授予機器帳號對此憑證的存取權。" }, "secretMachineAccountsEmptyMessage": { - "message": "Add machine accounts to grant access to this secret" + "message": "新增機器帳號以授予對此憑證的存取權" }, "smAccessRemovalWarningSecretTitle": { - "message": "Remove access to this secret" + "message": "移除對此憑證的存取權" }, "smAccessRemovalSecretMessage": { - "message": "This action will remove your access to this secret." + "message": "此操作將移除您對此憑證的存取權。" }, "invoice": { - "message": "Invoice" + "message": "發票" }, "unassignedSeatsAvailable": { - "message": "You have $SEATS$ unassigned seats available.", + "message": "您有 $SEATS$ 個未指派的座位可用。", "placeholders": { "seats": { "content": "$1", @@ -10417,49 +10417,49 @@ "description": "A message showing how many unassigned seats are available for a provider." }, "contactYourProviderForAdditionalSeats": { - "message": "Contact your provider admin to purchase additional seats." + "message": "請聯絡您的提供者管理員以購買額外座位。" }, "open": { - "message": "Open", + "message": "開啟", "description": "The status of an invoice." }, "uncollectible": { - "message": "Uncollectible", + "message": "無法收集", "description": "The status of an invoice." }, "clientDetails": { - "message": "Client details" + "message": "客戶端詳細資訊" }, "downloadCSV": { "message": "下載 CSV" }, "monthlySubscriptionUserSeatsMessage": { - "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. " + "message": "對訂閱的調整將在下一個帳單週期對帳單總額產生按比例計費。 " }, "annualSubscriptionUserSeatsMessage": { - "message": "Adjustments to your subscription will result in prorated charges on a monthly billing cycle. " + "message": "對訂閱的調整將在每月帳單週期產生按比例計費。 " }, "billingHistoryDescription": { - "message": "Download a CSV to obtain client details for each billing date. Prorated charges are not included in the CSV and may vary from the linked invoice. For the most accurate billing details, refer to your monthly invoices.", + "message": "下載 CSV 以取得每個帳單日期的客戶詳細資訊。CSV 不包含按比例計費,可能與連結的發票不同。欲取得最準確的帳單資訊,請參考每月發票。", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "noInvoicesToList": { - "message": "There are no invoices to list", + "message": "沒有可列出的發票", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "providerClientVaultPrivacyNotification": { - "message": "Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions,", + "message": "通知:本月稍晚將提升客戶密碼庫的隱私,供應商成員將不再能直接存取客戶密碼庫項目。如有疑問,", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'." }, "contactBitwardenSupport": { - "message": "contact Bitwarden support.", + "message": "請聯絡 Bitwarden 支援。", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'. 'Bitwarden' should not be translated" }, "sponsored": { - "message": "Sponsored" + "message": "贊助" }, "licenseAndBillingManagementDesc": { - "message": "After making updates in the Bitwarden cloud server, upload your license file to apply the most recent changes." + "message": "在 Bitwarden 雲端伺服器完成更新後,請上傳你的授權檔以套用最新變更。" }, "addToFolder": { "message": "新增到資料夾" @@ -10468,10 +10468,10 @@ "message": "選擇資料夾" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "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", @@ -10480,7 +10480,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 個項目會被永久移到 $ORG$。您將不再擁有此項目。", "placeholders": { "org": { "content": "$1", @@ -10489,7 +10489,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ 個項目會被永久移到 $ORG$。您將不再擁有這些項目。", "placeholders": { "personal_items_count": { "content": "$1", @@ -10502,64 +10502,64 @@ } }, "data": { - "message": "Data" + "message": "資料" }, "purchasedSeatsRemoved": { - "message": "purchased seats removed" + "message": "已移除購買的席次" }, "environmentVariables": { - "message": "Environment variables" + "message": "環境變數" }, "organizationId": { - "message": "Organization ID" + "message": "組織 ID" }, "projectIds": { - "message": "Project IDs" + "message": "專案 IDs" }, "projectId": { - "message": "Project ID" + "message": "專案 ID" }, "projectsAccessedByMachineAccount": { - "message": "The following projects can be accessed by this machine account." + "message": "此機器帳號可存取以下專案。" }, "config": { - "message": "Config" + "message": "設定" }, "learnMoreAboutEmergencyAccess": { - "message": "Learn more about emergency access" + "message": "深入瞭解緊急存取" }, "learnMoreAboutMatchDetection": { - "message": "Learn more about match detection" + "message": "深入瞭解符合項目偵測" }, "learnMoreAboutMasterPasswordReprompt": { - "message": "Learn more about master password re-prompt" + "message": "深入瞭解主密碼再次提示" }, "learnMoreAboutSearchingYourVault": { - "message": "Learn more about searching your vault" + "message": "深入瞭解搜尋你的密碼庫" }, "learnMoreAboutYourAccountFingerprintPhrase": { - "message": "Learn about your account fingerprint phrase" + "message": "瞭解你的帳號指紋短語" }, "impactOfRotatingYourEncryptionKey": { - "message": "Impact of rotating your encryption key" + "message": "輪換加密金鑰的影響" }, "learnMoreAboutEncryptionAlgorithms": { - "message": "Learn more about encryption algorithms" + "message": "深入瞭解加密演算法" }, "learnMoreAboutKDFIterations": { - "message": "Learn more about KDF iterations" + "message": "深入瞭解 KDF 迭代" }, "learnMoreAboutLocalization": { - "message": "Learn more about localization" + "message": "深入瞭解在地化" }, "learnMoreAboutWebsiteIcons": { - "message": "Learn more about using website icons" + "message": "深入瞭解網站圖示的使用" }, "learnMoreAboutUserAccess": { - "message": "Learn more about user access" + "message": "深入瞭解使用者存取" }, "learnMoreAboutMemberRoles": { - "message": "Learn more about member roles and permissions" + "message": "深入瞭解成員角色與權限" }, "whatIsACvvNumber": { "message": "CVV 號碼是什麼?" @@ -10568,13 +10568,13 @@ "message": "瞭解更多關於 Bitwarden API 的資訊" }, "fileSends": { - "message": "File Sends" + "message": "檔案 Send" }, "textSends": { - "message": "Text Sends" + "message": "文字 Sends" }, "includesXMembers": { - "message": "for $COUNT$ member", + "message": "供 $COUNT$ 位成員使用", "placeholders": { "count": { "content": "$1", @@ -10592,10 +10592,10 @@ } }, "optionalOnPremHosting": { - "message": "Optional on-premises hosting" + "message": "可選擇自建託管" }, "upgradeFreeOrganization": { - "message": "Upgrade your $NAME$ organization ", + "message": "升級你的 $NAME$ 組織", "placeholders": { "name": { "content": "$1", @@ -10604,10 +10604,10 @@ } }, "includeSsoAuthenticationMessage": { - "message": "SSO Authentication" + "message": "SSO 驗證" }, "familiesPlanInvLimitReachedManageBilling": { - "message": "Families organizations may have up to $SEATCOUNT$ members. Upgrade to a paid plan to invite more members.", + "message": "家庭組織最多可有 $SEATCOUNT$ 位成員。升級至付費方案以邀請更多成員。", "placeholders": { "seatcount": { "content": "$1", @@ -10616,7 +10616,7 @@ } }, "familiesPlanInvLimitReachedNoManageBilling": { - "message": "Families organizations may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade.", + "message": "家庭組織最多可有 $SEATCOUNT$ 位成員。請聯絡你們組織擁有者以進行升級。", "placeholders": { "seatcount": { "content": "$1", @@ -10625,10 +10625,10 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "升級你的方案以邀請成員,並體驗更強大的安全功能。" }, "upgradeDiscount": { - "message": "Save $AMOUNT$%", + "message": "省下 $AMOUNT$%", "placeholders": { "amount": { "content": "$1", @@ -10637,43 +10637,43 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "為大型組織提供進階能力" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "為成長中的團隊提供韌性防護" }, "teamsInviteMessage": { - "message": "Invite unlimited members" + "message": "可邀請不限人數的成員" }, "accessToCreateGroups": { - "message": "Access to create groups" + "message": "可建立群組" }, "syncGroupsAndUsersFromDirectory": { - "message": "Sync groups and users from a directory" + "message": "從目錄服務同步群組與使用者" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "守護家人的登入安全" }, "accessToPremiumFeatures": { - "message": "Access to Premium features" + "message": "可使用進階版功能" }, "additionalStorageGbMessage": { - "message": "GB additional storage" + "message": "GB 額外儲存空間" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "金鑰演算法" }, "sshPrivateKey": { - "message": "Private key" + "message": "私密金鑰" }, "sshPublicKey": { - "message": "Public key" + "message": "公共金鑰" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "指紋" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "指紋" }, "sshKeyPrivateKey": { "message": "私密金鑰" @@ -10694,86 +10694,86 @@ "message": "RSA 4096-Bit" }, "premiumAccounts": { - "message": "6 premium accounts" + "message": "6 個進階版帳號" }, "unlimitedSharing": { - "message": "Unlimited sharing" + "message": "無限制分享" }, "unlimitedCollections": { - "message": "Unlimited collections" + "message": "不限集合數量" }, "secureDataSharing": { - "message": "Secure data sharing" + "message": "安全的資料分享" }, "eventLogMonitoring": { - "message": "Event log monitoring" + "message": "事件記錄監控" }, "directoryIntegration": { - "message": "Directory integration" + "message": "目錄整合" }, "passwordLessSso": { - "message": "Passwordless SSO" + "message": "免密碼 SSO" }, "accountRecovery": { - "message": "Account recovery" + "message": "帳號復原" }, "customRoles": { - "message": "Custom roles" + "message": "自訂角色" }, "unlimitedSecretsStorage": { - "message": "Unlimited secrets storage" + "message": "機密不限儲存量" }, "unlimitedUsers": { - "message": "Unlimited users" + "message": "不限使用者數量" }, "UpTo50MachineAccounts": { - "message": "Up to 50 machine accounts" + "message": "最多 50 個機器帳號" }, "UpTo20MachineAccounts": { - "message": "Up to 20 machine accounts" + "message": "最多 20 個機器帳號" }, "current": { - "message": "Current" + "message": "目前" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "你的機密管理訂閱將依所選方案升級" }, "bitwardenPasswordManager": { - "message": "Bitwarden Password Manager" + "message": "Bitwarden 密碼管理工具" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "你贈送的一年期密碼管理器訂閱將升級至所選方案。在贈送期間結束前不會收費。" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "檔案已儲存至裝置。在您的裝置中管理下載的檔案。" }, "publicApi": { - "message": "Public API", + "message": "公共 API", "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "顯示字元數" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "隱藏字元數" }, "editAccess": { - "message": "Edit access" + "message": "編輯存取權" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "像安全問題之類的資料 請使用文本框" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "敏感資料 如同密碼 使用隱藏字段" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "如果您想自動填充表單的復選框,例如「記住電子郵件」,請使用復選框" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "使用連結欄位若您在特定網站上遇到自動填入問題。" }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "填入欄位的 html id、名稱、標籤或預留字元" }, "uppercaseDescription": { "message": "包含大寫字元", @@ -10810,23 +10810,23 @@ "message": "最大檔案大小為 500MB" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "你確定要永久刪除此附件嗎?" }, "manageSubscriptionFromThe": { - "message": "Manage subscription from the", + "message": "從", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." + "message": "若要在自己的伺服器上託管 Bitwarden,你需要上傳授權檔。為支援自建組織的免費家庭方案與進階計費功能,你需要在自建組織中設定自動同步。" }, "selfHostingTitleProper": { "message": "自架" }, "claim-domain-single-org-warning": { - "message": "Claiming a domain will turn on the single organization policy." + "message": "宣告網域將會啟用單一組織原則。" }, "single-org-revoked-user-warning": { - "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." + "message": "不符合原則的成員將被撤銷。當成員離開所有其他組織後,管理員可將其還原。" }, "deleteOrganizationUser": { "message": "刪除 $NAME$", @@ -10839,7 +10839,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "This will permanently delete all items owned by $NAME$. Collection items are not impacted.", + "message": "此動作將永久刪除 $NAME$ 擁有的所有項目。集合中的項目不受影響。", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -10849,7 +10849,7 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "This will permanently delete all items owned by the following members. Collection items are not impacted.", + "message": "此動作將永久刪除以下成員擁有的所有項目。集合中的項目不受影響。", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { @@ -10862,10 +10862,10 @@ } }, "organizationUserDeletedDesc": { - "message": "The user was removed from the organization and all associated user data has been deleted." + "message": "該使用者已從組織移除,並已刪除其所有相關使用者資料。" }, "deletedUserIdEventMessage": { - "message": "Deleted user $ID$", + "message": "已刪除使用者 $ID$", "placeholders": { "id": { "content": "$1", @@ -10874,7 +10874,7 @@ } }, "userLeftOrganization": { - "message": "User $ID$ left organization", + "message": "使用者 $ID$ 已離開組織", "placeholders": { "id": { "content": "$1", @@ -10883,7 +10883,7 @@ } }, "suspendedOrganizationTitle": { - "message": "The $ORGANIZATION$ is suspended", + "message": "$ORGANIZATION$ 已被停用", "placeholders": { "organization": { "content": "$1", @@ -10892,37 +10892,37 @@ } }, "suspendedUserOrgMessage": { - "message": "Contact your organization owner for assistance." + "message": "請聯絡你們組織的擁有者以取得協助。" }, "suspendedOwnerOrgMessage": { - "message": "To regain access to your organization, add a payment method." + "message": "若要恢復存取你的組織,請新增付款方式。" }, "deleteMembers": { - "message": "Delete members" + "message": "刪除群成員" }, "noSelectedMembersApplicable": { - "message": "This action is not applicable to any of the selected members." + "message": "此動作不適用於任何已選取的成員。" }, "deletedSuccessfully": { "message": "刪除成功" }, "freeFamiliesSponsorship": { - "message": "Remove Free Bitwarden Families sponsorship" + "message": "移除免費的 Bitwarden 家庭贊助" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Do not allow members to redeem a Families plan through this organization." + "message": "不允許成員透過此組織兌換家庭方案。" }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the organization's billing page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "以銀行帳號付款僅適用於美國客戶。你需要驗證你的銀行帳號。我們將於 1–2 個工作天內進行小額入帳。請在組織的帳單頁面輸入此次入帳的敘述代碼以驗證銀行帳號。未完成驗證將導致漏付款並使你的訂閱被停用。" }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "We have made a micro-deposit to your bank account (this may take 1-2 business days). Enter the six-digit code starting with 'SM' found on the deposit description. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "我們已對你的銀行帳號進行小額入帳(可能需時 1–2 個工作天)。請輸入入帳敘述中以「SM」開頭的 6 位數代碼。未完成銀行帳號驗證將導致漏付款並使你的訂閱被停用。" }, "descriptorCode": { - "message": "Descriptor code" + "message": "敘述代碼" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", "placeholders": { "collections": { "content": "$1", @@ -10931,37 +10931,37 @@ } }, "removeMembers": { - "message": "Remove members" + "message": "移除成員" }, "devices": { - "message": "Devices" + "message": "裝置" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "你的帳號已在下列各裝置登入。若有不認得的裝置,請立即將其移除。" }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "你的帳號已在下列各裝置登入。" }, "claimedDomains": { - "message": "Claimed domains" + "message": "已宣告的網域" }, "claimDomain": { - "message": "Claim domain" + "message": "宣告網域" }, "reclaimDomain": { - "message": "Reclaim domain" + "message": "重新宣告網域" }, "claimDomainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be claimed." + "message": "範例:mydomain.com。子網域需另外個別宣告。" }, "automaticClaimedDomains": { - "message": "Automatic Claimed Domains" + "message": "自動宣告網域" }, "automaticDomainClaimProcess": { - "message": "Bitwarden will attempt to claim the domain 3 times during the first 72 hours. If the domain can’t be claimed, check the DNS record in your host and manually claim. The domain will be removed from your organization in 7 days if it is not claimed." + "message": "Bitwarden 會在前 72 小時內嘗試宣告該網域 3 次。若無法宣告,請檢查主機上的 DNS 紀錄並手動宣告。若 7 天內仍未宣告,該網域將自你的組織移除。" }, "domainNotClaimed": { - "message": "$DOMAIN$ not claimed. Check your DNS records.", + "message": "尚未宣告 $DOMAIN$。請檢查你的 DNS 紀錄。", "placeholders": { "DOMAIN": { "content": "$1", @@ -10970,19 +10970,19 @@ } }, "domainStatusClaimed": { - "message": "Claimed" + "message": "已宣告" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "驗證中" }, "claimedDomainsDescription": { - "message": "Claim a domain to own member accounts. The SSO identifier page will be skipped during login for members with claimed domains and administrators will be able to delete claimed accounts." + "message": "宣告網域以取得其成員帳號的管理權。擁有已宣告網域的成員在登入時會略過 SSO 識別頁面,且管理員將可刪除已宣告的帳號。" }, "invalidDomainNameClaimMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be claimed." + "message": "輸入格式無效。格式:mydomain.com。子網域需另外個別宣告。" }, "domainClaimedEvent": { - "message": "$DOMAIN$ claimed", + "message": "已宣告 $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -10991,7 +10991,7 @@ } }, "domainNotClaimedEvent": { - "message": "$DOMAIN$ not claimed", + "message": "未宣告 $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -11000,7 +11000,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "如果你移除 $EMAIL$,此家庭方案的贊助將無法兌換。確定要繼續嗎?", "placeholders": { "email": { "content": "$1", @@ -11009,7 +11009,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "如果你移除 $EMAIL$,此家庭方案的贊助將結束,並會於 $DATE$ 由已儲存的付款方式收取 $40 + 適用稅金。$DATE$ 之前你將無法兌換新的贊助。確定要繼續嗎?", "placeholders": { "email": { "content": "$1", @@ -11022,108 +11022,108 @@ } }, "domainClaimed": { - "message": "Domain claimed" + "message": "已宣告網域" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "組織名稱不得超過 50 個字元。" }, "rotationCompletedTitle": { - "message": "Key rotation successful" + "message": "金鑰輪換成功" }, "rotationCompletedDesc": { - "message": "Your master password and encryption keys have been updated. Your other devices have been logged out." + "message": "你的主密碼與加密金鑰已更新。你在其他裝置上的登入已登出。" }, "trustUserEmergencyAccess": { - "message": "Trust and confirm user" + "message": "信任並確認使用者" }, "trustOrganization": { - "message": "Trust organization" + "message": "信任組織" }, "trust": { - "message": "Trust" + "message": "信任" }, "doNotTrust": { - "message": "Do not trust" + "message": "不信任" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "機構不被信任" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "為了保護你的帳號安全,僅在你已授予此使用者緊急存取權,且其指紋與其帳號中顯示的指紋相符時才確認。" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "為了保護你的帳號安全,僅在你是此組織的成員、已啟用帳號復原功能,且下方顯示的指紋與組織的指紋相符時才繼續。" }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "此組織有企業政策,會將你加入帳號復原功能。加入後,組織管理員可變更你的密碼。僅在你確認此組織身份,且下方顯示的指紋詞句與該組織的指紋相符時才繼續。" }, "trustUser": { - "message": "Trust user" + "message": "信任使用者" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "您輸入的密碼錯誤。" }, "importSshKey": { - "message": "Import" + "message": "匯入" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "確認密碼" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "輸入 SSH 金鑰的密碼" }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "請輸入密碼" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH 密鑰不正確" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "SSH 密鑰類型不支援" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "從剪貼簿中匯入密鑰" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH 密鑰成功匯入" }, "copySSHPrivateKey": { - "message": "Copy private key" + "message": "複製私密金鑰" }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "正在開啟 Bitwarden 瀏覽器擴充套件" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "出了點問題..." }, "openingExtensionError": { - "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + "message": "開啟 Bitwarden 瀏覽器擴充套件時發生問題。請點擊按鈕立即開啟。" }, "openExtension": { - "message": "Open extension" + "message": "開啟擴充功能" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "尚未安裝 Bitwarden 瀏覽器擴充套件?" }, "installExtension": { - "message": "Install extension" + "message": "安裝擴充套件" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "已開啟瀏覽器擴充套件" }, "openedExtensionViewAtRiskPasswords": { - "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + "message": "已成功開啟 Bitwarden 瀏覽器擴充套件。你現在可以檢視風險密碼。" }, "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "message": "開啟 Bitwarden 瀏覽器擴充套件時發生問題。請從工具列開啟 Bitwarden 圖示", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "from the toolbar.", + "message": "。", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "你的訂閱即將續約。為確保服務不中斷,請於 $RENEWAL_DATE$ 前聯絡 $RESELLER$ 確認續約。", "placeholders": { "reseller": { "content": "$1", @@ -11136,7 +11136,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "你的訂閱已於 $ISSUED_DATE$ 開立發票。為確保服務不中斷,請於 $DUE_DATE$ 前聯絡 $RESELLER$ 確認續約。", "placeholders": { "reseller": { "content": "$1", @@ -11153,7 +11153,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "你的訂閱發票尚未付款。為確保服務不中斷,請於 $GRACE_PERIOD_END$ 前聯絡 $RESELLER$ 確認續約。", "placeholders": { "reseller": { "content": "$1", @@ -11166,10 +11166,10 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "已重新啟動組織訂閱" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "重新啟動你的訂閱" }, "suspendedManagedOrgMessage": { "message": "聯繫 $PROVIDER$ 以取得協助。", @@ -11181,16 +11181,16 @@ } }, "accountDeprovisioningNotification": { - "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + "message": "管理員現在可以刪除屬於已宣告網域的成員帳號。" }, "deleteManagedUserWarningDesc": { - "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + "message": "此動作將刪除成員帳號,包括其密碼庫中的所有項目。這取代先前的「移除」動作。" }, "deleteManagedUserWarning": { - "message": "Delete is a new action!" + "message": "「刪除」是新的動作!" }, "seatsRemaining": { - "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "message": "此組織已指派 $TOTAL$ 個席次,你尚餘 $REMAINING$ 個席次。請聯絡你的供應商以管理訂閱。", "placeholders": { "remaining": { "content": "$1", @@ -11203,19 +11203,19 @@ } }, "existingOrganization": { - "message": "Existing organization" + "message": "既有組織" }, "selectOrganizationProviderPortal": { - "message": "Select an organization to add to your Provider Portal." + "message": "選取要加入你供應商入口網站的組織。" }, "noOrganizations": { - "message": "There are no organizations to list" + "message": "沒有可列出的組織" }, "yourProviderSubscriptionCredit": { - "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + "message": "你供應商的訂閱將針對組織訂閱剩餘時間獲得相對應的折抵。" }, "doYouWantToAddThisOrg": { - "message": "Do you want to add this organization to $PROVIDER$?", + "message": "要將此組織新增至 $PROVIDER$ 嗎?", "placeholders": { "provider": { "content": "$1", @@ -11224,13 +11224,13 @@ } }, "addedExistingOrganization": { - "message": "Added existing organization" + "message": "已新增既有組織" }, "assignedExceedsAvailable": { - "message": "Assigned seats exceed available seats." + "message": "指派席次超過可用席次。" }, "userkeyRotationDisclaimerEmergencyAccessText": { - "message": "Fingerprint phrase for $NUM_USERS$ contacts for which you have enabled emergency access.", + "message": "你已啟用緊急存取的 $NUM_USERS$ 位聯絡人之指紋短語。", "placeholders": { "num_users": { "content": "$1", @@ -11239,7 +11239,7 @@ } }, "userkeyRotationDisclaimerAccountRecoveryOrgsText": { - "message": "Fingerprint phrase for the organization $ORG_NAME$ for which you have enabled account recovery.", + "message": "你已啟用帳號復原之組織 $ORG_NAME$ 的指紋短語。", "placeholders": { "org_name": { "content": "$1", @@ -11248,203 +11248,238 @@ } }, "userkeyRotationDisclaimerDescription": { - "message": "Rotating your encryption keys will require you to trust keys of any organizations that can recover your account, and any contacts that you have enabled emergency access for. To continue, make sure you can verify the following:" + "message": "輪換你的加密金鑰後,你需要信任可復原你帳號的各組織金鑰,以及你已啟用緊急存取之聯絡人的金鑰。若要繼續,請確認你能驗證以下項目:" }, "userkeyRotationDisclaimerTitle": { - "message": "Untrusted encryption keys" + "message": "未受信任的加密金鑰" }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "變更有風險的密碼" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "此登入資訊存在風險,且缺少網站。請新增網站並變更密碼以提升安全性。" }, "missingWebsite": { - "message": "Missing website" + "message": "缺少網站" }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "移除以 PIN 解鎖" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "不允許成員使用 PIN 解鎖其帳號。" }, "upgradeForFullEventsMessage": { - "message": "Event logs are not stored for your organization. Upgrade to a Teams or Enterprise plan to get full access to organization event logs." + "message": "你的組織不會儲存事件記錄。升級至團隊或企業方案以取得完整的組織事件記錄存取。" }, "upgradeEventLogTitleMessage": { - "message": "Upgrade to see event logs from your organization." + "message": "升級以檢視你組織的事件記錄。" }, "upgradeEventLogMessage": { - "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + "message": "這些事件僅為範例,並不反映你 Bitwarden 組織內的真實事件。" }, "viewEvents": { - "message": "View Events" + "message": "檢視事件" }, "cannotCreateCollection": { - "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." + "message": "免費組織最多可有 2 個集合。升級至付費方案即可新增更多集合。" }, "searchArchive": { - "message": "Search archive" + "message": "搜尋封存" }, "archiveNoun": { - "message": "Archive", + "message": "封存", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "封存", "description": "Verb" }, - "noItemsInArchive": { - "message": "No items in archive" + "unArchive": { + "message": "Unarchive" }, - "archivedItemsDescription": { + "itemsInArchive": { + "message": "Items in archive" + }, + "noItemsInArchive": { + "message": "封存中沒有項目" + }, + "noItemsInArchiveDesc": { "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." }, + "itemWasSentToArchive": { + "message": "Item was sent to archive" + }, + "itemsWereSentToArchive": { + "message": "Items were sent to archive" + }, + "itemUnarchived": { + "message": "Item was unarchived" + }, + "bulkArchiveItems": { + "message": "Items archived" + }, + "bulkUnarchiveItems": { + "message": "Items unarchived" + }, + "archiveItem": { + "message": "Archive item", + "description": "Verb" + }, + "archiveItemConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + }, + "archiveBulkItems": { + "message": "Archive items", + "description": "Verb" + }, + "archiveBulkItemsConfirmDesc": { + "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + }, "businessUnit": { - "message": "Business Unit" + "message": "營業單位" }, "businessUnits": { - "message": "Business Units" + "message": "營業單位" }, "newBusinessUnit": { - "message": "New business unit" + "message": "新事業單位" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "安全傳送機密的資訊", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "安全的和任何人及任何平臺分享檔案及資料。您的資料會受到端對端加密的保護。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "快速建立密碼" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "點擊即可輕鬆產生強且唯一的密碼。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "協助你維持登入資訊的安全。", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "點擊「產生密碼」按鈕即可輕鬆建立強且唯一的密碼,協助你確保登入資訊的安全。", "description": "Aria label for the body content of the generator nudge" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "使用自動填入節省時間" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "包含", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "網頁", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "讓此登入顯示為自動填入建議。", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "流暢的線上結帳體驗" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "使用支付卡功能,安全且精準地自動填入付款表單。" }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "簡化帳號建立流程 " }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "使用身份資訊,快速自動填入冗長的註冊或聯絡表單。" }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "保護你的敏感資料安全" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "使用備註功能,安全儲存銀行或保險等敏感資料。" }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "開發者友善的 SSH 存取" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "儲存你的金鑰並透過 SSH 代理程式進行快速、加密的驗證。", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "深入了解 SSH 代理程式", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "setupExtensionPageTitle": { - "message": "Autofill your passwords securely with one click" + "message": "一鍵安全自動填入你的密碼" }, "setupExtensionPageDescription": { - "message": "Get the Bitwarden browser extension and start autofilling today" + "message": "取得 Bitwarden 瀏覽器擴充套件,立刻開始自動填入" }, "getTheExtension": { - "message": "Get the extension" + "message": "取得擴充功能" }, "addItLater": { - "message": "Add it later" + "message": "稍後再新增" }, "cannotAutofillPasswordsWithoutExtensionTitle": { - "message": "You can't autofill passwords without the browser extension" + "message": "沒有瀏覽器擴充套件就無法自動填入密碼" }, "cannotAutofillPasswordsWithoutExtensionDesc": { - "message": "Are you sure you don't want to add the extension now?" + "message": "確定現在不新增擴充套件嗎?" }, "skipToWebApp": { - "message": "Skip to web app" + "message": "改用網頁版" }, "bitwardenExtensionInstalled": { - "message": "Bitwarden extension installed!" + "message": "已安裝 Bitwarden 擴充套件!" }, "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" + "message": "開啟 Bitwarden 擴充套件" }, "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "message": "已安裝 Bitwarden 擴充套件!開啟擴充套件以登入並開始自動填入。" }, "openExtensionToAutofill": { - "message": "Open the extension to log in and start autofilling." + "message": "開啟擴充套件以登入並開始自動填入。" }, "openBitwardenExtension": { - "message": "Open Bitwarden extension" + "message": "開啟 Bitwarden 擴充套件" }, "gettingStartedWithBitwardenPart1": { - "message": "For tips on getting started with Bitwarden visit the", + "message": "若想取得使用 Bitwarden 的入門技巧,請前往", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "gettingStartedWithBitwardenPart2": { - "message": "Learning Center", + "message": "學習中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "gettingStartedWithBitwardenPart3": { - "message": "Help Center", + "message": "說明中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "setupExtensionContentAlt": { - "message": "With the Bitwarden browser extension you can easily create new logins, access your saved logins directly from your browser toolbar, and sign in to accounts quickly using Bitwarden autofill." + "message": "透過 Bitwarden 瀏覽器擴充套件,你可以輕鬆建立新的登入、從瀏覽器工具列直接存取已儲存的登入,並使用 Bitwarden 自動填入快速登入帳號。" }, "restart": { - "message": "Restart" + "message": "重新啟動" }, "verifyProviderBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the provider's subscription page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "以銀行帳號付款僅適用於美國客戶。你需要驗證你的銀行帳號。我們將於 1–2 個工作天內進行小額入帳。請在供應商的訂閱頁面輸入此次入帳的敘述代碼以驗證銀行帳號。未完成驗證將導致漏付款並使你的訂閱被停用。" }, "clickPayWithPayPal": { - "message": "Please click the Pay with PayPal button to add your payment method." + "message": "請點擊「以 PayPal 付款」按鈕以新增你的付款方式。" }, "revokeActiveSponsorshipConfirmation": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end. A seat within your organization will become available for members or sponsorships after the sponsored organization renewal date on $DATE$.", + "message": "如果你移除 $EMAIL$,此家庭方案的贊助將結束。在 $DATE$ 受贊助組織的續約日之後,你組織中的一個席次將可供成員或贊助使用。", "placeholders": { "email": { "content": "$1", @@ -11457,56 +11492,56 @@ } }, "billingAddressRequiredToAddCredit": { - "message": "Billing address required to add credit.", + "message": "新增儲值需先提供帳單地址。", "description": "Error message shown when trying to add credit to a trialing organization without a billing address." }, "aboutThisSetting": { - "message": "About this setting" + "message": "關於此設定" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden 會使用已儲存的登入 URI 來判斷應顯示的圖示或變更密碼網址,以改善你的使用體驗。使用此服務時,不會收集或儲存任何資訊。" }, "billingAddress": { - "message": "Billing address" + "message": "帳單地址" }, "addBillingAddress": { - "message": "Add billing address" + "message": "新增帳單地址" }, "editBillingAddress": { - "message": "Edit billing address" + "message": "編輯帳單地址" }, "noBillingAddress": { - "message": "No address on file." + "message": "未提供地址。" }, "billingAddressUpdated": { - "message": "Your billing address has been updated." + "message": "你的帳單地址已更新。" }, "paymentDetails": { - "message": "Payment details" + "message": "付款明細" }, "paymentMethodUpdated": { - "message": "Your payment method has been updated." + "message": "你的付款方式已更新。" }, "bankAccountVerified": { - "message": "Your bank account has been verified." + "message": "你的銀行帳號已通過驗證。" }, "availableCreditAppliedToInvoice": { - "message": "Any available credit will be automatically applied towards invoices generated for this account." + "message": "任何可用的儲值都會自動套用至此帳號所產生的發票。" }, "mustBePositiveNumber": { - "message": "Must be a positive number" + "message": "必須為正數" }, "cardSecurityCode": { - "message": "Card security code" + "message": "支付卡安全碼" }, "cardSecurityCodeDescription": { - "message": "Card security code, also known as CVV or CVC, is typically a 3 digit number printed on the back of your credit card or 4 digit number printed on the front above your card number." + "message": "支付卡安全碼(CVV 或 CVC)通常是印在支付卡背面的 3 位數字,或印在支付卡正面卡號上方的 4 位數字。" }, "verifyBankAccountWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the Payment Details page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "以銀行帳號付款僅適用於美國客戶。你需要驗證你的銀行帳號。我們將於 1–2 個工作天內進行小額入帳。請在「付款明細」頁面輸入此次入帳的敘述代碼以驗證銀行帳號。未完成驗證將導致漏付款並使你的訂閱被停用。" }, "taxId": { - "message": "Tax ID: $TAX_ID$", + "message": "稅務識別碼:$TAX_ID$", "placeholders": { "tax_id": { "content": "$1", @@ -11515,14 +11550,14 @@ } }, "unpaidInvoices": { - "message": "Unpaid invoices" + "message": "未付款發票" }, "unpaidInvoicesForServiceUser": { - "message": "Your subscription has not been paid. Contact your provider administrator to restore service to you and your clients.", + "message": "你的訂閱尚未付款。請聯絡供應商管理員以恢復你與客戶的服務。", "description": "A message shown in a non-dismissible dialog to service users of unpaid providers." }, "providerSuspended": { - "message": "$PROVIDER$ is suspended", + "message": "$PROVIDER$ 已被停用", "placeholders": { "provider": { "content": "$1", @@ -11531,11 +11566,11 @@ } }, "restoreProviderPortalAccessViaCustomerSupport": { - "message": "To restore access to your provider portal, contact Bitwarden Customer Support to renew your subscription.", + "message": "若要恢復存取你的供應商入口網站,請聯絡 Bitwarden 客戶支援以續約你的訂閱。", "description": "A message shown in a non-dismissible dialog to any user of a suspended providers." }, "restoreProviderPortalAccessViaPaymentMethod": { - "message": "Your subscription has not been paid. To restore service to you and your clients, add a payment method by $CANCELLATION_DATE$.", + "message": "你的訂閱尚未付款。請於 $CANCELLATION_DATE$ 前新增付款方式,以恢復你與客戶的服務。", "placeholders": { "cancellation_date": { "content": "$1", @@ -11545,7 +11580,7 @@ "description": "A message shown in a non-dismissible dialog to admins of unpaid providers." }, "subscribetoEnterprise": { - "message": "Subscribe to $PLAN$", + "message": "訂閱 $PLAN$", "placeholders": { "plan": { "content": "$1", @@ -11554,7 +11589,7 @@ } }, "subscribeEnterpriseSubtitle": { - "message": "Your 7-day $PLAN$ trial starts today. Add a payment method now to continue using these features after your trial ends: ", + "message": "你的 $PLAN$ 7 天試用自今日開始。請立即新增付款方式,以便在試用結束後繼續使用以下功能:", "placeholders": { "plan": { "content": "$1", @@ -11563,59 +11598,59 @@ } }, "unlimitedSecretsAndProjects": { - "message": "Unlimited secrets and projects" + "message": "不限機密與專案數量" }, "providersubscriptionCanceled": { - "message": "Subscription canceled" + "message": "訂閱已取消" }, "providersubCanceledmessage": { - "message": "To resubscribe, contact Bitwarden Customer Support." + "message": "若要重新訂閱,請聯絡 Bitwarden 客戶支援。" }, "showMore": { - "message": "Show more" + "message": "顯示更多" }, "showLess": { - "message": "Show less" + "message": "顯示較少" }, "missingTaxId": { - "message": "Missing Tax ID" + "message": "缺少稅務識別碼" }, "missingTaxIdWarning": { - "message": "Action required: You're missing a Tax ID number in payment details. If a Tax ID is not added, your invoices may include additional tax." + "message": "需要採取動作:你的付款明細缺少稅務識別碼。若未新增,發票可能會包含額外稅額。" }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "更多導覽階層", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "addTaxId": { - "message": "Add a Tax ID" + "message": "新增稅務識別碼" }, "missingTaxIdCalloutTitle": { - "message": "Action required: Missing Tax ID" + "message": "需要採取動作:缺少稅務識別碼" }, "missingTaxIdCalloutDescription": { - "message": "If a Tax ID is not added, your invoices may include additional tax." + "message": "若未新增稅務識別碼,發票可能會包含額外稅額。" }, "unverifiedTaxIdWarning": { - "message": "Action required: Your Tax ID number is unverified. If your Tax ID is left unverified, your invoices may include additional tax." + "message": "需要採取動作:你的稅務識別碼尚未驗證。若未完成驗證,發票可能會包含額外稅額。" }, "editTaxId": { - "message": "Edit your Tax ID" + "message": "編輯你的稅務識別碼" }, "unverifiedTaxIdCalloutTitle": { - "message": "Tax ID unverified" + "message": "稅務識別碼未驗證" }, "unverifiedTaxIdCalloutDescription": { - "message": "Check your Tax ID to verify the format is correct and there are no typos." + "message": "請檢查你的稅務識別碼,確認格式正確且沒有錯字。" }, "pendingVerification": { - "message": "Pending verification" + "message": "待驗證" }, "checkInputFormat": { - "message": "Check input format for typos." + "message": "請檢查輸入格式是否有錯字。" }, "exampleTaxIdFormat": { - "message": "Example $CODE$ format: $EXAMPLE$", + "message": "$CODE$ 格式範例:$EXAMPLE$", "placeholders": { "code": { "content": "$1", @@ -11628,46 +11663,46 @@ } }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "確認 Key Connector 網域" }, "requiredToVerifyBankAccountWithStripe": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "以銀行帳號付款僅適用於美國客戶。你需要驗證你的銀行帳號。我們將於 1–2 個工作天內進行小額入帳。未完成銀行帳號驗證將導致漏付款並使你的訂閱被停用。" }, "verifyBankAccountWithStripe": { - "message": "We have made a micro-deposit to your bank account. This may take 1-2 business days. When you see the deposit in your account, you can verify your bank account. Failure to verify your bank account will result in a missed payment and your subscription will be suspended." + "message": "我們已對你的銀行帳號進行小額入帳,可能需時 1–2 個工作天。當你在帳號中看到入帳後,即可完成銀行帳號驗證。未完成驗證將導致漏付款並使你的訂閱被停用。" }, "verifyNow": { - "message": "Verify now." + "message": "立即驗證" }, "additionalStorageGB": { - "message": "Additional storage GB" + "message": "額外儲存空間 (GB)" }, "additionalServiceAccountsV2": { - "message": "Additional machine accounts" + "message": "額外機器帳號" }, "secretsManagerSeats": { - "message": "Secrets Manager seats" + "message": "機密管理席次" }, "additionalStorage": { - "message": "Additional Storage" + "message": "額外儲存空間" }, "expandPurchaseDetails": { - "message": "Expand purchase details" + "message": "展開購買明細" }, "collapsePurchaseDetails": { - "message": "Collapse purchase details" + "message": "收合購買明細" }, "familiesMembership": { - "message": "Families membership" + "message": "家庭會員" }, "planDescPremium": { - "message": "Complete online security" + "message": "完整的線上安全" }, "planDescFamiliesV2": { - "message": "Premium security for your family" + "message": "為你的家人提供進階安全" }, "planDescFreeV2": { - "message": "Share with $COUNT$ other user", + "message": "可與 $COUNT$ 位其他使用者分享", "placeholders": { "count": { "content": "$1", @@ -11676,37 +11711,37 @@ } }, "planDescEnterpriseV2": { - "message": "Advanced capabilities for any organization" + "message": "適用於各類組織的進階能力" }, "planNameCustom": { - "message": "Custom plan" + "message": "自訂方案" }, "planDescCustom": { - "message": "Bitwarden scales with businesses of all sizes to secure passwords and sensitive information. If you're part of a large enterprise, contact sales to request a quote." + "message": "Bitwarden 可隨各種規模的企業擴展,以保護密碼與敏感資訊。若你屬於大型企業,請聯絡業務以索取報價。" }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "內建驗證器" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "外洩監控" }, "andMoreFeatures": { - "message": "And more!" + "message": "以及其他功能功能!" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "安全檔案儲存" }, "familiesUnlimitedSharing": { - "message": "Unlimited sharing - choose who sees what" + "message": "不限分享—自訂誰能看到哪些內容" }, "familiesUnlimitedCollections": { - "message": "Unlimited family collections" + "message": "不限家庭集合數量" }, "familiesSharedStorage": { - "message": "Shared storage for important family info" + "message": "重要家庭資訊的共享儲存空間" }, "limitedUsersV2": { - "message": "Up to $COUNT$ members", + "message": "最多 $COUNT$ 位成員", "placeholders": { "count": { "content": "$1", @@ -11715,7 +11750,7 @@ } }, "limitedCollectionsV2": { - "message": "Up to $COUNT$ collections", + "message": "最多 $COUNT$ 個集合", "placeholders": { "count": { "content": "$1", @@ -11724,13 +11759,13 @@ } }, "alwaysFree": { - "message": "Always free" + "message": "永遠免費" }, "twoSecretsIncluded": { - "message": "2 secrets" + "message": "2 個機密" }, "projectsIncludedV2": { - "message": "$COUNT$ project(s)", + "message": "$COUNT$ 個專案", "placeholders": { "count": { "content": "$1", @@ -11739,13 +11774,13 @@ } }, "secureItemSharing": { - "message": "Secure item sharing" + "message": "安全分享項目" }, "scimSupport": { - "message": "SCIM support" + "message": "支援 SCIM" }, "includedMachineAccountsV2": { - "message": "$COUNT$ machine accounts", + "message": "$COUNT$ 個機器帳號", "placeholders": { "count": { "content": "$1", @@ -11754,54 +11789,72 @@ } }, "enterpriseSecurityPolicies": { - "message": "Enterprise security policies" + "message": "企業安全原則" }, "selfHostOption": { - "message": "Self-host option" + "message": "自建選項" }, "complimentaryFamiliesPlan": { - "message": "Complimentary families plan for all users" + "message": "提供所有使用者免費家庭方案" }, "strengthenCybersecurity": { - "message": "Strengthen cybersecurity" + "message": "強化資安" }, "boostProductivity": { - "message": "Boost productivity" + "message": "增強生產力" }, "seamlessIntegration": { - "message": "Seamless integration" + "message": "無縫集成" }, "families": { - "message": "Families" + "message": "家庭" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "升級為家庭方案" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "升級到 Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "你已升級為家庭方案!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "計算你所在地區的稅額時發生錯誤。請再試一次。" }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "歡迎使用 Bitwarden" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "升級進階版解鎖更多安全功能,或使用家庭方案開始分享項目" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "價格不含稅,並以年繳計費。" }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "你寄給成員的邀請中會顯示你的組織名稱。" }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "不更新繼續" + }, + "upgradeYourPlan": { + "message": "Upgrade your plan" + }, + "upgradeNow": { + "message": "Upgrade now" + }, + "formWillCreateNewFamiliesOrgMessage": { + "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "處理你的升級時發生錯誤。請再試一次。" + }, + "bitwardenFreeplanMessage": { + "message": "You have the Bitwarden Free plan" + }, + "upgradeCompleteSecurity": { + "message": "Upgrade for complete security" + }, + "viewbusinessplans": { + "message": "View business plans" } } diff --git a/eslint.config.mjs b/eslint.config.mjs index af5d56e6f73..07bc5951786 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -78,7 +78,7 @@ export default tseslint.config( "@bitwarden/platform/required-using": "error", "@bitwarden/platform/no-enums": "error", - "@bitwarden/components/require-theme-colors-in-svg": "warn", + "@bitwarden/components/require-theme-colors-in-svg": "error", "@typescript-eslint/explicit-member-accessibility": ["error", { accessibility: "no-public" }], "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled diff --git a/libs/angular/src/auth/components/set-pin.component.ts b/libs/angular/src/auth/components/set-pin.component.ts index 9e351990fff..28f0fbaee97 100644 --- a/libs/angular/src/auth/components/set-pin.component.ts +++ b/libs/angular/src/auth/components/set-pin.component.ts @@ -9,7 +9,6 @@ import { UserVerificationService } from "@bitwarden/common/auth/abstractions/use import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { DialogRef } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; @Directive() export class SetPinComponent implements OnInit { @@ -22,7 +21,6 @@ export class SetPinComponent implements OnInit { constructor( private accountService: AccountService, - private keyService: KeyService, private dialogRef: DialogRef, private formBuilder: FormBuilder, private pinService: PinServiceAbstraction, @@ -47,25 +45,11 @@ export class SetPinComponent implements OnInit { } const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; - const userKey = await this.keyService.getUserKey(); - - const userKeyEncryptedPin = await this.pinService.createUserKeyEncryptedPin( + await this.pinService.setPin( pinFormControl.value, - userKey, - ); - await this.pinService.setUserKeyEncryptedPin(userKeyEncryptedPin, userId); - - const pinKeyEncryptedUserKey = await this.pinService.createPinKeyEncryptedUserKey( - pinFormControl.value, - userKey, + requireMasterPasswordOnClientRestart ? "EPHEMERAL" : "PERSISTENT", userId, ); - await this.pinService.storePinKeyEncryptedUserKey( - pinKeyEncryptedUserKey, - requireMasterPasswordOnClientRestart, - userId, - ); - this.dialogRef.close(true); }; } diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 01163b72e37..2fff000f278 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -182,6 +182,8 @@ import { } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { DefaultMasterPasswordUnlockService } from "@bitwarden/common/key-management/master-password/services/default-master-password-unlock.service"; import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; +import { PinStateServiceAbstraction } from "@bitwarden/common/key-management/pin/pin-state.service.abstraction"; +import { PinStateService } from "@bitwarden/common/key-management/pin/pin-state.service.implementation"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { PinService } from "@bitwarden/common/key-management/pin/pin.service.implementation"; import { SecurityStateService } from "@bitwarden/common/key-management/security-state/abstractions/security-state.service"; @@ -542,7 +544,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: DomainSettingsService, useClass: DefaultDomainSettingsService, - deps: [StateProvider], + deps: [StateProvider, PolicyServiceAbstraction, AccountService], }), safeProvider({ provide: CipherServiceAbstraction, @@ -696,7 +698,6 @@ const safeProviders: SafeProvider[] = [ provide: KeyService, useClass: DefaultKeyService, deps: [ - PinServiceAbstraction, InternalMasterPasswordServiceAbstraction, KeyGenerationService, CryptoFunctionServiceAbstraction, @@ -856,7 +857,7 @@ const safeProviders: SafeProvider[] = [ useClass: DefaultVaultTimeoutSettingsService, deps: [ AccountServiceAbstraction, - PinServiceAbstraction, + PinStateServiceAbstraction, UserDecryptionOptionsServiceAbstraction, KeyService, TokenServiceAbstraction, @@ -1072,9 +1073,7 @@ const safeProviders: SafeProvider[] = [ useClass: MasterPasswordService, deps: [ StateProvider, - StateServiceAbstraction, KeyGenerationService, - EncryptService, LogService, CryptoFunctionServiceAbstraction, AccountServiceAbstraction, @@ -1295,19 +1294,26 @@ const safeProviders: SafeProvider[] = [ ApiServiceAbstraction, StateProvider, AuthRequestApiServiceAbstraction, + AccountServiceAbstraction, ], }), + safeProvider({ + provide: PinStateServiceAbstraction, + useClass: PinStateService, + deps: [StateProvider], + }), safeProvider({ provide: PinServiceAbstraction, useClass: PinService, deps: [ AccountServiceAbstraction, - CryptoFunctionServiceAbstraction, EncryptService, KdfConfigService, KeyGenerationService, LogService, - StateProvider, + KeyService, + SdkService, + PinStateServiceAbstraction, ], }), safeProvider({ diff --git a/libs/assets/src/svg/svgs/background-right-illustration.ts b/libs/assets/src/svg/svgs/background-right-illustration.ts index b8f02935d83..1c488f7242d 100644 --- a/libs/assets/src/svg/svgs/background-right-illustration.ts +++ b/libs/assets/src/svg/svgs/background-right-illustration.ts @@ -1,5 +1,28 @@ import { svgIcon } from "../icon-service"; export const BackgroundRightIllustration = svgIcon` - + + + + + + + + + + + + + + + + + + + + + + + + `; diff --git a/libs/assets/src/svg/svgs/bitwarden-icon.ts b/libs/assets/src/svg/svgs/bitwarden-icon.ts index 2f88b38043c..203460952b5 100644 --- a/libs/assets/src/svg/svgs/bitwarden-icon.ts +++ b/libs/assets/src/svg/svgs/bitwarden-icon.ts @@ -3,12 +3,12 @@ import { svgIcon } from "../icon-service"; export const BitwardenIcon = svgIcon` - + - + diff --git a/libs/assets/src/svg/svgs/carousel-icon.ts b/libs/assets/src/svg/svgs/carousel-icon.ts index 802f6ff1435..e29fd952098 100644 --- a/libs/assets/src/svg/svgs/carousel-icon.ts +++ b/libs/assets/src/svg/svgs/carousel-icon.ts @@ -2,6 +2,6 @@ import { svgIcon } from "../icon-service"; export const CarouselIcon = svgIcon` - + `; diff --git a/libs/assets/src/svg/svgs/secrets-manager-alt.ts b/libs/assets/src/svg/svgs/secrets-manager-alt.ts index 293bd99cbf3..98640803ca9 100644 --- a/libs/assets/src/svg/svgs/secrets-manager-alt.ts +++ b/libs/assets/src/svg/svgs/secrets-manager-alt.ts @@ -1,5 +1,9 @@ import { svgIcon } from "../icon-service"; export const SecretsManagerAlt = svgIcon` - + + + + + `; diff --git a/libs/assets/src/svg/svgs/two-factor-auth-duo.icon.ts b/libs/assets/src/svg/svgs/two-factor-auth-duo.icon.ts index 53a81386e04..5bf43334d18 100644 --- a/libs/assets/src/svg/svgs/two-factor-auth-duo.icon.ts +++ b/libs/assets/src/svg/svgs/two-factor-auth-duo.icon.ts @@ -1,3 +1,5 @@ +// this svg includes the Duo logo, which contains colors not part of our bitwarden theme colors +/* eslint-disable @bitwarden/components/require-theme-colors-in-svg */ import { svgIcon } from "../icon-service"; export const TwoFactorAuthDuoIcon = svgIcon` @@ -13,7 +15,7 @@ export const TwoFactorAuthDuoIcon = svgIcon` - + diff --git a/libs/assets/src/svg/svgs/two-factor-auth-yubico.icon.ts b/libs/assets/src/svg/svgs/two-factor-auth-yubico.icon.ts index e00bc905880..d4d38c363ae 100644 --- a/libs/assets/src/svg/svgs/two-factor-auth-yubico.icon.ts +++ b/libs/assets/src/svg/svgs/two-factor-auth-yubico.icon.ts @@ -1,3 +1,5 @@ +// this svg includes the Yubico logo, which contains colors not part of our bitwarden theme colors +/* eslint-disable @bitwarden/components/require-theme-colors-in-svg */ import { svgIcon } from "../icon-service"; export const TwoFactorAuthYubicoIcon = svgIcon` @@ -8,7 +10,7 @@ export const TwoFactorAuthYubicoIcon = svgIcon` - + diff --git a/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts b/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts index 10cc643fd45..1bfbfd8d004 100644 --- a/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts +++ b/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts @@ -55,6 +55,7 @@ export abstract class AuthRequestServiceAbstraction { * Approve or deny an auth request. * @param approve True to approve, false to deny. * @param authRequest The auth request to approve or deny, must have an id and key. + * @param activeUserId the active user id * @returns The updated auth request, the `requestApproved` field will be true if * approval was successful. * @throws If the auth request is missing an id or key. diff --git a/libs/auth/src/common/login-strategies/login.strategy.spec.ts b/libs/auth/src/common/login-strategies/login.strategy.spec.ts index e2f326d836d..a23f8034238 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.spec.ts @@ -337,7 +337,7 @@ describe("LoginStrategy", () => { const tokenResponse = identityTokenResponseFactory(); tokenResponse.privateKey = null; keyService.makeKeyPair.mockResolvedValue(["PUBLIC_KEY", new EncString("PRIVATE_KEY")]); - keyService.getUserKey.mockResolvedValue(userKey); + keyService.userKey$.mockReturnValue(new BehaviorSubject(userKey).asObservable()); apiService.postIdentityToken.mockResolvedValue(tokenResponse); masterPasswordService.masterKeySubject.next(masterKey); @@ -356,9 +356,11 @@ describe("LoginStrategy", () => { }); it("throws if userKey is CoseEncrypt0 (V2 encryption) in createKeyPairForOldAccount", async () => { - keyService.getUserKey.mockResolvedValue({ - inner: () => ({ type: 7 }), - } as UserKey); + keyService.userKey$.mockReturnValue( + new BehaviorSubject({ + inner: () => ({ type: 7 }), + } as unknown as UserKey).asObservable(), + ); await expect(passwordLoginStrategy["createKeyPairForOldAccount"](userId)).resolves.toBe( undefined, ); diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index 93198f992cb..7ad5cd24353 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -306,7 +306,11 @@ export abstract class LoginStrategy { protected async createKeyPairForOldAccount(userId: UserId) { try { - const userKey = await this.keyService.getUserKey(userId); + const userKey = await firstValueFrom(this.keyService.userKey$(userId)); + if (userKey === null) { + throw new Error("User key is null when creating key pair for old account"); + } + if (userKey.inner().type == EncryptionType.CoseEncrypt0) { throw new Error("Cannot create key pair for account on V2 encryption"); } diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts index 69f38f40989..8cb0cc279ae 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts @@ -1,7 +1,8 @@ import { mock } from "jest-mock-extended"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, of } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; @@ -9,11 +10,11 @@ import { FakeMasterPasswordService } from "@bitwarden/common/key-management/mast import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { StateProvider } from "@bitwarden/common/platform/state"; import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; +import { newGuid } from "@bitwarden/guid"; import { KeyService } from "@bitwarden/key-management"; import { DefaultAuthRequestApiService } from "./auth-request-api.service"; @@ -29,10 +30,11 @@ describe("AuthRequestService", () => { const encryptService = mock(); const apiService = mock(); const authRequestApiService = mock(); + const accountService = mock(); let mockPrivateKey: Uint8Array; let mockPublicKey: Uint8Array; - const mockUserId = Utils.newGuid() as UserId; + const mockUserId = newGuid() as UserId; beforeEach(() => { jest.clearAllMocks(); @@ -46,6 +48,7 @@ describe("AuthRequestService", () => { apiService, stateProvider, authRequestApiService, + accountService, ); mockPrivateKey = new Uint8Array(64); @@ -95,6 +98,8 @@ describe("AuthRequestService", () => { const authRequestNoId = new AuthRequestResponse({ id: "", key: "KEY" }); const authRequestNoPublicKey = new AuthRequestResponse({ id: "123", publicKey: "" }); + accountService.activeAccount$ = of({ id: mockUserId } as any); + await expect(sut.approveOrDenyAuthRequest(true, authRequestNoId)).rejects.toThrow( "Auth request has no id", ); @@ -104,8 +109,9 @@ describe("AuthRequestService", () => { }); it("should use the user key if the master key and hash do not exist", async () => { - keyService.getUserKey.mockResolvedValueOnce( - new SymmetricCryptoKey(new Uint8Array(64)) as UserKey, + accountService.activeAccount$ = of({ id: mockUserId } as any); + keyService.userKey$.mockReturnValue( + of(new SymmetricCryptoKey(new Uint8Array(64)) as UserKey), ); await sut.approveOrDenyAuthRequest( diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.ts b/libs/auth/src/common/services/auth-request/auth-request.service.ts index 5fc28e960a8..ba4b9eaf174 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.ts @@ -4,9 +4,11 @@ import { Observable, Subject, defer, firstValueFrom, map } from "rxjs"; import { Jsonify } from "type-fest"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; import { PasswordlessAuthRequest } from "@bitwarden/common/auth/models/request/passwordless-auth.request"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; @@ -56,6 +58,7 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { private apiService: ApiService, private stateProvider: StateProvider, private authRequestApiService: AuthRequestApiServiceAbstraction, + private accountService: AccountService, ) { this.authRequestPushNotification$ = this.authRequestPushNotificationSubject.asObservable(); this.adminLoginApproved$ = this.adminLoginApprovedSubject.asObservable(); @@ -124,15 +127,19 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { approve: boolean, authRequest: AuthRequestResponse, ): Promise { + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + if (!authRequest.id) { throw new Error("Auth request has no id"); } if (!authRequest.publicKey) { throw new Error("Auth request has no public key"); } + if (activeUserId == null) { + throw new Error("User ID is required"); + } const pubKey = Utils.fromB64ToArray(authRequest.publicKey); - - const keyToEncrypt = await this.keyService.getUserKey(); + const keyToEncrypt = await firstValueFrom(this.keyService.userKey$(activeUserId)); const encryptedKey = await this.encryptService.encapsulateKeyUnsigned(keyToEncrypt, pubKey); const response = new PasswordlessAuthRequest( diff --git a/libs/common/src/admin-console/enums/policy-type.enum.ts b/libs/common/src/admin-console/enums/policy-type.enum.ts index a4a860a2f3f..7c06bc41a66 100644 --- a/libs/common/src/admin-console/enums/policy-type.enum.ts +++ b/libs/common/src/admin-console/enums/policy-type.enum.ts @@ -17,5 +17,6 @@ export enum PolicyType { FreeFamiliesSponsorshipPolicy = 13, // Disables free families plan for organization RemoveUnlockWithPin = 14, // Do not allow members to unlock their account with a PIN. RestrictedItemTypes = 15, // Restricts item types that can be created within an organization + UriMatchDefaults = 16, // Sets the default URI matching strategy for all users within an organization AutotypeDefaultSetting = 17, // Sets the default autotype setting for desktop app } diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts index d5b787d69f0..7e6e0d53f57 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts @@ -1,5 +1,5 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; +import { BehaviorSubject, of } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports @@ -103,7 +103,7 @@ describe("PasswordResetEnrollmentServiceImplementation", () => { }; activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "userId" as UserId })); - keyService.getUserKey.mockResolvedValue({ key: "key" } as any); + keyService.userKey$.mockReturnValue(of({ key: "key" } as any)); encryptService.encapsulateKeyUnsigned.mockResolvedValue(encryptedKey as any); await service.enroll("orgId"); diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts index f491d7d5eb0..55644009f16 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports @@ -8,9 +8,11 @@ import { OrganizationUserApiService, OrganizationUserResetPasswordEnrollmentRequest, } from "@bitwarden/admin-console/common"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports import { KeyService } from "@bitwarden/key-management"; +import { UserId } from "@bitwarden/user-core"; import { OrganizationApiServiceAbstraction } from "../../admin-console/abstractions/organization/organization-api.service.abstraction"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; @@ -43,7 +45,7 @@ export class PasswordResetEnrollmentServiceImplementation async enroll(organizationId: string): Promise; async enroll(organizationId: string, userId: string, userKey: UserKey): Promise; - async enroll(organizationId: string, userId?: string, userKey?: UserKey): Promise { + async enroll(organizationId: string, activeUserId?: string, userKey?: UserKey): Promise { const orgKeyResponse = await this.organizationApiService.getKeys(organizationId); if (orgKeyResponse == null) { throw new Error(this.i18nService.t("resetPasswordOrgKeysError")); @@ -51,9 +53,12 @@ export class PasswordResetEnrollmentServiceImplementation const orgPublicKey = Utils.fromB64ToArray(orgKeyResponse.publicKey); - userId = - userId ?? (await firstValueFrom(this.accountService.activeAccount$.pipe(map((a) => a?.id)))); - userKey = userKey ?? (await this.keyService.getUserKey(userId)); + activeUserId = + activeUserId ?? (await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId))); + if (activeUserId == null) { + throw new Error("User ID is required"); + } + userKey = userKey ?? (await firstValueFrom(this.keyService.userKey$(activeUserId as UserId))); // RSA Encrypt user's userKey.key with organization public key const encryptedKey = await this.encryptService.encapsulateKeyUnsigned(userKey, orgPublicKey); @@ -62,7 +67,7 @@ export class PasswordResetEnrollmentServiceImplementation await this.organizationUserApiService.putOrganizationUserResetPasswordEnrollment( organizationId, - userId, + activeUserId, resetRequest, ); } diff --git a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts index b8a9a85ed0a..790c134398c 100644 --- a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts +++ b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts @@ -19,8 +19,8 @@ import { import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; import { InternalMasterPasswordServiceAbstraction } from "../../../key-management/master-password/abstractions/master-password.service.abstraction"; +import { PinLockType } from "../../../key-management/pin/pin-lock-type"; import { PinServiceAbstraction } from "../../../key-management/pin/pin.service.abstraction"; -import { PinLockType } from "../../../key-management/pin/pin.service.implementation"; import { VaultTimeoutSettingsService } from "../../../key-management/vault-timeout"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { HashPurpose } from "../../../platform/enums"; diff --git a/libs/common/src/autofill/services/domain-settings.service.spec.ts b/libs/common/src/autofill/services/domain-settings.service.spec.ts index 12a34b70913..53cf72d8e73 100644 --- a/libs/common/src/autofill/services/domain-settings.service.spec.ts +++ b/libs/common/src/autofill/services/domain-settings.service.spec.ts @@ -1,5 +1,8 @@ +import { mock } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; + import { FakeStateProvider, FakeAccountService, mockAccountServiceWith } from "../../../spec"; import { Utils } from "../../platform/misc/utils"; import { UserId } from "../../types/guid"; @@ -10,6 +13,7 @@ describe("DefaultDomainSettingsService", () => { let domainSettingsService: DomainSettingsService; const mockUserId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); + const policyService = mock(); const fakeStateProvider: FakeStateProvider = new FakeStateProvider(accountService); const mockEquivalentDomains = [ @@ -19,7 +23,11 @@ describe("DefaultDomainSettingsService", () => { ]; beforeEach(() => { - domainSettingsService = new DefaultDomainSettingsService(fakeStateProvider); + domainSettingsService = new DefaultDomainSettingsService( + fakeStateProvider, + policyService, + accountService, + ); jest.spyOn(domainSettingsService, "getUrlEquivalentDomains"); domainSettingsService.equivalentDomains$ = of(mockEquivalentDomains); diff --git a/libs/common/src/autofill/services/domain-settings.service.ts b/libs/common/src/autofill/services/domain-settings.service.ts index bc86f9b4d64..d6ab8851ad7 100644 --- a/libs/common/src/autofill/services/domain-settings.service.ts +++ b/libs/common/src/autofill/services/domain-settings.service.ts @@ -1,6 +1,12 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { map, Observable } from "rxjs"; +import { combineLatest, map, Observable, switchMap, shareReplay } from "rxjs"; + +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums/policy-type.enum"; +import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { NeverDomains, @@ -87,6 +93,18 @@ export abstract class DomainSettingsService { defaultUriMatchStrategy$: Observable; setDefaultUriMatchStrategy: (newValue: UriMatchStrategySetting) => Promise; + /** + * Org policy value for default for URI-matching + * strategies. Can be overridden by cipher-specific settings. + */ + defaultUriMatchStrategyPolicy$: Observable; + + /** + * Resolved (concerning user setting, org policy, etc) default for URI-matching + * strategies. Can be overridden by cipher-specific settings. + */ + resolvedDefaultUriMatchStrategy$: Observable; + /** * Helper function for the common resolution of a given URL against equivalent domains */ @@ -109,7 +127,15 @@ export class DefaultDomainSettingsService implements DomainSettingsService { private defaultUriMatchStrategyState: ActiveUserState; readonly defaultUriMatchStrategy$: Observable; - constructor(private stateProvider: StateProvider) { + readonly defaultUriMatchStrategyPolicy$: Observable; + + readonly resolvedDefaultUriMatchStrategy$: Observable; + + constructor( + private stateProvider: StateProvider, + private policyService: PolicyService, + private accountService: AccountService, + ) { this.showFaviconsState = this.stateProvider.getGlobal(SHOW_FAVICONS); this.showFavicons$ = this.showFaviconsState.state$.pipe(map((x) => x ?? true)); @@ -129,6 +155,31 @@ export class DefaultDomainSettingsService implements DomainSettingsService { this.defaultUriMatchStrategy$ = this.defaultUriMatchStrategyState.state$.pipe( map((x) => x ?? UriMatchStrategy.Domain), ); + + this.defaultUriMatchStrategyPolicy$ = this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.policyService.policiesByType$(PolicyType.UriMatchDefaults, userId), + ), + getFirstPolicy, + map((policy) => { + if (!policy?.enabled || policy?.data == null) { + return null; + } + const data = policy.data?.defaultUriMatchStrategy; + // Validate that data is a valid UriMatchStrategy value + return Object.values(UriMatchStrategy).includes(data) ? data : null; + }), + shareReplay({ bufferSize: 1, refCount: true }), + ); + + this.resolvedDefaultUriMatchStrategy$ = combineLatest([ + this.defaultUriMatchStrategy$, + this.defaultUriMatchStrategyPolicy$, + ]).pipe( + map(([userSettingValue, policySettingValue]) => policySettingValue || userSettingValue), + shareReplay({ bufferSize: 1, refCount: true }), + ); } async setShowFavicons(newValue: boolean): Promise { diff --git a/libs/common/src/key-management/master-password/services/master-password.service.spec.ts b/libs/common/src/key-management/master-password/services/master-password.service.spec.ts index f5fee3be4c5..e3d0bf51d67 100644 --- a/libs/common/src/key-management/master-password/services/master-password.service.spec.ts +++ b/libs/common/src/key-management/master-password/services/master-password.service.spec.ts @@ -6,22 +6,22 @@ import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk- import { Utils } from "@bitwarden/common/platform/misc/utils"; // eslint-disable-next-line no-restricted-imports import { Argon2KdfConfig, KdfConfig, KdfType, PBKDF2KdfConfig } from "@bitwarden/key-management"; +import { PureCrypto } from "@bitwarden/sdk-internal"; import { FakeAccountService, FakeStateProvider, + makeEncString, makeSymmetricCryptoKey, mockAccountServiceWith, } from "../../../../spec"; import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; import { LogService } from "../../../platform/abstractions/log.service"; -import { StateService } from "../../../platform/abstractions/state.service"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { UserId } from "../../../types/guid"; import { MasterKey, UserKey } from "../../../types/key"; import { KeyGenerationService } from "../../crypto"; import { CryptoFunctionService } from "../../crypto/abstractions/crypto-function.service"; -import { EncryptService } from "../../crypto/abstractions/encrypt.service"; import { EncString } from "../../crypto/models/enc-string"; import { MasterKeyWrappedUserKey, @@ -31,6 +31,7 @@ import { import { FORCE_SET_PASSWORD_REASON, + MASTER_KEY, MASTER_KEY_ENCRYPTED_USER_KEY, MASTER_PASSWORD_UNLOCK_KEY, MasterPasswordService, @@ -39,9 +40,7 @@ import { describe("MasterPasswordService", () => { let sut: MasterPasswordService; - let stateService: MockProxy; let keyGenerationService: MockProxy; - let encryptService: MockProxy; let logService: MockProxy; let cryptoFunctionService: MockProxy; let accountService: FakeAccountService; @@ -53,18 +52,12 @@ describe("MasterPasswordService", () => { const kdfArgon2: KdfConfig = new Argon2KdfConfig(4, 64, 3); const salt = "test@bitwarden.com" as MasterPasswordSalt; const userKey = makeSymmetricCryptoKey(64, 2) as UserKey; - const testUserKey: SymmetricCryptoKey = makeSymmetricCryptoKey(64, 1); - const testMasterKey: MasterKey = makeSymmetricCryptoKey(32, 2); - const testStretchedMasterKey: SymmetricCryptoKey = makeSymmetricCryptoKey(64, 3); const testMasterKeyEncryptedKey = "0.gbauOANURUHqvhLTDnva1A==|nSW+fPumiuTaDB/s12+JO88uemV6rhwRSR+YR1ZzGr5j6Ei3/h+XEli2Unpz652NlZ9NTuRpHxeOqkYYJtp7J+lPMoclgteXuAzUu9kqlRc="; - const testStretchedMasterKeyEncryptedKey = - "2.gbauOANURUHqvhLTDnva1A==|nSW+fPumiuTaDB/s12+JO88uemV6rhwRSR+YR1ZzGr5j6Ei3/h+XEli2Unpz652NlZ9NTuRpHxeOqkYYJtp7J+lPMoclgteXuAzUu9kqlRc=|DeUFkhIwgkGdZA08bDnDqMMNmZk21D+H5g8IostPKAY="; + const sdkLoadServiceReady = jest.fn(); beforeEach(() => { - stateService = mock(); keyGenerationService = mock(); - encryptService = mock(); logService = mock(); cryptoFunctionService = mock(); accountService = mockAccountServiceWith(userId); @@ -72,18 +65,18 @@ describe("MasterPasswordService", () => { sut = new MasterPasswordService( stateProvider, - stateService, keyGenerationService, - encryptService, logService, cryptoFunctionService, accountService, ); - encryptService.unwrapSymmetricKey.mockResolvedValue(makeSymmetricCryptoKey(64, 1)); keyGenerationService.stretchKey.mockResolvedValue(makeSymmetricCryptoKey(64, 3)); Object.defineProperty(SdkLoadService, "Ready", { - value: Promise.resolve(), + value: new Promise((resolve) => { + sdkLoadServiceReady(); + resolve(undefined); + }), configurable: true, }); }); @@ -159,41 +152,62 @@ describe("MasterPasswordService", () => { expect(state).toEqual(ForceSetPasswordReason.None); }); }); + describe("decryptUserKeyWithMasterKey", () => { - it("decrypts a userkey wrapped in AES256-CBC", async () => { - encryptService.unwrapSymmetricKey.mockResolvedValue(testUserKey); - await sut.decryptUserKeyWithMasterKey( - testMasterKey, + const masterKey = makeSymmetricCryptoKey(64, 0) as MasterKey; + const userKey = makeSymmetricCryptoKey(64, 1) as UserKey; + const masterKeyEncryptedUserKey = makeEncString("test-encrypted-user-key"); + + const decryptUserKeyWithMasterKeyMock = jest.spyOn( + PureCrypto, + "decrypt_user_key_with_master_key", + ); + + beforeEach(() => { + decryptUserKeyWithMasterKeyMock.mockReturnValue(userKey.toEncoded()); + }); + + it("successfully decrypts", async () => { + const decryptedUserKey = await sut.decryptUserKeyWithMasterKey( + masterKey, userId, - new EncString(testMasterKeyEncryptedKey), + masterKeyEncryptedUserKey, ); - expect(encryptService.unwrapSymmetricKey).toHaveBeenCalledWith( - new EncString(testMasterKeyEncryptedKey), - testMasterKey, + + expect(decryptedUserKey).toEqual(new SymmetricCryptoKey(userKey.toEncoded())); + expect(sdkLoadServiceReady).toHaveBeenCalled(); + expect(PureCrypto.decrypt_user_key_with_master_key).toHaveBeenCalledWith( + masterKeyEncryptedUserKey.toSdk(), + masterKey.toEncoded(), + ); + expect(sdkLoadServiceReady.mock.invocationCallOrder[0]).toBeLessThan( + decryptUserKeyWithMasterKeyMock.mock.invocationCallOrder[0], ); }); - it("decrypts a userkey wrapped in AES256-CBC-HMAC", async () => { - encryptService.unwrapSymmetricKey.mockResolvedValue(testUserKey); - keyGenerationService.stretchKey.mockResolvedValue(testStretchedMasterKey); - await sut.decryptUserKeyWithMasterKey( - testMasterKey, + + it("returns null when failed to decrypt", async () => { + decryptUserKeyWithMasterKeyMock.mockImplementation(() => { + throw new Error("Decryption failed"); + }); + + const decryptedUserKey = await sut.decryptUserKeyWithMasterKey( + masterKey, userId, - new EncString(testStretchedMasterKeyEncryptedKey), + masterKeyEncryptedUserKey, ); - expect(encryptService.unwrapSymmetricKey).toHaveBeenCalledWith( - new EncString(testStretchedMasterKeyEncryptedKey), - testStretchedMasterKey, - ); - expect(keyGenerationService.stretchKey).toHaveBeenCalledWith(testMasterKey); + expect(decryptedUserKey).toBeNull(); }); - it("returns null if failed to decrypt", async () => { - encryptService.unwrapSymmetricKey.mockRejectedValue(new Error("Decryption failed")); - const result = await sut.decryptUserKeyWithMasterKey( - testMasterKey, - userId, - new EncString(testStretchedMasterKeyEncryptedKey), - ); - expect(result).toBeNull(); + + it("returns error when master key is null", async () => { + stateProvider.singleUser.getFake(userId, MASTER_KEY).nextState(null); + + await expect( + sut.decryptUserKeyWithMasterKey( + null as unknown as MasterKey, + userId, + masterKeyEncryptedUserKey, + ), + ).rejects.toThrow("No master key found."); }); }); @@ -331,11 +345,11 @@ describe("MasterPasswordService", () => { it.each([kdfPBKDF2, kdfArgon2])( "sets the master password unlock data kdf %o in the state", async (kdfConfig) => { - const masterPasswordUnlockData = await sut.makeMasterPasswordUnlockData( - "test-password", - kdfConfig, + const masterKeyWrappedUserKey = makeEncString().toSdk() as MasterKeyWrappedUserKey; + const masterPasswordUnlockData = new MasterPasswordUnlockData( salt, - userKey, + kdfConfig, + masterKeyWrappedUserKey, ); await sut.setMasterPasswordUnlockData(masterPasswordUnlockData, userId); diff --git a/libs/common/src/key-management/master-password/services/master-password.service.ts b/libs/common/src/key-management/master-password/services/master-password.service.ts index 5cb6bb96a45..8012a9230e7 100644 --- a/libs/common/src/key-management/master-password/services/master-password.service.ts +++ b/libs/common/src/key-management/master-password/services/master-password.service.ts @@ -12,8 +12,6 @@ import { PureCrypto } from "@bitwarden/sdk-internal"; import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; import { LogService } from "../../../platform/abstractions/log.service"; -import { StateService } from "../../../platform/abstractions/state.service"; -import { EncryptionType } from "../../../platform/enums"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { MASTER_PASSWORD_DISK, @@ -26,7 +24,6 @@ import { UserId } from "../../../types/guid"; import { MasterKey, UserKey } from "../../../types/key"; import { KeyGenerationService } from "../../crypto"; import { CryptoFunctionService } from "../../crypto/abstractions/crypto-function.service"; -import { EncryptService } from "../../crypto/abstractions/encrypt.service"; import { EncryptedString, EncString } from "../../crypto/models/enc-string"; import { InternalMasterPasswordServiceAbstraction } from "../abstractions/master-password.service.abstraction"; import { @@ -38,7 +35,7 @@ import { } from "../types/master-password.types"; /** Memory since master key shouldn't be available on lock */ -const MASTER_KEY = new UserKeyDefinition(MASTER_PASSWORD_MEMORY, "masterKey", { +export const MASTER_KEY = new UserKeyDefinition(MASTER_PASSWORD_MEMORY, "masterKey", { deserializer: (masterKey) => SymmetricCryptoKey.fromJSON(masterKey) as MasterKey, clearOn: ["lock", "logout"], }); @@ -82,9 +79,7 @@ export const MASTER_PASSWORD_UNLOCK_KEY = new UserKeyDefinition; + + /** + * Gets the user's {@link PinLockType} + * @param userId The user's id + * @throws If the user id is not provided + */ + abstract getPinLockType(userId: UserId): Promise; + + /** + * Checks if a user is enrolled into PIN unlock + * @param userId The user's id + */ + abstract isPinSet(userId: UserId): Promise; + + /** + * Gets the user's PIN-protected UserKey envelope, either persistent or ephemeral based on the provided PinLockType + * @deprecated - This is not a public API. DO NOT USE IT + * @param userId The user's id + * @param pinLockType User's {@link PinLockType}. + * @throws if the user id is not provided + * @throws if the pin lock type is not persistent or ephemeral + */ + abstract getPinProtectedUserKeyEnvelope( + userId: UserId, + pinLockType: PinLockType, + ): Promise; + + /** + * Gets the user's legacy PIN-protected UserKey + * @deprecated Use {@link getPinProtectedUserKeyEnvelope} instead. Only for migration support. + * @param userId The user's id + * @throws If the user id is not provided + */ + abstract getLegacyPinKeyEncryptedUserKeyPersistent(userId: UserId): Promise; + + /** + * Sets the PIN state for the user + * @deprecated - This is not a public API. DO NOT USE IT + * @param userId The user's id + * @param pinProtectedUserKeyEnvelope The user's PIN-protected UserKey envelope + * @param userKeyEncryptedPin The user's UserKey-encrypted PIN + * @param pinLockType The user's PinLockType + * @throws If the user id, pinProtectedUserKeyEnvelope, or pinLockType is not provided + * @throws If the pin lock type is not persistent or ephemeral + */ + abstract setPinState( + userId: UserId, + pinProtectedUserKeyEnvelope: PasswordProtectedKeyEnvelope, + userKeyEncryptedPin: EncryptedString, + pinLockType: PinLockType, + ): Promise; + + /** + * Clears all PIN state for the user, both persistent and ephemeral + * @param userId The user's id + * @throws If the user id is not provided + */ + abstract clearPinState(userId: UserId): Promise; + + /** + * Clears only the user's ephemeral PIN. Persistent PIN state and UserKey wrapped PIN remains unchanged. + * @param userId The user's id + * @throws If the user id is not provided + */ + abstract clearEphemeralPinState(userId: UserId): Promise; +} diff --git a/libs/common/src/key-management/pin/pin-state.service.implementation.ts b/libs/common/src/key-management/pin/pin-state.service.implementation.ts new file mode 100644 index 00000000000..0bf6cb60fb0 --- /dev/null +++ b/libs/common/src/key-management/pin/pin-state.service.implementation.ts @@ -0,0 +1,129 @@ +import { firstValueFrom, map, Observable } from "rxjs"; + +import { PasswordProtectedKeyEnvelope } from "@bitwarden/sdk-internal"; +import { StateProvider } from "@bitwarden/state"; +import { UserId } from "@bitwarden/user-core"; + +import { assertNonNullish } from "../../auth/utils"; +import { EncryptedString, EncString } from "../crypto/models/enc-string"; + +import { PinLockType } from "./pin-lock-type"; +import { PinStateServiceAbstraction } from "./pin-state.service.abstraction"; +import { + PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, + PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, + USER_KEY_ENCRYPTED_PIN, + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, +} from "./pin.state"; + +export class PinStateService implements PinStateServiceAbstraction { + constructor(private stateProvider: StateProvider) {} + + userKeyEncryptedPin$(userId: UserId): Observable { + assertNonNullish(userId, "userId"); + + return this.stateProvider + .getUserState$(USER_KEY_ENCRYPTED_PIN, userId) + .pipe(map((value) => (value ? new EncString(value) : null))); + } + + async isPinSet(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + return (await this.getPinLockType(userId)) !== "DISABLED"; + } + + async getPinLockType(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + + const isPersistentPinSet = + (await this.getPinProtectedUserKeyEnvelope(userId, "PERSISTENT")) != null || + // Deprecated + (await this.getLegacyPinKeyEncryptedUserKeyPersistent(userId)) != null; + const isPinSet = + (await firstValueFrom(this.stateProvider.getUserState$(USER_KEY_ENCRYPTED_PIN, userId))) != + null; + + if (isPersistentPinSet) { + return "PERSISTENT"; + } else if (isPinSet) { + return "EPHEMERAL"; + } else { + return "DISABLED"; + } + } + + async getPinProtectedUserKeyEnvelope( + userId: UserId, + pinLockType: PinLockType, + ): Promise { + assertNonNullish(userId, "userId"); + + if (pinLockType === "EPHEMERAL") { + return await firstValueFrom( + this.stateProvider.getUserState$(PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, userId), + ); + } else if (pinLockType === "PERSISTENT") { + return await firstValueFrom( + this.stateProvider.getUserState$(PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, userId), + ); + } else { + throw new Error(`Unsupported PinLockType: ${pinLockType}`); + } + } + + async getLegacyPinKeyEncryptedUserKeyPersistent(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + + return await firstValueFrom( + this.stateProvider + .getUserState$(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, userId) + .pipe(map((value) => (value ? new EncString(value) : null))), + ); + } + + async setPinState( + userId: UserId, + pinProtectedUserKeyEnvelope: PasswordProtectedKeyEnvelope, + userKeyEncryptedPin: EncryptedString, + pinLockType: PinLockType, + ): Promise { + assertNonNullish(userId, "userId"); + assertNonNullish(pinProtectedUserKeyEnvelope, "pinProtectedUserKeyEnvelope"); + assertNonNullish(pinLockType, "pinLockType"); + + if (pinLockType === "EPHEMERAL") { + await this.stateProvider.setUserState( + PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, + pinProtectedUserKeyEnvelope, + userId, + ); + } else if (pinLockType === "PERSISTENT") { + await this.stateProvider.setUserState( + PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, + pinProtectedUserKeyEnvelope, + userId, + ); + } else { + throw new Error(`Cannot set up PIN with pin lock type ${pinLockType}`); + } + + await this.stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, userKeyEncryptedPin, userId); + } + + async clearPinState(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + + await this.stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, null, userId); + await this.stateProvider.setUserState(PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, null, userId); + await this.stateProvider.setUserState(PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, null, userId); + + // Note: This can be deleted after sufficiently many PINs are migrated and the state is removed. + await this.stateProvider.setUserState(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, null, userId); + } + + async clearEphemeralPinState(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + + await this.stateProvider.setUserState(PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, null, userId); + } +} diff --git a/libs/common/src/key-management/pin/pin-state.service.spec.ts b/libs/common/src/key-management/pin/pin-state.service.spec.ts new file mode 100644 index 00000000000..be85a15e6d3 --- /dev/null +++ b/libs/common/src/key-management/pin/pin-state.service.spec.ts @@ -0,0 +1,727 @@ +import { firstValueFrom } from "rxjs"; + +import { PasswordProtectedKeyEnvelope } from "@bitwarden/sdk-internal"; + +import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../spec"; +import { Utils } from "../../platform/misc/utils"; +import { UserId } from "../../types/guid"; +import { EncryptedString } from "../crypto/models/enc-string"; + +import { PinLockType } from "./pin-lock-type"; +import { PinStateService } from "./pin-state.service.implementation"; +import { + USER_KEY_ENCRYPTED_PIN, + PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL, + PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, +} from "./pin.state"; + +describe("PinStateService", () => { + let sut: PinStateService; + + let accountService: FakeAccountService; + let stateProvider: FakeStateProvider; + + const mockUserId = Utils.newGuid() as UserId; + const mockUserEmail = "user@example.com"; + const mockUserKeyEncryptedPin = "userKeyEncryptedPin" as EncryptedString; + const mockEphemeralEnvelope = "mock-ephemeral-envelope" as PasswordProtectedKeyEnvelope; + const mockPersistentEnvelope = "mock-persistent-envelope" as PasswordProtectedKeyEnvelope; + + beforeEach(() => { + accountService = mockAccountServiceWith(mockUserId, { email: mockUserEmail }); + stateProvider = new FakeStateProvider(accountService); + + sut = new PinStateService(stateProvider); + }); + + it("should instantiate the PinStateService", () => { + expect(sut).not.toBeFalsy(); + }); + + describe("userKeyWrappedPin$", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([null, undefined])("throws if userId is %p", async (userId) => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act & Assert + expect(() => sut.userKeyEncryptedPin$(userId as any)).toThrow("userId is null or undefined."); + }); + + test.each([null, undefined])("emits null if userKeyEncryptedPin is nullish", async (value) => { + // Arrange + await stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, value, mockUserId); + + // Act + const result = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + + // Assert + expect(result).toBe(null); + }); + + it("emits the userKeyEncryptedPin when available", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act + const result = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + + // Assert + expect(result?.encryptedString).toEqual(mockUserKeyEncryptedPin); + }); + + it("emits null when userKeyEncryptedPin isn't available", async () => { + // Arrange - don't set any state + + // Act + const result = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + + // Assert + expect(result).toBeNull(); + }); + }); + + describe("getPinLockType()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should throw an error if userId is null", async () => { + // Act & Assert + await expect(sut.getPinLockType(null as any)).rejects.toThrow("userId"); + }); + + it("should return 'PERSISTENT' if a pin protected user key (persistent) is found", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act + const result = await sut.getPinLockType(mockUserId); + + // Assert + expect(result).toBe("PERSISTENT"); + }); + + it("should return 'PERSISTENT' if a legacy pin key encrypted user key (persistent) is found", async () => { + // Arrange + await stateProvider.setUserState( + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, + mockUserKeyEncryptedPin, + mockUserId, + ); + + // Act + const result = await sut.getPinLockType(mockUserId); + + // Assert + expect(result).toBe("PERSISTENT"); + }); + + it("should return 'EPHEMERAL' if only user key encrypted pin is found", async () => { + // Arrange + await stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, mockUserKeyEncryptedPin, mockUserId); + + // Act + const result = await sut.getPinLockType(mockUserId); + + // Assert + expect(result).toBe("EPHEMERAL"); + }); + + it("should return 'DISABLED' if no PIN-related state is found", async () => { + // Arrange - don't set any PIN-related state + + // Act + const result = await sut.getPinLockType(mockUserId); + + // Assert + expect(result).toBe("DISABLED"); + }); + + it("should return 'DISABLED' if all PIN-related state is null", async () => { + // Arrange - explicitly set all state to null + await stateProvider.setUserState( + PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT, + null, + mockUserId, + ); + await stateProvider.setUserState(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, null, mockUserId); + await stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, null, mockUserId); + + // Act + const result = await sut.getPinLockType(mockUserId); + + // Assert + expect(result).toBe("DISABLED"); + }); + }); + + describe("getPinProtectedUserKeyEnvelope()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([ + [null, "PERSISTENT" as PinLockType], + [undefined, "PERSISTENT" as PinLockType], + [null, "EPHEMERAL" as PinLockType], + [undefined, "EPHEMERAL" as PinLockType], + [null, "DISABLED" as PinLockType], + [undefined, "DISABLED" as PinLockType], + ])("throws if userId is %p with pinLockType %s", async (userId, pinLockType: PinLockType) => { + // Using unnecesary switch so we can have exhaustive check on PinLockType + switch (pinLockType) { + case "PERSISTENT": + return await expect( + sut.getPinProtectedUserKeyEnvelope(userId as any, pinLockType), + ).rejects.toThrow("userId is null or undefined."); + case "EPHEMERAL": + return await expect( + sut.getPinProtectedUserKeyEnvelope(userId as any, pinLockType), + ).rejects.toThrow("userId is null or undefined."); + case "DISABLED": + return await expect( + sut.getPinProtectedUserKeyEnvelope(userId as any, pinLockType), + ).rejects.toThrow("userId is null or undefined."); + default: { + // This is the exhaustive check, will cause a compile error if a PinLockType is not handled above + const _exhaustiveCheck: never = pinLockType; + return _exhaustiveCheck; + } + } + }); + + it("should throw error for unsupported pinLockType", async () => { + // Act & Assert + await expect( + sut.getPinProtectedUserKeyEnvelope(mockUserId, "DISABLED" as any), + ).rejects.toThrow("Unsupported PinLockType: DISABLED"); + }); + + test.each([["PERSISTENT" as PinLockType], ["EPHEMERAL" as PinLockType]])( + "should return %s envelope when pinLockType is %s", + async (pinLockType: PinLockType) => { + // Arrange + const mockEnvelope = + pinLockType === "PERSISTENT" ? mockPersistentEnvelope : mockEphemeralEnvelope; + + await sut.setPinState(mockUserId, mockEnvelope, mockUserKeyEncryptedPin, pinLockType); + + // Act + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, pinLockType); + + // Assert + expect(result).toBe(mockEnvelope); + }, + ); + + test.each([["PERSISTENT" as PinLockType], ["EPHEMERAL" as PinLockType]])( + "should return null when %s envelope is not set", + async (pinLockType: PinLockType) => { + // Arrange - don't set any state + + // Act + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, pinLockType); + + // Assert + expect(result).toBeNull(); + }, + ); + + test.each([ + ["PERSISTENT" as PinLockType, PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT], + ["EPHEMERAL" as PinLockType, PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL], + ])( + "should return null when %s envelope is explicitly set to null", + async (pinLockType, keyDefinition) => { + // Arrange + await stateProvider.setUserState(keyDefinition, null, mockUserId); + + // Act + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, pinLockType); + + // Assert + expect(result).toBeNull(); + }, + ); + + it("should not cross-contaminate PERSISTENT and EPHEMERAL envelopes", async () => { + // Arrange - set both envelopes to different values + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + + // Act + const persistentResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT"); + const ephemeralResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL"); + + // Assert + expect(persistentResult).toBe(mockPersistentEnvelope); + expect(ephemeralResult).toBe(mockEphemeralEnvelope); + expect(persistentResult).not.toBe(ephemeralResult); + }); + }); + + describe("getLegacyPinKeyEncryptedUserKeyPersistent()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([null, undefined])("throws if userId is %p", async (userId) => { + // Act & Assert + await expect(() => + sut.getLegacyPinKeyEncryptedUserKeyPersistent(userId as any), + ).rejects.toThrow("userId is null or undefined."); + }); + + it("should return EncString when legacy key is set", async () => { + // Arrange + await stateProvider.setUserState( + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, + mockUserKeyEncryptedPin, + mockUserId, + ); + + // Act + const result = await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId); + + // Assert + expect(result?.encryptedString).toEqual(mockUserKeyEncryptedPin); + }); + + test.each([null, undefined])("should return null when legacy key is %p", async (value) => { + // Arrange + await stateProvider.setUserState(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, value, mockUserId); + + // Act + const result = await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId); + + // Assert + expect(result).toBeNull(); + }); + }); + + describe("setPinState()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([[null], [undefined]])("throws if userId is %p", async (userId) => { + // Act & Assert + await expect( + sut.setPinState( + userId as any, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ), + ).rejects.toThrow(`userId is null or undefined.`); + }); + + test.each([[null], [undefined]])( + "throws if pinProtectedUserKeyEnvelope is %p", + async (envelope) => { + // Act & Assert + await expect( + sut.setPinState(mockUserId, envelope as any, mockUserKeyEncryptedPin, "PERSISTENT"), + ).rejects.toThrow(`pinProtectedUserKeyEnvelope is null or undefined.`); + }, + ); + + test.each([[null], [undefined]])("throws if pinLockType is %p", async (pinLockType) => { + // Act & Assert + await expect( + sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + pinLockType as any, + ), + ).rejects.toThrow(`pinLockType is null or undefined.`); + }); + + it("should throw error for unsupported pinLockType", async () => { + // Act & Assert + await expect( + sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "DISABLED" as PinLockType, + ), + ).rejects.toThrow("Cannot set up PIN with pin lock type DISABLED"); + }); + + test.each([["PERSISTENT" as PinLockType], ["EPHEMERAL" as PinLockType]])( + "should set %s PIN state correctly", + async (pinLockType: PinLockType) => { + // Arrange + const mockEnvelope = + pinLockType === "PERSISTENT" ? mockPersistentEnvelope : mockEphemeralEnvelope; + + // Act + await sut.setPinState(mockUserId, mockEnvelope, mockUserKeyEncryptedPin, pinLockType); + + // Assert - verify the correct envelope was set + const envelopeResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, pinLockType); + expect(envelopeResult).toBe(mockEnvelope); + + // Assert - verify the user key encrypted PIN was set + const pinResult = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + expect(pinResult?.encryptedString).toEqual(mockUserKeyEncryptedPin); + }, + ); + }); + + describe("clearPinState", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([null, undefined])("throws if userId is %p", async (userId) => { + // Act & Assert + await expect(sut.clearPinState(userId as any)).rejects.toThrow( + `userId is null or undefined.`, + ); + }); + + it("clears UserKey encrypted PIN", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act + await sut.clearPinState(mockUserId); + + // Assert + const result = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + expect(result).toBeNull(); + }); + + it("clears ephemeral PIN protected user key envelope", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + + // Act + await sut.clearPinState(mockUserId); + + // Assert + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL"); + expect(result).toBeNull(); + }); + + it("clears persistent PIN protected user key envelope", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act + await sut.clearPinState(mockUserId); + + // Assert + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT"); + expect(result).toBeNull(); + }); + + it("clears legacy PIN key encrypted user key persistent", async () => { + // Arrange + await stateProvider.setUserState( + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, + mockUserKeyEncryptedPin, + mockUserId, + ); + + // Act + await sut.clearPinState(mockUserId); + + // Assert + const result = await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId); + expect(result).toBeNull(); + }); + + it("clears all PIN state when all types are set", async () => { + // Arrange - set up all possible PIN state + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + await stateProvider.setUserState( + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, + mockUserKeyEncryptedPin, + mockUserId, + ); + + // Verify all state is set before clearing + expect(await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId))).not.toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL")).not.toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT")).not.toBeNull(); + expect(await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId)).not.toBeNull(); + + // Act + await sut.clearPinState(mockUserId); + + // Assert - all PIN state should be cleared + expect(await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId))).toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL")).toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT")).toBeNull(); + expect(await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId)).toBeNull(); + }); + + it("results in PIN lock type DISABLED after clearing", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Verify PIN is set up before clearing + expect(await sut.getPinLockType(mockUserId)).toBe("PERSISTENT"); + + // Act + await sut.clearPinState(mockUserId); + + // Assert + expect(await sut.getPinLockType(mockUserId)).toBe("DISABLED"); + }); + + it("handles clearing when no PIN state exists", async () => { + // Arrange - no PIN state set up + + // Act & Assert - should not throw + await expect(sut.clearPinState(mockUserId)).resolves.not.toThrow(); + + // Verify state remains cleared + expect(await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId))).toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL")).toBeNull(); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT")).toBeNull(); + expect(await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId)).toBeNull(); + expect(await sut.getPinLockType(mockUserId)).toBe("DISABLED"); + }); + }); + + describe("clearEphemeralPinState", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test.each([null, undefined])("throws if userId is %p", async (userId) => { + // Act & Assert + await expect(sut.clearEphemeralPinState(userId as any)).rejects.toThrow( + `userId is null or undefined.`, + ); + }); + + it("clears only ephemeral PIN protected user key envelope", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert + const result = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL"); + expect(result).toBeNull(); + }); + + it("does not clear user key encrypted PIN", async () => { + // Arrange + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert - user key encrypted PIN should still be present + const pinResult = await firstValueFrom(sut.userKeyEncryptedPin$(mockUserId)); + expect(pinResult?.encryptedString).toEqual(mockUserKeyEncryptedPin); + }); + + it("does not clear persistent PIN protected user key envelope", async () => { + // Arrange - set up both ephemeral and persistent state + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert - persistent envelope should still be present + const persistentResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT"); + expect(persistentResult).toBe(mockPersistentEnvelope); + + // Assert - ephemeral envelope should be cleared + const ephemeralResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL"); + expect(ephemeralResult).toBeNull(); + }); + + it("does not clear legacy PIN key encrypted user key persistent", async () => { + // Arrange - set up ephemeral state and legacy state + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + await stateProvider.setUserState( + PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, + mockUserKeyEncryptedPin, + mockUserId, + ); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert - legacy PIN should still be present + const legacyResult = await sut.getLegacyPinKeyEncryptedUserKeyPersistent(mockUserId); + expect(legacyResult?.encryptedString).toEqual(mockUserKeyEncryptedPin); + + // Assert - ephemeral envelope should be cleared + const ephemeralResult = await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL"); + expect(ephemeralResult).toBeNull(); + }); + + it("changes PIN lock type from EPHEMERAL to DISABLED when no other PIN state exists", async () => { + // Arrange - set up only ephemeral PIN state + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + + // Verify PIN lock type is EPHEMERAL before clearing + expect(await sut.getPinLockType(mockUserId)).toBe("EPHEMERAL"); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert - PIN lock type should be DISABLED since no PIN envelope exists + // Note: USER_KEY_ENCRYPTED_PIN still exists but without an envelope, it's effectively disabled + expect(await sut.getPinLockType(mockUserId)).toBe("EPHEMERAL"); + }); + + it("keeps PIN lock type as PERSISTENT when persistent state remains", async () => { + // Arrange - set up both ephemeral and persistent state + await sut.setPinState( + mockUserId, + mockEphemeralEnvelope, + mockUserKeyEncryptedPin, + "EPHEMERAL", + ); + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Verify PIN lock type is PERSISTENT before clearing (persistent takes precedence) + expect(await sut.getPinLockType(mockUserId)).toBe("PERSISTENT"); + + // Act + await sut.clearEphemeralPinState(mockUserId); + + // Assert - PIN lock type should remain PERSISTENT + expect(await sut.getPinLockType(mockUserId)).toBe("PERSISTENT"); + }); + + it("handles clearing when no ephemeral PIN state exists", async () => { + // Arrange - no PIN state set up + + // Act & Assert - should not throw + await expect(sut.clearEphemeralPinState(mockUserId)).resolves.not.toThrow(); + + // Verify state remains cleared + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL")).toBeNull(); + }); + + it("handles clearing when only persistent PIN state exists", async () => { + // Arrange - set up only persistent state + await sut.setPinState( + mockUserId, + mockPersistentEnvelope, + mockUserKeyEncryptedPin, + "PERSISTENT", + ); + + // Act & Assert - should not throw + await expect(sut.clearEphemeralPinState(mockUserId)).resolves.not.toThrow(); + + // Assert - persistent state should remain unchanged + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "PERSISTENT")).toBe( + mockPersistentEnvelope, + ); + expect(await sut.getPinProtectedUserKeyEnvelope(mockUserId, "EPHEMERAL")).toBeNull(); + expect(await sut.getPinLockType(mockUserId)).toBe("PERSISTENT"); + }); + }); +}); diff --git a/libs/common/src/key-management/pin/pin.service.abstraction.ts b/libs/common/src/key-management/pin/pin.service.abstraction.ts index 33f369cc50f..b242320c06e 100644 --- a/libs/common/src/key-management/pin/pin.service.abstraction.ts +++ b/libs/common/src/key-management/pin/pin.service.abstraction.ts @@ -1,128 +1,78 @@ // eslint-disable-next-line no-restricted-imports import { KdfConfig } from "@bitwarden/key-management"; -import { EncString } from "../../key-management/crypto/models/enc-string"; import { UserId } from "../../types/guid"; import { PinKey, UserKey } from "../../types/key"; -import { PinLockType } from "./pin.service.implementation"; +import { PinLockType } from "./pin-lock-type"; /** - * The PinService is used for PIN-based unlocks. Below is a very basic overview of the PIN flow: + * The PinService provides PIN-based unlock functionality for user accounts. * - * -- Setting the PIN via {@link SetPinComponent} -- + * ## Overview * - * When the user submits the setPinForm: - - * 1. We encrypt the PIN with the UserKey and store it on disk as `userKeyEncryptedPin`. - * - * 2. We create a PinKey from the PIN, and then use that PinKey to encrypt the UserKey, resulting in - * a `pinKeyEncryptedUserKey`, which can be stored in one of two ways depending on what the user selects - * for the `requireMasterPasswordOnClientReset` checkbox. - * - * If `requireMasterPasswordOnClientReset` is: - * - TRUE, store in memory as `pinKeyEncryptedUserKeyEphemeral` (does NOT persist through a client reset) - * - FALSE, store on disk as `pinKeyEncryptedUserKeyPersistent` (persists through a client reset) - * - * -- Unlocking with the PIN via {@link LockComponent} -- - * - * When the user enters their PIN, we decrypt their UserKey with the PIN and set that UserKey to state. + * - The PIN is used to unlock the user's UserKey + * - PIN state and key material are managed using secure envelopes and encrypted state, with support for both ephemeral (in-memory) and persistent (on-disk) storage. + * When stored ephemerally, PIN unlock is only available after first unlock. When stored persistent, PIN unlock is available before first unlock. + * - The PIN is also stored, encrypted with the user's UserKey. After first unlock, the PIN can be retrieved. */ export abstract class PinServiceAbstraction { /** - * Gets the persistent (stored on disk) version of the UserKey, encrypted by the PinKey. + * Gets the user's PIN + * @throws If the user is locked + * @returns The user's PIN */ - abstract getPinKeyEncryptedUserKeyPersistent: (userId: UserId) => Promise; + abstract getPin(userId: UserId): Promise; /** - * Clears the persistent (stored on disk) version of the UserKey, encrypted by the PinKey. + * Setup pin unlock + * @throws If the provided user is locked */ - abstract clearPinKeyEncryptedUserKeyPersistent(userId: UserId): Promise; + abstract setPin(pin: string, pinLockType: PinLockType, userId: UserId): Promise; /** - * Gets the ephemeral (stored in memory) version of the UserKey, encrypted by the PinKey. + * Clear pin unlock */ - abstract getPinKeyEncryptedUserKeyEphemeral: (userId: UserId) => Promise; - - /** - * Clears the ephemeral (stored in memory) version of the UserKey, encrypted by the PinKey. - */ - abstract clearPinKeyEncryptedUserKeyEphemeral(userId: UserId): Promise; - - /** - * Creates a pinKeyEncryptedUserKey from the provided PIN and UserKey. - */ - abstract createPinKeyEncryptedUserKey: ( - pin: string, - userKey: UserKey, - userId: UserId, - ) => Promise; - - /** - * Stores the UserKey, encrypted by the PinKey. - * @param storeEphemeralVersion If true, stores an ephemeral version via the private {@link setPinKeyEncryptedUserKeyEphemeral} method. - * If false, stores a persistent version via the private {@link setPinKeyEncryptedUserKeyPersistent} method. - */ - abstract storePinKeyEncryptedUserKey: ( - pinKeyEncryptedUserKey: EncString, - storeEphemeralVersion: boolean, - userId: UserId, - ) => Promise; - - /** - * Gets the user's PIN, encrypted by the UserKey. - */ - abstract getUserKeyEncryptedPin: (userId: UserId) => Promise; - - /** - * Sets the user's PIN, encrypted by the UserKey. - */ - abstract setUserKeyEncryptedPin: ( - userKeyEncryptedPin: EncString, - userId: UserId, - ) => Promise; - - /** - * Creates a PIN, encrypted by the UserKey. - */ - abstract createUserKeyEncryptedPin: (pin: string, userKey: UserKey) => Promise; - - /** - * Clears the user's PIN, encrypted by the UserKey. - */ - abstract clearUserKeyEncryptedPin(userId: UserId): Promise; - - /** - * Makes a PinKey from the provided PIN. - */ - abstract makePinKey: (pin: string, salt: string, kdfConfig: KdfConfig) => Promise; + abstract unsetPin(userId: UserId): Promise; /** * Gets the user's PinLockType {@link PinLockType}. */ - abstract getPinLockType: (userId: UserId) => Promise; + abstract getPinLockType(userId: UserId): Promise; /** * Declares whether or not the user has a PIN set (either persistent or ephemeral). * Note: for ephemeral, this does not check if we actual have an ephemeral PIN-encrypted UserKey stored in memory. * Decryption might not be possible even if this returns true. Use {@link isPinDecryptionAvailable} if decryption is required. */ - abstract isPinSet: (userId: UserId) => Promise; + abstract isPinSet(userId: UserId): Promise; /** * Checks if PIN-encrypted keys are stored for the user. * Used for unlock / user verification scenarios where we will need to decrypt the UserKey with the PIN. */ - abstract isPinDecryptionAvailable: (userId: UserId) => Promise; + abstract isPinDecryptionAvailable(userId: UserId): Promise; + + /** + * Clears ephemeral PINs for the user being logged out. + */ + abstract logout(userId: UserId): Promise; /** * Decrypts the UserKey with the provided PIN. - * - * @remarks - If the user has an old pinKeyEncryptedMasterKey (formerly called `pinProtected`), the UserKey - * will be obtained via the private {@link decryptAndMigrateOldPinKeyEncryptedMasterKey} method. - * - If the user does not have an old pinKeyEncryptedMasterKey, the UserKey will be obtained via the - * private {@link decryptUserKey} method. * @returns UserKey + * @throws If the pin lock type is ephemeral but the ephemeral pin protected user key envelope is not available */ - abstract decryptUserKeyWithPin: (pin: string, userId: UserId) => Promise; + abstract decryptUserKeyWithPin(pin: string, userId: UserId): Promise; + + /** + * @deprecated This is not deprecated, but only meant to be called by KeyService. DO NOT USE IT. + */ + abstract userUnlocked(userId: UserId): Promise; + + /** + * Makes a PinKey from the provided PIN. + * @deprecated - Note: This is currently re-used by vault exports, which is still permitted but should be refactored out to use a different construct. + */ + abstract makePinKey(pin: string, salt: string, kdfConfig: KdfConfig): Promise; } diff --git a/libs/common/src/key-management/pin/pin.service.implementation.ts b/libs/common/src/key-management/pin/pin.service.implementation.ts index da46cd3bc76..29a10d1a0a4 100644 --- a/libs/common/src/key-management/pin/pin.service.implementation.ts +++ b/libs/common/src/key-management/pin/pin.service.implementation.ts @@ -1,275 +1,137 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { firstValueFrom, map } from "rxjs"; // eslint-disable-next-line no-restricted-imports -import { KdfConfig, KdfConfigService } from "@bitwarden/key-management"; +import { KdfConfig, KdfConfigService, KeyService } from "@bitwarden/key-management"; import { AccountService } from "../../auth/abstractions/account.service"; -import { CryptoFunctionService } from "../../key-management/crypto/abstractions/crypto-function.service"; +import { assertNonNullish } from "../../auth/utils"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; -import { EncString, EncryptedString } from "../../key-management/crypto/models/enc-string"; +import { EncString } from "../../key-management/crypto/models/enc-string"; import { LogService } from "../../platform/abstractions/log.service"; -import { PIN_DISK, PIN_MEMORY, StateProvider, UserKeyDefinition } from "../../platform/state"; +import { SdkService } from "../../platform/abstractions/sdk/sdk.service"; +import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { UserId } from "../../types/guid"; import { PinKey, UserKey } from "../../types/key"; import { KeyGenerationService } from "../crypto"; +import { firstValueFromOrThrow } from "../utils"; +import { PinLockType } from "./pin-lock-type"; +import { PinStateServiceAbstraction } from "./pin-state.service.abstraction"; import { PinServiceAbstraction } from "./pin.service.abstraction"; -/** - * - DISABLED : No PIN set. - * - PERSISTENT : PIN is set and persists through client reset. - * - EPHEMERAL : PIN is set, but does NOT persist through client reset. This means that - * after client reset the master password is required to unlock. - */ -export type PinLockType = "DISABLED" | "PERSISTENT" | "EPHEMERAL"; - -/** - * The persistent (stored on disk) version of the UserKey, encrypted by the PinKey. - * - * @remarks Persists through a client reset. Used when `requireMasterPasswordOnClientRestart` is disabled. - * @see SetPinComponent.setPinForm.requireMasterPasswordOnClientRestart - */ -export const PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT = new UserKeyDefinition( - PIN_DISK, - "pinKeyEncryptedUserKeyPersistent", - { - deserializer: (jsonValue) => jsonValue, - clearOn: ["logout"], - }, -); - -/** - * The ephemeral (stored in memory) version of the UserKey, encrypted by the PinKey. - * - * @remarks Does NOT persist through a client reset. Used when `requireMasterPasswordOnClientRestart` is enabled. - * @see SetPinComponent.setPinForm.requireMasterPasswordOnClientRestart - */ -export const PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL = new UserKeyDefinition( - PIN_MEMORY, - "pinKeyEncryptedUserKeyEphemeral", - { - deserializer: (jsonValue) => jsonValue, - clearOn: ["logout"], - }, -); - -/** - * The PIN, encrypted by the UserKey. - */ -export const USER_KEY_ENCRYPTED_PIN = new UserKeyDefinition( - PIN_DISK, - "userKeyEncryptedPin", - { - deserializer: (jsonValue) => jsonValue, - clearOn: ["logout"], - }, -); - export class PinService implements PinServiceAbstraction { constructor( private accountService: AccountService, - private cryptoFunctionService: CryptoFunctionService, private encryptService: EncryptService, private kdfConfigService: KdfConfigService, private keyGenerationService: KeyGenerationService, private logService: LogService, - private stateProvider: StateProvider, + private keyService: KeyService, + private sdkService: SdkService, + private pinStateService: PinStateServiceAbstraction, ) {} - async getPinKeyEncryptedUserKeyPersistent(userId: UserId): Promise { - this.validateUserId(userId, "Cannot get pinKeyEncryptedUserKeyPersistent."); - - return EncString.fromJSON( - await firstValueFrom( - this.stateProvider.getUserState$(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, userId), - ), - ); - } - - /** - * Sets the persistent (stored on disk) version of the UserKey, encrypted by the PinKey. - */ - private async setPinKeyEncryptedUserKeyPersistent( - pinKeyEncryptedUserKey: EncString, - userId: UserId, - ): Promise { - this.validateUserId(userId, "Cannot set pinKeyEncryptedUserKeyPersistent."); - - if (pinKeyEncryptedUserKey == null) { - throw new Error( - "No pinKeyEncryptedUserKey provided. Cannot set pinKeyEncryptedUserKeyPersistent.", - ); - } - - await this.stateProvider.setUserState( - PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, - pinKeyEncryptedUserKey?.encryptedString, - userId, - ); - } - - async clearPinKeyEncryptedUserKeyPersistent(userId: UserId): Promise { - this.validateUserId(userId, "Cannot clear pinKeyEncryptedUserKeyPersistent."); - - await this.stateProvider.setUserState(PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, null, userId); - } - - async getPinKeyEncryptedUserKeyEphemeral(userId: UserId): Promise { - this.validateUserId(userId, "Cannot get pinKeyEncryptedUserKeyEphemeral."); - - return EncString.fromJSON( - await firstValueFrom( - this.stateProvider.getUserState$(PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, userId), - ), - ); - } - - /** - * Sets the ephemeral (stored in memory) version of the UserKey, encrypted by the PinKey. - */ - private async setPinKeyEncryptedUserKeyEphemeral( - pinKeyEncryptedUserKey: EncString, - userId: UserId, - ): Promise { - this.validateUserId(userId, "Cannot set pinKeyEncryptedUserKeyEphemeral."); - - if (pinKeyEncryptedUserKey == null) { - throw new Error( - "No pinKeyEncryptedUserKey provided. Cannot set pinKeyEncryptedUserKeyEphemeral.", - ); - } - - await this.stateProvider.setUserState( - PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, - pinKeyEncryptedUserKey?.encryptedString, - userId, - ); - } - - async clearPinKeyEncryptedUserKeyEphemeral(userId: UserId): Promise { - this.validateUserId(userId, "Cannot clear pinKeyEncryptedUserKeyEphemeral."); - - await this.stateProvider.setUserState(PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, null, userId); - } - - async createPinKeyEncryptedUserKey( - pin: string, - userKey: UserKey, - userId: UserId, - ): Promise { - this.validateUserId(userId, "Cannot create pinKeyEncryptedUserKey."); - - if (!userKey) { - throw new Error("No UserKey provided. Cannot create pinKeyEncryptedUserKey."); - } - - const email = await firstValueFrom( - this.accountService.accounts$.pipe(map((accounts) => accounts[userId].email)), - ); - const kdfConfig = await this.kdfConfigService.getKdfConfig(userId); - const pinKey = await this.makePinKey(pin, email, kdfConfig); - - return await this.encryptService.wrapSymmetricKey(userKey, pinKey); - } - - async storePinKeyEncryptedUserKey( - pinKeyEncryptedUserKey: EncString, - storeAsEphemeral: boolean, - userId: UserId, - ): Promise { - this.validateUserId(userId, "Cannot store pinKeyEncryptedUserKey."); - - if (storeAsEphemeral) { - await this.setPinKeyEncryptedUserKeyEphemeral(pinKeyEncryptedUserKey, userId); - } else { - await this.setPinKeyEncryptedUserKeyPersistent(pinKeyEncryptedUserKey, userId); - } - } - - async getUserKeyEncryptedPin(userId: UserId): Promise { - this.validateUserId(userId, "Cannot get userKeyEncryptedPin."); - - return EncString.fromJSON( - await firstValueFrom(this.stateProvider.getUserState$(USER_KEY_ENCRYPTED_PIN, userId)), - ); - } - - async setUserKeyEncryptedPin(userKeyEncryptedPin: EncString, userId: UserId): Promise { - this.validateUserId(userId, "Cannot set userKeyEncryptedPin."); - - await this.stateProvider.setUserState( - USER_KEY_ENCRYPTED_PIN, - userKeyEncryptedPin?.encryptedString, - userId, - ); - } - - async clearUserKeyEncryptedPin(userId: UserId): Promise { - this.validateUserId(userId, "Cannot clear userKeyEncryptedPin."); - - await this.stateProvider.setUserState(USER_KEY_ENCRYPTED_PIN, null, userId); - } - - async createUserKeyEncryptedPin(pin: string, userKey: UserKey): Promise { - if (!userKey) { - throw new Error("No UserKey provided. Cannot create userKeyEncryptedPin."); - } - - return await this.encryptService.encryptString(pin, userKey); - } - - async makePinKey(pin: string, salt: string, kdfConfig: KdfConfig): Promise { - const start = Date.now(); - const pinKey = await this.keyGenerationService.deriveKeyFromPassword(pin, salt, kdfConfig); - this.logService.info(`[Pin Service] deriving pin key took ${Date.now() - start}ms`); - - return (await this.keyGenerationService.stretchKey(pinKey)) as PinKey; - } - - async getPinLockType(userId: UserId): Promise { - this.validateUserId(userId, "Cannot get PinLockType."); - - const aUserKeyEncryptedPinIsSet = !!(await this.getUserKeyEncryptedPin(userId)); - const aPinKeyEncryptedUserKeyPersistentIsSet = - !!(await this.getPinKeyEncryptedUserKeyPersistent(userId)); - - if (aPinKeyEncryptedUserKeyPersistentIsSet) { - return "PERSISTENT"; - } else if (aUserKeyEncryptedPinIsSet && !aPinKeyEncryptedUserKeyPersistentIsSet) { - return "EPHEMERAL"; - } else { - return "DISABLED"; - } + getPinLockType(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + return this.pinStateService.getPinLockType(userId); } async isPinSet(userId: UserId): Promise { - this.validateUserId(userId, "Cannot determine if PIN is set."); + assertNonNullish(userId, "userId"); + return (await this.pinStateService.getPinLockType(userId)) !== "DISABLED"; + } - return (await this.getPinLockType(userId)) !== "DISABLED"; + async logout(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + await this.pinStateService.clearPinState(userId); + } + + async userUnlocked(userId: UserId): Promise { + if ( + (await this.pinStateService.getPinLockType(userId)) === "EPHEMERAL" && + !(await this.isPinDecryptionAvailable(userId)) + ) { + this.logService.info("[Pin Service] On first unlock: Setting up ephemeral PIN"); + + // On first unlock, set the ephemeral pin envelope, if it is not set yet + const pin = await this.getPin(userId); + await this.setPin(pin, "EPHEMERAL", userId); + } else if ((await this.pinStateService.getPinLockType(userId)) === "PERSISTENT") { + // Encrypted migration for persistent pin unlock to pin envelopes. + // This will be removed at the earliest in 2026.1.0 + // + // ----- ENCRYPTION MIGRATION ----- + // Pin-key encrypted user-keys are eagerly migrated to the new pin-protected user key envelope format. + if ((await this.pinStateService.getLegacyPinKeyEncryptedUserKeyPersistent(userId)) != null) { + this.logService.info( + "[Pin Service] Migrating legacy PIN key to PinProtectedUserKeyEnvelope", + ); + const pin = await this.getPin(userId); + await this.setPin(pin, "PERSISTENT", userId); + } + } + } + + async getPin(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + + const userKey: UserKey = await firstValueFromOrThrow( + this.keyService.userKey$(userId), + "userKey", + ); + const userKeyEncryptedPin = await firstValueFromOrThrow( + this.pinStateService.userKeyEncryptedPin$(userId), + "userKeyEncryptedPin", + ); + return this.encryptService.decryptString(userKeyEncryptedPin, userKey); + } + + async setPin(pin: string, pinLockType: PinLockType, userId: UserId): Promise { + assertNonNullish(pin, "pin"); + assertNonNullish(pinLockType, "pinLockType"); + assertNonNullish(userId, "userId"); + + // Use the sdk to create an enrollment, not yet persisting it to state + const { pinProtectedUserKeyEnvelope, userKeyEncryptedPin } = await firstValueFrom( + this.sdkService.userClient$(userId).pipe( + map((sdk) => { + using ref = sdk.take(); + return ref.value.crypto().enroll_pin(pin); + }), + ), + ); + + await this.pinStateService.setPinState( + userId, + pinProtectedUserKeyEnvelope, + userKeyEncryptedPin, + pinLockType, + ); + } + + async unsetPin(userId: UserId): Promise { + assertNonNullish(userId, "userId"); + await this.pinStateService.clearPinState(userId); } async isPinDecryptionAvailable(userId: UserId): Promise { - this.validateUserId(userId, "Cannot determine if decryption of user key via PIN is available."); - - const pinLockType = await this.getPinLockType(userId); + assertNonNullish(userId, "userId"); + const pinLockType = await this.pinStateService.getPinLockType(userId); switch (pinLockType) { case "DISABLED": return false; case "PERSISTENT": - // The above getPinLockType call ensures that we have either a PinKeyEncryptedUserKey set. + // The above getPinLockType call ensures that we have either a PinKeyEncryptedUserKey or PinProtectedKeyEnvelope set. return true; case "EPHEMERAL": { // The above getPinLockType call ensures that we have a UserKeyEncryptedPin set. - // However, we must additively check to ensure that we have a set PinKeyEncryptedUserKeyEphemeral b/c otherwise - // we cannot take a PIN, derive a PIN key, and decrypt the ephemeral UserKey. - const pinKeyEncryptedUserKeyEphemeral = - await this.getPinKeyEncryptedUserKeyEphemeral(userId); - return Boolean(pinKeyEncryptedUserKeyEphemeral); + // However, we must additively check to ensure that we have a set PinKeyEncryptedUserKeyEphemeral, since + // this is only available after first unlock + const ephemeralPinProtectedKeyEnvelope = + await this.pinStateService.getPinProtectedUserKeyEnvelope(userId, "EPHEMERAL"); + return ephemeralPinProtectedKeyEnvelope != null; } - default: { // Compile-time check for exhaustive switch const _exhaustiveCheck: never = pinLockType; @@ -279,112 +141,89 @@ export class PinService implements PinServiceAbstraction { } async decryptUserKeyWithPin(pin: string, userId: UserId): Promise { - this.validateUserId(userId, "Cannot decrypt user key with PIN."); + assertNonNullish(pin, "pin"); + assertNonNullish(userId, "userId"); - try { - const pinLockType = await this.getPinLockType(userId); + const hasPinProtectedKeyEnvelopeSet = + (await this.pinStateService.getPinProtectedUserKeyEnvelope(userId, "EPHEMERAL")) != null || + (await this.pinStateService.getPinProtectedUserKeyEnvelope(userId, "PERSISTENT")) != null; - const pinKeyEncryptedUserKey = await this.getPinKeyEncryptedKeys(pinLockType, userId); + if (hasPinProtectedKeyEnvelopeSet) { + this.logService.info("[Pin Service] Pin-unlock via PinProtectedUserKeyEnvelope"); - const email = await firstValueFrom( - this.accountService.accounts$.pipe(map((accounts) => accounts[userId].email)), - ); - const kdfConfig = await this.kdfConfigService.getKdfConfig(userId); - - const userKey: UserKey = await this.decryptUserKey( + const pinLockType = await this.pinStateService.getPinLockType(userId); + const envelope = await this.pinStateService.getPinProtectedUserKeyEnvelope( userId, - pin, - email, - kdfConfig, - pinKeyEncryptedUserKey, + pinLockType, ); - if (!userKey) { - this.logService.warning(`User key null after pin key decryption.`); + + try { + // Use the sdk to create an enrollment, not yet persisting it to state + const startTime = performance.now(); + const userKeyBytes = await firstValueFrom( + this.sdkService.client$.pipe( + map((sdk) => { + if (!sdk) { + throw new Error("SDK not available"); + } + return sdk.crypto().unseal_password_protected_key_envelope(pin, envelope!); + }), + ), + ); + this.logService.measure(startTime, "Crypto", "PinService", "UnsealPinEnvelope"); + + return new SymmetricCryptoKey(userKeyBytes) as UserKey; + } catch (error) { + this.logService.error(`Failed to unseal pin: ${error}`); return null; } + } else { + this.logService.info("[Pin Service] Pin-unlock via legacy PinKeyEncryptedUserKey"); - if (!(await this.validatePin(userKey, pin, userId))) { - this.logService.warning(`Pin key decryption successful but pin validation failed.`); + // This branch is deprecated and will be removed in the future, but is kept for migration. + try { + const pinKeyEncryptedUserKey = + await this.pinStateService.getLegacyPinKeyEncryptedUserKeyPersistent(userId); + const email = await firstValueFrom( + this.accountService.accounts$.pipe(map((accounts) => accounts[userId].email)), + ); + const kdfConfig = await this.kdfConfigService.getKdfConfig(userId); + return await this.decryptUserKey(pin, email, kdfConfig, pinKeyEncryptedUserKey!); + } catch (error) { + this.logService.error(`Error decrypting user key with pin: ${error}`); return null; } - - return userKey; - } catch (error) { - this.logService.error(`Error decrypting user key with pin: ${error}`); - return null; } } + /// Anything below here is deprecated and will be removed subsequently + + async makePinKey(pin: string, salt: string, kdfConfig: KdfConfig): Promise { + const startTime = performance.now(); + const pinKey = await this.keyGenerationService.deriveKeyFromPassword(pin, salt, kdfConfig); + this.logService.measure(startTime, "Crypto", "PinService", "makePinKey"); + + return (await this.keyGenerationService.stretchKey(pinKey)) as PinKey; + } + /** * Decrypts the UserKey with the provided PIN. + * @deprecated + * @throws If the PIN does not match the PIN that was used to encrypt the user key + * @throws If the salt, or KDF don't match the salt / KDF used to encrypt the user key */ private async decryptUserKey( - userId: UserId, pin: string, salt: string, kdfConfig: KdfConfig, - pinKeyEncryptedUserKey?: EncString, + pinKeyEncryptedUserKey: EncString, ): Promise { - this.validateUserId(userId, "Cannot decrypt user key."); - - pinKeyEncryptedUserKey ||= await this.getPinKeyEncryptedUserKeyPersistent(userId); - pinKeyEncryptedUserKey ||= await this.getPinKeyEncryptedUserKeyEphemeral(userId); - - if (!pinKeyEncryptedUserKey) { - throw new Error("No pinKeyEncryptedUserKey found."); - } - + assertNonNullish(pin, "pin"); + assertNonNullish(salt, "salt"); + assertNonNullish(kdfConfig, "kdfConfig"); + assertNonNullish(pinKeyEncryptedUserKey, "pinKeyEncryptedUserKey"); const pinKey = await this.makePinKey(pin, salt, kdfConfig); const userKey = await this.encryptService.unwrapSymmetricKey(pinKeyEncryptedUserKey, pinKey); - return userKey as UserKey; } - - /** - * Gets the user's `pinKeyEncryptedUserKey` (persistent or ephemeral) - * (if one exists) based on the user's PinLockType. - * - * @throws If PinLockType is 'DISABLED' or if userId is not provided - */ - private async getPinKeyEncryptedKeys( - pinLockType: PinLockType, - userId: UserId, - ): Promise { - this.validateUserId(userId, "Cannot get PinKey encrypted keys."); - - switch (pinLockType) { - case "PERSISTENT": { - return await this.getPinKeyEncryptedUserKeyPersistent(userId); - } - case "EPHEMERAL": { - return await this.getPinKeyEncryptedUserKeyEphemeral(userId); - } - case "DISABLED": - throw new Error("Pin is disabled"); - default: { - // Compile-time check for exhaustive switch - const _exhaustiveCheck: never = pinLockType; - return _exhaustiveCheck; - } - } - } - - private async validatePin(userKey: UserKey, pin: string, userId: UserId): Promise { - this.validateUserId(userId, "Cannot validate PIN."); - - const userKeyEncryptedPin = await this.getUserKeyEncryptedPin(userId); - const decryptedPin = await this.encryptService.decryptString(userKeyEncryptedPin, userKey); - - const isPinValid = this.cryptoFunctionService.compareFast(decryptedPin, pin); - return isPinValid; - } - - /** - * Throws a custom error message if user ID is not provided. - */ - private validateUserId(userId: UserId, errorMessage: string = "") { - if (!userId) { - throw new Error(`User ID is required. ${errorMessage}`); - } - } } diff --git a/libs/common/src/key-management/pin/pin.service.spec.ts b/libs/common/src/key-management/pin/pin.service.spec.ts index b014c26c7dc..8d78255bb1b 100644 --- a/libs/common/src/key-management/pin/pin.service.spec.ts +++ b/libs/common/src/key-management/pin/pin.service.spec.ts @@ -1,68 +1,64 @@ import { mock } from "jest-mock-extended"; +import { BehaviorSubject, filter } from "rxjs"; // eslint-disable-next-line no-restricted-imports -import { DEFAULT_KDF_CONFIG, KdfConfigService } from "@bitwarden/key-management"; +import { DEFAULT_KDF_CONFIG, KdfConfigService, KeyService } from "@bitwarden/key-management"; +import { PasswordProtectedKeyEnvelope } from "@bitwarden/sdk-internal"; -import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../spec"; +import { MockSdkService } from "../..//platform/spec/mock-sdk.service"; +import { FakeAccountService, mockAccountServiceWith, mockEnc } from "../../../spec"; import { LogService } from "../../platform/abstractions/log.service"; import { Utils } from "../../platform/misc/utils"; import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { UserId } from "../../types/guid"; import { PinKey, UserKey } from "../../types/key"; import { KeyGenerationService } from "../crypto"; -import { CryptoFunctionService } from "../crypto/abstractions/crypto-function.service"; import { EncryptService } from "../crypto/abstractions/encrypt.service"; -import { EncString } from "../crypto/models/enc-string"; +import { EncryptedString, EncString } from "../crypto/models/enc-string"; -import { - PinService, - PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, - PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, - USER_KEY_ENCRYPTED_PIN, - PinLockType, -} from "./pin.service.implementation"; +import { PinStateServiceAbstraction } from "./pin-state.service.abstraction"; +import { PinService } from "./pin.service.implementation"; describe("PinService", () => { let sut: PinService; let accountService: FakeAccountService; - let stateProvider: FakeStateProvider; - const cryptoFunctionService = mock(); const encryptService = mock(); const kdfConfigService = mock(); const keyGenerationService = mock(); const logService = mock(); - const mockUserId = Utils.newGuid() as UserId; - const mockUserKey = new SymmetricCryptoKey(randomBytes(64)) as UserKey; + const mockUserKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; const mockPinKey = new SymmetricCryptoKey(randomBytes(32)) as PinKey; const mockUserEmail = "user@example.com"; const mockPin = "1234"; const mockUserKeyEncryptedPin = new EncString("userKeyEncryptedPin"); - - // Note: both pinKeyEncryptedUserKeys use encryptionType: 2 (AesCbc256_HmacSha256_B64) - const pinKeyEncryptedUserKeyEphemeral = new EncString( - "2.gbauOANURUHqvhLTDnva1A==|nSW+fPumiuTaDB/s12+JO88uemV6rhwRSR+YR1ZzGr5j6Ei3/h+XEli2Unpz652NlZ9NTuRpHxeOqkYYJtp7J+lPMoclgteXuAzUu9kqlRc=|DeUFkhIwgkGdZA08bDnDqMMNmZk21D+H5g8IostPKAY=", - ); - const pinKeyEncryptedUserKeyPersistant = new EncString( - "2.fb5kOEZvh9zPABbP8WRmSQ==|Yi6ZAJY+UtqCKMUSqp1ahY9Kf8QuneKXs6BMkpNsakLVOzTYkHHlilyGABMF7GzUO8QHyZi7V/Ovjjg+Naf3Sm8qNhxtDhibITv4k8rDnM0=|TFkq3h2VNTT1z5BFbebm37WYuxyEHXuRo0DZJI7TQnw=", - ); + const mockEphemeralEnvelope = "mock-ephemeral-envelope" as PasswordProtectedKeyEnvelope; + const mockPersistentEnvelope = "mock-persistent-envelope" as PasswordProtectedKeyEnvelope; + const keyService = mock(); + const sdkService = new MockSdkService(); + const pinStateService = mock(); + const behaviorSubject = new BehaviorSubject<{ userId: UserId; userKey: UserKey }>(null); beforeEach(() => { - jest.clearAllMocks(); - accountService = mockAccountServiceWith(mockUserId, { email: mockUserEmail }); - stateProvider = new FakeStateProvider(accountService); + (keyService as any)["unlockedUserKeys$"] = behaviorSubject + .asObservable() + .pipe(filter((x) => x != null)); + sdkService.client.crypto + .mockDeep() + .unseal_password_protected_key_envelope.mockReturnValue(new Uint8Array(64)); sut = new PinService( accountService, - cryptoFunctionService, encryptService, kdfConfigService, keyGenerationService, logService, - stateProvider, + keyService, + sdkService, + pinStateService, ); }); @@ -70,204 +66,69 @@ describe("PinService", () => { expect(sut).not.toBeFalsy(); }); - describe("userId validation", () => { - it("should throw an error if a userId is not provided", async () => { - await expect(sut.getPinKeyEncryptedUserKeyPersistent(undefined)).rejects.toThrow( - "User ID is required. Cannot get pinKeyEncryptedUserKeyPersistent.", - ); - await expect(sut.getPinKeyEncryptedUserKeyEphemeral(undefined)).rejects.toThrow( - "User ID is required. Cannot get pinKeyEncryptedUserKeyEphemeral.", - ); - await expect(sut.clearPinKeyEncryptedUserKeyPersistent(undefined)).rejects.toThrow( - "User ID is required. Cannot clear pinKeyEncryptedUserKeyPersistent.", - ); - await expect(sut.clearPinKeyEncryptedUserKeyEphemeral(undefined)).rejects.toThrow( - "User ID is required. Cannot clear pinKeyEncryptedUserKeyEphemeral.", - ); - await expect( - sut.createPinKeyEncryptedUserKey(mockPin, mockUserKey, undefined), - ).rejects.toThrow("User ID is required. Cannot create pinKeyEncryptedUserKey."); - await expect(sut.getUserKeyEncryptedPin(undefined)).rejects.toThrow( - "User ID is required. Cannot get userKeyEncryptedPin.", - ); - await expect(sut.setUserKeyEncryptedPin(mockUserKeyEncryptedPin, undefined)).rejects.toThrow( - "User ID is required. Cannot set userKeyEncryptedPin.", - ); - await expect(sut.clearUserKeyEncryptedPin(undefined)).rejects.toThrow( - "User ID is required. Cannot clear userKeyEncryptedPin.", - ); - await expect( - sut.createPinKeyEncryptedUserKey(mockPin, mockUserKey, undefined), - ).rejects.toThrow("User ID is required. Cannot create pinKeyEncryptedUserKey."); - await expect(sut.getPinLockType(undefined)).rejects.toThrow("Cannot get PinLockType."); - await expect(sut.isPinSet(undefined)).rejects.toThrow( - "User ID is required. Cannot determine if PIN is set.", + describe("userUnlocked()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should set up ephemeral PIN on first unlock if needed", async () => { + // Arrange + pinStateService.getPinLockType.mockResolvedValue("EPHEMERAL"); + jest.spyOn(sut, "isPinDecryptionAvailable").mockResolvedValue(false); + const getPinSpy = jest.spyOn(sut, "getPin").mockResolvedValue(mockPin); + const setPinSpy = jest.spyOn(sut, "setPin").mockResolvedValue(); + + // Act + await sut.userUnlocked(mockUserId); + + // Assert + expect(getPinSpy).toHaveBeenCalledWith(mockUserId); + expect(setPinSpy).toHaveBeenCalledWith(mockPin, "EPHEMERAL", mockUserId); + expect(logService.info).toHaveBeenCalledWith( + "[Pin Service] On first unlock: Setting up ephemeral PIN", ); }); - }); - describe("get/clear/create/store pinKeyEncryptedUserKey methods", () => { - describe("getPinKeyEncryptedUserKeyPersistent()", () => { - it("should get the pinKeyEncryptedUserKey of the specified userId", async () => { - await sut.getPinKeyEncryptedUserKeyPersistent(mockUserId); + it("should migrate legacy persistent PIN if needed", async () => { + // Arrange + pinStateService.getPinLockType.mockResolvedValue("PERSISTENT"); + pinStateService.getLegacyPinKeyEncryptedUserKeyPersistent.mockResolvedValue( + mockEnc("legacy-key"), + ); + const getPinSpy = jest.spyOn(sut, "getPin").mockResolvedValue(mockPin); + const setPinSpy = jest.spyOn(sut, "setPin").mockResolvedValue(); - expect(stateProvider.mock.getUserState$).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, - mockUserId, - ); - }); + // Act + await sut.userUnlocked(mockUserId); + + // Assert + expect(getPinSpy).toHaveBeenCalledWith(mockUserId); + expect(setPinSpy).toHaveBeenCalledWith(mockPin, "PERSISTENT", mockUserId); + expect(logService.info).toHaveBeenCalledWith( + "[Pin Service] Migrating legacy PIN key to PinProtectedUserKeyEnvelope", + ); }); - describe("clearPinKeyEncryptedUserKeyPersistent()", () => { - it("should clear the pinKeyEncryptedUserKey of the specified userId", async () => { - await sut.clearPinKeyEncryptedUserKeyPersistent(mockUserId); + it("should do nothing if no migration or setup is needed", async () => { + // Arrange + pinStateService.getPinLockType.mockResolvedValue("DISABLED"); + const getPinSpy = jest.spyOn(sut, "getPin"); + const setPinSpy = jest.spyOn(sut, "setPin"); - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, - null, - mockUserId, - ); - }); - }); + // Act + await sut.userUnlocked(mockUserId); - describe("getPinKeyEncryptedUserKeyEphemeral()", () => { - it("should get the pinKeyEncrypterUserKeyEphemeral of the specified userId", async () => { - await sut.getPinKeyEncryptedUserKeyEphemeral(mockUserId); - - expect(stateProvider.mock.getUserState$).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, - mockUserId, - ); - }); - }); - - describe("clearPinKeyEncryptedUserKeyEphemeral()", () => { - it("should clear the pinKeyEncryptedUserKey of the specified userId", async () => { - await sut.clearPinKeyEncryptedUserKeyEphemeral(mockUserId); - - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, - null, - mockUserId, - ); - }); - }); - - describe("createPinKeyEncryptedUserKey()", () => { - it("should throw an error if a userKey is not provided", async () => { - await expect( - sut.createPinKeyEncryptedUserKey(mockPin, undefined, mockUserId), - ).rejects.toThrow("No UserKey provided. Cannot create pinKeyEncryptedUserKey."); - }); - - it("should create a pinKeyEncryptedUserKey", async () => { - // Arrange - sut.makePinKey = jest.fn().mockResolvedValue(mockPinKey); - - // Act - await sut.createPinKeyEncryptedUserKey(mockPin, mockUserKey, mockUserId); - - // Assert - expect(encryptService.wrapSymmetricKey).toHaveBeenCalledWith(mockUserKey, mockPinKey); - }); - }); - - describe("storePinKeyEncryptedUserKey", () => { - it("should store a pinKeyEncryptedUserKey (persistent version) when 'storeAsEphemeral' is false", async () => { - // Arrange - const storeAsEphemeral = false; - - // Act - await sut.storePinKeyEncryptedUserKey( - pinKeyEncryptedUserKeyPersistant, - storeAsEphemeral, - mockUserId, - ); - - // Assert - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT, - pinKeyEncryptedUserKeyPersistant.encryptedString, - mockUserId, - ); - }); - - it("should store a pinKeyEncryptedUserKeyEphemeral when 'storeAsEphemeral' is true", async () => { - // Arrange - const storeAsEphemeral = true; - - // Act - await sut.storePinKeyEncryptedUserKey( - pinKeyEncryptedUserKeyEphemeral, - storeAsEphemeral, - mockUserId, - ); - - // Assert - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - PIN_KEY_ENCRYPTED_USER_KEY_EPHEMERAL, - pinKeyEncryptedUserKeyEphemeral.encryptedString, - mockUserId, - ); - }); - }); - }); - - describe("userKeyEncryptedPin methods", () => { - describe("getUserKeyEncryptedPin()", () => { - it("should get the userKeyEncryptedPin of the specified userId", async () => { - await sut.getUserKeyEncryptedPin(mockUserId); - - expect(stateProvider.mock.getUserState$).toHaveBeenCalledWith( - USER_KEY_ENCRYPTED_PIN, - mockUserId, - ); - }); - }); - - describe("setUserKeyEncryptedPin()", () => { - it("should set the userKeyEncryptedPin of the specified userId", async () => { - await sut.setUserKeyEncryptedPin(mockUserKeyEncryptedPin, mockUserId); - - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - USER_KEY_ENCRYPTED_PIN, - mockUserKeyEncryptedPin.encryptedString, - mockUserId, - ); - }); - }); - - describe("clearUserKeyEncryptedPin()", () => { - it("should clear the pinKeyEncryptedUserKey of the specified userId", async () => { - await sut.clearUserKeyEncryptedPin(mockUserId); - - expect(stateProvider.mock.setUserState).toHaveBeenCalledWith( - USER_KEY_ENCRYPTED_PIN, - null, - mockUserId, - ); - }); - }); - - describe("createUserKeyEncryptedPin()", () => { - it("should throw an error if a userKey is not provided", async () => { - await expect(sut.createUserKeyEncryptedPin(mockPin, undefined)).rejects.toThrow( - "No UserKey provided. Cannot create userKeyEncryptedPin.", - ); - }); - - it("should create a userKeyEncryptedPin from the provided PIN and userKey", async () => { - encryptService.encryptString.mockResolvedValue(mockUserKeyEncryptedPin); - - const result = await sut.createUserKeyEncryptedPin(mockPin, mockUserKey); - - expect(encryptService.encryptString).toHaveBeenCalledWith(mockPin, mockUserKey); - expect(result).toEqual(mockUserKeyEncryptedPin); - }); + // Assert + expect(getPinSpy).not.toHaveBeenCalled(); + expect(setPinSpy).not.toHaveBeenCalled(); }); }); describe("makePinKey()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it("should make a PinKey", async () => { // Arrange keyGenerationService.deriveKeyFromPassword.mockResolvedValue(mockPinKey); @@ -285,52 +146,202 @@ describe("PinService", () => { }); }); - describe("getPinLockType()", () => { - it("should return 'PERSISTENT' if a pinKeyEncryptedUserKey (persistent version) is found", async () => { - // Arrange - sut.getUserKeyEncryptedPin = jest.fn().mockResolvedValue(null); - sut.getPinKeyEncryptedUserKeyPersistent = jest - .fn() - .mockResolvedValue(pinKeyEncryptedUserKeyPersistant); - - // Act - const result = await sut.getPinLockType(mockUserId); - - // Assert - expect(result).toBe("PERSISTENT"); + describe("getPin()", () => { + beforeEach(() => { + jest.clearAllMocks(); + keyService.userKey$.mockReturnValue(new BehaviorSubject(mockUserKey).asObservable()); }); - it("should return 'EPHEMERAL' if a pinKeyEncryptedUserKey (persistent version) is not found but a userKeyEncryptedPin is found", async () => { - // Arrange - sut.getUserKeyEncryptedPin = jest.fn().mockResolvedValue(mockUserKeyEncryptedPin); - sut.getPinKeyEncryptedUserKeyPersistent = jest.fn().mockResolvedValue(null); + it("should successfully decrypt and return the PIN", async () => { + const expectedPin = "1234"; + pinStateService.userKeyEncryptedPin$.mockReturnValue( + new BehaviorSubject(mockUserKeyEncryptedPin).asObservable(), + ); + encryptService.decryptString.mockResolvedValue(expectedPin); - // Act + const result = await sut.getPin(mockUserId); + + expect(result).toBe(expectedPin); + expect(encryptService.decryptString).toHaveBeenCalledWith( + mockUserKeyEncryptedPin, + mockUserKey, + ); + }); + + it("should throw an error if userId is null", async () => { + await expect(sut.getPin(null as any)).rejects.toThrow("userId"); + }); + + it("should throw an error if userKey is not available", async () => { + keyService.userKey$.mockReturnValue(new BehaviorSubject(null).asObservable()); + await expect(sut.getPin(mockUserId)).rejects.toThrow("userKey"); + }); + }); + + describe("unsetPin()", () => { + beforeEach(async () => { + jest.clearAllMocks(); + }); + + it("should throw an error if userId is null", async () => { + await expect(sut.unsetPin(null as any)).rejects.toThrow("userId"); + }); + + it("should call pinStateService.clearPinState with the correct userId", async () => { + await sut.unsetPin(mockUserId); + expect(pinStateService.clearPinState).toHaveBeenCalledWith(mockUserId); + }); + }); + + describe("setPin()", () => { + const mockPinProtectedUserKeyEnvelope = "mock-envelope" as PasswordProtectedKeyEnvelope; + const mockUserKeyEncryptedPinFromSdk = "sdk-encrypted-pin"; + + beforeEach(() => {}); + + it("should throw an error if pin is null", async () => { + // Act & Assert + await expect(sut.setPin(null as any, "EPHEMERAL", mockUserId)).rejects.toThrow("pin"); + }); + + it("should throw an error if pinLockType is null", async () => { + // Act & Assert + await expect(sut.setPin(mockPin, null as any, mockUserId)).rejects.toThrow("pinLockType"); + }); + + it("should throw an error if userId is null", async () => { + // Act & Assert + await expect(sut.setPin(mockPin, "EPHEMERAL", null as any)).rejects.toThrow("userId"); + }); + + it("should successfully set an EPHEMERAL pin", async () => { + sdkService.simulate + .userLogin(mockUserId) + .crypto.mockDeep() + .enroll_pin.mockReturnValue({ + pinProtectedUserKeyEnvelope: mockPinProtectedUserKeyEnvelope, + userKeyEncryptedPin: mockUserKeyEncryptedPinFromSdk as EncryptedString, + }); + + await sut.setPin(mockPin, "EPHEMERAL", mockUserId); + + expect(pinStateService.setPinState).toHaveBeenCalledWith( + mockUserId, + mockPinProtectedUserKeyEnvelope, + mockUserKeyEncryptedPinFromSdk, + "EPHEMERAL", + ); + }); + + it("should successfully set a PERSISTENT pin", async () => { + sdkService.simulate + .userLogin(mockUserId) + .crypto.mockDeep() + .enroll_pin.mockReturnValue({ + pinProtectedUserKeyEnvelope: mockPinProtectedUserKeyEnvelope, + userKeyEncryptedPin: mockUserKeyEncryptedPinFromSdk as EncryptedString, + }); + + await sut.setPin(mockPin, "PERSISTENT", mockUserId); + + expect(pinStateService.setPinState).toHaveBeenCalledWith( + mockUserId, + mockPinProtectedUserKeyEnvelope, + mockUserKeyEncryptedPinFromSdk, + "PERSISTENT", + ); + }); + }); + + describe("getPinLockType()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should call pinStateService.getPinLockType with the correct userId", async () => { + pinStateService.getPinLockType.mockResolvedValue("EPHEMERAL"); const result = await sut.getPinLockType(mockUserId); - - // Assert + expect(pinStateService.getPinLockType).toHaveBeenCalledWith(mockUserId); expect(result).toBe("EPHEMERAL"); }); + }); - it("should return 'DISABLED' if both of these are NOT found: userKeyEncryptedPin, pinKeyEncryptedUserKey (persistent version)", async () => { - // Arrange - sut.getUserKeyEncryptedPin = jest.fn().mockResolvedValue(null); - sut.getPinKeyEncryptedUserKeyPersistent = jest.fn().mockResolvedValue(null); + describe("isPinDecryptionAvailable()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should throw an error if userId is null", async () => { + // Act & Assert + await expect(sut.isPinDecryptionAvailable(null as any)).rejects.toThrow("userId"); + }); + + it("should return false if pinLockType is DISABLED", async () => { + // Arrange - don't set any PIN-related state (will result in DISABLED) // Act - const result = await sut.getPinLockType(mockUserId); + const result = await sut.isPinDecryptionAvailable(mockUserId); // Assert - expect(result).toBe("DISABLED"); + expect(result).toBe(false); + }); + + it("should return true if pinLockType is PERSISTENT", async () => { + // Arrange - mock lock type + pinStateService.getPinLockType.mockResolvedValue("PERSISTENT"); + + // Act + const result = await sut.isPinDecryptionAvailable(mockUserId); + + // Assert + expect(result).toBe(true); + }); + + it("should return true if pinLockType is EPHEMERAL and ephemeral envelope is available", async () => { + // Arrange - mock lock type and set ephemeral envelope + pinStateService.getPinLockType.mockResolvedValue("EPHEMERAL"); + pinStateService.getPinProtectedUserKeyEnvelope.mockResolvedValue(mockEphemeralEnvelope); + + // Act + const result = await sut.isPinDecryptionAvailable(mockUserId); + + // Assert + expect(result).toBe(true); + }); + + it("should return false if pinLockType is EPHEMERAL but ephemeral envelope is not available", async () => { + // Arrange - set only user key encrypted pin (EPHEMERAL) but no ephemeral envelope + pinStateService.getPinLockType.mockResolvedValue("EPHEMERAL"); + pinStateService.getPinProtectedUserKeyEnvelope.mockResolvedValue(null); + + // Act + const result = await sut.isPinDecryptionAvailable(mockUserId); + + // Assert + expect(result).toBe(false); + }); + + it("should handle unexpected pinLockType and throw error", async () => { + // Arrange - mock getPinLockType to return an unexpected value + pinStateService.getPinLockType.mockResolvedValue("UNKNOWN" as any); + + // Act & Assert + await expect(sut.isPinDecryptionAvailable(mockUserId)).rejects.toThrow( + "Unexpected pinLockType: UNKNOWN", + ); }); }); describe("isPinSet()", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it.each(["PERSISTENT", "EPHEMERAL"])( "should return true if the user PinLockType is '%s'", async () => { // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("PERSISTENT"); + pinStateService.getPinLockType.mockResolvedValue("PERSISTENT"); // Act const result = await sut.isPinSet(mockUserId); @@ -342,7 +353,7 @@ describe("PinService", () => { it("should return false if the user PinLockType is 'DISABLED'", async () => { // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("DISABLED"); + pinStateService.getPinLockType.mockResolvedValue("DISABLED"); // Act const result = await sut.isPinSet(mockUserId); @@ -352,162 +363,87 @@ describe("PinService", () => { }); }); - describe("isPinDecryptionAvailable()", () => { - it("should return false if pinLockType is DISABLED", async () => { - // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("DISABLED"); - - // Act - const result = await sut.isPinDecryptionAvailable(mockUserId); - - // Assert - expect(result).toBe(false); + describe("logout", () => { + beforeEach(() => { + jest.clearAllMocks(); }); - it("should return true if pinLockType is PERSISTENT", async () => { - // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("PERSISTENT"); - - // Act - const result = await sut.isPinDecryptionAvailable(mockUserId); - - // Assert - expect(result).toBe(true); + it("should throw when userId is null", async () => { + await expect(sut.logout(null as any)).rejects.toThrow("userId"); }); - it("should return true if pinLockType is EPHEMERAL and we have an ephemeral PIN key encrypted user key", async () => { - // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("EPHEMERAL"); - sut.getPinKeyEncryptedUserKeyEphemeral = jest - .fn() - .mockResolvedValue(pinKeyEncryptedUserKeyEphemeral); - - // Act - const result = await sut.isPinDecryptionAvailable(mockUserId); - - // Assert - expect(result).toBe(true); - }); - - it("should return false if pinLockType is EPHEMERAL and we do not have an ephemeral PIN key encrypted user key", async () => { - // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("EPHEMERAL"); - sut.getPinKeyEncryptedUserKeyEphemeral = jest.fn().mockResolvedValue(null); - - // Act - const result = await sut.isPinDecryptionAvailable(mockUserId); - - // Assert - expect(result).toBe(false); - }); - - it("should throw an error if an unexpected pinLockType is returned", async () => { - // Arrange - sut.getPinLockType = jest.fn().mockResolvedValue("UNKNOWN"); - - // Act & Assert - await expect(sut.isPinDecryptionAvailable(mockUserId)).rejects.toThrow( - "Unexpected pinLockType: UNKNOWN", - ); + it("should call pinStateService.clearPinState", async () => { + await sut.logout(mockUserId); + expect(pinStateService.clearPinState).toHaveBeenCalledWith(mockUserId); }); }); - describe("decryptUserKeyWithPin()", () => { - async function setupDecryptUserKeyWithPinMocks(pinLockType: PinLockType) { - sut.getPinLockType = jest.fn().mockResolvedValue(pinLockType); - - mockPinEncryptedKeyDataByPinLockType(pinLockType); - - kdfConfigService.getKdfConfig.mockResolvedValue(DEFAULT_KDF_CONFIG); - - mockDecryptUserKeyFn(); - - sut.getUserKeyEncryptedPin = jest.fn().mockResolvedValue(mockUserKeyEncryptedPin); - encryptService.decryptString.mockResolvedValue(mockPin); - cryptoFunctionService.compareFast.calledWith(mockPin, "1234").mockResolvedValue(true); - } - - function mockDecryptUserKeyFn() { - sut.getPinKeyEncryptedUserKeyPersistent = jest - .fn() - .mockResolvedValue(pinKeyEncryptedUserKeyPersistant); - sut.makePinKey = jest.fn().mockResolvedValue(mockPinKey); - encryptService.unwrapSymmetricKey.mockResolvedValue(mockUserKey); - } - - function mockPinEncryptedKeyDataByPinLockType(pinLockType: PinLockType) { - switch (pinLockType) { - case "PERSISTENT": - sut.getPinKeyEncryptedUserKeyPersistent = jest - .fn() - .mockResolvedValue(pinKeyEncryptedUserKeyPersistant); - break; - case "EPHEMERAL": - sut.getPinKeyEncryptedUserKeyEphemeral = jest - .fn() - .mockResolvedValue(pinKeyEncryptedUserKeyEphemeral); - - break; - case "DISABLED": - // no mocking required. Error should be thrown - break; - } - } - - const testCases: { pinLockType: PinLockType }[] = [ - { pinLockType: "PERSISTENT" }, - { pinLockType: "EPHEMERAL" }, - ]; - - testCases.forEach(({ pinLockType }) => { - describe(`given a ${pinLockType} PIN)`, () => { - it(`should successfully decrypt and return user key when using a valid PIN`, async () => { - // Arrange - await setupDecryptUserKeyWithPinMocks(pinLockType); - - // Act - const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); - - // Assert - expect(result).toEqual(mockUserKey); - }); - - it(`should return null when PIN is incorrect and user key cannot be decrypted`, async () => { - // Arrange - await setupDecryptUserKeyWithPinMocks(pinLockType); - sut.decryptUserKeyWithPin = jest.fn().mockResolvedValue(null); - - // Act - const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); - - // Assert - expect(result).toBeNull(); - }); - - // not sure if this is a realistic scenario but going to test it anyway - it(`should return null when PIN doesn't match after successful user key decryption`, async () => { - // Arrange - await setupDecryptUserKeyWithPinMocks(pinLockType); - encryptService.decryptString.mockResolvedValue("9999"); // non matching PIN - - // Act - const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); - - // Assert - expect(result).toBeNull(); - }); - }); + describe("decryptUserKeyWithPin", () => { + beforeEach(() => { + jest.clearAllMocks(); + pinStateService.userKeyEncryptedPin$.mockReset(); + pinStateService.getPinProtectedUserKeyEnvelope.mockReset(); + pinStateService.getLegacyPinKeyEncryptedUserKeyPersistent.mockReset(); }); - it(`should return null when pin is disabled`, async () => { + it("should throw an error if userId is null", async () => { + await expect(sut.decryptUserKeyWithPin("1234", null as any)).rejects.toThrow("userId"); + }); + + it("should throw an error if pin is null", async () => { + await expect(sut.decryptUserKeyWithPin(null as any, mockUserId)).rejects.toThrow("pin"); + }); + + it("should return userkey with new pin EPHEMERAL", async () => { // Arrange - await setupDecryptUserKeyWithPinMocks("DISABLED"); + const mockPin = "1234"; + pinStateService.userKeyEncryptedPin$.mockReturnValueOnce( + new BehaviorSubject(mockUserKeyEncryptedPin), + ); + pinStateService.getPinProtectedUserKeyEnvelope.mockResolvedValueOnce(mockEphemeralEnvelope); // Act const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); // Assert - expect(result).toBeNull(); + expect(result).toEqual(mockUserKey); + }); + + it("should return userkey with new pin PERSISTENT", async () => { + // Arrange + const mockPin = "1234"; + pinStateService.userKeyEncryptedPin$.mockReturnValueOnce( + new BehaviorSubject(mockUserKeyEncryptedPin), + ); + pinStateService.getPinProtectedUserKeyEnvelope.mockResolvedValueOnce(mockPersistentEnvelope); + + // Act + const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); + + // Assert + expect(result).toEqual(mockUserKey); + }); + + it("should return userkey with legacy pin PERSISTENT", async () => { + keyGenerationService.deriveKeyFromPassword.mockResolvedValue(mockPinKey); + keyGenerationService.stretchKey.mockResolvedValue(mockPinKey); + kdfConfigService.getKdfConfig.mockResolvedValue(DEFAULT_KDF_CONFIG); + encryptService.unwrapSymmetricKey.mockResolvedValue(mockUserKey); + + // Arrange + const mockPin = "1234"; + pinStateService.userKeyEncryptedPin$.mockReturnValueOnce( + new BehaviorSubject(mockUserKeyEncryptedPin), + ); + pinStateService.getLegacyPinKeyEncryptedUserKeyPersistent.mockResolvedValueOnce( + mockUserKeyEncryptedPin, + ); + + // Act + const result = await sut.decryptUserKeyWithPin(mockPin, mockUserId); + + // Assert + expect(result).toEqual(mockUserKey); }); }); }); diff --git a/libs/common/src/key-management/pin/pin.state.ts b/libs/common/src/key-management/pin/pin.state.ts new file mode 100644 index 00000000000..4ad0524035f --- /dev/null +++ b/libs/common/src/key-management/pin/pin.state.ts @@ -0,0 +1,61 @@ +import { PIN_DISK, PIN_MEMORY, UserKeyDefinition } from "@bitwarden/common/platform/state"; +import { PasswordProtectedKeyEnvelope } from "@bitwarden/sdk-internal"; + +import { EncryptedString } from "../crypto/models/enc-string"; + +/** + * The persistent (stored on disk) version of the UserKey, encrypted by the PinKey. + * + * @deprecated + * @remarks Persists through a client reset. Used when `requireMasterPasswordOnClientRestart` is disabled. + * @see SetPinComponent.setPinForm.requireMasterPasswordOnClientRestart + */ +export const PIN_KEY_ENCRYPTED_USER_KEY_PERSISTENT = new UserKeyDefinition( + PIN_DISK, + "pinKeyEncryptedUserKeyPersistent", + { + deserializer: (jsonValue) => jsonValue, + clearOn: ["logout"], + }, +); + +/** + * The persistent (stored on disk) version of the UserKey, stored in a `PasswordProtectedKeyEnvelope`. + * + * @remarks Persists through a client reset. Used when `requireMasterPasswordOnClientRestart` is disabled. + * @see SetPinComponent.setPinForm.requireMasterPasswordOnClientRestart + */ +export const PIN_PROTECTED_USER_KEY_ENVELOPE_PERSISTENT = + new UserKeyDefinition( + PIN_DISK, + "pinProtectedUserKeyEnvelopePersistent", + { + deserializer: (jsonValue) => jsonValue, + clearOn: ["logout"], + }, + ); + +/** + * The ephemeral (stored in memory) version of the UserKey, stored in a `PasswordProtectedKeyEnvelope`. + */ +export const PIN_PROTECTED_USER_KEY_ENVELOPE_EPHEMERAL = + new UserKeyDefinition( + PIN_MEMORY, + "pinProtectedUserKeyEnvelopeEphemeral", + { + deserializer: (jsonValue) => jsonValue, + clearOn: ["logout"], + }, + ); + +/** + * The PIN, encrypted by the UserKey. + */ +export const USER_KEY_ENCRYPTED_PIN = new UserKeyDefinition( + PIN_DISK, + "userKeyEncryptedPin", + { + deserializer: (jsonValue) => jsonValue, + clearOn: ["logout"], + }, +); diff --git a/libs/common/src/key-management/services/default-process-reload.service.ts b/libs/common/src/key-management/services/default-process-reload.service.ts index bc5739167ce..24bf81abcdf 100644 --- a/libs/common/src/key-management/services/default-process-reload.service.ts +++ b/libs/common/src/key-management/services/default-process-reload.service.ts @@ -58,8 +58,7 @@ export class DefaultProcessReloadService implements ProcessReloadServiceAbstract // If there is an active user, check if they have a pinKeyEncryptedUserKeyEphemeral. If so, prevent process reload upon lock. const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; if (userId != null) { - const ephemeralPin = await this.pinService.getPinKeyEncryptedUserKeyEphemeral(userId); - if (ephemeralPin != null) { + if ((await this.pinService.getPinLockType(userId)) === "EPHEMERAL") { this.logService.info( "[Process Reload Service] Ephemeral pin active, preventing process reload", ); diff --git a/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts b/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts index bcbf0029199..697b8a1875c 100644 --- a/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts +++ b/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts @@ -56,6 +56,4 @@ export abstract class VaultTimeoutSettingsService { * @returns boolean true if biometric lock is set */ abstract isBiometricLockSet(userId?: string): Promise; - - abstract clear(userId: UserId): Promise; } diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts index 93067111bed..f3fec6d849a 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts @@ -20,7 +20,7 @@ import { TokenService } from "../../../auth/services/token.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { Utils } from "../../../platform/misc/utils"; import { UserId } from "../../../types/guid"; -import { PinServiceAbstraction } from "../../pin/pin.service.abstraction"; +import { PinStateServiceAbstraction } from "../../pin/pin-state.service.abstraction"; import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../abstractions/vault-timeout-settings.service"; import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; @@ -30,7 +30,7 @@ import { VAULT_TIMEOUT, VAULT_TIMEOUT_ACTION } from "./vault-timeout-settings.st describe("VaultTimeoutSettingsService", () => { let accountService: FakeAccountService; - let pinService: MockProxy; + let pinStateService: MockProxy; let userDecryptionOptionsService: MockProxy; let keyService: MockProxy; let tokenService: MockProxy; @@ -46,7 +46,7 @@ describe("VaultTimeoutSettingsService", () => { beforeEach(() => { accountService = mockAccountServiceWith(mockUserId); - pinService = mock(); + pinStateService = mock(); userDecryptionOptionsService = mock(); keyService = mock(); tokenService = mock(); @@ -96,7 +96,7 @@ describe("VaultTimeoutSettingsService", () => { }); it("contains Lock when the user has either a persistent or ephemeral PIN configured", async () => { - pinService.isPinSet.mockResolvedValue(true); + pinStateService.isPinSet.mockResolvedValue(true); const result = await firstValueFrom( vaultTimeoutSettingsService.availableVaultTimeoutActions$(), @@ -118,7 +118,7 @@ describe("VaultTimeoutSettingsService", () => { it("not contains Lock when the user does not have a master password, PIN, or biometrics", async () => { userDecryptionOptionsSubject.next(new UserDecryptionOptions({ hasMasterPassword: false })); - pinService.isPinSet.mockResolvedValue(false); + pinStateService.isPinSet.mockResolvedValue(false); biometricStateService.biometricUnlockEnabled$ = of(false); const result = await firstValueFrom( @@ -212,7 +212,7 @@ describe("VaultTimeoutSettingsService", () => { "returns $expected when policy is $policy, has PIN unlock method: $hasPinUnlock or Biometric unlock method: $hasBiometricUnlock, and user preference is $userPreference", async ({ hasPinUnlock, hasBiometricUnlock, policy, userPreference, expected }) => { biometricStateService.getBiometricUnlockEnabled.mockResolvedValue(hasBiometricUnlock); - pinService.isPinSet.mockResolvedValue(hasPinUnlock); + pinStateService.isPinSet.mockResolvedValue(hasPinUnlock); userDecryptionOptionsSubject.next( new UserDecryptionOptions({ hasMasterPassword: false }), @@ -377,7 +377,7 @@ describe("VaultTimeoutSettingsService", () => { ): VaultTimeoutSettingsService { return new VaultTimeoutSettingsService( accountService, - pinService, + pinStateService, userDecryptionOptionsService, keyService, tokenService, diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts index e40b896dc8c..4ca23bb24bf 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts @@ -30,7 +30,7 @@ import { TokenService } from "../../../auth/abstractions/token.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { StateProvider } from "../../../platform/state"; import { UserId } from "../../../types/guid"; -import { PinServiceAbstraction } from "../../pin/pin.service.abstraction"; +import { PinStateServiceAbstraction } from "../../pin/pin-state.service.abstraction"; import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../abstractions/vault-timeout-settings.service"; import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; @@ -40,7 +40,7 @@ import { VAULT_TIMEOUT, VAULT_TIMEOUT_ACTION } from "./vault-timeout-settings.st export class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceAbstraction { constructor( private accountService: AccountService, - private pinService: PinServiceAbstraction, + private pinStateService: PinStateServiceAbstraction, private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, private keyService: KeyService, private tokenService: TokenService, @@ -279,7 +279,7 @@ export class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceA const canLock = (await this.userHasMasterPassword(userId)) || - (await this.pinService.isPinSet(userId as UserId)) || + (await this.pinStateService.isPinSet(userId as UserId)) || (await this.isBiometricLockSet(userId)); if (canLock) { @@ -289,10 +289,6 @@ export class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceA return availableActions; } - async clear(userId: UserId): Promise { - await this.keyService.clearPinKeys(userId); - } - private async userHasMasterPassword(userId: string): Promise { if (userId) { const decryptionOptions = await firstValueFrom( diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts index 9b1350fc3a7..8b523498c31 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts @@ -144,7 +144,6 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { await this.searchService.clearIndex(lockingUserId); - // ! DO NOT REMOVE folderService.clearDecryptedFolderState ! For more information see PM-25660 await this.folderService.clearDecryptedFolderState(lockingUserId); await this.masterPasswordService.clearMasterKey(lockingUserId); diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts index 4aee0d48e5a..c78e6370ffb 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts @@ -247,8 +247,8 @@ function createMockClient(): MockProxy { client.crypto.mockReturnValue(mock()); client.platform.mockReturnValue({ state: jest.fn().mockReturnValue(mock()), + load_flags: jest.fn().mockReturnValue(mock()), free: mock(), - load_flags: jest.fn(), }); return client; } diff --git a/libs/common/src/types/key.ts b/libs/common/src/types/key.ts index ca56deb2fb1..46dcc14a8b2 100644 --- a/libs/common/src/types/key.ts +++ b/libs/common/src/types/key.ts @@ -9,6 +9,7 @@ export type PrfKey = Opaque; export type UserKey = Opaque; /** @deprecated Interacting with the master key directly is prohibited. Use a high level function from MasterPasswordService instead. */ export type MasterKey = Opaque; +/** @deprecated */ export type PinKey = Opaque; export type OrgKey = Opaque; export type ProviderKey = Opaque; diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 8de7f48c2ba..4bdc0d9b9fd 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -634,7 +634,9 @@ export class CipherService implements CipherServiceAbstraction { const equivalentDomains = await firstValueFrom( this.domainSettingsService.getUrlEquivalentDomains(url), ); - defaultMatch ??= await firstValueFrom(this.domainSettingsService.defaultUriMatchStrategy$); + defaultMatch ??= await firstValueFrom( + this.domainSettingsService.resolvedDefaultUriMatchStrategy$, + ); const archiveFeatureEnabled = await this.configService.getFeatureFlag( FeatureFlag.PM19148_InnovationArchive, diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css index 1e0a6f438f0..f8e02a7e668 100644 --- a/libs/components/src/tw-theme.css +++ b/libs/components/src/tw-theme.css @@ -62,6 +62,7 @@ --color-hover-contrast: rgb(255 255 255 / 0.15); --color-marketing-logo: 23 93 220; + --color-bw-blue: 23 93 220; --tw-ring-offset-color: #ffffff; @@ -129,6 +130,7 @@ --color-hover-contrast: rgb(0 0 0 / 0.15); --color-marketing-logo: 255 255 255; + --color-bw-blue: 23 93 220; --tw-ring-offset-color: #1f242e; diff --git a/libs/components/tailwind.config.base.js b/libs/components/tailwind.config.base.js index b3f3077b1a3..06c325894df 100644 --- a/libs/components/tailwind.config.base.js +++ b/libs/components/tailwind.config.base.js @@ -83,6 +83,7 @@ module.exports = { contrast: "var(--color-hover-contrast)", }, "marketing-logo": rgba("--color-marketing-logo"), + "bw-blue": rgba("--color-bw-blue"), illustration: { outline: rgba("--color-illustration-outline"), "bg-primary": rgba("--color-illustration-bg-primary"), diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts index d98cd817147..fcb79c1c5df 100644 --- a/libs/importer/src/components/import.component.ts +++ b/libs/importer/src/components/import.component.ts @@ -35,10 +35,7 @@ import { CollectionView, } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { - getOrganizationById, - OrganizationService, -} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; @@ -48,7 +45,9 @@ import { ClientType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { getById } from "@bitwarden/common/platform/misc"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { isId, OrganizationId } from "@bitwarden/common/types/guid"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; @@ -72,7 +71,11 @@ import { import { ImporterMetadata, DataLoader, Loader, Instructions } from "../metadata"; import { ImportOption, ImportResult, ImportType } from "../models"; -import { ImportCollectionServiceAbstraction, ImportServiceAbstraction } from "../services"; +import { + ImportCollectionServiceAbstraction, + ImportMetadataServiceAbstraction, + ImportServiceAbstraction, +} from "../services"; import { ImportChromeComponent } from "./chrome"; import { @@ -118,21 +121,34 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { collections$: Observable; organizations$: Observable; - private _organizationId: string; + private _organizationId: OrganizationId | undefined; - get organizationId(): string { + get organizationId(): OrganizationId | undefined { return this._organizationId; } - @Input() set organizationId(value: string) { + /** + * Enables the hosting control to pass in an organizationId + * If a organizationId is provided, the organization selection is disabled. + */ + @Input() set organizationId(value: OrganizationId | string | undefined) { + if (Utils.isNullOrEmpty(value)) { + this._organizationId = undefined; + this.organization = undefined; + return; + } + + if (!isId(value)) { + this._organizationId = undefined; + this.organization = undefined; + return; + } + this._organizationId = value; + getUserId(this.accountService.activeAccount$) .pipe( - switchMap((userId) => - this.organizationService - .organizations$(userId) - .pipe(getOrganizationById(this._organizationId)), - ), + switchMap((userId) => this.organizationService.organizations$(userId).pipe(getById(value))), ) .pipe(takeUntil(this.destroy$)) .subscribe((organization) => { @@ -147,7 +163,7 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { @Input() onImportFromBrowser: (browser: string, profile: string) => Promise; - protected organization: Organization; + protected organization: Organization | undefined = undefined; protected destroy$ = new Subject(); protected readonly isCardTypeRestricted$: Observable = @@ -236,6 +252,7 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { protected accountService: AccountService, private restrictedItemTypesService: RestrictedItemTypesService, private destroyRef: DestroyRef, + protected importMetadataService: ImportMetadataServiceAbstraction, ) {} protected get importBlockedByPolicy(): boolean { @@ -254,9 +271,11 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { } async ngOnInit() { + await this.importMetadataService.init(); + this.setImportOptions(); - this.importService + this.importMetadataService .metadata$(this.formGroup.controls.format.valueChanges) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ @@ -444,7 +463,7 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { importContents, this.organizationId, this.formGroup.controls.targetSelector.value, - (await this.canAccessImport(this.organizationId)) && this.isFromAC, + this.organization?.canAccessImport && this.isFromAC, ); //No errors, display success message @@ -464,20 +483,6 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { } } - private async canAccessImport(organizationId?: string): Promise { - if (!organizationId) { - return false; - } - const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - return ( - await firstValueFrom( - this.organizationService - .organizations$(userId) - .pipe(getOrganizationById(this.organizationId)), - ) - )?.canAccessImport; - } - getFormatInstructionTitle() { if (this.format == null) { return null; diff --git a/libs/importer/src/components/importer-providers.ts b/libs/importer/src/components/importer-providers.ts index b00bd65211e..c48f7c1b096 100644 --- a/libs/importer/src/components/importer-providers.ts +++ b/libs/importer/src/components/importer-providers.ts @@ -37,7 +37,9 @@ import { // FIXME: unify with `SYSTEM_SERVICE_PROVIDER` when migrating it from the generator component module // to a general module. -const SYSTEM_SERVICE_PROVIDER = new SafeInjectionToken("SystemServices"); +export const SYSTEM_SERVICE_PROVIDER = new SafeInjectionToken( + "SystemServices", +); /** Import service factories */ export const ImporterProviders: SafeProvider[] = [ @@ -85,7 +87,6 @@ export const ImporterProviders: SafeProvider[] = [ PinServiceAbstraction, AccountService, RestrictedItemTypesService, - SYSTEM_SERVICE_PROVIDER, ], }), ]; diff --git a/libs/importer/src/components/index.ts b/libs/importer/src/components/index.ts index a2e59f1714f..366b7c36212 100644 --- a/libs/importer/src/components/index.ts +++ b/libs/importer/src/components/index.ts @@ -1,3 +1,4 @@ export * from "./dialog"; +export * from "./importer-providers"; export { ImportComponent } from "./import.component"; diff --git a/libs/importer/src/index.ts b/libs/importer/src/index.ts index 1d7a88d3162..a24d22e12ba 100644 --- a/libs/importer/src/index.ts +++ b/libs/importer/src/index.ts @@ -1,4 +1,5 @@ export * from "./models"; +export * from "./metadata"; export * from "./services"; export { Importer } from "./importers/importer"; diff --git a/libs/importer/src/metadata/importers.ts b/libs/importer/src/metadata/importers.ts index efd5eafe7d5..b2c13a84049 100644 --- a/libs/importer/src/metadata/importers.ts +++ b/libs/importer/src/metadata/importers.ts @@ -2,26 +2,32 @@ import { deepFreeze } from "@bitwarden/common/tools/util"; import { ImportType } from "../models"; -import { Loader, Instructions } from "./data"; +import { Instructions, Loader } from "./data"; import { ImporterMetadata } from "./types"; -// FIXME: load this data from rust code +export type ImportersMetadata = Partial>; + +/** List of all supported importers and their default capabilities + * Note: the loaders listed here are the ones that are supported in all clients. + * Specific clients may have additional loaders available based on platform capabilities. + */ const importers = [ + { id: "bitwardenjson", loaders: [Loader.file], instructions: Instructions.unique }, // chromecsv import depends upon operating system, so ironically it doesn't support chromium { id: "chromecsv", loaders: [Loader.file], instructions: Instructions.chromium }, - { id: "operacsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium }, + { id: "operacsv", loaders: [Loader.file], instructions: Instructions.chromium }, { id: "vivaldicsv", - loaders: [Loader.file, Loader.chromium], + loaders: [Loader.file], instructions: Instructions.chromium, }, - { id: "bravecsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium }, - { id: "edgecsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium }, + { id: "bravecsv", loaders: [Loader.file], instructions: Instructions.chromium }, + { id: "edgecsv", loaders: [Loader.file], instructions: Instructions.chromium }, // FIXME: add other formats and remove `Partial` from export ] as const; /** Describes which loaders are available for each import type */ -export const Importers: Partial> = deepFreeze( +export const Importers: ImportersMetadata = deepFreeze( Object.fromEntries(importers.map((i) => [i.id, i])), ); diff --git a/libs/importer/src/services/default-import-metadata.service.ts b/libs/importer/src/services/default-import-metadata.service.ts new file mode 100644 index 00000000000..a9e767178aa --- /dev/null +++ b/libs/importer/src/services/default-import-metadata.service.ts @@ -0,0 +1,51 @@ +import { map, Observable } from "rxjs"; + +import { SemanticLogger } from "@bitwarden/common/tools/log"; +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; + +import { ImporterMetadata, Importers, ImportersMetadata } from "../metadata"; +import { ImportType } from "../models/import-options"; +import { availableLoaders } from "../util"; + +import { ImportMetadataServiceAbstraction } from "./import-metadata.service.abstraction"; + +export class DefaultImportMetadataService implements ImportMetadataServiceAbstraction { + protected importers: ImportersMetadata = Importers; + private logger: SemanticLogger; + + constructor(protected system: SystemServiceProvider) { + this.logger = system.log({ type: "ImportMetadataService" }); + } + + async init(): Promise { + // no-op for default implementation + } + + metadata$(type$: Observable): Observable { + const client = this.system.environment.getClientType(); + const capabilities$ = type$.pipe( + map((type) => { + if (!this.importers) { + return { type, loaders: [] }; + } + + const loaders = availableLoaders(this.importers, type, client); + + if (!loaders || loaders.length === 0) { + return { type, loaders: [] }; + } + + const capabilities: ImporterMetadata = { type, loaders }; + if (type in this.importers) { + capabilities.instructions = this.importers[type]?.instructions; + } + + this.logger.debug({ importType: type, capabilities }, "capabilities updated"); + + return capabilities; + }), + ); + + return capabilities$; + } +} diff --git a/libs/importer/src/services/import-metadata.service.abstraction.ts b/libs/importer/src/services/import-metadata.service.abstraction.ts new file mode 100644 index 00000000000..500dcfcef10 --- /dev/null +++ b/libs/importer/src/services/import-metadata.service.abstraction.ts @@ -0,0 +1,11 @@ +import { Observable } from "rxjs"; + +import { ImporterMetadata } from "../metadata"; +import { ImportType } from "../models/import-options"; + +export abstract class ImportMetadataServiceAbstraction { + abstract init(): Promise; + + /** describes the features supported by a format */ + abstract metadata$: (type$: Observable) => Observable; +} diff --git a/libs/importer/src/services/import-metadata.service.spec.ts b/libs/importer/src/services/import-metadata.service.spec.ts new file mode 100644 index 00000000000..25ce41251b6 --- /dev/null +++ b/libs/importer/src/services/import-metadata.service.spec.ts @@ -0,0 +1,110 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { Subject, firstValueFrom } from "rxjs"; + +import { ClientType } from "@bitwarden/client-type"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; + +import { ImporterMetadata, Instructions } from "../metadata"; +import { ImportType } from "../models"; + +import { DefaultImportMetadataService } from "./default-import-metadata.service"; +import { ImportMetadataServiceAbstraction } from "./import-metadata.service.abstraction"; + +describe("ImportMetadataService", () => { + let sut: ImportMetadataServiceAbstraction; + let systemServiceProvider: MockProxy; + + beforeEach(() => { + const configService = mock(); + + const environment = mock(); + environment.getClientType.mockReturnValue(ClientType.Desktop); + + systemServiceProvider = mock({ + configService, + environment, + log: jest.fn().mockReturnValue({ debug: jest.fn() }), + }); + + sut = new DefaultImportMetadataService(systemServiceProvider); + }); + + describe("metadata$", () => { + let typeSubject: Subject; + let mockLogger: { debug: jest.Mock }; + + beforeEach(() => { + typeSubject = new Subject(); + mockLogger = { debug: jest.fn() }; + + const configService = mock(); + + const environment = mock(); + environment.getClientType.mockReturnValue(ClientType.Desktop); + + systemServiceProvider = mock({ + configService, + environment, + log: jest.fn().mockReturnValue(mockLogger), + }); + + // Recreate the service with the updated mocks for logging tests + sut = new DefaultImportMetadataService(systemServiceProvider); + }); + + afterEach(() => { + typeSubject.complete(); + }); + + it("should emit metadata when type$ emits", async () => { + const testType: ImportType = "chromecsv"; + + const metadataPromise = firstValueFrom(sut.metadata$(typeSubject)); + typeSubject.next(testType); + + const result = await metadataPromise; + + expect(result).toEqual({ + type: testType, + loaders: expect.any(Array), + instructions: Instructions.chromium, + }); + expect(result.type).toBe(testType); + }); + + it("should update when type$ changes", async () => { + const emissions: ImporterMetadata[] = []; + const subscription = sut.metadata$(typeSubject).subscribe((metadata) => { + emissions.push(metadata); + }); + + typeSubject.next("chromecsv"); + typeSubject.next("bravecsv"); + + // Wait for emissions + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(emissions).toHaveLength(2); + expect(emissions[0].type).toBe("chromecsv"); + expect(emissions[1].type).toBe("bravecsv"); + + subscription.unsubscribe(); + }); + + it("should log debug information with correct data", async () => { + const testType: ImportType = "chromecsv"; + + const metadataPromise = firstValueFrom(sut.metadata$(typeSubject)); + typeSubject.next(testType); + + await metadataPromise; + + expect(mockLogger.debug).toHaveBeenCalledWith( + { importType: testType, capabilities: expect.any(Object) }, + "capabilities updated", + ); + }); + }); +}); diff --git a/libs/importer/src/services/import.service.abstraction.ts b/libs/importer/src/services/import.service.abstraction.ts index ee0d1ed33ab..d8f1f6ccd5c 100644 --- a/libs/importer/src/services/import.service.abstraction.ts +++ b/libs/importer/src/services/import.service.abstraction.ts @@ -1,6 +1,5 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Observable } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports @@ -8,7 +7,6 @@ import { CollectionView } from "@bitwarden/admin-console/common"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { Importer } from "../importers/importer"; -import { ImporterMetadata } from "../metadata"; import { ImportOption, ImportType } from "../models/import-options"; import { ImportResult } from "../models/import-result"; @@ -17,9 +15,6 @@ export abstract class ImportServiceAbstraction { regularImportOptions: readonly ImportOption[]; getImportOptions: () => ImportOption[]; - /** describes the features supported by a format */ - metadata$: (type$: Observable) => Observable; - import: ( importer: Importer, fileContents: string, diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index 2a3963e19d7..fd710056e80 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -1,20 +1,13 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject, Subject, firstValueFrom } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; -import { ClientType } from "@bitwarden/client-type"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -25,8 +18,6 @@ import { KeyService } from "@bitwarden/key-management"; import { BitwardenPasswordProtectedImporter } from "../importers/bitwarden/bitwarden-password-protected-importer"; import { Importer } from "../importers/importer"; -import { ImporterMetadata, Instructions, Loader } from "../metadata"; -import { ImportType } from "../models"; import { ImportResult } from "../models/import-result"; import { ImportApiServiceAbstraction } from "./import-api.service.abstraction"; @@ -44,7 +35,6 @@ describe("ImportService", () => { let pinService: MockProxy; let accountService: MockProxy; let restrictedItemTypesService: MockProxy; - let systemServiceProvider: MockProxy; beforeEach(() => { cipherService = mock(); @@ -57,18 +47,6 @@ describe("ImportService", () => { pinService = mock(); restrictedItemTypesService = mock(); - const configService = mock(); - configService.getFeatureFlag$.mockReturnValue(new BehaviorSubject(false)); - - const environment = mock(); - environment.getClientType.mockReturnValue(ClientType.Desktop); - - systemServiceProvider = mock({ - configService, - environment, - log: jest.fn().mockReturnValue({ debug: jest.fn() }), - }); - importService = new ImportService( cipherService, folderService, @@ -80,7 +58,6 @@ describe("ImportService", () => { pinService, accountService, restrictedItemTypesService, - systemServiceProvider, ); }); @@ -268,136 +245,6 @@ describe("ImportService", () => { expect(importResult.folderRelationships[1]).toEqual([0, 1]); }); }); - - describe("metadata$", () => { - let featureFlagSubject: BehaviorSubject; - let typeSubject: Subject; - let mockLogger: { debug: jest.Mock }; - - beforeEach(() => { - featureFlagSubject = new BehaviorSubject(false); - typeSubject = new Subject(); - mockLogger = { debug: jest.fn() }; - - const configService = mock(); - configService.getFeatureFlag$.mockReturnValue(featureFlagSubject); - - const environment = mock(); - environment.getClientType.mockReturnValue(ClientType.Desktop); - - systemServiceProvider = mock({ - configService, - environment, - log: jest.fn().mockReturnValue(mockLogger), - }); - - // Recreate the service with the updated mocks for logging tests - importService = new ImportService( - cipherService, - folderService, - importApiService, - i18nService, - collectionService, - keyService, - encryptService, - pinService, - accountService, - restrictedItemTypesService, - systemServiceProvider, - ); - }); - - afterEach(() => { - featureFlagSubject.complete(); - typeSubject.complete(); - }); - - it("should emit metadata when type$ emits", async () => { - const testType: ImportType = "chromecsv"; - - const metadataPromise = firstValueFrom(importService.metadata$(typeSubject)); - typeSubject.next(testType); - - const result = await metadataPromise; - - expect(result).toEqual({ - type: testType, - loaders: expect.any(Array), - instructions: Instructions.chromium, - }); - expect(result.type).toBe(testType); - }); - - it("should include all loaders when chromium feature flag is enabled", async () => { - const testType: ImportType = "bravecsv"; // bravecsv supports both file and chromium loaders - featureFlagSubject.next(true); - - const metadataPromise = firstValueFrom(importService.metadata$(typeSubject)); - typeSubject.next(testType); - - const result = await metadataPromise; - - expect(result.loaders).toContain(Loader.chromium); - expect(result.loaders).toContain(Loader.file); - }); - - it("should update when type$ changes", async () => { - const emissions: ImporterMetadata[] = []; - const subscription = importService.metadata$(typeSubject).subscribe((metadata) => { - emissions.push(metadata); - }); - - typeSubject.next("chromecsv"); - typeSubject.next("bravecsv"); - - // Wait for emissions - await new Promise((resolve) => setTimeout(resolve, 0)); - - expect(emissions).toHaveLength(2); - expect(emissions[0].type).toBe("chromecsv"); - expect(emissions[1].type).toBe("bravecsv"); - - subscription.unsubscribe(); - }); - - it("should update when both type$ and feature flag change", async () => { - const emissions: ImporterMetadata[] = []; - - const subscription = importService.metadata$(typeSubject).subscribe((metadata) => { - emissions.push(metadata); - }); - - // Initial emission - typeSubject.next("chromecsv"); - - // Change both at the same time - featureFlagSubject.next(true); - typeSubject.next("bravecsv"); - - // Wait for emissions - await new Promise((resolve) => setTimeout(resolve, 0)); - - expect(emissions.length).toBeGreaterThanOrEqual(2); - const lastEmission = emissions[emissions.length - 1]; - expect(lastEmission.type).toBe("bravecsv"); - - subscription.unsubscribe(); - }); - - it("should log debug information with correct data", async () => { - const testType: ImportType = "chromecsv"; - - const metadataPromise = firstValueFrom(importService.metadata$(typeSubject)); - typeSubject.next(testType); - - await metadataPromise; - - expect(mockLogger.debug).toHaveBeenCalledWith( - { importType: testType, capabilities: expect.any(Object) }, - "capabilities updated", - ); - }); - }); }); function createCipher(options: Partial = {}) { diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index c17490ed4a4..3efe327e319 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { combineLatest, firstValueFrom, map, Observable } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports @@ -11,7 +11,6 @@ import { } from "@bitwarden/admin-console/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { DeviceType } from "@bitwarden/common/enums"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { ImportCiphersRequest } from "@bitwarden/common/models/request/import-ciphers.request"; @@ -20,8 +19,6 @@ import { KvpRequest } from "@bitwarden/common/models/request/kvp.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SemanticLogger } from "@bitwarden/common/tools/log"; -import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -98,7 +95,6 @@ import { PasswordDepot17XmlImporter, } from "../importers"; import { Importer } from "../importers/importer"; -import { ImporterMetadata, Importers, Loader } from "../metadata"; import { featuredImportOptions, ImportOption, @@ -108,15 +104,12 @@ import { import { ImportResult } from "../models/import-result"; import { ImportApiServiceAbstraction } from "../services/import-api.service.abstraction"; import { ImportServiceAbstraction } from "../services/import.service.abstraction"; -import { availableLoaders as availableLoaders } from "../util"; export class ImportService implements ImportServiceAbstraction { featuredImportOptions = featuredImportOptions as readonly ImportOption[]; regularImportOptions = regularImportOptions as readonly ImportOption[]; - private logger: SemanticLogger; - constructor( private cipherService: CipherService, private folderService: FolderService, @@ -128,55 +121,12 @@ export class ImportService implements ImportServiceAbstraction { private pinService: PinServiceAbstraction, private accountService: AccountService, private restrictedItemTypesService: RestrictedItemTypesService, - private system: SystemServiceProvider, - ) { - this.logger = system.log({ type: "ImportService" }); - } + ) {} getImportOptions(): ImportOption[] { return this.featuredImportOptions.concat(this.regularImportOptions); } - metadata$(type$: Observable): Observable { - const client = this.system.environment.getClientType(); - const capabilities$ = combineLatest([type$]).pipe( - map(([type]) => { - let loaders = availableLoaders(type, client); - - // Mac App Store is currently disabled due to sandboxing. - let isUnsupported = this.system.environment.isMacAppStore(); - - // disable the chromium loader for Brave on Windows only - if (type === "bravecsv") { - try { - const device = this.system.environment.getDevice(); - const isWindowsDesktop = device === DeviceType.WindowsDesktop; - if (isWindowsDesktop) { - isUnsupported = true; - } - } catch { - isUnsupported = true; - } - } - // If the browser is unsupported, remove the chromium loader - if (isUnsupported) { - loaders = loaders?.filter((loader) => loader !== Loader.chromium); - } - - const capabilities: ImporterMetadata = { type, loaders }; - if (type in Importers) { - capabilities.instructions = Importers[type].instructions; - } - - this.logger.debug({ importType: type, capabilities }, "capabilities updated"); - - return capabilities; - }), - ); - - return capabilities$; - } - async import( importer: Importer, fileContents: string, diff --git a/libs/importer/src/services/index.ts b/libs/importer/src/services/index.ts index 13568f886c4..ec53826addc 100644 --- a/libs/importer/src/services/index.ts +++ b/libs/importer/src/services/index.ts @@ -4,4 +4,7 @@ export { ImportApiService } from "./import-api.service"; export { ImportServiceAbstraction } from "./import.service.abstraction"; export { ImportService } from "./import.service"; +export { ImportMetadataServiceAbstraction } from "./import-metadata.service.abstraction"; +export { DefaultImportMetadataService } from "./default-import-metadata.service"; + export { ImportCollectionServiceAbstraction } from "./import-collection.service.abstraction"; diff --git a/libs/importer/src/util.spec.ts b/libs/importer/src/util.spec.ts deleted file mode 100644 index 5a68e3cea12..00000000000 --- a/libs/importer/src/util.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { ClientType } from "@bitwarden/client-type"; - -import { Loader } from "./metadata"; -import { availableLoaders } from "./util"; - -describe("availableLoaders", () => { - describe("given valid import types", () => { - it("returns available loaders when client supports all loaders", () => { - const result = availableLoaders("operacsv", ClientType.Desktop); - - expect(result).toEqual([Loader.file, Loader.chromium]); - }); - - it("returns filtered loaders when client supports some loaders", () => { - const result = availableLoaders("operacsv", ClientType.Browser); - - expect(result).toEqual([Loader.file]); - }); - - it("returns single loader for import types with one loader", () => { - const result = availableLoaders("chromecsv", ClientType.Desktop); - - expect(result).toEqual([Loader.file]); - }); - - it("returns all supported loaders for multi-loader import types", () => { - const result = availableLoaders("bravecsv", ClientType.Desktop); - - expect(result).toEqual([Loader.file, Loader.chromium]); - }); - }); - - describe("given unknown import types", () => { - it("returns undefined when import type is not found in metadata", () => { - const result = availableLoaders("nonexistent" as any, ClientType.Desktop); - - expect(result).toBeUndefined(); - }); - }); - - describe("given different client types", () => { - it("returns appropriate loaders for Browser client", () => { - const result = availableLoaders("operacsv", ClientType.Browser); - - expect(result).toEqual([Loader.file]); - }); - - it("returns appropriate loaders for Web client", () => { - const result = availableLoaders("chromecsv", ClientType.Web); - - expect(result).toEqual([Loader.file]); - }); - - it("returns appropriate loaders for CLI client", () => { - const result = availableLoaders("vivaldicsv", ClientType.Cli); - - expect(result).toEqual([Loader.file]); - }); - }); -}); diff --git a/libs/importer/src/util.ts b/libs/importer/src/util.ts index 0a76b7e753b..7a5f4cbf1e8 100644 --- a/libs/importer/src/util.ts +++ b/libs/importer/src/util.ts @@ -1,6 +1,6 @@ import { ClientType } from "@bitwarden/client-type"; -import { LoaderAvailability, Importers } from "./metadata"; +import { LoaderAvailability, ImportersMetadata } from "./metadata"; import { ImportType } from "./models"; /** Lookup the loaders supported by a specific client. @@ -8,12 +8,20 @@ import { ImportType } from "./models"; * @returns `undefined` when metadata is not defined for the type, or * an array identifying the supported clients. */ -export function availableLoaders(type: ImportType, client: ClientType) { - if (!(type in Importers)) { +export function availableLoaders( + importersMetadata: ImportersMetadata, + type: ImportType, + client: ClientType, +) { + if (!importersMetadata) { return undefined; } - const capabilities = Importers[type]?.loaders ?? []; + if (!(type in importersMetadata)) { + return undefined; + } + + const capabilities = importersMetadata[type]?.loaders ?? []; const available = capabilities.filter((loader) => LoaderAvailability[loader].includes(client)); return available; } diff --git a/libs/key-management-ui/src/lock/components/lock.component.ts b/libs/key-management-ui/src/lock/components/lock.component.ts index e7550e34b9f..7fcb050f34e 100644 --- a/libs/key-management-ui/src/lock/components/lock.component.ts +++ b/libs/key-management-ui/src/lock/components/lock.component.ts @@ -622,6 +622,7 @@ export class LockComponent implements OnInit, OnDestroy { this.logService.mark("Vault unlocked"); await this.keyService.setUserKey(key, this.activeAccount.id); + await this.pinService.userUnlocked(this.activeAccount.id); // Now that we have a decrypted user key in memory, we can check if we // need to establish trust on the current device diff --git a/libs/key-management/src/abstractions/key.service.ts b/libs/key-management/src/abstractions/key.service.ts index e4bb83cb2fd..abd4dcc1563 100644 --- a/libs/key-management/src/abstractions/key.service.ts +++ b/libs/key-management/src/abstractions/key.service.ts @@ -142,11 +142,10 @@ export abstract class KeyService { abstract makeUserKeyV1(): Promise; /** * Clears the user's stored version of the user key - * @param keySuffix The desired version of the key to clear * @param userId The desired user * @throws Error when userId is null or undefined. */ - abstract clearStoredUserKey(keySuffix: KeySuffixOptions, userId: string): Promise; + abstract clearStoredUserKey(userId: string): Promise; /** * Retrieves the user's master key if it is in state, or derives it from the provided password * @param password The user's master password that will be used to derive a master key if one isn't found @@ -228,6 +227,7 @@ export abstract class KeyService { * @deprecated Use {@link orgKeys$} with a required {@link UserId} instead. */ abstract activeUserOrgKeys$: Observable>; + /** * Returns the organization's symmetric key * @deprecated Use the observable userOrgKeys$ and `map` to the desired {@link OrgKey} instead @@ -345,14 +345,6 @@ export abstract class KeyService { * @throws If the provided key is a null-ish value. */ abstract makeKeyPair(key: SymmetricCryptoKey): Promise<[string, EncString]>; - /** - * Clears the user's pin keys from storage - * Note: This will remove the stored pin and as a result, - * disable pin protection for the user - * @param userId The desired user - * @throws Error when provided userId is null or undefined - */ - abstract clearPinKeys(userId: UserId): Promise; /** * @param keyMaterial The key material to derive the send key from * @returns A new send key diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 46d1125711b..0dd9f3603f5 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -10,7 +10,6 @@ import { EncryptedString, } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; -import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { UnsignedPublicKey, WrappedSigningKey } from "@bitwarden/common/key-management/types"; import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; @@ -57,7 +56,6 @@ import { KdfConfig } from "./models/kdf-config"; describe("keyService", () => { let keyService: DefaultKeyService; - const pinService = mock(); const keyGenerationService = mock(); const cryptoFunctionService = mock(); const encryptService = mock(); @@ -77,7 +75,6 @@ describe("keyService", () => { stateProvider = new FakeStateProvider(accountService); keyService = new DefaultKeyService( - pinService, masterPasswordService, keyGenerationService, cryptoFunctionService, @@ -256,54 +253,6 @@ describe("keyService", () => { "No userId provided.", ); }); - - describe("Pin Key refresh", () => { - const mockPinKeyEncryptedUserKey = new EncString( - "2.AAAw2vTUePO+CCyokcIfVw==|DTBNlJ5yVsV2Bsk3UU3H6Q==|YvFBff5gxWqM+UsFB6BKimKxhC32AtjF3IStpU1Ijwg=", - ); - const mockUserKeyEncryptedPin = new EncString( - "2.BBBw2vTUePO+CCyokcIfVw==|DTBNlJ5yVsV2Bsk3UU3H6Q==|YvFBff5gxWqM+UsFB6BKimKxhC32AtjF3IStpU1Ijwg=", - ); - - it("sets a pinKeyEncryptedUserKeyPersistent if a userKeyEncryptedPin and pinKeyEncryptedUserKey is set", async () => { - pinService.createPinKeyEncryptedUserKey.mockResolvedValue(mockPinKeyEncryptedUserKey); - pinService.getUserKeyEncryptedPin.mockResolvedValue(mockUserKeyEncryptedPin); - pinService.getPinKeyEncryptedUserKeyPersistent.mockResolvedValue( - mockPinKeyEncryptedUserKey, - ); - - await keyService.setUserKey(mockUserKey, mockUserId); - - expect(pinService.storePinKeyEncryptedUserKey).toHaveBeenCalledWith( - mockPinKeyEncryptedUserKey, - false, - mockUserId, - ); - }); - - it("sets a pinKeyEncryptedUserKeyEphemeral if a userKeyEncryptedPin is set, but a pinKeyEncryptedUserKey is not set", async () => { - pinService.createPinKeyEncryptedUserKey.mockResolvedValue(mockPinKeyEncryptedUserKey); - pinService.getUserKeyEncryptedPin.mockResolvedValue(mockUserKeyEncryptedPin); - pinService.getPinKeyEncryptedUserKeyPersistent.mockResolvedValue(null); - - await keyService.setUserKey(mockUserKey, mockUserId); - - expect(pinService.storePinKeyEncryptedUserKey).toHaveBeenCalledWith( - mockPinKeyEncryptedUserKey, - true, - mockUserId, - ); - }); - - it("clears the pinKeyEncryptedUserKeyPersistent and pinKeyEncryptedUserKeyEphemeral if the UserKeyEncryptedPin is not set", async () => { - pinService.getUserKeyEncryptedPin.mockResolvedValue(null); - - await keyService.setUserKey(mockUserKey, mockUserId); - - expect(pinService.clearPinKeyEncryptedUserKeyPersistent).toHaveBeenCalledWith(mockUserId); - expect(pinService.clearPinKeyEncryptedUserKeyEphemeral).toHaveBeenCalledWith(mockUserId); - }); - }); }); describe("setUserKeys", () => { @@ -388,36 +337,22 @@ describe("keyService", () => { const invalidUserIdTestCases = [ { keySuffix: KeySuffixOptions.Auto, userId: null as unknown as UserId }, { keySuffix: KeySuffixOptions.Auto, userId: undefined as unknown as UserId }, - { keySuffix: KeySuffixOptions.Pin, userId: null as unknown as UserId }, - { keySuffix: KeySuffixOptions.Pin, userId: undefined as unknown as UserId }, ]; test.each(invalidUserIdTestCases)( "throws when keySuffix is $keySuffix and userId is $userId", async ({ keySuffix, userId }) => { - await expect(keyService.clearStoredUserKey(keySuffix, userId)).rejects.toThrow( - "UserId is required", - ); + await expect(keyService.clearStoredUserKey(userId)).rejects.toThrow("UserId is required"); }, ); }); describe("with Auto key suffix", () => { it("UserKeyAutoUnlock is cleared and pin keys are not cleared", async () => { - await keyService.clearStoredUserKey(KeySuffixOptions.Auto, mockUserId); + await keyService.clearStoredUserKey(mockUserId); expect(stateService.setUserKeyAutoUnlock).toHaveBeenCalledWith(null, { userId: mockUserId, }); - expect(pinService.clearPinKeyEncryptedUserKeyEphemeral).not.toHaveBeenCalled(); - }); - }); - - describe("with PIN key suffix", () => { - it("pin keys are cleared and user key auto unlock not", async () => { - await keyService.clearStoredUserKey(KeySuffixOptions.Pin, mockUserId); - - expect(stateService.setUserKeyAutoUnlock).not.toHaveBeenCalled(); - expect(pinService.clearPinKeyEncryptedUserKeyEphemeral).toHaveBeenCalledWith(mockUserId); }); }); }); @@ -448,24 +383,6 @@ describe("keyService", () => { }); }); - describe("clearPinKeys", () => { - test.each([null as unknown as UserId, undefined as unknown as UserId])( - "throws when the provided userId is %s", - async (userId) => { - await expect(keyService.clearPinKeys(userId)).rejects.toThrow("UserId is required"); - }, - ); - it("calls pin service to clear", async () => { - const userId = "someOtherUser" as UserId; - - await keyService.clearPinKeys(userId); - - expect(pinService.clearPinKeyEncryptedUserKeyPersistent).toHaveBeenCalledWith(userId); - expect(pinService.clearPinKeyEncryptedUserKeyEphemeral).toHaveBeenCalledWith(userId); - expect(pinService.clearUserKeyEncryptedPin).toHaveBeenCalledWith(userId); - }); - }); - describe("userPrivateKey$", () => { let mockUserKey: UserKey; let mockUserPrivateKey: Uint8Array; @@ -1262,7 +1179,6 @@ describe("keyService", () => { expect(result).toEqual(mockUserKey); expect(validateUserKeySpy).toHaveBeenCalledWith(mockUserKey, mockUserId); expect(logService.warning).toHaveBeenCalledWith("Invalid key, throwing away stored keys"); - expect(pinService.clearPinKeyEncryptedUserKeyEphemeral).toHaveBeenCalledWith(mockUserId); expect(stateService.setUserKeyAutoUnlock).toHaveBeenCalledWith(null, { userId: mockUserId, }); diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index a13c74e96d2..fc340410124 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -27,7 +27,6 @@ import { EncryptedString, } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { WrappedSigningKey } from "@bitwarden/common/key-management/types"; import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; @@ -72,7 +71,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { readonly activeUserOrgKeys$: Observable>; constructor( - protected pinService: PinServiceAbstraction, protected masterPasswordService: InternalMasterPasswordServiceAbstraction, protected keyGenerationService: KeyGenerationService, protected cryptoFunctionService: CryptoFunctionService, @@ -105,6 +103,13 @@ export class DefaultKeyService implements KeyServiceAbstraction { await this.stateProvider.setUserState(USER_EVER_HAD_USER_KEY, true, userId); await this.storeAdditionalKeys(key, userId); + + // Await the key actually being set. This ensures that any subsequent callers know the key is already in state. + // There were bugs related to the stateprovider observables in the past that caused issues around this. + const userKey = await firstValueFrom(this.userKey$(userId).pipe(filter((k) => k != null))); + if (userKey == null) { + throw new Error("Failed to set user key"); + } } async setUserKeys( @@ -223,17 +228,12 @@ export class DefaultKeyService implements KeyServiceAbstraction { await this.clearAllStoredUserKeys(userId); } - async clearStoredUserKey(keySuffix: KeySuffixOptions, userId: UserId): Promise { + async clearStoredUserKey(userId: UserId): Promise { if (userId == null) { throw new Error("UserId is required"); } - if (keySuffix === KeySuffixOptions.Auto) { - await this.stateService.setUserKeyAutoUnlock(null, { userId: userId }); - } - if (keySuffix === KeySuffixOptions.Pin) { - await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); - } + await this.stateService.setUserKeyAutoUnlock(null, { userId: userId }); } /** @@ -513,16 +513,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { await this.stateProvider.setUserState(USER_KEY_ENCRYPTED_SIGNING_KEY, null, userId); } - async clearPinKeys(userId: UserId): Promise { - if (userId == null) { - throw new Error("UserId is required"); - } - - await this.pinService.clearPinKeyEncryptedUserKeyPersistent(userId); - await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); - await this.pinService.clearUserKeyEncryptedPin(userId); - } - async makeSendKey(keyMaterial: CsprngArray): Promise { return await this.keyGenerationService.deriveKeyFromMaterial( keyMaterial, @@ -546,7 +536,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { await this.clearProviderKeys(userId); await this.clearKeyPair(userId); await this.clearSigningKey(userId); - await this.clearPinKeys(userId); await this.stateProvider.setUserState(USER_EVER_HAD_USER_KEY, null, userId); } @@ -678,32 +667,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { } else { await this.stateService.setUserKeyAutoUnlock(null, { userId: userId }); } - - const storePin = await this.shouldStoreKey(KeySuffixOptions.Pin, userId); - if (storePin) { - // Decrypt userKeyEncryptedPin with user key - const pin = await this.encryptService.decryptString( - (await this.pinService.getUserKeyEncryptedPin(userId))!, - key, - ); - - const pinKeyEncryptedUserKey = await this.pinService.createPinKeyEncryptedUserKey( - pin, - key, - userId, - ); - const noPreExistingPersistentKey = - (await this.pinService.getPinKeyEncryptedUserKeyPersistent(userId)) == null; - - await this.pinService.storePinKeyEncryptedUserKey( - pinKeyEncryptedUserKey, - noPreExistingPersistentKey, - userId, - ); - } else { - await this.pinService.clearPinKeyEncryptedUserKeyPersistent(userId); - await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); - } } protected async shouldStoreKey(keySuffix: KeySuffixOptions, userId: UserId) { @@ -720,11 +683,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { shouldStoreKey = vaultTimeout == VaultTimeoutStringType.Never; break; } - case KeySuffixOptions.Pin: { - const userKeyEncryptedPin = await this.pinService.getUserKeyEncryptedPin(userId); - shouldStoreKey = !!userKeyEncryptedPin; - break; - } } return shouldStoreKey; } @@ -744,7 +702,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { protected async clearAllStoredUserKeys(userId: UserId): Promise { await this.stateService.setUserKeyAutoUnlock(null, { userId: userId }); - await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); } private async hashPhrase(hash: Uint8Array, minimumEntropy = 64) { diff --git a/libs/state-internal/src/default-single-user-state.ts b/libs/state-internal/src/default-single-user-state.ts index 1496a710537..9155a221d56 100644 --- a/libs/state-internal/src/default-single-user-state.ts +++ b/libs/state-internal/src/default-single-user-state.ts @@ -31,8 +31,6 @@ export class DefaultSingleUserState protected override async doStorageSave(newState: T, oldState: T): Promise { await super.doStorageSave(newState, oldState); - if (newState != null && oldState == null) { - await this.stateEventRegistrarService.registerEvents(this.keyDefinition); - } + await this.stateEventRegistrarService.registerEvents(this.keyDefinition); } } diff --git a/libs/vault/src/cipher-form/cipher-form.stories.ts b/libs/vault/src/cipher-form/cipher-form.stories.ts index 3b1017ffe32..cf52dbc557f 100644 --- a/libs/vault/src/cipher-form/cipher-form.stories.ts +++ b/libs/vault/src/cipher-form/cipher-form.stories.ts @@ -215,7 +215,9 @@ export default { { provide: DomainSettingsService, useValue: { - defaultUriMatchStrategy$: new BehaviorSubject(UriMatchStrategy.StartsWith), + resolvedDefaultUriMatchStrategy$: new BehaviorSubject(UriMatchStrategy.StartsWith), + defaultUriMatchStrategy$: new BehaviorSubject(UriMatchStrategy.Domain), + defaultUriMatchStrategyPolicy$: new BehaviorSubject(null), }, }, { diff --git a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.spec.ts b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.spec.ts index afbf1d86649..3aeeac6ca92 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.spec.ts +++ b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.spec.ts @@ -43,7 +43,7 @@ describe("AutofillOptionsComponent", () => { liveAnnouncer = mock(); platformUtilsService = mock(); domainSettingsService = mock(); - domainSettingsService.defaultUriMatchStrategy$ = new BehaviorSubject(null); + domainSettingsService.resolvedDefaultUriMatchStrategy$ = new BehaviorSubject(null); autofillSettingsService = mock(); autofillSettingsService.autofillOnPageLoadDefault$ = new BehaviorSubject(false); diff --git a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts index 213fe227cdf..6a2b3e431ca 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts +++ b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts @@ -76,10 +76,12 @@ export class AutofillOptionsComponent implements OnInit { return this.cipherFormContainer.config.mode === "partial-edit"; } - protected defaultMatchDetection$ = this.domainSettingsService.defaultUriMatchStrategy$.pipe( - // The default match detection should only be shown when used on the browser - filter(() => this.platformUtilsService.getClientType() == ClientType.Browser), - ); + protected defaultMatchDetection$ = + this.domainSettingsService.resolvedDefaultUriMatchStrategy$.pipe( + // The default match detection should only be shown when used on the browser + filter(() => this.platformUtilsService.getClientType() == ClientType.Browser), + ); + protected autofillOnPageLoadEnabled$ = this.autofillSettingsService.autofillOnPageLoad$; protected autofillOptions: { label: string; value: boolean | null }[] = [ diff --git a/package-lock.json b/package-lock.json index 8da94affe5d..2c1ca659d99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,7 +279,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2025.10.1", + "version": "2025.10.2", "hasInstallScript": true, "license": "GPL-3.0" },