diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 6000df04bb..7b17b114d6 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index f7479ccf18..e12fb0dc88 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Parol silindi" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 0b11a5e3e6..26ecf49cc7 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 7ffecb5d1f..2ddaf647d8 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Секретният ключ е премахнат" + }, + "unassignedItemsBanner": { + "message": "Забележка: неразпределените елементи на организацията вече не се виждат в изгледа с „Всички трезори“, а са достъпни само през Административната конзола. Добавете тези елементи към някоя колекция в Административната конзола, за да станат видими." } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 63cb122765..4bdf811b3b 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index e0a0633dda..a7f157011e 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 1572f54c80..147a64233c 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -3001,9 +3001,12 @@ "description": "Notification message for when saving credentials has failed." }, "removePasskey": { - "message": "Remove passkey" + "message": "Suprimeix la clau de pas" }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "Clau de pas suprimida" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index e818527b51..2b6a8d4f0b 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Přístupový klíč byl odebrán" + }, + "unassignedItemsBanner": { + "message": "Upozornění: Nepřiřazené položky organizace již nejsou viditelné ve Vašem zobrazení všech trezorů a jsou nyní přístupné jen v konzoli správce. Přiřaďte tyto položky do kolekce z konzole pro správce, aby byly viditelné." } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 410c8dbe80..79867bf7bf 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 4c686aa5ce..26e08741b2 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Adgangsnøgle fjernet" + }, + "unassignedItemsBanner": { + "message": "Bemærk: Utildelte organisationsemner er ikke længere synlige i Alle Bokse-visningen og er kun tilgængelige via Adminkonsollen. Føj disse emner til en samling fra Adminkonsollen for at gøre dem synlige." } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 502f5a8833..b542fbfad7 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -2706,7 +2706,7 @@ "message": "Für dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich." }, "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." + "message": "Koppel die Erweiterung ab, um die Anmeldung abzuschließen." }, "popoutExtension": { "message": "Popout-Erweiterung" @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey gelöscht" + }, + "unassignedItemsBanner": { + "message": "Hinweis: Nicht zugeordnete Organisationseinträge sind nicht mehr in der Ansicht aller Tresore sichtbar und nur über die Administrator-Konsole zugänglich. Weise diese Einträge einer Sammlung aus der Administrator-Konsole zu, um sie sichtbar zu machen." } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index a698cf2ec6..7bbc615dae 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 9d444ce40e..4108db3996 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -3008,5 +3008,8 @@ }, "unassignedItemsBanner": { "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." + }, + "unassignedItemsBannerSelfHost": { + "message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 284d05d7bc..1c24106cdc 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organisation items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 77d4b05427..f1a4979766 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index da9d26eb6d..31200031f6 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index fc108fcab5..1f98d15758 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 2d8286307b..49086462d9 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index fc702246d5..0c44026cec 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 13c6d119f9..ead3d43236 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Suojausavain poistettiin" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index d1cd0687e8..e9bc8e2c75 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index adfb462a66..452a2b363b 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Clé d'identification (passkey) retirée" + }, + "unassignedItemsBanner": { + "message": "Notice : les éléments d'organisation non assignés ne sont plus visibles dans la vue Tous les coffres et sont uniquement accessibles via la console d'administration. Assignez ces éléments à une collection à partir de la console d'administration pour les rendre visibles." } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index f9c352a683..7a05907228 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 84bc3461ae..99daecc5f8 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index c98aae3a3b..ec4509dbd4 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index c720d99c71..5c10efc3ae 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "A jelszó eltávolításra került." + }, + "unassignedItemsBanner": { + "message": "Megjegyzés: A nem hozzá nem rendelt szervezeti elemek már nem láthatók az Összes széf nézetben és csak az Adminisztrátori konzolon keresztül érhetők el. Rendeljük ezeket az elemeket egy gyűjteményhez az Adminisztrátor konzolból, hogy láthatóvá tegyük azokat." } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index ecc11725e7..810d603047 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index fb87081121..86a6bf054e 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey rimossa" + }, + "unassignedItemsBanner": { + "message": "Avviso: gli elementi dell'organizzazione non assegnati non sono più visibili nella visualizzazione Tutte le Cassaforti su tutti i dispositivi e sono ora accessibili solo tramite la Console di amministrazione. Assegna questi elementi ad una raccolta dalla Console di amministrazione per renderli visibili." } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index a247ee29cb..eb78a7205f 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "パスキーを削除しました" + }, + "unassignedItemsBanner": { + "message": "注意: 割り当てられていない組織項目は、すべての保管庫のビューでは表示されなくなり、管理コンソールからのみアクセスできます。 管理コンソールからコレクションにこれらのアイテムを割り当てると、表示するようにできます。" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 2559f4a109..66dae59f4c 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 01997a462c..68fe45999d 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index a99dd11d2f..689e618929 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 9537241f0d..c99d128915 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Pašalintas slaptaraktis" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 492141ff59..c36315d10d 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Piekļuves atslēga noņemta" + }, + "unassignedItemsBanner": { + "message": "Jāņem vērā: nepiešķirti apvienības vienumi vairs nav redzami skatā \"Visas glabātavas\" un ir sasniedzami tikai no pārvaldības konsoles, kur šie vienumi jāpiešķir krājumam, lai padarītu tos redzamus." } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index b87a8c8ee6..7205a54559 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index c3859f9764..918557feb8 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 5256eba72d..d77aaa7d7c 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index e189f1774f..bbf16b345a 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey verwijderd" + }, + "unassignedItemsBanner": { + "message": "Let op: Niet-toegewezen organisatie-items zijn niet langer zichtbaar in de weergave van alle kluisjes en zijn alleen toegankelijk via de Admin Console. Om deze items zichtbaar te maken, moet je ze toewijzen aan een collectie via de Admin Console." } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 4fa5fcb859..98130de3be 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey został usunięty" + }, + "unassignedItemsBanner": { + "message": "Uwaga: Nieprzypisane elementy w organizacji nie są już widoczne w widoku Wszystkie sejfy i są dostępne tylko przez Konsolę Administracyjną. Przypisz te elementy do kolekcji z konsoli administracyjnej, aby były one widoczne." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index a21308af6a..6126679902 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index bd42d39535..a904867d5f 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Chave de acesso removida" + }, + "unassignedItemsBanner": { + "message": "Aviso: Os itens da organização não atribuídos já não são visíveis na vista Todos os cofres e só são acessíveis através da consola de administração. Atribua estes itens a uma coleção a partir da Consola de administração para os tornar visíveis." } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 49ca701a6f..3e554f4d68 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 229ab31816..aed3d58b11 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -688,10 +688,10 @@ "message": "Запрос на обновление пароля логина при обнаружении изменений на сайте. Применяется ко всем авторизованным аккаунтам." }, "enableUsePasskeys": { - "message": "Запрос на сохранение и использование ключей доступа" + "message": "Запрос на сохранение и использование passkey" }, "usePasskeysDesc": { - "message": "Запрос на сохранение новых ключей или в авторизация с ключами, хранящимися в вашем хранилище. Применяется ко всем авторизованным аккаунтам." + "message": "Запрос на сохранение новых passkey или в авторизация с passkey, хранящимися в вашем хранилище. Применяется ко всем авторизованным аккаунтам." }, "notificationChangeDesc": { "message": "Обновить этот пароль в Bitwarden?" @@ -2786,25 +2786,25 @@ "message": "Подтвердите пароль к файлу" }, "typePasskey": { - "message": "Ключ доступа" + "message": "Passkey" }, "passkeyNotCopied": { - "message": "Ключ доступа не будет скопирован" + "message": "Passkey не будет скопирован" }, "passkeyNotCopiedAlert": { - "message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" + "message": "Passkey не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована." }, "logInWithPasskey": { - "message": "Войти с ключом доступа?" + "message": "Войти с passkey?" }, "passkeyAlreadyExists": { - "message": "Для данного приложения уже существует ключ доступа." + "message": "Для данного приложения уже существует passkey." }, "noPasskeysFoundForThisApplication": { - "message": "Для данного приложения ключей доступа не найдено." + "message": "Для данного приложения не найден passkey." }, "noMatchingPasskeyLogin": { "message": "У вас нет подходящего логина для этого сайта." @@ -2813,28 +2813,28 @@ "message": "Подтвердить" }, "savePasskey": { - "message": "Сохранить ключ доступа" + "message": "Сохранить passkey" }, "savePasskeyNewLogin": { - "message": "Сохранить ключ доступа как новый логин" + "message": "Сохранить passkey как новый логин" }, "choosePasskey": { - "message": "Выберите логин, для которого будет сохранен данный ключ доступа" + "message": "Выберите логин, для которого будет сохранен данный passkey" }, "passkeyItem": { - "message": "Ключ доступа элемента" + "message": "Элемент passkey" }, "overwritePasskey": { - "message": "Перезаписать ключ доступа?" + "message": "Перезаписать passkey?" }, "overwritePasskeyAlert": { - "message": "Этот элемент уже содержит ключ доступа. Вы уверены, что хотите перезаписать текущий ключ?" + "message": "Этот элемент уже содержит passkey. Вы уверены, что хотите перезаписать текущий passkey?" }, "featureNotSupported": { "message": "Функция пока не поддерживается" }, "yourPasskeyIsLocked": { - "message": "Для использования ключа доступа необходима аутентификация. Для продолжения работы подтвердите свою личность." + "message": "Для использования passkey необходима аутентификация. Для продолжения работы подтвердите свою личность." }, "multifactorAuthenticationCancelled": { "message": "Многофакторная аутентификация отменена" @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey удален" + }, + "unassignedItemsBanner": { + "message": "Обратите внимание: неприсвоенные элементы организации больше не видны в представлении \"Все хранилища\" и доступны только через консоль администратора. Назначьте эти элементы коллекции в консоли администратора, чтобы сделать их видимыми." } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 9857b8ca97..3dc18a97fb 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index b6f984a04c..bd4f9f9796 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Prístupový kľúč bol odstránený" + }, + "unassignedItemsBanner": { + "message": "Upozornenie: Nepriradené položky organizácie už nie sú viditeľné v zobrazení Všetky Trezory a sú prístupné len cez administrátorskú konzolu. Aby boli viditeľné, priraďte tieto položky do kolekcie z konzoly administrátora." } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index a8547066e6..3e2690be30 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 67ef9eb856..fef1a4eb8a 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Приступачни кључ је уклоњен" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index e37b914b28..0a27862c74 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 0f2cab77d8..dc91c1e6a9 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 0ee21fb3ec..ecc346513d 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index d9da7727cc..f6c00a58b8 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 64d3f62a78..873cfad2c6 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Ключ доступу вилучено" + }, + "unassignedItemsBanner": { + "message": "Увага: непризначені елементи організації більше не видимі у поданні \"Усі сховища\" і доступні лише в консолі адміністратора. Щоб зробити їх видимими, призначте ці елементи збірці в консолі адміністратора." } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 7aa43a4491..d71fa3322f 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 1e31baee60..85fb5f6d2e 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "通行密钥已移除" + }, + "unassignedItemsBanner": { + "message": "注意:未分配的组织项目在「所有密码库」视图中不再可见,只能通过管理控制台访问。通过管理控制台将这些项目分配给集合以使其可见。" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index c47bf538b8..66d9f7ce62 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -3005,5 +3005,8 @@ }, "passkeyRemoved": { "message": "Passkey removed" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts index 295fedbadd..c18fd1a112 100644 --- a/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts +++ b/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts @@ -17,6 +17,10 @@ import { FactoryOptions, factory, } from "../../../platform/background/service-factories/factory-options"; +import { + stateProviderFactory, + StateProviderInitOptions, +} from "../../../platform/background/service-factories/state-provider.factory"; import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; import { @@ -31,7 +35,8 @@ export type AuthRequestServiceInitOptions = AuthRequestServiceFactoryOptions & AccountServiceInitOptions & MasterPasswordServiceInitOptions & CryptoServiceInitOptions & - ApiServiceInitOptions; + ApiServiceInitOptions & + StateProviderInitOptions; export function authRequestServiceFactory( cache: { authRequestService?: AuthRequestServiceAbstraction } & CachedServices, @@ -48,6 +53,7 @@ export function authRequestServiceFactory( await internalMasterPasswordServiceFactory(cache, opts), await cryptoServiceFactory(cache, opts), await apiServiceFactory(cache, opts), + await stateProviderFactory(cache, opts), ), ); } diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts index 77d9741056..9a0423fca3 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -6,6 +6,7 @@ import { Subject, firstValueFrom, map, switchMap, takeUntil } from "rxjs"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -32,6 +33,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { private location: Location, private router: Router, private vaultTimeoutSettingsService: VaultTimeoutSettingsService, + private authService: AuthService, ) {} get accountLimit() { @@ -42,13 +44,14 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { return this.accountSwitcherService.SPECIAL_ADD_ACCOUNT_ID; } - get availableAccounts$() { - return this.accountSwitcherService.availableAccounts$; - } - - get currentAccount$() { - return this.accountService.activeAccount$; - } + readonly availableAccounts$ = this.accountSwitcherService.availableAccounts$; + readonly currentAccount$ = this.accountService.activeAccount$.pipe( + switchMap((a) => + a == null + ? null + : this.authService.activeAccountStatus$.pipe(map((s) => ({ ...a, status: s }))), + ), + ); async ngOnInit() { const availableVaultTimeoutActions = await firstValueFrom( diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.ts b/apps/browser/src/auth/popup/account-switching/current-account.component.ts index 1c7f93bf30..643c37b9aa 100644 --- a/apps/browser/src/auth/popup/account-switching/current-account.component.ts +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.ts @@ -4,6 +4,7 @@ import { ActivatedRoute, Router } from "@angular/router"; import { Observable, combineLatest, switchMap } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { UserId } from "@bitwarden/common/types/guid"; @@ -29,12 +30,14 @@ export class CurrentAccountComponent { private router: Router, private location: Location, private route: ActivatedRoute, + private authService: AuthService, ) { this.currentAccount$ = combineLatest([ this.accountService.activeAccount$, this.avatarService.avatarColor$, + this.authService.activeAccountStatus$, ]).pipe( - switchMap(async ([account, avatarColor]) => { + switchMap(async ([account, avatarColor, accountStatus]) => { if (account == null) { return null; } @@ -42,7 +45,7 @@ export class CurrentAccountComponent { id: account.id, name: account.name || account.email, email: account.email, - status: account.status, + status: accountStatus, avatarColor, }; diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts index f02a8ee201..fe04bee20e 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -1,7 +1,8 @@ import { matches, mock } from "jest-mock-extended"; -import { BehaviorSubject, firstValueFrom, of, timeout } from "rxjs"; +import { BehaviorSubject, ReplaySubject, firstValueFrom, of, timeout } from "rxjs"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; @@ -12,22 +13,29 @@ import { UserId } from "@bitwarden/common/types/guid"; import { AccountSwitcherService } from "./account-switcher.service"; describe("AccountSwitcherService", () => { - const accountsSubject = new BehaviorSubject>(null); - const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>(null); + let accountsSubject: BehaviorSubject>; + let activeAccountSubject: BehaviorSubject<{ id: UserId } & AccountInfo>; + let authStatusSubject: ReplaySubject>; const accountService = mock(); const avatarService = mock(); const messagingService = mock(); const environmentService = mock(); const logService = mock(); + const authService = mock(); let accountSwitcherService: AccountSwitcherService; beforeEach(() => { jest.resetAllMocks(); + accountsSubject = new BehaviorSubject>(null); + activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>(null); + authStatusSubject = new ReplaySubject>(1); + // Use subject to allow for easy updates accountService.accounts$ = accountsSubject; accountService.activeAccount$ = activeAccountSubject; + authService.authStatuses$ = authStatusSubject; accountSwitcherService = new AccountSwitcherService( accountService, @@ -35,48 +43,59 @@ describe("AccountSwitcherService", () => { messagingService, environmentService, logService, + authService, ); }); + afterEach(() => { + accountsSubject.complete(); + activeAccountSubject.complete(); + authStatusSubject.complete(); + }); + describe("availableAccounts$", () => { - it("should return all accounts and an add account option when accounts are less than 5", async () => { - const user1AccountInfo: AccountInfo = { + it("should return all logged in accounts and an add account option when accounts are less than 5", async () => { + const accountInfo: AccountInfo = { name: "Test User 1", email: "test1@email.com", - status: AuthenticationStatus.Unlocked, }; avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); - accountsSubject.next({ - "1": user1AccountInfo, - } as Record); - - activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "1" as UserId })); + accountsSubject.next({ ["1" as UserId]: accountInfo, ["2" as UserId]: accountInfo }); + authStatusSubject.next({ + ["1" as UserId]: AuthenticationStatus.Unlocked, + ["2" as UserId]: AuthenticationStatus.Locked, + }); + activeAccountSubject.next(Object.assign(accountInfo, { id: "1" as UserId })); const accounts = await firstValueFrom( accountSwitcherService.availableAccounts$.pipe(timeout(20)), ); - expect(accounts).toHaveLength(2); + expect(accounts).toHaveLength(3); expect(accounts[0].id).toBe("1"); expect(accounts[0].isActive).toBeTruthy(); - - expect(accounts[1].id).toBe("addAccount"); + expect(accounts[1].id).toBe("2"); expect(accounts[1].isActive).toBeFalsy(); + + expect(accounts[2].id).toBe("addAccount"); + expect(accounts[2].isActive).toBeFalsy(); }); it.each([5, 6])( "should return only accounts if there are %i accounts", async (numberOfAccounts) => { const seedAccounts: Record = {}; + const seedStatuses: Record = {}; for (let i = 0; i < numberOfAccounts; i++) { seedAccounts[`${i}` as UserId] = { email: `test${i}@email.com`, name: "Test User ${i}", - status: AuthenticationStatus.Unlocked, }; + seedStatuses[`${i}` as UserId] = AuthenticationStatus.Unlocked; } avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); accountsSubject.next(seedAccounts); + authStatusSubject.next(seedStatuses); activeAccountSubject.next( Object.assign(seedAccounts["1" as UserId], { id: "1" as UserId }), ); @@ -89,6 +108,26 @@ describe("AccountSwitcherService", () => { }); }, ); + + it("excludes logged out accounts", async () => { + const user1AccountInfo: AccountInfo = { + name: "Test User 1", + email: "", + }; + accountsSubject.next({ ["1" as UserId]: user1AccountInfo }); + authStatusSubject.next({ ["1" as UserId]: AuthenticationStatus.LoggedOut }); + accountsSubject.next({ + "1": user1AccountInfo, + } as Record); + + const accounts = await firstValueFrom( + accountSwitcherService.availableAccounts$.pipe(timeout(20)), + ); + + // Add account only + expect(accounts).toHaveLength(1); + expect(accounts[0].id).toBe("addAccount"); + }); }); describe("selectAccount", () => { diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts index 32ebee7c75..a73ec3e1f6 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts @@ -11,6 +11,7 @@ import { } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; @@ -48,25 +49,27 @@ export class AccountSwitcherService { private messagingService: MessagingService, private environmentService: EnvironmentService, private logService: LogService, + authService: AuthService, ) { this.availableAccounts$ = combineLatest([ - this.accountService.accounts$, + accountService.accounts$, + authService.authStatuses$, this.accountService.activeAccount$, ]).pipe( - switchMap(async ([accounts, activeAccount]) => { - const accountEntries = Object.entries(accounts).filter( - ([_, account]) => account.status !== AuthenticationStatus.LoggedOut, + switchMap(async ([accounts, accountStatuses, activeAccount]) => { + const loggedInIds = Object.keys(accounts).filter( + (id: UserId) => accountStatuses[id] !== AuthenticationStatus.LoggedOut, ); // Accounts shouldn't ever be more than ACCOUNT_LIMIT but just in case do a greater than - const hasMaxAccounts = accountEntries.length >= this.ACCOUNT_LIMIT; + const hasMaxAccounts = loggedInIds.length >= this.ACCOUNT_LIMIT; const options: AvailableAccount[] = await Promise.all( - accountEntries.map(async ([id, account]) => { + loggedInIds.map(async (id: UserId) => { return { - name: account.name ?? account.email, - email: account.email, + name: accounts[id].name ?? accounts[id].email, + email: accounts[id].email, id: id, server: (await this.environmentService.getEnvironment(id))?.getHostname(), - status: account.status, + status: accountStatuses[id], isActive: id === activeAccount?.id, avatarColor: await firstValueFrom( this.avatarService.getUserAvatarColor$(id as UserId), diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 0e43f420ab..105e7e2a38 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -596,6 +596,7 @@ export default class MainBackground { this.masterPasswordService, this.cryptoService, this.apiService, + this.stateProvider, ); this.authService = new AuthService( @@ -779,14 +780,14 @@ export default class MainBackground { this.apiService, this.stateProvider, this.logService, - this.accountService, + this.authService, ); this.eventCollectionService = new EventCollectionService( this.cipherService, this.stateProvider, this.organizationService, this.eventUploadService, - this.accountService, + this.authService, ); this.totpService = new TotpService(this.cryptoFunctionService, this.logService); @@ -844,6 +845,7 @@ export default class MainBackground { logoutCallback, this.stateService, this.authService, + this.authRequestService, this.messagingService, ); diff --git a/apps/browser/src/background/service-factories/event-collection-service.factory.ts b/apps/browser/src/background/service-factories/event-collection-service.factory.ts index ec892c73dd..b8f89c90bd 100644 --- a/apps/browser/src/background/service-factories/event-collection-service.factory.ts +++ b/apps/browser/src/background/service-factories/event-collection-service.factory.ts @@ -5,7 +5,10 @@ import { organizationServiceFactory, OrganizationServiceInitOptions, } from "../../admin-console/background/service-factories/organization-service.factory"; -import { accountServiceFactory } from "../../auth/background/service-factories/account-service.factory"; +import { + authServiceFactory, + AuthServiceInitOptions, +} from "../../auth/background/service-factories/auth-service.factory"; import { FactoryOptions, CachedServices, @@ -29,7 +32,8 @@ export type EventCollectionServiceInitOptions = EventCollectionServiceOptions & CipherServiceInitOptions & StateServiceInitOptions & OrganizationServiceInitOptions & - EventUploadServiceInitOptions; + EventUploadServiceInitOptions & + AuthServiceInitOptions; export function eventCollectionServiceFactory( cache: { eventCollectionService?: AbstractEventCollectionService } & CachedServices, @@ -45,7 +49,7 @@ export function eventCollectionServiceFactory( await stateProviderFactory(cache, opts), await organizationServiceFactory(cache, opts), await eventUploadServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), + await authServiceFactory(cache, opts), ), ); } diff --git a/apps/browser/src/background/service-factories/event-upload-service.factory.ts b/apps/browser/src/background/service-factories/event-upload-service.factory.ts index 4e1d7949be..b20310e8c9 100644 --- a/apps/browser/src/background/service-factories/event-upload-service.factory.ts +++ b/apps/browser/src/background/service-factories/event-upload-service.factory.ts @@ -1,7 +1,10 @@ import { EventUploadService as AbstractEventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; -import { accountServiceFactory } from "../../auth/background/service-factories/account-service.factory"; +import { + AuthServiceInitOptions, + authServiceFactory, +} from "../../auth/background/service-factories/auth-service.factory"; import { ApiServiceInitOptions, apiServiceFactory, @@ -23,7 +26,8 @@ type EventUploadServiceOptions = FactoryOptions; export type EventUploadServiceInitOptions = EventUploadServiceOptions & ApiServiceInitOptions & StateServiceInitOptions & - LogServiceInitOptions; + LogServiceInitOptions & + AuthServiceInitOptions; export function eventUploadServiceFactory( cache: { eventUploadService?: AbstractEventUploadService } & CachedServices, @@ -38,7 +42,7 @@ export function eventUploadServiceFactory( await apiServiceFactory(cache, opts), await stateProviderFactory(cache, opts), await logServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), + await authServiceFactory(cache, opts), ), ); } diff --git a/apps/browser/src/platform/popup/header.component.ts b/apps/browser/src/platform/popup/header.component.ts index 6b9e9c9a3e..ebda12c2a4 100644 --- a/apps/browser/src/platform/popup/header.component.ts +++ b/apps/browser/src/platform/popup/header.component.ts @@ -1,8 +1,10 @@ import { Component, Input } from "@angular/core"; -import { Observable, map } from "rxjs"; +import { Observable, combineLatest, map, of, switchMap } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { UserId } from "@bitwarden/common/types/guid"; import { enableAccountSwitching } from "../flags"; @@ -14,14 +16,18 @@ export class HeaderComponent { @Input() noTheme = false; @Input() hideAccountSwitcher = false; authedAccounts$: Observable; - constructor(accountService: AccountService) { + constructor(accountService: AccountService, authService: AuthService) { this.authedAccounts$ = accountService.accounts$.pipe( - map((accounts) => { + switchMap((accounts) => { if (!enableAccountSwitching()) { - return false; + return of(false); } - return Object.values(accounts).some((a) => a.status !== AuthenticationStatus.LoggedOut); + return combineLatest( + Object.keys(accounts).map((id) => authService.authStatusFor$(id as UserId)), + ).pipe( + map((statuses) => statuses.some((status) => status !== AuthenticationStatus.LoggedOut)), + ); }), ); } diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 03ac1612f1..b0fdaec4fc 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -1,9 +1,10 @@ import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { NavigationEnd, Router, RouterOutlet } from "@angular/router"; import { ToastrService } from "ngx-toastr"; -import { filter, concatMap, Subject, takeUntil, firstValueFrom } from "rxjs"; +import { filter, concatMap, Subject, takeUntil, firstValueFrom, map } from "rxjs"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { DialogService, SimpleDialogOptions } from "@bitwarden/components"; @@ -57,8 +58,9 @@ export class AppComponent implements OnInit, OnDestroy { this.activeUserId = userId; }); - this.stateService.activeAccountUnlocked$ + this.authService.activeAccountStatus$ .pipe( + map((status) => status === AuthenticationStatus.Unlocked), filter((unlocked) => unlocked), concatMap(async () => { await this.recordActivity(); diff --git a/apps/browser/src/vault/popup/components/vault/current-tab.component.html b/apps/browser/src/vault/popup/components/vault/current-tab.component.html index 1a42f70701..fc8b4212ba 100644 --- a/apps/browser/src/vault/popup/components/vault/current-tab.component.html +++ b/apps/browser/src/vault/popup/components/vault/current-tab.component.html @@ -39,12 +39,13 @@

- {{ "unassignedItemsBanner" | i18n }} + {{ unassignedItemsBannerService.bannerText$ | async | i18n }} ; vaultTimeoutPolicyCallout: Observable<{ @@ -122,6 +125,7 @@ export class SettingsComponent implements OnInit { private desktopSettingsService: DesktopSettingsService, private biometricStateService: BiometricStateService, private desktopAutofillSettingsService: DesktopAutofillSettingsService, + private authRequestService: AuthRequestServiceAbstraction, ) { const isMac = this.platformUtilsService.getDevice() === DeviceType.MacOsDesktop; @@ -207,6 +211,7 @@ export class SettingsComponent implements OnInit { return; } this.currentUserEmail = await this.stateService.getEmail(); + this.currentUserId = (await this.stateService.getUserId()) as UserId; this.availableVaultTimeoutActions$ = this.refreshTimeoutSettings$.pipe( switchMap(() => this.vaultTimeoutSettingsService.availableVaultTimeoutActions$()), @@ -249,7 +254,8 @@ export class SettingsComponent implements OnInit { requirePasswordOnStart: await firstValueFrom( this.biometricStateService.requirePasswordOnStart$, ), - approveLoginRequests: (await this.stateService.getApproveLoginRequests()) ?? false, + approveLoginRequests: + (await this.authRequestService.getAcceptAuthRequests(this.currentUserId)) ?? false, clearClipboard: await firstValueFrom(this.autofillSettingsService.clearClipboardDelay$), minimizeOnCopyToClipboard: await this.stateService.getMinimizeOnCopyToClipboard(), enableFavicons: await firstValueFrom(this.domainSettingsService.showFavicons$), @@ -665,7 +671,10 @@ export class SettingsComponent implements OnInit { } async updateApproveLoginRequests() { - await this.stateService.setApproveLoginRequests(this.form.value.approveLoginRequests); + await this.authRequestService.setAcceptAuthRequests( + this.form.value.approveLoginRequests, + this.currentUserId, + ); } ngOnDestroy() { diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 9f341f926f..c76111b53c 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2698,9 +2698,9 @@ "message": "Activeu l'acceleració i reinicieu el maquinari" }, "removePasskey": { - "message": "Remove passkey" + "message": "Suprimeix la clau de pas" }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "Clau de pas suprimida" } } diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 357a5757ce..0e28c2cf90 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2480,13 +2480,13 @@ "message": "Перейти к содержимому" }, "typePasskey": { - "message": "Ключ доступа" + "message": "Passkey" }, "passkeyNotCopied": { - "message": "Ключ доступа не будет скопирован" + "message": "Passkey не будет скопирован" }, "passkeyNotCopiedAlert": { - "message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" + "message": "Passkey не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" }, "aliasDomain": { "message": "Псевдоним домена" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 2c3401de6b..8725fa0f21 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1907,7 +1907,7 @@ "message": "无法完成生物识别。" }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "使用其他方式?" }, "useMasterPassword": { "message": "使用主密码" diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.ts b/apps/desktop/src/vault/app/vault/add-edit.component.ts index b89beebaa6..86e0b881ee 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit.component.ts @@ -75,6 +75,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges, async ngOnInit() { await super.ngOnInit(); + await this.load(); this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { this.ngZone.run(() => { switch (message.command) { diff --git a/apps/desktop/src/vault/app/vault/vault.component.ts b/apps/desktop/src/vault/app/vault/vault.component.ts index e8aabbb20f..208bbc70f0 100644 --- a/apps/desktop/src/vault/app/vault/vault.component.ts +++ b/apps/desktop/src/vault/app/vault/vault.component.ts @@ -8,7 +8,7 @@ import { ViewContainerRef, } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; -import { Subject, takeUntil } from "rxjs"; +import { firstValueFrom, Subject, takeUntil } from "rxjs"; import { first } from "rxjs/operators"; import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref"; @@ -16,13 +16,13 @@ import { ModalService } from "@bitwarden/angular/services/modal.service"; import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -32,6 +32,7 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { DialogService } from "@bitwarden/components"; import { PasswordRepromptService } from "@bitwarden/vault"; +import { AuthRequestServiceAbstraction } from "../../../../../../libs/auth/src/common/abstractions"; import { SearchBarService } from "../../../app/layout/search/search-bar.service"; import { GeneratorComponent } from "../../../app/tools/generator.component"; import { invokeMenu, RendererMenuItem } from "../../../utils"; @@ -102,11 +103,12 @@ export class VaultComponent implements OnInit, OnDestroy { private eventCollectionService: EventCollectionService, private totpService: TotpService, private passwordRepromptService: PasswordRepromptService, - private stateService: StateService, private searchBarService: SearchBarService, private apiService: ApiService, private dialogService: DialogService, private billingAccountProfileStateService: BillingAccountProfileStateService, + private authRequestService: AuthRequestServiceAbstraction, + private accountService: AccountService, ) {} async ngOnInit() { @@ -224,7 +226,8 @@ export class VaultComponent implements OnInit, OnDestroy { this.searchBarService.setEnabled(true); this.searchBarService.setPlaceholderText(this.i18nService.t("searchVault")); - const approveLoginRequests = await this.stateService.getApproveLoginRequests(); + const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const approveLoginRequests = await this.authRequestService.getAcceptAuthRequests(userId); if (approveLoginRequests) { const authRequest = await this.apiService.getLastAuthRequest(); if (authRequest != null) { diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html index 6029cfd833..e0a8006081 100644 --- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html +++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html @@ -20,19 +20,4 @@ -

diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts b/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts index 99cb3102aa..602ad82972 100644 --- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts +++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts @@ -1,15 +1,32 @@ -import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { UntypedFormGroup } from "@angular/forms"; +import { firstValueFrom } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @Component({ selector: "app-org-info", templateUrl: "organization-information.component.html", }) -export class OrganizationInformationComponent { +export class OrganizationInformationComponent implements OnInit { @Input() nameOnly = false; @Input() createOrganization = true; @Input() isProvider = false; @Input() acceptingSponsorship = false; @Input() formGroup: UntypedFormGroup; @Output() changedBusinessOwned = new EventEmitter(); + + constructor(private accountService: AccountService) {} + + async ngOnInit(): Promise { + if (this.formGroup.controls.billingEmail.value) { + return; + } + + const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + + if (activeAccount?.email) { + this.formGroup.controls.billingEmail.setValue(activeAccount.email); + } + } } diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.html b/apps/web/src/app/admin-console/organizations/settings/account.component.html index 7035b976ca..082fe7eb80 100644 --- a/apps/web/src/app/admin-console/organizations/settings/account.component.html +++ b/apps/web/src/app/admin-console/organizations/settings/account.component.html @@ -20,10 +20,6 @@ {{ "billingEmail" | i18n }} - - {{ "businessName" | i18n }} - -
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts index b218e680e3..1ce05f7a30 100644 --- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts @@ -65,10 +65,6 @@ export class AccountComponent { { value: "", disabled: true }, { validators: [Validators.required, Validators.email, Validators.maxLength(256)] }, ), - businessName: this.formBuilder.control( - { value: "", disabled: true }, - { validators: [Validators.maxLength(50)] }, - ), }); protected collectionManagementFormGroup = this.formBuilder.group({ @@ -124,7 +120,6 @@ export class AccountComponent { // Update disabled states - reactive forms prefers not using disabled attribute if (!this.selfHosted) { this.formGroup.get("orgName").enable(); - this.formGroup.get("businessName").enable(); this.collectionManagementFormGroup.get("limitCollectionCreationDeletion").enable(); this.collectionManagementFormGroup.get("allowAdminAccessToAllCollectionItems").enable(); } @@ -143,7 +138,6 @@ export class AccountComponent { this.formGroup.patchValue({ orgName: this.org.name, billingEmail: this.org.billingEmail, - businessName: this.org.businessName, }); this.collectionManagementFormGroup.patchValue({ limitCollectionCreationDeletion: this.org.limitCollectionCreationDeletion, @@ -168,7 +162,6 @@ export class AccountComponent { const request = new OrganizationUpdateRequest(); request.name = this.formGroup.value.orgName; - request.businessName = this.formGroup.value.businessName; request.billingEmail = this.formGroup.value.billingEmail; // Backfill pub/priv key if necessary diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts index 8fbca22bc5..be313c2574 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts @@ -101,7 +101,12 @@ export const getPermissionList = (flexibleCollectionsEnabled: boolean): Permissi * for the dropdown in the AccessSelectorComponent * @param value */ -export const convertToPermission = (value: CollectionAccessSelectionView) => { +export const convertToPermission = ( + value: CollectionAccessSelectionView | undefined, +): CollectionPermission | undefined => { + if (value == null) { + return undefined; + } if (value.manage) { return CollectionPermission.Manage; } else if (value.readOnly) { diff --git a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.html b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.html deleted file mode 100644 index 613e2a7a92..0000000000 --- a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - {{ "enrollAccountRecovery" | i18n }} -
- - {{ "resetPasswordEnrollmentWarning" | i18n }} - - -
- - - - -
-
diff --git a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts index 4cbdbf3864..b228a4d135 100644 --- a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts +++ b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts @@ -1,12 +1,7 @@ -import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; -import { Component, Inject } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; - +import { UserVerificationDialogComponent } from "@bitwarden/auth/angular"; import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service"; import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/admin-console/abstractions/organization-user/requests"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { Verification } from "@bitwarden/common/auth/types/verification"; 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"; @@ -19,63 +14,58 @@ interface EnrollMasterPasswordResetData { organization: Organization; } -@Component({ - selector: "app-enroll-master-password-reset", - templateUrl: "enroll-master-password-reset.component.html", -}) export class EnrollMasterPasswordReset { - protected organization: Organization; + constructor() {} - protected formGroup = new FormGroup({ - verification: new FormControl(null, Validators.required), - }); - - constructor( - private dialogRef: DialogRef, - @Inject(DIALOG_DATA) protected data: EnrollMasterPasswordResetData, - private resetPasswordService: OrganizationUserResetPasswordService, - private userVerificationService: UserVerificationService, - private platformUtilsService: PlatformUtilsService, - private i18nService: I18nService, - private syncService: SyncService, - private logService: LogService, - private organizationUserService: OrganizationUserService, + static async open( + dialogService: DialogService, + data: EnrollMasterPasswordResetData, + resetPasswordService: OrganizationUserResetPasswordService, + organizationUserService: OrganizationUserService, + platformUtilsService: PlatformUtilsService, + i18nService: I18nService, + syncService: SyncService, + logService: LogService, ) { - this.organization = data.organization; - } + const result = await UserVerificationDialogComponent.open(dialogService, { + title: "enrollAccountRecovery", + calloutOptions: { + text: "resetPasswordEnrollmentWarning", + type: "warning", + }, + }); - submit = async () => { - try { - await this.userVerificationService - .buildRequest( - this.formGroup.value.verification, - OrganizationUserResetPasswordEnrollmentRequest, - ) - .then(async (request) => { - // Create request and execute enrollment - request.resetPasswordKey = await this.resetPasswordService.buildRecoveryKey( - this.organization.id, - ); - await this.organizationUserService.putOrganizationUserResetPasswordEnrollment( - this.organization.id, - this.organization.userId, - request, - ); - - await this.syncService.fullSync(true); - }); - this.platformUtilsService.showToast( - "success", - null, - this.i18nService.t("enrollPasswordResetSuccess"), - ); - this.dialogRef.close(); - } catch (e) { - this.logService.error(e); + // Handle the result of the dialog based on user action and verification success + if (result.userAction === "cancel") { + return; } - }; - static open(dialogService: DialogService, data: EnrollMasterPasswordResetData) { - return dialogService.open(EnrollMasterPasswordReset, { data }); + // User confirmed the dialog so check verification success + if (!result.verificationSuccess) { + // verification failed + return; + } + + // Verification succeeded + try { + // This object is missing most of the properties in the + // `OrganizationUserResetPasswordEnrollmentRequest()`, but those + // properties don't carry over to the server model anyway and are + // never used by this flow. + const request = new OrganizationUserResetPasswordEnrollmentRequest(); + request.resetPasswordKey = await resetPasswordService.buildRecoveryKey(data.organization.id); + + await organizationUserService.putOrganizationUserResetPasswordEnrollment( + data.organization.id, + data.organization.userId, + request, + ); + + platformUtilsService.showToast("success", null, i18nService.t("enrollPasswordResetSuccess")); + + await syncService.fullSync(true); + } catch (e) { + logService.error(e); + } } } diff --git a/apps/web/src/app/admin-console/organizations/users/organization-user.module.ts b/apps/web/src/app/admin-console/organizations/users/organization-user.module.ts deleted file mode 100644 index 30e2b5abe7..0000000000 --- a/apps/web/src/app/admin-console/organizations/users/organization-user.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ScrollingModule } from "@angular/cdk/scrolling"; -import { NgModule } from "@angular/core"; - -import { UserVerificationModule } from "../../../auth/shared/components/user-verification"; -import { LooseComponentsModule, SharedModule } from "../../../shared"; - -import { EnrollMasterPasswordReset } from "./enroll-master-password-reset.component"; - -@NgModule({ - imports: [SharedModule, ScrollingModule, LooseComponentsModule, UserVerificationModule], - declarations: [EnrollMasterPasswordReset], - exports: [EnrollMasterPasswordReset], -}) -export class OrganizationUserModule {} diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts index 17eddbd33d..f2fb296522 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.ts +++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts @@ -120,7 +120,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { additionalStorage: [0, [Validators.min(0), Validators.max(99)]], additionalSeats: [0, [Validators.min(0), Validators.max(100000)]], clientOwnerEmail: ["", [Validators.email]], - businessName: [""], plan: [this.plan], product: [this.product], secretsManager: this.secretsManagerSubscription, @@ -596,9 +595,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { private async updateOrganization(orgId: string) { const request = new OrganizationUpgradeRequest(); - request.businessName = this.formGroup.controls.businessOwned.value - ? this.formGroup.controls.businessName.value - : null; request.additionalSeats = this.formGroup.controls.additionalSeats.value; request.additionalStorageGb = this.formGroup.controls.additionalStorage.value; request.premiumAccessAddon = @@ -656,9 +652,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { request.paymentToken = tokenResult[0]; request.paymentMethodType = tokenResult[1]; - request.businessName = this.formGroup.controls.businessOwned.value - ? this.formGroup.controls.businessName.value - : null; request.additionalSeats = this.formGroup.controls.additionalSeats.value; request.additionalStorageGb = this.formGroup.controls.additionalStorage.value; request.premiumAccessAddon = diff --git a/apps/web/src/app/layouts/header/web-header.component.html b/apps/web/src/app/layouts/header/web-header.component.html index e1cda607c0..9346763a47 100644 --- a/apps/web/src/app/layouts/header/web-header.component.html +++ b/apps/web/src/app/layouts/header/web-header.component.html @@ -2,10 +2,12 @@ class="-tw-m-6 tw-flex tw-flex-col tw-pb-6" (onClose)="unassignedItemsBannerService.hideBanner()" *ngIf=" - (unassignedItemsBannerEnabled$ | async) && (unassignedItemsBannerService.showBanner$ | async) + (unassignedItemsBannerEnabled$ | async) && + (unassignedItemsBannerService.showBanner$ | async) && + (unassignedItemsBannerService.bannerText$ | async) " > - {{ "unassignedItemsBanner" | i18n }} + {{ unassignedItemsBannerService.bannerText$ | async | i18n }}
gc.id == collectionId)), + readonlyPermission: + collectionId != null + ? convertToPermission(group.collections.find((gc) => gc.id == collectionId)) + : undefined, }; } @@ -456,9 +459,12 @@ function mapUserToAccessItemView( status: user.status, accessAllItems: user.accessAll, readonly: user.accessAll, - readonlyPermission: convertToPermission( - new CollectionAccessSelectionView(user.collections.find((uc) => uc.id == collectionId)), - ), + readonlyPermission: + collectionId != null + ? convertToPermission( + new CollectionAccessSelectionView(user.collections.find((uc) => uc.id == collectionId)), + ) + : undefined, }; } diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts index fa81abdc54..8dd63e62dd 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts @@ -16,6 +16,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService } from "@bitwarden/components"; +import { OrganizationUserResetPasswordService } from "../../../../admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service"; import { EnrollMasterPasswordReset } from "../../../../admin-console/organizations/users/enroll-master-password-reset.component"; import { OptionsInput } from "../shared/components/vault-filter-section.component"; import { OrganizationFilter } from "../shared/models/vault-filter.type"; @@ -46,6 +47,7 @@ export class OrganizationOptionsComponent implements OnInit, OnDestroy { private organizationUserService: OrganizationUserService, private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, private dialogService: DialogService, + private resetPasswordService: OrganizationUserResetPasswordService, ) {} async ngOnInit() { @@ -144,7 +146,16 @@ export class OrganizationOptionsComponent implements OnInit, OnDestroy { async toggleResetPasswordEnrollment(org: Organization) { if (!this.organization.resetPasswordEnrolled) { - EnrollMasterPasswordReset.open(this.dialogService, { organization: org }); + await EnrollMasterPasswordReset.open( + this.dialogService, + { organization: org }, + this.resetPasswordService, + this.organizationUserService, + this.platformUtilsService, + this.i18nService, + this.syncService, + this.logService, + ); } else { // Remove reset password const request = new OrganizationUserResetPasswordEnrollmentRequest(); diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 3677e54c1c..efd009b3ad 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Voeg bestaande organisasie toe" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My aanbieder" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index f5353f2234..e2ec92c79f 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index bc30012efe..6b84306675 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Mövcud təşkilatı əlavə et" }, + "addNewOrganization": { + "message": "Yeni təşkilat əlavə et" + }, "myProvider": { "message": "Provayderim" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Kolleksiya müraciəti məhdudlaşdırıldı" }, + "readOnlyCollectionAccess": { + "message": "Bu kolleksiyanı idarə etmək üçün müraciətiniz yoxdur." + }, "grantCollectionAccess": { "message": "Qrup və ya üzvlərin bu kolleksiyaya müraciətinə icazə verin." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provayder Portal" }, + "viewCollection": { + "message": "Kolleksiyaya bax" + }, "restrictedGroupAccess": { "message": "Özünüzü qruplara əlavə edə bilməzsiniz." }, @@ -7607,28 +7616,28 @@ "message": "Özünüzü kolleksiyalara əlavə edə bilməzsiniz." }, "assign": { - "message": "Assign" + "message": "Təyin et" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Kolleksiyalara təyin et" }, "assignToTheseCollections": { - "message": "Assign to these collections" + "message": "Bu kolleksiyalara təyin et" }, "bulkCollectionAssignmentDialogDescription": { - "message": "Select the collections that the items will be shared with. Once an item is updated in one collection, it will be reflected in all collections. Only organization members with access to these collections will be able to see the items." + "message": "Elementlərin paylaşılacağı kolleksiyaları seçin. Bir kolleksiyada bir element güncəlləndikdə, bütün kolleksiyalarda əks olunacaq. Elementləri, yalnız bu kolleksiyalara müraciət edə bilən təşkilat üzvləri görə bilər." }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Təyin ediləcək kolleksiyaları seçin" }, "noCollectionsAssigned": { - "message": "No collections have been assigned" + "message": "Heç bir kolleksiya təyin edilmədi" }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Uğurla təyin edilən kolleksiyalar" }, "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$ element seçmisiniz. Düzəliş icazəniz olmadığı üçün $READONLY_COUNT$ elementi güncəlləyə bilməzsiniz.", "placeholders": { "total_count": { "content": "$1", @@ -7641,6 +7650,257 @@ } }, "items": { - "message": "Items" + "message": "Elementlər" + }, + "assignedSeats": { + "message": "Təyin edilən yerlər" + }, + "assigned": { + "message": "Təyin edilmiş" + }, + "used": { + "message": "İstifadə edilmiş" + }, + "remaining": { + "message": "Qalan" + }, + "unlinkOrganization": { + "message": "Təşkilatı ayır" + }, + "manageSeats": { + "message": "YERLƏRİ İDARƏ ET" + }, + "manageSeatsDescription": { + "message": "Yerlərə edilən düzəlişlər növbəti hesablaşma dövründə öz əksini tapacaq." + }, + "unassignedSeatsDescription": { + "message": "Təyin edilməmiş abunəlik yerləri" + }, + "purchaseSeatDescription": { + "message": "Əlavə yerlər satın alındı" + }, + "assignedSeatCannotUpdate": { + "message": "Təyin edilən yerlər güncəllənə bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." + }, + "subscriptionUpdateFailed": { + "message": "Abunəlik güncəllənmədi" + }, + "trial": { + "message": "Sınaq", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Vaxtı keçmiş", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abunəliyin müddəti bitib", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Abunəliyinizi davam etdirmək üçün abunəliyin bitmə tarixindən etibarən $DAYS$ gün güzəşt dövrünüz var. $SUSPENSION_DATE$ tarixinə qədər vaxtı keçmiş fakturaları həll edin.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Abunəliyinizi davam etdirmək üçün ilk ödənilməmiş fakturanızın yazıldığı tarixdən etibarən $DAYS$ gün güzəşt dövrünüz var. $SUSPENSION_DATE$ tarixinə qədər vaxtı keçmiş fakturaları həll edin.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Ödənilməmiş faktura", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Abunəliyi yenidən aktivləşdirmək üçün lütfən vaxtı keçmiş fakturaları həll edin.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Ləğv tarixi", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Maşın hesabları fəaliyyəti dayandırılmış təşkilatlarda yaradıla bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." + }, + "machineAccount": { + "message": "Maşın hesabı", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Maşın hesabları", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Yeni maşın hesabı", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "\"Sirr\" müraciətini avtomatlaşdırmağa başlamaq üçün yeni bir maşın hesabı yaradın.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Göstəriləcək heç nə yoxdur", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Maşın hesablarını sil", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Maşın hesabını sil", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Maşın hesabına bax", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "$MACHINE_ACCOUNT$ maşın hesabının silinməsi daimi və geri qaytarıla bilməyən prosesdir.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Maşın hesablarının silinməsi daimi və geri qaytarıla bilməyən prosesdir." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "$COUNT$ maşın hesabını sil", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Maşın hesabı silindi" + }, + "deleteMachineAccountsToast": { + "message": "Maşın hesabları silindi" + }, + "searchMachineAccounts": { + "message": "Maşın hesablarını axtar", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Maşın hesabına düzəliş et", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Maşın hesabının adı", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Maşın hesabı yaradıldı", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Maşın hesabı güncəlləndi", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Maşın hesablarının bu layihəyə müraciətinə icazə verin." + }, + "projectMachineAccountsSelectHint": { + "message": "Maşın hesablarını yazın və ya seçin" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Müraciət icazəsi veriləcək maşın hesablarını əlavə edin" + }, + "machineAccountPeopleDescription": { + "message": "Qrup və ya insanların bu maşın hesabına müraciətinə icazə verin." + }, + "machineAccountProjectsDescription": { + "message": "Bu maşın hesabına layihələr təyin edin. " + }, + "createMachineAccount": { + "message": "Bir maşın hesabı yarat" + }, + "maPeopleWarningMessage": { + "message": "İnsanları maşın hesabından silsəniz belə, yaratdıqları müraciət tokenləri silinmir. Güvənliyin ən yaxşı təcrübəsi üçün, maşın hesabından silinmiş insanlar tərəfindən yaradılan müraciət tokenlərinin ləğv edilməsi tövsiyə olunur." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Bu maşın hesabına müraciəti sil" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Bu əməliyyat, maşın hesabına olan müraciətinizi götürəcək." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ maşın hesabı daxildir", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "Əlavə maşın hesabları üçün aylıq $COST$", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Əlavə maşın hesabları" + }, + "includedMachineAccounts": { + "message": "Planınız, $COUNT$ maşın hesabı ilə gəlir.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Aylıq $COST$ qarşılığında əlavə maşın hesablarını əlavə edə bilərsiniz.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Maşın hesablarını limitlə (ixtiyari)" + }, + "limitMachineAccountsDesc": { + "message": "Maşın hesablarınız üçün bir limit müəyyən edin. Bu limitə çatanda, yeni maşın hesabı yarada bilməyəcəksiniz." + }, + "machineAccountLimit": { + "message": "Maşın hesabı limiti (ixtiyari)" + }, + "maxMachineAccountCost": { + "message": "Maksimal mümkün maşın hesabı qiyməti" + }, + "machineAccountAccessUpdated": { + "message": "Maşın hesabına müraciət güncəlləndi" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 2ec27ae4be..756b87237f 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Дадаць існуючую арганізацыю" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Мой пастаўшчык" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index a0d1781736..c4a6597bf1 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Добавяне на съществуваща организация" }, + "addNewOrganization": { + "message": "Добавяне на нова организация" + }, "myProvider": { "message": "Моят доставчик" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Достъпът до колекцията е ограничен" }, + "readOnlyCollectionAccess": { + "message": "Нямате достъп за управление на тази колекция." + }, "grantCollectionAccess": { "message": "Дайте права на групи и членове до тази колекция." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Портал за доставчици" }, + "viewCollection": { + "message": "Преглед на колекцията" + }, "restrictedGroupAccess": { "message": "Не може да добавяте себе си към групи." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Елементи" + }, + "assignedSeats": { + "message": "Назначени места" + }, + "assigned": { + "message": "Назначени" + }, + "used": { + "message": "Използвани" + }, + "remaining": { + "message": "Оставащи" + }, + "unlinkOrganization": { + "message": "Разкачане на организацията" + }, + "manageSeats": { + "message": "УПРАВЛЕНИЕ НА МЕСТАТА" + }, + "manageSeatsDescription": { + "message": "Промените по местата ще се отразят в следващия платежен цикъл." + }, + "unassignedSeatsDescription": { + "message": "Неназначени места от абонамента" + }, + "purchaseSeatDescription": { + "message": "Закупени са нови места" + }, + "assignedSeatCannotUpdate": { + "message": "Назначените места не могат да бъдат променени. Свържете се със собственика на организацията си за помощ." + }, + "subscriptionUpdateFailed": { + "message": "Промяната на абонамента беше неуспешна" + }, + "trial": { + "message": "Пробен период", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Просрочено", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Абонаментът е изтекъл", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "След като просрочите периода на абонамента си, разполагате с още $DAYS$ дни, за да го подновите. Моля, заплатете старите фактури до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "След като просрочите срока на първата си неплатена фактура, разполагате с още $DAYS$ дни, за да подновите абонамента си. Моля, заплатете старите фактури до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Неплатена фактура", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "За да подновите абонамента си, моля, заплатете фактурите с изтекъл срок.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Дата на прекратяване", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "В изключени организации не могат да се създават машинни акаунти. Свържете се със собственика на организацията си за помощ." + }, + "machineAccount": { + "message": "Машинен акаунт", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Машинни акаунти", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Нов машинен акаунт", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Създайте нов машинен акаунт, за да можете да автоматизирате достъпа до тайните.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Все още няма нищо за показване", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Изтриване на машинните акаунти", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Изтриване на машинния акаунт", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Преглед на машинния акаунт", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Изтриването на машинния акаунт $MACHINE_ACCOUNT$ е окончателно и необратимо.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Изтриването на машинни акаунти е окончателно и необратимо." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Изтриване $COUNT$ машинни акаунти", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Машинният акаунт е изтрит" + }, + "deleteMachineAccountsToast": { + "message": "Машинните акаунти са изтрити" + }, + "searchMachineAccounts": { + "message": "Търсене на машинни акаунти", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Редактиране на машинния акаунт", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Име на машинния акаунт", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Машинният акаунт е създаден", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Машинният акаунт е обновен", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Дайте достъп на машинните акаунти до този проект." + }, + "projectMachineAccountsSelectHint": { + "message": "Пишете тук или изберете машинни акаунти" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Добавете машинни акаунти, за да дадете достъп" + }, + "machineAccountPeopleDescription": { + "message": "Дайте права на групи и хора до този машинен акаунт." + }, + "machineAccountProjectsDescription": { + "message": "Назначете проекти към този машинен акаунт. " + }, + "createMachineAccount": { + "message": "Създаване на машинен акаунт" + }, + "maPeopleWarningMessage": { + "message": "Премахването на хора от даден машинен акаунт не премахва идентификаторите за достъп, които те са създали. От гледна точка на сигурността е препоръчително да отнемете достъпа чрез идентификаторите създадени от хора, които са били премахнати от машинен акаунт." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Премахване на достъпа до този машинен акаунт" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Това действие ще премахне достъпа Ви до машинния акаунт." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ включени машинни акаунта", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ на месец за допълнителни машинни акаунти", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Допълнителни машинни акаунти" + }, + "includedMachineAccounts": { + "message": "В плана Ви са включени $COUNT$ машинни акаунта.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Може да добавите още машинни акаунти за $COST$ на месец.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Ограничаване на машинните акаунти (незадължително)" + }, + "limitMachineAccountsDesc": { + "message": "Задайте ограничение за броя на машинните акаунти. Когато то бъде достигнато, няма да можете да създавате нови машинни акаунти." + }, + "machineAccountLimit": { + "message": "Ограничение на машинните акаунти (незадължително)" + }, + "maxMachineAccountCost": { + "message": "Максимална възможна цена за машинни акаунти" + }, + "machineAccountAccessUpdated": { + "message": "Достъпът на машинния акаунт е променен" + }, + "unassignedItemsBanner": { + "message": "Забележка: неразпределените елементи на организацията вече не се виждат в изгледа с „Всички трезори“ на различните устройства, а са достъпни само през Административната конзола. Добавете тези елементи към някоя колекция в Административната конзола, за да станат видими." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 9d0ccd3b50..14457f7ddc 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 84084847d4..a0033e67fe 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index e23f7acec4..97d870febc 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Afig organització existent" }, + "addNewOrganization": { + "message": "Afegeix organització nova" + }, "myProvider": { "message": "El meu proveïdor" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "L'accés a la col·lecció està restringit" }, + "readOnlyCollectionAccess": { + "message": "No teniu accés per gestionar aquesta col·lecció." + }, "grantCollectionAccess": { "message": "Concedeix als grups o membres l'accés a aquesta col·lecció." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portal del proveïdor" }, + "viewCollection": { + "message": "Mostra col·lecció" + }, "restrictedGroupAccess": { "message": "No podeu afegir-vos als grups." }, @@ -7607,13 +7616,13 @@ "message": "No podeu afegir-vos a les col·leccions." }, "assign": { - "message": "Assign" + "message": "Assigna" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Assigna a col·leccions" }, "assignToTheseCollections": { - "message": "Assign to these collections" + "message": "Assigna a aquestes col·leccions" }, "bulkCollectionAssignmentDialogDescription": { "message": "Select the collections that the items will be shared with. Once an item is updated in one collection, it will be reflected in all collections. Only organization members with access to these collections will be able to see the items." @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 523f1faa10..e8816e9dd6 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Přidat existující organizaci" }, + "addNewOrganization": { + "message": "Přidat novou organizaci" + }, "myProvider": { "message": "Můj poskytovatel" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Přístup ke kolekci je omezen" }, + "readOnlyCollectionAccess": { + "message": "Nemáte přístup ke správě této kolekce." + }, "grantCollectionAccess": { "message": "Udělí skupinám nebo členům přístup k této kolekci." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portál poskytovatele" }, + "viewCollection": { + "message": "Zobrazit kolekci" + }, "restrictedGroupAccess": { "message": "Do skupin nemůžete přidat sami sebe." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Položky" + }, + "assignedSeats": { + "message": "Přiřazení uživatelé" + }, + "assigned": { + "message": "Přiřazeno" + }, + "used": { + "message": "Využito" + }, + "remaining": { + "message": "Zbývá" + }, + "unlinkOrganization": { + "message": "Odpojit organizaci" + }, + "manageSeats": { + "message": "SPRAVOVAT UŽIVATELE" + }, + "manageSeatsDescription": { + "message": "Nastavení uživatelů bude započítáno v dalším fakturačním cyklu." + }, + "unassignedSeatsDescription": { + "message": "Nepřiřazení uživatelé k odběru" + }, + "purchaseSeatDescription": { + "message": "Další zakoupení uživatelé" + }, + "assignedSeatCannotUpdate": { + "message": "Přiřazení uživatelé nemohou být aktualizováni. Požádejte o pomoc vlastníka organizace." + }, + "subscriptionUpdateFailed": { + "message": "Aktualizace předplatného se nezdařila" + }, + "trial": { + "message": "Zkušební verze", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Po splatnosti", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Předplatné vypršelo", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Máte lhůtu k odkladu $DAYS$ dnů od data vypršení předplatného pro zachování předplatného. Vyřešte poslední splatné faktury od $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Máte lhůtu k odkladu $DAYS$ dnů od data, kdy byla Vaše první nezaplacená faktura udržována v předplatném. Vyřešte poslední splatné faktury od $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Nezaplacená faktura", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Chcete-li znovu aktivovat předplatné, vyřešte poslední splatné faktury.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Datum zrušení", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Strojové účty nelze vytvořit v pozastavených organizacích. Požádejte o pomoc vlastníka organizace." + }, + "machineAccount": { + "message": "Strojový účet", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Strojové účty", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Nový strojový účet", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Abyste mohli začít automatizovat přístup k tajnému kliči, vytvořte nový strojový účet.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nyní není nic k zobrazení", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Smazat strojové účty", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Smazat strojový účet", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Zobrazit strojový účet", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Smazání strojového účtu $MACHINE_ACCOUNT$ je trvalé a nevratné.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Smazání strojových účtů je trvalé a nevratné." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Smazat $COUNT$ strojových účtů", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Strojový účet byl smazán" + }, + "deleteMachineAccountsToast": { + "message": "Strojové účty byly smazány" + }, + "searchMachineAccounts": { + "message": "Prohledat strojové účty", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Upravit strojový účet", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Název strojového účtu", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Strojový účet byl vytvořen", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Strojový účet byl aktualizován", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Udělí strojovým účtům přístup k tomuto projektu." + }, + "projectMachineAccountsSelectHint": { + "message": "Napište nebo vyberte strojové účty" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Přidejte strojové účty pro udělení přístupu" + }, + "machineAccountPeopleDescription": { + "message": "Udělí skupinám nebo lidem přístup k tomuto strojovému účtu." + }, + "machineAccountProjectsDescription": { + "message": "Přiřaďte projekty k tomuto strojovému účtu. " + }, + "createMachineAccount": { + "message": "Vytvořit strojový účet" + }, + "maPeopleWarningMessage": { + "message": "Odebráním osob ze strojového účtu se neodeberou přístupové tokeny, které tyto osoby vytvořily. V rámci osvědčených bezpečnostních postupů se doporučuje zrušit přístupové tokeny vytvořené osobami odebranými ze strojového účtu." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Odebrat přístup k tomuto strojovému účtu" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Tato akce odebere Váš přístup ke strojovému účtu." + }, + "machineAccountsIncluded": { + "message": "Zahrnuto $COUNT$ strojových účtů", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "Pro další strojové účty $COST$ měsíčně", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Další strojové účty" + }, + "includedMachineAccounts": { + "message": "Váš plán již obsahuje $COUNT$ strojových účtů.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Za $COST$ měsíčně můžete přidat další strojové účty.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Omezit strojové účty (volitelné)" + }, + "limitMachineAccountsDesc": { + "message": "Nastavte limit pro Vaše strojové účty. Jakmile tohoto limitu dosáhnete, nebudete moci vytvářet nové strojové účty." + }, + "machineAccountLimit": { + "message": "Limit strojových účtů (volitelné)" + }, + "maxMachineAccountCost": { + "message": "Max. potenciální náklady na strojový účet" + }, + "machineAccountAccessUpdated": { + "message": "Přístup strojového účtu byl aktualizován" + }, + "unassignedItemsBanner": { + "message": "Upozornění: Nepřiřazené položky organizace již nejsou viditelné ve Vašem zobrazení všech trezorů napříč zařízeními a jsou nyní přístupné jen v konzoli správce. Přiřaďte tyto položky do kolekce z konzole pro správce, aby byly viditelné." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 4781d9d3b6..8883fd78cb 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index bcb1c16235..683c1e7862 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Tilføj eksisterende organisation" }, + "addNewOrganization": { + "message": "Tilføj ny organisation" + }, "myProvider": { "message": "Min udbyder" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Adgang til samling er begrænset" }, + "readOnlyCollectionAccess": { + "message": "Du har ikke adgang til at håndtere denne samling." + }, "grantCollectionAccess": { "message": "Tildel grupper eller medlemmer adgang til denne samling." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Udbyderportal" }, + "viewCollection": { + "message": "Vis samling" + }, "restrictedGroupAccess": { "message": "Man kan ikke føje sig selv til grupper." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Emner" + }, + "assignedSeats": { + "message": "Tildelte pladser" + }, + "assigned": { + "message": "Tildelte" + }, + "used": { + "message": "Brugte" + }, + "remaining": { + "message": "Resterer" + }, + "unlinkOrganization": { + "message": "Fjern associering til organisation" + }, + "manageSeats": { + "message": "HÅNDTERING AF PLADSER" + }, + "manageSeatsDescription": { + "message": "Justeringer af pladser afspejles i den næste faktureringsperiode." + }, + "unassignedSeatsDescription": { + "message": "Ikke-tildelte abonnementspladser" + }, + "purchaseSeatDescription": { + "message": "Yderligere pladser tilkøbt" + }, + "assignedSeatCannotUpdate": { + "message": "Tildelte pladser kan ikke opdateres. Kontakt organisationsejeren for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Abonnementsopdatering mislykkedes" + }, + "trial": { + "message": "Prøveperiode", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Forfalden", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abonnement udløbet", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Der er en respitperiode på $DAYS$ dage fra abonnementsudløbsdatoen til at bevare abonnementet. Afregn venligst de forfaldne fakturaer inden $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Der er en respitperiode på $DAYS$ dage fra første fakturaforfaldsdato til at bevare abonnementet. Afregn venligst de forfaldne fakturaer inden $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Ubetalt faktura", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Afregn de tidligere forfaldne fakturaer for at genaktivere abonnementet.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Maskinekonti kan ikke oprettes i suspenderede organisationer. Kontakt organisationsejeren for hjælp." + }, + "machineAccount": { + "message": "Maskinekonto", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Maskinekonti", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Ny maskinekonto", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Opret en ny maskinekonto for at komme i gang med at automatisere hemmelig adgang.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Intet at vise endnu", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Slet maskinekonti", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Slet maskinekonto", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Vis maskinekonto", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Sletning af maskinekontoen $MACHINE_ACCOUNT$ er permanent og irreversibel.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Sletning af maskinekonti er permanent og irreversibel." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Slet $COUNT$ maskinekonti", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Maskinekonto slettet" + }, + "deleteMachineAccountsToast": { + "message": "Maskinekonti slettet" + }, + "searchMachineAccounts": { + "message": "Søg efter maskinekonti", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Redigér maskinekonto", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Maskinekontonavn", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Maskinekonto oprettet", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Maskinekonto opdateret", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Tildel maskinkonti adgang til dette projekt." + }, + "projectMachineAccountsSelectHint": { + "message": "Angiv eller vælg maskinekonti" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Tilføj maskinekonti for at tildele adgang" + }, + "machineAccountPeopleDescription": { + "message": "Tildel grupper eller personer adgang til denne maskinekonto." + }, + "machineAccountProjectsDescription": { + "message": "Tildel projekter til denne maskinekonto. " + }, + "createMachineAccount": { + "message": "Opret en maskinekonto" + }, + "maPeopleWarningMessage": { + "message": "Fjernelse af personer fra en maskinekonto fjerner ikke deres oprettede adgangstokener. For bedste sikkerhedspraksis anbefales ophævelse af adgangtokener oprettet af personer fjernet fra en maskinekonto." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Fjern adgang til denne maskinekonto" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Denne handling fjerner maskinekontoadgangen." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ maskinekonti inkluderet", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ pr. måned for yderligere maskinekonti", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Yderligere maskinekonti" + }, + "includedMachineAccounts": { + "message": "Abonnementstypen er inkl. $COUNT$ maskinekonti.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Yderligere maskinekonti kan tilføjes for $COST$ pr. måned.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Begræns maskinekonti (valgfrit)" + }, + "limitMachineAccountsDesc": { + "message": "Opsæt kvote for maskinekonti. Når kvoten er opbrugt, vil nye maskinekonti ikke kunne oprettes." + }, + "machineAccountLimit": { + "message": "Maskinekontokvote (valgfrit)" + }, + "maxMachineAccountCost": { + "message": "Maks. potentiel maskinekontoomkostning" + }, + "machineAccountAccessUpdated": { + "message": "Maskinekontoadgang opdateret" + }, + "unassignedItemsBanner": { + "message": "Bemærk: Utildelte organisationsemner er ikke længere synlige i Alle Bokse-visningen og er kun tilgængelige via Adminkonsollen. Føj disse emner til en samling fra Adminkonsollen for at gøre dem synlige." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index c3e5a9bba5..2679bc189e 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Bestehende Organisation hinzufügen" }, + "addNewOrganization": { + "message": "Neue Organisation erstellen" + }, "myProvider": { "message": "Mein Anbieter" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Zugriff auf Sammlungen ist eingeschränkt" }, + "readOnlyCollectionAccess": { + "message": "Du hast keinen Zugriff, um diese Sammlung zu verwalten." + }, "grantCollectionAccess": { "message": "Gewähre Gruppen oder Mitgliedern Zugriff auf diese Sammlung." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Anbieterportal" }, + "viewCollection": { + "message": "Sammlung anzeigen" + }, "restrictedGroupAccess": { "message": "Du kannst dich nicht selbst zu Gruppen hinzufügen." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Einträge" + }, + "assignedSeats": { + "message": "Zugewiesene Benutzerplätze" + }, + "assigned": { + "message": "Zugewiesen" + }, + "used": { + "message": "Belegt" + }, + "remaining": { + "message": "Verbleibend" + }, + "unlinkOrganization": { + "message": "Organisations-Verknüpfung aufheben" + }, + "manageSeats": { + "message": "Benutzerpätze verwalten" + }, + "manageSeatsDescription": { + "message": "Die Anpassung der Benutzerplätze wird im nächsten Abrechnungszeitraum berücksichtigt." + }, + "unassignedSeatsDescription": { + "message": "Nicht zugewiesene Abonnement-Benutzerplätze" + }, + "purchaseSeatDescription": { + "message": "Zusätzliche gekaufte Benutzerplätze" + }, + "assignedSeatCannotUpdate": { + "message": "Zugewiesene Benutzerplätze können nicht aktualisiert werden. Bitte kontaktiere deinen Organisationseigentümer, um Unterstützung zu erhalten." + }, + "subscriptionUpdateFailed": { + "message": "Aktualisierung des Abonnement fehlgeschlagen" + }, + "trial": { + "message": "Testversion", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Überfällig", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abonnement abgelaufen", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Du hast eine Übergangsfrist von $DAYS$ Tagen ab dem Ablaufdatum deines Abonnements, um dein Abonnement weiterzuführen. Bitte begleiche die letzten fälligen Rechnungen bis zum $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Du hast eine Übergangsfrist von $DAYS$ Tagen ab dem Fälligkeitsdatum deiner ersten unbezahlten Rechnung, um dein Abonnement weiterzuführen. Bitte begleiche die überfälligen Rechnungen bis zum $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unbezahlte Rechnung", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Um dein Abonnement zu reaktivieren, begleiche bitte die letzten überfälligen Rechnungen.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Kündigungsdatum", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Gerätekonten können in deaktivierten Organisationen nicht erstellt werden. Bitte kontaktiere deinen Organisationseigentümer, um Unterstützung zu erhalten." + }, + "machineAccount": { + "message": "Gerätekonto", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Gerätekonten", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Neues Gerätekonto", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Erstelle ein neues Gerätekonto, um mit der Automation für Zugriffe auf Geheimnisse zu beginnen.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Hier gibt es noch nichts", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Gerätekonten löschen", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Gerätekonto löschen", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Gerätekonto anzeigen", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Das Löschen des Gerätekontos $MACHINE_ACCOUNT$ ist dauerhaft und unwiderruflich.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Das Löschen von Gerätekonten ist dauerhaft und unwiderruflich." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "$COUNT$ Gerätekonten löschen", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Gerätekonto gelöscht" + }, + "deleteMachineAccountsToast": { + "message": "Gerätekonten gelöscht" + }, + "searchMachineAccounts": { + "message": "Gerätekonten suchen", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Gerätekonto bearbeiten", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Name des Gerätekontos", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Neues Gerätekonto erstellt", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Gerätekonto aktualisiert", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Gerätekonten Zugriff auf dieses Projekt erlauben." + }, + "projectMachineAccountsSelectHint": { + "message": "Gerätekonten suchen oder auswählen" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Gerätekonten hinzufügen, um Zugriff zu gewähren" + }, + "machineAccountPeopleDescription": { + "message": "Gruppen oder Personen Zugriff auf dieses Gerätekonto gewähren." + }, + "machineAccountProjectsDescription": { + "message": "Diesem Gerätekonto Projekte zuweisen. " + }, + "createMachineAccount": { + "message": "Gerätekonto erstellen" + }, + "maPeopleWarningMessage": { + "message": "Das Entfernen von Personen aus einem Gerätekonto entfernt nicht die von ihnen erstellten Zugriffstoken. Aus Sicherheitsgründen wird empfohlen, Zugriffstoken zu widerrufen, die von Personen erstellt wurden, die aus einem Gerätekonto entfernt wurden." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Zugriff auf dieses Gerätekonto entfernen" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Diese Aktion wird deinen Zugriff auf das Gerätekonto entfernen." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ Gerätekonten enthalten", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ pro Monat für zusätzliche Gerätekonten", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Zusätzliche Gerätekonten" + }, + "includedMachineAccounts": { + "message": "Dein Tarif enthält $COUNT$ Gerätekonten.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Du kannst zusätzliche Gerätekonten für $COST$ pro Monat hinzufügen.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Gerätekonten begrenzen (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Lege ein Limit für deine Gerätekonten fest. Sobald dieses Limit erreicht ist, kannst du keine neuen Gerätekonten mehr erstellen." + }, + "machineAccountLimit": { + "message": "Gerätekonten-Limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Maximal mögliche Kosten des Gerätekontos" + }, + "machineAccountAccessUpdated": { + "message": "Zugriff auf Gerätekonto aktualisiert" + }, + "unassignedItemsBanner": { + "message": "Hinweis: Nicht zugewiesene Organisationseinträge sind nicht mehr geräteübergreifend in der Ansicht aller Tresore sichtbar und sind nun nur über die Administrator-Konsole zugänglich. Weise diese Einträge einer Sammlung aus der Administrator-Konsole zu, um sie sichtbar zu machen." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 0babeee15d..4502d940b2 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Προσθήκη Υπάρχοντος Οργανισμού" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Ο Πάροχος Μου" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index e8944471cc..f28bff066a 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -7902,5 +7902,8 @@ }, "unassignedItemsBanner": { "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." + }, + "unassignedItemsBannerSelfHost": { + "message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in your All Vaults view across devices and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index d70d6cff23..88d67c51b4 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organisation" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 561d267cab..ea3ff3f395 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index d3a9ad414a..929a83d4fa 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 250614565d..8f9d2993eb 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Añadir una organización existente" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Mi proveedor" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 1866c649e4..b41732103f 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 0c35039424..a57e36221a 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Gehitu existitzen den erakunde bat" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Nire hornitzailea" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 2c3d10c6a8..0298bbc64b 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "سازمان موجود را اضافه کنید" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "ارائه دهنده‌ی من" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 43bbf01847..8875133d01 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -603,7 +603,7 @@ "message": "Ei" }, "loginOrCreateNewAccount": { - "message": "Käytä salattua holviasi kirjautumalla sisään tai tai luo uusi tili." + "message": "Käytä salattua holviasi kirjautumalla sisään tai luo uusi tili." }, "loginWithDevice": { "message": "Laitteella kirjautuminen" @@ -3168,7 +3168,7 @@ } }, "unlinkedSsoUser": { - "message": "Irrotti käyttäjän \"$ID$\" kertakirjautumisesta.", + "message": "Poisti kertakirjautumisen käyttäjältä \"$ID$\".", "placeholders": { "id": { "content": "$1", @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Lisää olemassa oleva organisaatio" }, + "addNewOrganization": { + "message": "Lisää uusi organisaatio" + }, "myProvider": { "message": "Oma toimittaja" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Kokoelman käyttöä on rajoitettu" }, + "readOnlyCollectionAccess": { + "message": "Oikeutesi eivät riitä kokoelman hallintaan." + }, "grantCollectionAccess": { "message": "Myönnä ryhmille tai henkilöille kokoelman käyttöoikeus." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Toimittajaportaali" }, + "viewCollection": { + "message": "Tarkastele kokoelmaa" + }, "restrictedGroupAccess": { "message": "Et voi lisätä itseäsi ryhmiin." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Kohteet" + }, + "assignedSeats": { + "message": "Määritetyt käyttäjäpaikat" + }, + "assigned": { + "message": "Määritetty" + }, + "used": { + "message": "Käytetty" + }, + "remaining": { + "message": "Jäljellä" + }, + "unlinkOrganization": { + "message": "Irrota organisaatio" + }, + "manageSeats": { + "message": "HALLITSE KÄYTTÄJÄPAIKKOJA" + }, + "manageSeatsDescription": { + "message": "Käyttäjäpaikkojen muutokset näkyvät seuraavalla laskutuskaudella." + }, + "unassignedSeatsDescription": { + "message": "Tilauksen määrittämättömät käyttäjäpaikat" + }, + "purchaseSeatDescription": { + "message": "Käyttäjäpaikkoja ostettu lisää" + }, + "assignedSeatCannotUpdate": { + "message": "Määritettyjä käyttäjäpaikkoja ei ole mahdollista päivittää. Ole yhteydessä organisaatiosi omistajaan saadaksesi apua." + }, + "subscriptionUpdateFailed": { + "message": "Tilausmuutos epäonnistui" + }, + "trial": { + "message": "Kokeilu", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Erääntynyt", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Tilaus on päättynyt", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Sinulla on $DAYS$ päivän varoaika tilauksesi säilyttämiseksi. Maksa erääntyneet laskut $SUSPENSION_DATE$ mennessä.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Sinulla on $DAYS$ päivän varoaika ensimmäisen erääntyneen laskusi eräpäivästä tilauksesi säilyttämiseksi. Maksa erääntyneet laskut $SUSPENSION_DATE$ mennessä.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Maksamaton lasku", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Palauta tilauksesi käyttöön maksamalla erääntyneet laskut.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Peruutuspäivä", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Konetilien luonti ei ole mahdollista jäädytetyissä organisaatioissa. Ole yhteydessä organisaatiosi omistajaan saadaksesi apua." + }, + "machineAccount": { + "message": "Konetili", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Konetilit", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Uusi konetili", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Aloita salaisen käytön automatisointi luomalla uusi konetili.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Ei vielä mitään näytettävää", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Poista konetilit", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Poista konetili", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Näytä konetili", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Konetilin $MACHINE_ACCOUNT$ poisto on pysyvää ja peruuttamatonta.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Konetilien poisto on pysyvää ja peruuttamatonta." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Poista $COUNT$ konetiliä", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Konetili poistettiin" + }, + "deleteMachineAccountsToast": { + "message": "Konetilit poistettiin" + }, + "searchMachineAccounts": { + "message": "Etsi konetileistä", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Muokkaa konetiliä", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Konetilin nimi", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Konetili luotiin", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Konetili päivitettiin", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Myönnä konetileille käyttöoikeus projektiin." + }, + "projectMachineAccountsSelectHint": { + "message": "Syötä tai valitse konetilit" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Myönnä käyttöoikeuksia lisäämällä konetilejä" + }, + "machineAccountPeopleDescription": { + "message": "Myönnä ryhmille tai henkilöille tämän konetilin käyttöoikeus." + }, + "machineAccountProjectsDescription": { + "message": "Määritä konetilille projekteja. " + }, + "createMachineAccount": { + "message": "Luo konetili" + }, + "maPeopleWarningMessage": { + "message": "Henkilöiden poistaminen konetililtä ei poista heidän luomiaan käyttötunnisteita. Parasta suojauskäytäntöä varten on suositeltavaa mitätöidä konetililtä poistettujen henkilöiden luomat tunnukset." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Poista konetilin käyttöoikeus" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Tämä poistaa käyttöoikeutesi konetiliin." + }, + "machineAccountsIncluded": { + "message": "Sisältää $COUNT$ konetiliä", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "Jokainen lisätty konetili kustantaa $COST$ kuukaudessa", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Lisättävät konetilit" + }, + "includedMachineAccounts": { + "message": "Tilaukseesi sisältyy $COUNT$ konetiliä.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Voit hankkia lisää konetilejä hintaan $COST$/tili/kuukausi.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Rajoita konetilien määrää (valinnainen)" + }, + "limitMachineAccountsDesc": { + "message": "Aseta tilaukseesi sisältyvä konetilien määrä. Määrän täytyttyä et voi luoda uusia konetilejä." + }, + "machineAccountLimit": { + "message": "Konetilien enimmäismäärä (valinnainen)" + }, + "maxMachineAccountCost": { + "message": "Konetilin mahdollinen enimmäiskustannus" + }, + "machineAccountAccessUpdated": { + "message": "Konetilin oikeuksia muutettiin" + }, + "unassignedItemsBanner": { + "message": "Huomautus: Organisaation kohteita, joita ei ole lisätty kokoelmaan, ei enää näytetä laitteiden \"Kaikki holvit\" -näkymissä, ja jatkossa ne näkyvät vain hallintakonsolin kautta. Lisää kohteet kokoelmiin, jotta ne ovat laitteilla käytettävissä." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index bfcdccc7a2..7664321333 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Magdagdag ng umiiral na organisasyon" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Ang Aking Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 9cc40e4133..57132fbe9a 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Ajouter une organisation existante" }, + "addNewOrganization": { + "message": "Ajouter une nouvelle organisation" + }, "myProvider": { "message": "Mon fournisseur" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "L'accès à la collection est restreint" }, + "readOnlyCollectionAccess": { + "message": "Vous n'avez pas accès à la gestion de cette collection." + }, "grantCollectionAccess": { "message": "Accorder l'accès à cette collection aux groupes ou aux membres." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portail fournisseur" }, + "viewCollection": { + "message": "Afficher la Collection" + }, "restrictedGroupAccess": { "message": "Vous ne pouvez vous ajoutez vous-même aux groupes." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Éléments" + }, + "assignedSeats": { + "message": "Places assignées" + }, + "assigned": { + "message": "Assigné" + }, + "used": { + "message": "Utilisé" + }, + "remaining": { + "message": "Restant" + }, + "unlinkOrganization": { + "message": "Délier l'organisation" + }, + "manageSeats": { + "message": "GÉRER LES PLACES" + }, + "manageSeatsDescription": { + "message": "Les ajustements aux licences seront reflétés lors du prochain cycle de facturation." + }, + "unassignedSeatsDescription": { + "message": "Licenses d'abonnement non assignés" + }, + "purchaseSeatDescription": { + "message": "Licenses additionnelles achetées" + }, + "assignedSeatCannotUpdate": { + "message": "Les Licences assignées ne peuvent être mises à jour. Veuillez contacter le propriétaire de votre organisation pour assistance." + }, + "subscriptionUpdateFailed": { + "message": "Mise à jour de l'abonnement échouée" + }, + "trial": { + "message": "Essai", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Échéance dépassée", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abonnement expiré", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Vous bénéficiez d'une période de grace de $DAYS$ jours suivants la date d'expiration de votre abonnement pour le maintenir. Veuillez adresser les paiements en souffrance pour les factures dont les échéances sont passées d'ici le $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Vous bénéficiez d'une période de grace de $DAYS$ jours à partir de la première journée de votre première facture impayée pour maintenir votre abonnement. Veuillez adresser les paiements en souffrance pour les factures dont les échéances sont passées d'ici le $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Facture impayée", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Pour réactiver votre abonnement, veuillez adresser les paiements en souffrance pour les factures dont les échéances sont passées.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Date d'annulation", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Les comptes de machine ne peuvent pas être créés dans les organisations suspendues. Veuillez contacter le propriétaire de votre organisation pour obtenir de l'aide." + }, + "machineAccount": { + "message": "Compte machine", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Comptes de machine", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Nouveau compte machine", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Créez un nouveau compte machine pour commencer à automatiser l'accès secret.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Rien à afficher pour l'instant", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Supprimer les comptes de machine", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Supprimer le compte machine", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Afficher le compte machine", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "La suppression du compte machine $MACHINE_ACCOUNT$ est permanente et irréversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "La suppression des comptes de la machine est permanente et irréversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Supprimer $COUNT$ comptes machines", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Compte de machine supprimé" + }, + "deleteMachineAccountsToast": { + "message": "Comptes de machine supprimés" + }, + "searchMachineAccounts": { + "message": "Rechercher des comptes de machine", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Éditer le compte machine", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Nom du compte machine", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Compte de machine créé", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Compte de la machine mis à jour", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Accorder l'accès à ce projet aux comptes de machine." + }, + "projectMachineAccountsSelectHint": { + "message": "Saisissez ou sélectionnez les comptes de machine" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Ajouter des comptes de machine pour accorder l'accès" + }, + "machineAccountPeopleDescription": { + "message": "Accorder l'accès à ce compte à des groupes ou à des personnes." + }, + "machineAccountProjectsDescription": { + "message": "Assigner des projets à ce compte machine. " + }, + "createMachineAccount": { + "message": "Créer un compte machine" + }, + "maPeopleWarningMessage": { + "message": "La suppression de personnes d'un compte machine ne supprime pas les jetons d'accès qu'ils ont créés. Pour de meilleures pratiques en matière de sécurité, il est recommandé de révoquer les jetons d'accès créés par des personnes supprimées d'un compte machine." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Retirer l'accès à ce compte machine" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Cette action supprimera votre accès au compte de la machine." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ comptes machines inclus", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ par mois pour des comptes machines supplémentaires", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Comptes de machine supplémentaires" + }, + "includedMachineAccounts": { + "message": "Votre forfait est livré avec $COUNT$ comptes machines.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Vous pouvez ajouter des comptes machines supplémentaires pour $COST$ par mois.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limiter les comptes de la machine (facultatif)" + }, + "limitMachineAccountsDesc": { + "message": "Définissez une limite pour vos comptes machines. Une fois cette limite atteinte, vous ne pourrez plus créer de nouveaux comptes machines." + }, + "machineAccountLimit": { + "message": "Limite du compte de la machine (facultatif)" + }, + "maxMachineAccountCost": { + "message": "Coût potentiel maximal de compte machine" + }, + "machineAccountAccessUpdated": { + "message": "Accès au compte machine mis à jour" + }, + "unassignedItemsBanner": { + "message": "Remarque : Les éléments d'organisation non assignés ne sont plus visibles dans la vue tous les coffres sur les appareils et ne sont maintenant accessibles que via la Console Admin. Assigner ces éléments à une collection de la Console Admin pour les rendre visibles." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 0c8316fe49..bcbea04c28 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index b00c912d7a..892db00010 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 4d47c12e86..0915a1a818 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Dodaj postojeću organizaciju" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Moj davatelj usluga" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index e1f3682bbd..16ed9d34d9 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Létező fordítások hozzáadása" }, + "addNewOrganization": { + "message": "Új szervezet hozzáadása" + }, "myProvider": { "message": "Saját szolgáltató" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "A gyűjtemény elérése korlátozott." }, + "readOnlyCollectionAccess": { + "message": "Nincs jogosultság ennek a gyűjteménynek a kezelésére." + }, "grantCollectionAccess": { "message": "Adjunk hozzáférést csoportoknak vagy személyeknek eennél a gyűjteménynél." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Szolgáltató portál" }, + "viewCollection": { + "message": "Gyűjtemény megtekintése" + }, "restrictedGroupAccess": { "message": "Nem adhadjuk magunkat a csoporthoz." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Elemek" + }, + "assignedSeats": { + "message": "Hozzárendelt helyek" + }, + "assigned": { + "message": "Hozzárendelve" + }, + "used": { + "message": "Felhasznált" + }, + "remaining": { + "message": "Maradt" + }, + "unlinkOrganization": { + "message": "Szervezet leválasztása" + }, + "manageSeats": { + "message": "HELYEK KEZELÉSE" + }, + "manageSeatsDescription": { + "message": "A helyek módosításai a következő számlázási ciklusban jelennek meg." + }, + "unassignedSeatsDescription": { + "message": "Nem hozzárendelt előfizetési helyek" + }, + "purchaseSeatDescription": { + "message": "További megvásárolt helyek" + }, + "assignedSeatCannotUpdate": { + "message": "A hozzárendelt helyek nem frissíthetők. Segítségért forduljunk a szervezet tulajdonosához." + }, + "subscriptionUpdateFailed": { + "message": "Az előfizetés frissítés sikertelen volt." + }, + "trial": { + "message": "Próba", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Határidőn túl", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Az előfizetés lejárt.", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Az előfizetés lejárati dátumától számítva $DAYS$ nap türelmi időszak áll rendelkezésére az előfizetés fenntartásához. Rendezzük a lejárt számlákat a következő időpontig: $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Az első kifizetetlen számla esedékességétől számítva $DAYS$ nap türelmi időszak áll rendelkezésére az előfizetés fenntartására. Rendezzük a lejárt számlákat a következő időpontig: $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Kifizetetlen számla", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Az előfizetés újraaktiválásához oldjuk meg a lejárt számlákat.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Lemondási dátum", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "A felfüggesztett szervezetekben nem hozhatók létre szolgáltatásfiókok. Segítségért forduljunk a szervezet tulajdonosához." + }, + "machineAccount": { + "message": "Gépi fiók", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Gépi fiókok", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Új gépi fiók", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Új gépi fiók létrehozása a titkos kód automatikus hozzáféréséhez.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nincs megjeleníthető tartalom.", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Gépi fiókok törlése", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Gépi fiók törlése", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Gépi fiók mgtekintése", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "$MACHINE_ACCOUNT$ gépi fiók törlése végleges és visszafordíthatatlan.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "A gépi fiókok törlése végleges és visszafordíthatatlan." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "$COUNT$ gépi fiókok törlése", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "A gépi fiók törlésre került." + }, + "deleteMachineAccountsToast": { + "message": "A gépi fiókok törlésre kerültek." + }, + "searchMachineAccounts": { + "message": "Gépi fiókok keresése", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Gépi fiók szerkesztése", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Gépi fióknév", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "A gépi fiók létrehozásra került.", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "A gépi fiók frissítésre került.", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Gépi fiókok elérésének engedélyezése ehhez a projekthez." + }, + "projectMachineAccountsSelectHint": { + "message": "Írjuk be vagy válasszuk ki a gépi fiókokat." + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Adjunk hozzá gépi fiókokat a hozzáférés biztosításához" + }, + "machineAccountPeopleDescription": { + "message": "Adjunk hozzáférést csoportoknak vagy személyeknek ehhez a gépi fiókhoz." + }, + "machineAccountProjectsDescription": { + "message": "Projektek hozzárendelése ehhez a gépi fiókhoz. " + }, + "createMachineAccount": { + "message": "Gépi fiók létrehozása" + }, + "maPeopleWarningMessage": { + "message": "Az emberek gépi fiókból való eltávolítása nem távolítja el az általuk létrehozott elérési vezérjeleket. A legjobb biztonsági gyakorlat érdekében javasolt visszavonni a gépi fiókból eltávolított személyek által létrehozott elérési vezérjeleket." + }, + "smAccessRemovalWarningMaTitle": { + "message": "A gépi fiók elérés visszavonása" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Ez a művelet eltávolítja a gépi fiók elérési lehetőségét." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ gépi fiók belefoglalva", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ havonta kiegészítő gépi fiókokhoz", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Kiegészítő gépi fiókok" + }, + "includedMachineAccounts": { + "message": "A csomag $COUNT$ gépi fiókot tartalmaz.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "További gépi fiókok adhatók hozzá havi $COST$ áron.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Gépi fiókok korlátozása (opcionális)" + }, + "limitMachineAccountsDesc": { + "message": "Állítsunk be korlátot a gépi fiókokhoz. Ha elérjük ezt a korlátot, nem tudunk új gépi fiókokat létrehozni." + }, + "machineAccountLimit": { + "message": "Gépi fiók korlát (opcionális)" + }, + "maxMachineAccountCost": { + "message": "Maximális lehetséges gépi fiókköltség" + }, + "machineAccountAccessUpdated": { + "message": "A gépi fiók elérése frissítésre került." + }, + "unassignedItemsBanner": { + "message": "Megjegyzés: A nem hozzá rendelt szervezeti elemek már nem láthatók az Összes széf nézetben a különböző eszközökön és mostantól csak a Felügyeleti konzolon keresztül érhetők el. Rendeljük ezeket az elemeket egy gyűjteményhez az Adminisztrátori konzolból, hogy láthatóvá tegyeük azokat." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 83d6c42673..ee0830e6ff 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Tambah Organisasi yang sudah ada" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Provider Saya" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index c31ff1a5a2..0ae1f9ae41 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Aggiungi organizzazione esistente" }, + "addNewOrganization": { + "message": "Aggiungi nuova organizzazione" + }, "myProvider": { "message": "Il mio fornitore" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "L'accesso alla raccolta è limitato" }, + "readOnlyCollectionAccess": { + "message": "Non hai accesso alla gestione di questa raccolta." + }, "grantCollectionAccess": { "message": "Consenti a gruppi o membri di accedere a questa raccolta." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portale Fornitori" }, + "viewCollection": { + "message": "Visualizza raccolta" + }, "restrictedGroupAccess": { "message": "Non puoi aggiungerti da solo ai gruppi." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Elementi" + }, + "assignedSeats": { + "message": "Slot assegnati" + }, + "assigned": { + "message": "Assegnato" + }, + "used": { + "message": "Usato" + }, + "remaining": { + "message": "Rimanenti" + }, + "unlinkOrganization": { + "message": "Scollega organizzazione" + }, + "manageSeats": { + "message": "GESTISCI SLOT" + }, + "manageSeatsDescription": { + "message": "Le modifiche agli slot si rifletteranno nel prossimo ciclo di fatturazione." + }, + "unassignedSeatsDescription": { + "message": "Posti in abbonamento non assegnati" + }, + "purchaseSeatDescription": { + "message": "Slot aggiuntivi acquistati" + }, + "assignedSeatCannotUpdate": { + "message": "Gli slot assegnati non possono essere aggiornati. Contatta il proprietario della tua organizzazione per ricevere assistenza." + }, + "subscriptionUpdateFailed": { + "message": "Aggiornamento dell'abbonamento fallito" + }, + "trial": { + "message": "Prova", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Arretrato", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abbonamento scaduto", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Hai un periodo di grazia di $DAYS$ giorni dalla data di scadenza dell'abbonamento per mantenerlo. Risolvi le fatture scadute entro il $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Hai un periodo di grazia di $DAYS$ giorni dalla data di scadenza della prima fattura non pagata per mantenere il tuo abbonamento. Risolvi le fatture scadute entro il $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Fattura non pagata", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Per riattivare il tuo abbonamento, risolvi le fatture arretrate.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Data di cancellazione", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Non è possibile creare account macchina nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per assistenza." + }, + "machineAccount": { + "message": "Account macchina", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Account macchina", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Nuovo account macchina", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Crea un nuovo account macchina per iniziare ad automatizzare le credenziali dei segreti.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Niente da mostrare per ora", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Elimina account macchina", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Elimina account macchina", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Visualizza account macchina", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "L'eliminazione dell'account macchina $MACHINE_ACCOUNT$ è permanente e irreversibile.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "L'eliminazione degli account macchina è permanente e irreversibile." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Elimina $COUNT$ account macchina", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Account macchina eliminato" + }, + "deleteMachineAccountsToast": { + "message": "Account macchina eliminati" + }, + "searchMachineAccounts": { + "message": "Cerca account macchina", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Modifica account macchina", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Nome account macchina", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Account macchina creato", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Account macchina aggiornato", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Concedi agli account macchina di accedere a questo progetto." + }, + "projectMachineAccountsSelectHint": { + "message": "Digita o seleziona account macchina" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Aggiungi account macchina per concedere l'accesso" + }, + "machineAccountPeopleDescription": { + "message": "Consenti a gruppi o persone di accedere a questo account macchina." + }, + "machineAccountProjectsDescription": { + "message": "Assegna progetti a questo account macchina. " + }, + "createMachineAccount": { + "message": "Crea un account macchina" + }, + "maPeopleWarningMessage": { + "message": "Rimuovere persone da un account macchina non rimuove i token di accesso che hanno creato. Per ragioni di sicurezza, consigliamo di revocare i token di accesso creati da persone rimosse da un account macchina." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Rimuovi accesso a questo account macchina" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Questa azione rimuoverà il tuo accesso all'account macchina." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ account macchina inclusi", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ al mese per account macchina aggiuntivi", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Account macchina aggiuntivi" + }, + "includedMachineAccounts": { + "message": "Il tuo piano include $COUNT$ account macchina.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Puoi aggiungere più account macchina a $COST$ al mese.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limita gli account macchina (facoltativo)" + }, + "limitMachineAccountsDesc": { + "message": "Imposta un limite per i tuoi account macchina. Una volta raggiunto questo limite, non potrai creare nuovi account macchina." + }, + "machineAccountLimit": { + "message": "Limite account macchina (facoltativo)" + }, + "maxMachineAccountCost": { + "message": "Costo massimo potenziale dell'account macchina" + }, + "machineAccountAccessUpdated": { + "message": "Accesso all'account macchina aggiornato" + }, + "unassignedItemsBanner": { + "message": "Avviso: gli elementi dell'organizzazione non assegnati non sono più visibili nella visualizzazione Tutte le Cassaforti su tutti i dispositivi e sono ora accessibili solo tramite la Console di amministrazione. Assegna questi elementi ad una raccolta dalla Console di amministrazione per renderli visibili." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index c2e3e77b24..2691faff33 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "既存の組織を追加する" }, + "addNewOrganization": { + "message": "新しい組織を追加" + }, "myProvider": { "message": "プロバイダー" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "コレクションへのアクセスが制限されています" }, + "readOnlyCollectionAccess": { + "message": "このコレクションを管理する権限がありません。" + }, "grantCollectionAccess": { "message": "グループまたはメンバーにこのコレクションへのアクセスを許可します。" }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "プロバイダーポータル" }, + "viewCollection": { + "message": "コレクションを表示" + }, "restrictedGroupAccess": { "message": "あなた自身をグループに追加することはできません。" }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "アイテム" + }, + "assignedSeats": { + "message": "割り当て済のシート" + }, + "assigned": { + "message": "割り当て済" + }, + "used": { + "message": "使用中" + }, + "remaining": { + "message": "残り" + }, + "unlinkOrganization": { + "message": "組織のリンクを解除" + }, + "manageSeats": { + "message": "シートの管理" + }, + "manageSeatsDescription": { + "message": "調整したシートは、次の請求サイクルで反映されます。" + }, + "unassignedSeatsDescription": { + "message": "未割り当てのサブスクリプションシート" + }, + "purchaseSeatDescription": { + "message": "追加シートを購入しました" + }, + "assignedSeatCannotUpdate": { + "message": "割り当て済のシートは更新できません。組織の所有者に連絡してください。" + }, + "subscriptionUpdateFailed": { + "message": "サブスクリプションの更新に失敗しました" + }, + "trial": { + "message": "お試し", + "description": "A subscription status label." + }, + "pastDue": { + "message": "期限切れ", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "サブスクリプションの有効期限が切れました", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "期限が切れた日から$DAYS$日間の猶予期間があり、支払いを済ませればサブスクリプションを継続できます。期限切れになった請求書の支払いを $SUSPENSION_DATE$ までに済ませてください。", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "最初の未払いの請求書の期限日から$DAYS$日間の猶予期間があり、支払いを済ませればサブスクリプションを継続できます。期限切れになった請求書の支払いを $SUSPENSION_DATE$ までに済ませてください。", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "未払い請求書", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "サブスクリプションを再度有効にするには、期限切れになった請求書の支払いをしてください。", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "解約日", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "一時停止中の組織ではマシンアカウントを作成できません。組織の所有者に問い合わせてください。" + }, + "machineAccount": { + "message": "マシンアカウント", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "マシンアカウント", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "新しいマシンアカウント", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "シークレットアクセスを自動化するためには、新しいマシンアカウントを作成してください。", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "まだ表示するものはありません", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "マシンアカウントの削除", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "マシンアカウントの削除", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "マシンアカウントを表示", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "マシンアカウント $MACHINE_ACCOUNT$ を削除すると元に戻すことはできません。", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "マシンアカウントを削除すると元に戻すことはできません。" + }, + "deleteMachineAccountsConfirmMessage": { + "message": "$COUNT$ 個のマシンアカウントの削除", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "マシンアカウントを削除しました" + }, + "deleteMachineAccountsToast": { + "message": "マシンアカウントを削除しました" + }, + "searchMachineAccounts": { + "message": "マシンアカウントの検索", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "マシンアカウントの編集", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "マシンアカウント名", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "マシンアカウントの作成", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "マシンアカウントを更新しました", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "このプロジェクトへのマシンアカウントのアクセスを許可します。" + }, + "projectMachineAccountsSelectHint": { + "message": "マシンアカウントを入力または選択" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "アクセスを許可するマシンアカウントを追加" + }, + "machineAccountPeopleDescription": { + "message": "グループまたはメンバーにこのマシンアカウントへのアクセスを許可します。" + }, + "machineAccountProjectsDescription": { + "message": "このマシンアカウントにプロジェクトを割り当てます。 " + }, + "createMachineAccount": { + "message": "マシンアカウントを作成" + }, + "maPeopleWarningMessage": { + "message": "マシンアカウントからユーザーを削除しても、作成したアクセストークンは削除されません。 セキュリティ向上のために、マシンアカウントから削除されたユーザーによって作成されたアクセストークンを取り消すことをお勧めします。" + }, + "smAccessRemovalWarningMaTitle": { + "message": "このマシンアカウントへのアクセスを削除" + }, + "smAccessRemovalWarningMaMessage": { + "message": "この操作により、マシンアカウントへのあなたのアクセス権限が削除されます。" + }, + "machineAccountsIncluded": { + "message": "$COUNT$ 個のマシンアカウントが含まれています", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "追加のマシンアカウントは月額 $COST$", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "追加のマシンアカウント" + }, + "includedMachineAccounts": { + "message": "お客様のプランには $COUNT$ 個のマシンアカウントが付属しています。", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "月額 $COST$ でマシンアカウントを追加できます。", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "マシンアカウントの制限 (オプション)" + }, + "limitMachineAccountsDesc": { + "message": "マシンアカウントの上限を設定します。この制限に達すると、新しいマシンアカウントを作成できなくなります。" + }, + "machineAccountLimit": { + "message": "マシンアカウントの上限(オプション)" + }, + "maxMachineAccountCost": { + "message": "マシンアカウントのコストの最大値" + }, + "machineAccountAccessUpdated": { + "message": "マシンアカウントへのアクセス権限を更新しました" + }, + "unassignedItemsBanner": { + "message": "注意: 割り当てられていない組織項目は、デバイス間のすべての保管庫のビューでは表示されなくなり、管理コンソールからのみアクセスできます。 管理コンソールからコレクションにこれらのアイテムを割り当てると、表示するようにできます。" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index e288311956..25a97a05a3 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 02631198e3..1dbb90ad26 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 1867603a0d..c01a591b63 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -395,7 +395,7 @@ "message": "항목 보기" }, "new": { - "message": "New", + "message": "새 항목", "description": "for adding new items" }, "item": { @@ -609,7 +609,7 @@ "message": "기기로 로그인" }, "loginWithDeviceEnabledNote": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "기기로 로그인은 Bitwarden 앱 설정에서 구성돼야 합니다. 다른 방식이 필요하신가요?" }, "loginWithMasterPassword": { "message": "마스터 비밀번호로 로그인" @@ -624,7 +624,7 @@ "message": "Use a different log in method" }, "loginWithPasskey": { - "message": "Log in with passkey" + "message": "패스키로 로그인" }, "invalidPasskeyPleaseTryAgain": { "message": "Invalid Passkey. Please try again." @@ -636,7 +636,7 @@ "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." }, "newPasskey": { - "message": "New passkey" + "message": "새 패스키" }, "learnMoreAboutPasswordless": { "message": "Learn more about passwordless" @@ -654,7 +654,7 @@ "message": "There was a problem creating your passkey." }, "passkeySuccessfullyCreated": { - "message": "Passkey successfully created!" + "message": "패스키가 생성되었습니다!" }, "customPasskeyNameInfo": { "message": "Name your passkey to help you identify it." @@ -711,7 +711,7 @@ "message": "새로 찾아오셨나요?" }, "startTrial": { - "message": "평가판 시작" + "message": "\b무료 체험 시작" }, "logIn": { "message": "로그인" @@ -793,7 +793,7 @@ "message": "계정 생성이 완료되었습니다! 이제 로그인하실 수 있습니다." }, "trialAccountCreated": { - "message": "계정 생성에 성공했습니다." + "message": "계정이 생성되었습니다." }, "masterPassSent": { "message": "마스터 비밀번호 힌트가 담긴 이메일을 보냈습니다." @@ -905,7 +905,7 @@ "message": "인증 코드 이메일 다시 보내기" }, "useAnotherTwoStepMethod": { - "message": "다른 2단계 인증 사용" + "message": "다른 2단계 로그인 방법 사용" }, "insertYubiKey": { "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 버튼을 누르세요." @@ -1045,7 +1045,7 @@ "message": "인증 코드 복사" }, "copyUuid": { - "message": "Copy UUID" + "message": "UUID 복사" }, "warning": { "message": "경고" @@ -1054,7 +1054,7 @@ "message": "보관함 내보내기 확인" }, "confirmSecretsExport": { - "message": "Confirm secrets export" + "message": "비밀 데이터 내보내기 확인" }, "exportWarningDesc": { "message": "내보내기는 보관함 데이터가 암호화되지 않은 형식으로 포함됩니다. 내보낸 파일을 안전하지 않은 채널(예: 이메일)을 통해 저장하거나 보내지 마십시오. 사용이 끝난 후에는 즉시 삭제하십시오." @@ -1078,7 +1078,7 @@ "message": "보관함 내보내기" }, "exportSecrets": { - "message": "Export secrets" + "message": "비밀 데이터 내보내기" }, "fileFormat": { "message": "파일 형식" @@ -1108,13 +1108,13 @@ "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "exportTypeHeading": { - "message": "Export type" + "message": "내보내기 유형" }, "accountRestricted": { - "message": "Account restricted" + "message": "계정 제한됨" }, "passwordProtected": { - "message": "Password protected" + "message": "비밀번호로 보호됨" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { "message": "'파일 암호'와 '파일 암호 확인'이 일치하지 않습니다." @@ -1151,7 +1151,7 @@ "message": "길이" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "최소 비밀번호 길이" }, "uppercase": { "message": "대문자 (A-Z)", @@ -1351,19 +1351,19 @@ "message": "데이터 가져오기" }, "onboardingImportDataDetailsPartOne": { - "message": "If you don't have any data to import, you can create a ", + "message": "가져오기할 데이터가 없으면, 대신 ", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLink": { - "message": "new item", + "message": "새 항목", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { - "message": " instead.", + "message": "을 생성할 수 있습니다.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." }, "onboardingImportDataDetailsPartTwoWithOrgs": { - "message": " instead. You may need to wait until your administrator confirms your organization membership.", + "message": "을 생성할 수 있습니다. 관리자가 귀하의 조직을 확인할 때까지 기다려야 할 수 있습니다.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. You may need to wait until your administrator confirms your organization membership." }, "importError": { @@ -1385,7 +1385,7 @@ } }, "dataExportSuccess": { - "message": "Data successfully exported" + "message": "데이터를 내보내기했습니다" }, "importWarning": { "message": "$ORGANIZATION$ 조직으로 데이터를 가져오려고 합니다. 데이터가 이 조직의 구성원과 공유될 수 있습니다. 계속하시겠습니까?", @@ -1409,13 +1409,13 @@ "message": "Import destination" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "가져오기 설정 알아보기" }, "selectImportFolder": { - "message": "Select a folder" + "message": "폴더 선택" }, "selectImportCollection": { - "message": "Select a collection" + "message": "컬렉션 선택" }, "importTargetHint": { "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", @@ -1456,7 +1456,7 @@ } }, "options": { - "message": "옵션" + "message": "설정" }, "preferences": { "message": "설정" @@ -1522,10 +1522,10 @@ "message": "도메인 업데이트됨" }, "twoStepLogin": { - "message": "2단계 인증" + "message": "2단계 로그인" }, "twoStepLoginEnforcement": { - "message": "Two-step Login Enforcement" + "message": "2단계 로그인 필수 설정" }, "twoStepLoginDesc": { "message": "로그인할 때 추가 단계를 요구하여 계정을 보호하십시오." @@ -1534,11 +1534,11 @@ "message": "Enable two-step login for your organization." }, "twoStepLoginEnterpriseDescStart": { - "message": "Enforce Bitwarden Two-step Login options for members by using the ", + "message": "을 사용해 구성원에게 Bitwarden 2단계 로그인 설정을 필수로 설정합니다.", "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": "2단계 인증 정책" + "message": "2단계 로그인 정책" }, "twoStepLoginOrganizationDuoDesc": { "message": "To enforce Two-step Login through Duo, use the options below." @@ -1735,7 +1735,7 @@ "message": "계정에 FIDO U2F 보안 키 추가" }, "removeU2fConfirmation": { - "message": "정말로 이 보안 키를 제거하시겠습니까?" + "message": "이 보안 키를 삭제하시겠습니까?" }, "twoFactorWebAuthnAdd": { "message": "계정에 WebAuthn 보안 키 추가" @@ -1992,7 +1992,7 @@ "message": "결제" }, "billingPlanLabel": { - "message": "요금제" + "message": "청구 계획" }, "paymentType": { "message": "결제 수단" @@ -2036,7 +2036,7 @@ "message": "1GB의 암호화된 파일 저장소." }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "YubiKey, Duo와 같은 \b상용 2단계 로그인 방법." }, "premiumSignUpEmergency": { "message": "긴급 접근" @@ -2104,7 +2104,7 @@ "message": "# 의 추가 GB" }, "additionalStorageIntervalDesc": { - "message": "귀하의 플랜은 $SIZE$의 암호화된 파일 저장소가 제공됩니다. GB / $INTERVAL$당 $PRICE$로 저장소용량을 추가할 수 있습니다.", + "message": "귀하의 요금제는 $SIZE$의 암호화 파일 저장소\u001d를 포함합니다. 추가 1GB당 매$INTERVAL$ $PRICE$로 저장소를 추가하실 수 있습니다.", "placeholders": { "size": { "content": "$1", @@ -2155,7 +2155,7 @@ "message": "Your payment method will be charged for any unpaid subscriptions." }, "paymentChargedWithTrial": { - "message": "귀하의 플랜은 7일 무료 평가판입니다. 평가 기간이 만료될 때까지 카드에서 대금이 지불되지 않습니다. 이후 정기적으로 매 $INTERVAL$ 청구됩니다. 언제든지 취소할 수 있습니다." + "message": "\b귀하의 요금제는 7일 무료 체험을 포함합니다. 체험 기간이 끝날 때까지 등록한 결제 수단에 요금이 청구되지 않습니다. 언제든지 취소하실 수 있습니다." }, "paymentInformation": { "message": "결제 정보" @@ -2302,7 +2302,7 @@ "message": "추가되는 저장소 용량 (GB)" }, "gbStorageRemove": { - "message": "삭제되는 저장소 용량 (GB)" + "message": "제거할 저장소 (GB)" }, "storageAddNote": { "message": "저장소 용량을 추가하면 청구 총계가 조정되고 파일에 즉시 지불 방법이 청구됩니다. 첫 번째 요금은 현재 청구 주기의 나머지 기간 동안 적립될 것입니다." @@ -2326,7 +2326,7 @@ "message": "Contact Support" }, "updatedPaymentMethod": { - "message": "결제방식 업데이트됨." + "message": "결제 수단이 업데이트되었습니다." }, "purchasePremium": { "message": "프리미엄 구매" @@ -2371,7 +2371,7 @@ "message": "기업 이름" }, "chooseYourPlan": { - "message": "플랜을 선택하십시오" + "message": "요금제를 선택하세요" }, "users": { "message": "사용자" @@ -2386,7 +2386,7 @@ "message": "# 의 사용자 수" }, "userSeatsAdditionalDesc": { - "message": "귀하의 플랜은 $BASE_SEATS$개의 사용자 수가 제공됩니다. 사용자 당 월 $SEAT_PRICE$로 사용자를 추가할 수 있습니다.", + "message": "귀하의 요금제는 $BASE_SEATS$명의 사용자\u001d를 포함합니다. 추가 사용자 1명 당 매월 $SEAT_PRICE$로 사용자를 추가하실 수 있습니다.", "placeholders": { "base_seats": { "content": "$1", @@ -2415,7 +2415,7 @@ } }, "planNameFamilies": { - "message": "가정" + "message": "가족" }, "planDescFamilies": { "message": "개인적인 사용을 위해 가족과 친구들에게 공유하세요." @@ -2427,7 +2427,7 @@ "message": "기업 및 기타 팀 조직용." }, "planNameTeamsStarter": { - "message": "Teams Starter" + "message": "팀 스타터" }, "planNameEnterprise": { "message": "기업" @@ -2523,7 +2523,7 @@ "message": "우선 고객 지원" }, "xDayFreeTrial": { - "message": "$COUNT$일간 무료 평가, 언제든지 취소", + "message": "$COUNT$일 무료 \b체험. 언제든지 취소하실 수 있습니다.", "placeholders": { "count": { "content": "$1", @@ -2532,7 +2532,7 @@ } }, "trialThankYou": { - "message": "Bitwarden의 $PLAN$에 가입해 주셔서 감사합니다!", + "message": "Bitwarden $PLAN$에 가입해 주셔서 고맙습니다!", "placeholders": { "plan": { "content": "$1", @@ -2541,7 +2541,7 @@ } }, "trialSecretsManagerThankYou": { - "message": "Thanks for signing up for Bitwarden Secrets Manager for $PLAN$!", + "message": "Bitwarden 비밀 데이터 관리자 $PLAN$에 가입해 주셔서 고맙습니다!", "placeholders": { "plan": { "content": "$1", @@ -2643,7 +2643,7 @@ } }, "removeUserConfirmation": { - "message": "정말 이 사용자를 제거하시겠습니까?" + "message": "이 사용자를 삭제하시겠습니까?" }, "removeOrgUserConfirmation": { "message": "구성원이 제거되면 해당 구성원은 그룹 데이터에 접근할 수 없으며 이 작업은 되돌릴 수 없습니다. 구성원을 다시 그룹에 추가하려면 해당 구성원을 다시 초대하여야 합니다." @@ -2802,10 +2802,10 @@ "message": "CLI" }, "bitWebVault": { - "message": "Bitwarden Web vault" + "message": "Bitwarden 웹 보관함" }, "bitSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "Birwarden 비밀 데이터 관리자" }, "loggedIn": { "message": "로그인됨." @@ -2940,7 +2940,7 @@ } }, "editItemWithName": { - "message": "Edit item - $NAME$", + "message": "항목 편집 - $NAME$", "placeholders": { "name": { "content": "$1", @@ -3384,7 +3384,7 @@ "message": "User accounts will remain active after deletion but will no longer be associated to this organization." }, "deletingOrganizationIsPermanentWarning": { - "message": "Deleting $ORGANIZATION$ is permanent and irreversible.", + "message": "$ORGANIZATION$ 삭제는 영구적이며 되돌릴 수 없습니다.", "placeholders": { "organization": { "content": "$1", @@ -3408,7 +3408,7 @@ "message": "청구서에 대한 세금 정보를 제공(또는 업데이트) 하려면 지원팀에 문의하십시오." }, "billingPlan": { - "message": "플랜", + "message": "요금제", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { @@ -3531,7 +3531,7 @@ "message": "Subscription updated. You now have access to Secrets Manager." }, "additionalOptions": { - "message": "추가 옵션" + "message": "추가 설정" }, "additionalOptionsDesc": { "message": "구독과 관련하여 추가적인 도움이 필요한 경우 고객 지원에 문의하십시오." @@ -3642,7 +3642,7 @@ "message": "조직 업그레이드" }, "upgradeOrganizationDesc": { - "message": "이 기능은 무료 조직에서는 사용할 수 없습니다. 더 많은 기능을 이용하려면 유료 플랜으로 전환하십시오." + "message": "이 기능은 무료 조직에서 사용하실 수 없습니다. 더 많은 기능을 잠금 해제하시려면 유료 요금제로 전환하세요." }, "createOrganizationStep1": { "message": "조직 만들기: 1단계" @@ -4210,7 +4210,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "비밀번호 제거" + "message": "비밀번호 삭제" }, "removedPassword": { "message": "비밀번호 제거함" @@ -4255,7 +4255,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "downloadAttachments": { - "message": "Download attachments" + "message": "첨부 파일 다운로드" }, "sendAccessUnavailable": { "message": "접근하려고 하는 Send가 존재하지 않거나 더이상 제공되지 않습니다.", @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "이미 있는 조직 추가" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "내 공급자" }, @@ -5420,7 +5423,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "memberDecryptionOption": { - "message": "멤버 복호화 옵션" + "message": "구성원 복호화 옵션" }, "memberDecryptionPassDesc": { "message": "Once authenticated, members will decrypt vault data using their master passwords." @@ -5625,7 +5628,7 @@ "message": "Exporting organization vault" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "$EMAIL$ 주소와 연관된 개인 보관함 항목만 내보내기됩니다. 조직 보관함 항목은 포함되지 않습니다. 보관함 항목 정보만 내보내기되고 첨부 파일을 포함하지 않습니다.", "placeholders": { "email": { "content": "$1", @@ -5634,7 +5637,7 @@ } }, "exportingOrganizationVaultDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "message": "$ORGANIZATION$ 조직과 연관된 조직 보관함만 내보내기됩니다. 개인 보관함이나 다른 조직의 항목은 포함되지 않습니다.", "placeholders": { "organization": { "content": "$1", @@ -6043,34 +6046,34 @@ "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret", + "message": "비밀 데이터 편집", "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret", + "message": "비밀 데이터 추가", "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name", + "message": "비밀 데이터 이름 복사", "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value", + "message": "비밀 데이터 값 복사", "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret", + "message": "비밀 데이터 삭제", "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets", + "message": "비밀 데이터 삭제", "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Permanently delete secret" + "message": "비밀 데이터 영구 삭제" }, "hardDeleteSecrets": { - "message": "Permanently delete secrets" + "message": "비밀 데이터 영구 삭제" }, "secretProjectAssociationDescription": { "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", @@ -6105,7 +6108,7 @@ "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret", + "message": "비밀 데이터", "description": "Label for a secret (key/value pair)" }, "serviceAccount": { @@ -6677,13 +6680,13 @@ "message": "Resend code" }, "memberColumnHeader": { - "message": "Member" + "message": "구성원" }, "groupSlashMemberColumnHeader": { - "message": "Group/Member" + "message": "그룹/구성원" }, "selectGroupsAndMembers": { - "message": "Select groups and members" + "message": "그룹 및 구성원 선택" }, "selectGroups": { "message": "Select groups" @@ -6698,7 +6701,7 @@ "message": "Deleted" }, "memberStatusFilter": { - "message": "Member status filter" + "message": "구성원 상태 필터" }, "inviteMember": { "message": "구성원 초대" @@ -6884,7 +6887,7 @@ "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login setup. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, "secretsManager": { - "message": "Secrets Manager" + "message": "비밀 데이터 관리자" }, "secretsManagerAccessDescription": { "message": "Activate user access to Secrets Manager." @@ -7081,7 +7084,7 @@ "message": "Device approval required. Select an approval option below:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "이 기기 기억하기" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" @@ -7168,7 +7171,7 @@ "description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager." }, "activateSecretsManager": { - "message": "Activate Secrets Manager" + "message": "비밀 데이터 관리자 활성화" }, "yourOrganizationsFingerprint": { "message": "Your organization's fingerprint phrase", @@ -7402,10 +7405,10 @@ "message": "Updated collection management setting" }, "passwordManagerPlanPrice": { - "message": "Password Manager plan price" + "message": "비밀번호 관리자 요금제 가격" }, "secretsManagerPlanPrice": { - "message": "Secrets Manager plan price" + "message": "비밀 데이터 관리자 요금제 가격" }, "passwordManager": { "message": "Password Manager" @@ -7453,7 +7456,7 @@ "message": "At least one member or group must have can manage permission." }, "typePasskey": { - "message": "Passkey" + "message": "패스키" }, "passkeyNotCopied": { "message": "Passkey will not be copied" @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7542,7 +7548,7 @@ "message": "Confirmation details" }, "smFreeTrialThankYou": { - "message": "Thank you for signing up for Bitwarden Secrets Manager!" + "message": "Bitwarden 비밀 데이터 관리자에 가입해 주셔서 고맙습니다!" }, "smFreeTrialConfirmationEmail": { "message": "We've sent a confirmation email to your email at " @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 8c2df3012a..d4cb0de727 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Pievienot esošo apvienību" }, + "addNewOrganization": { + "message": "Pievienot jaunu apvienību" + }, "myProvider": { "message": "Mans nodrošinātājs" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Piekļuve krājumam ir ierobežota" }, + "readOnlyCollectionAccess": { + "message": "Nav piekļuves pārvaldīt šo krājumu." + }, "grantCollectionAccess": { "message": "Piešķirt kopām vai dalībniekiem piekļuvi šim krājumam." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Nodrošinātāju portāls" }, + "viewCollection": { + "message": "Skatīt krājumu" + }, "restrictedGroupAccess": { "message": "Tu nevari sevi pievienot kopām." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Vienumi" + }, + "assignedSeats": { + "message": "Piešķirtās vietas" + }, + "assigned": { + "message": "Piešķirts" + }, + "used": { + "message": "Izmantots" + }, + "remaining": { + "message": "Atlicis" + }, + "unlinkOrganization": { + "message": "Atsaistīt apvienību" + }, + "manageSeats": { + "message": "PĀRVALDĪT VIETAS" + }, + "manageSeatsDescription": { + "message": "Vietu izmaiņas tiks atspoguļotas nākamajā norēķinu posmā." + }, + "unassignedSeatsDescription": { + "message": "Noņemtas piešķirtās abonementa vietas" + }, + "purchaseSeatDescription": { + "message": "Iegādātas papildu vietas" + }, + "assignedSeatCannotUpdate": { + "message": "Piešķirtās vietas nevar atjaunināt. Lūgums vērsties pēc palīdzības pie sava apvienības īpašnieka." + }, + "subscriptionUpdateFailed": { + "message": "Abonementa atjaunināšana neizdevās" + }, + "trial": { + "message": "Izmēģinājums", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Nokavēts", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abonements ir beidzies", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Tev ir $DAYS$ dienu papildu laiks no abonementa beigu datuma, lai paturētu savu abonementu. Lūgums apmaksāt nokavētos rēķinus līdz $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Tev ir $DAYS$ dienu papildu laiks no pirmā neapmaksātā rēķina datuma, lai paturētu savu abonementu. Lūgums apmaksāt nokavētos rēķinus līdz $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Neapmaksāts rēķins", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Lai atjaunotu savu abonementu, lūgums apmaksāt nokavētos rēķinus.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Atcelšanas datums", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Jāņem vērā: nepiešķirti apvienības vienumi vairs nav redzami skatā \"Visas glabātavas\" dažādās ierīcēs un ir sasniedzami tikai no pārvaldības konsoles, kur šie vienumi jāpiešķir krājumam, lai padarītu tos redzamus." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 81b6529793..d3b3bfd7f9 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 8840ef7c85..84c20f03c9 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Legg til eksisterende organisasjon" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Min leverandør" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index a42b9d71af..cbb84c245e 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index ecdde73f68..c0da91ee9a 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Bestaande organisatie toevoegen" }, + "addNewOrganization": { + "message": "Nieuwe organisatie toevoegen" + }, "myProvider": { "message": "Mijn provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collectietoegang is beperkt" }, + "readOnlyCollectionAccess": { + "message": "Je hebt geen toegang om deze collectie te beheren." + }, "grantCollectionAccess": { "message": "Groepen of mensen toegang tot deze collectie geven." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Providerportaal" }, + "viewCollection": { + "message": "Collectie weergeven" + }, "restrictedGroupAccess": { "message": "Het is niet mogelijk om jezelf toe te voegen aan groepen." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Toegewezen plaatsen" + }, + "assigned": { + "message": "Toegewezen" + }, + "used": { + "message": "Gebruikt" + }, + "remaining": { + "message": "Resterend" + }, + "unlinkOrganization": { + "message": "Organisatie ontkoppelen" + }, + "manageSeats": { + "message": "PLAATSEN BEHEREN" + }, + "manageSeatsDescription": { + "message": "Aanpassingen op plaatsen zijn effectief in de volgende factureringscyclus." + }, + "unassignedSeatsDescription": { + "message": "Niet-toegewezen stoelen" + }, + "purchaseSeatDescription": { + "message": "Aanvullende gekochte plaatsen" + }, + "assignedSeatCannotUpdate": { + "message": "Je kunt toegewezen plaatsen niet bijwerken. Neem contact op met de eigenaar van je organisatie voor ondersteuning." + }, + "subscriptionUpdateFailed": { + "message": "Abonnement bijwerken mislukt" + }, + "trial": { + "message": "Proefperiode", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Verlopen", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Abonnement verlopen", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Je hebt een gratieperiode van $DAYS$ dagen vanaf de vervaldatum van je abonnement om je abonnement te behouden. Graag de openstaande facturen voor $SUSPENSION_DATE$ voldoen.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Je hebt een gratieperiode van $DAYS$ dagen vanaf de datum waarop je eerste niet-betaalde factuur verloopt om je abonnement te behouden. Graag de openstaande facturen voor $SUSPENSION_DATE$ voldoen.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Openstaande factuur", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Voldoe de openstaande facturen om je abonnement te activeren.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Annuleringsdatum", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Je kunt geen machine-accounts aanmaken in opgeschorte organisaties. Neem contact op met de eigenaar van je organisatie voor hulp." + }, + "machineAccount": { + "message": "Machine-account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine-accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Nieuw machine-account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Nieuw machine-account aanmaken om te beginnen met het automatiseren van secrets.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nog niets te tonen", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Machine-accounts verwijderen", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Machine-account verwijderen", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Machine-account weergeven", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Het verwijderen van machine-account $MACHINE_ACCOUNT$ is definitief en onomkeerbaar.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Het verwijderen van machine-accounts is definitief en onomkeerbaar." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "$COUNT$ machine-accounts verwijderen", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine-account verwijderd" + }, + "deleteMachineAccountsToast": { + "message": "Machine-accounts verwijderd" + }, + "searchMachineAccounts": { + "message": "Machine-accounts zoeken", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Machine-account bewerken", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine-accountnaam", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine-account aangemaakt", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine-account verwijderd", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Machine-accounts toegang tot dit project geven." + }, + "projectMachineAccountsSelectHint": { + "message": "Typ of selecteer machine-accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Machine-accounts toevoegen om toegang te verlenen" + }, + "machineAccountPeopleDescription": { + "message": "Groepen of mensen toegang tot dit machine-account geven." + }, + "machineAccountProjectsDescription": { + "message": "Projecten aan dit machine-account toewijzen. " + }, + "createMachineAccount": { + "message": "Machine-account aanmaken" + }, + "maPeopleWarningMessage": { + "message": "Het verwijderen van mensen uit een machine-account verwijdert de door hen aangemaakte toegangstokens niet. Voor de veiligheid kun je het beste de toegangstokens die zijn gemaakt door mensen die zijn verwijderd uit een machine-account intrekken." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Toegang tot dit machine-account verwijderen" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Deze actie verwijdert je toegang tot het machine-account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine-accounts inbegrepen", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per maand voor extra machine-accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Extra machine-accounts" + }, + "includedMachineAccounts": { + "message": "Bij je abonnement horen $COUNT$ machine-accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Je kunt extra machine-accounts toevoegen voor $COST$ per maand.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Machine-accounts beperken (optioneel)" + }, + "limitMachineAccountsDesc": { + "message": "Stel een limiet in voor je machine-accounts. Zodra deze limiet is bereikt, kun je geen nieuwe machine-accounts toevoegen." + }, + "machineAccountLimit": { + "message": "Machine-account limiet (optioneel)" + }, + "maxMachineAccountCost": { + "message": "Maximale potentiële machine-account kosten" + }, + "machineAccountAccessUpdated": { + "message": "Toegang tot machine-account bijgewerkt" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 7ac2fff5ce..c75e8196f0 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 08d6748023..21fc97fe71 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Dodaj obecną organizację" }, + "addNewOrganization": { + "message": "Dodaj nową organizację" + }, "myProvider": { "message": "Mój dostawca" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Dostęp do kolekcji jest ograniczony" }, + "readOnlyCollectionAccess": { + "message": "Nie masz dostępu do zarządzania tą kolekcją." + }, "grantCollectionAccess": { "message": "Przyznaj grupom lub członkom dostęp do tej kolekcji." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portal dostawcy" }, + "viewCollection": { + "message": "Zobacz kolekcję" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Elementy" + }, + "assignedSeats": { + "message": "Przypisane miejsca" + }, + "assigned": { + "message": "Przypisane" + }, + "used": { + "message": "Użyte" + }, + "remaining": { + "message": "Pozostałe" + }, + "unlinkOrganization": { + "message": "Odłącz organizację" + }, + "manageSeats": { + "message": "ZARZĄDZAJ MIEJSCAMI" + }, + "manageSeatsDescription": { + "message": "Dostosowania miejsc zostaną odzwierciedlone w kolejnym cyklu rozliczeniowym." + }, + "unassignedSeatsDescription": { + "message": "Nieprzydzielone miejsca w subskrypcji" + }, + "purchaseSeatDescription": { + "message": "Zakupiono dodatkowe miejsca" + }, + "assignedSeatCannotUpdate": { + "message": "Przypisane miejsca nie mogą zostać zaktualizowane. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." + }, + "subscriptionUpdateFailed": { + "message": "Aktualizacja subskrypcji nie powiodła się" + }, + "trial": { + "message": "Wersja próbna", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Termin przekroczony", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subskrypcja wygasła", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Masz okres karencji $DAYS$ dni od daty wygaśnięcia subskrypcji, aby utrzymać subskrypcję. Opłać zaległe faktury przed $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Masz okres karencji $DAYS$ dni od dnia, w którym Twoja pierwsza niezapłacona faktura dotycząca subskrypcji się przeterminowała. Opłać zaległe faktury przed $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Nieopłacona faktura", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Aby reaktywować subskrypcję, opłać zaległe faktury.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Data anulowania", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Uwaga: Nieprzypisane elementy w organizacji nie są już widoczne w widoku Wszystkie sejfy na urządzeniach i są teraz dostępne tylko przez Konsolę Administracyjną. Przypisz te elementy do kolekcji z konsoli administracyjnej, aby były one widoczne." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 5ff05ed37e..e0dff9d098 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Adicionar Organização Existente" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Meu Provedor" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "O acesso à coleção está restrito" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "Você não pode se adicionar aos grupos." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 0c8c809ffc..4bd18c27e5 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -2051,7 +2051,7 @@ "message": "Prioridade no apoio ao cliente." }, "premiumSignUpFuture": { - "message": "Todas as futuras funcionalidades Premium. Mais em breve!" + "message": "Todas as futuras funcionalidades Premium. E muitas mais em breve!" }, "premiumPrice": { "message": "Tudo por apenas $PRICE$ /ano!", @@ -2532,7 +2532,7 @@ } }, "trialThankYou": { - "message": "Obrigado por se inscrever no Bitwarden para $PLAN$!", + "message": "Obrigado por se registar no Bitwarden para $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -2541,7 +2541,7 @@ } }, "trialSecretsManagerThankYou": { - "message": "Obrigado por se inscrever no Gestor de Segredos Bitwarden para o plano $PLAN$!", + "message": "Obrigado por se registar no Gestor de Segredos Bitwarden para o plano $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -3534,7 +3534,7 @@ "message": "Opções adicionais" }, "additionalOptionsDesc": { - "message": "Para obter ajuda adicional na gestão da sua subscrição, contacte o serviço de apoio ao cliente." + "message": "Para obter ajuda adicional na gestão da sua subscrição, por favor, contacte o apoio ao cliente." }, "subscriptionUserSeatsUnlimitedAutoscale": { "message": "Os ajustes à sua subscrição resultarão em alterações proporcionais aos seus totais de faturação. Se os novos utilizadores convidados excederem o número de licenças da sua subscrição, receberá imediatamente uma cobrança proporcional pelos utilizadores adicionais." @@ -3717,16 +3717,16 @@ "message": "Organização suspensa" }, "secretsAccessSuspended": { - "message": "Não é possível aceder a organizações suspensas. Contacte o proprietário da organização para obter assistência." + "message": "Não é possível aceder a organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, "secretsCannotCreate": { - "message": "Os segredos não podem ser criados em organizações suspensas. Contacte o proprietário da organização para obter assistência." + "message": "Os segredos não podem ser criados em organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, "projectsCannotCreate": { - "message": "Os projetos não podem ser criados em organizações suspensas. Contacte o proprietário da organização para obter assistência." + "message": "Os projetos não podem ser criados em organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, "serviceAccountsCannotCreate": { - "message": "As contas de serviço não podem ser criadas em organizações suspensas. Contacte o proprietário da organização para obter assistência." + "message": "As contas de serviço não podem ser criadas em organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." }, "disabledOrganizationFilterError": { "message": "Não é possível aceder aos itens de organizações suspensas. Contacte o proprietário da organização para obter assistência." @@ -4102,7 +4102,7 @@ "message": "Impedir os membros de aderirem a outras organizações." }, "singleOrgBlockCreateMessage": { - "message": "A sua organização atual tem uma política que não lhe permite aderir a mais do que uma organização. Contacte os administradores da sua organização ou inscreva-se a partir de uma conta Bitwarden diferente." + "message": "A sua organização atual tem uma política que não lhe permite aderir a mais do que uma organização. Por favor, contacte os administradores da sua organização ou registe-se a partir de uma conta Bitwarden diferente." }, "singleOrgPolicyWarning": { "message": "Os membros da organização que não sejam proprietários ou administradores e que já sejam membros de outra organização serão removidos da sua organização." @@ -4638,7 +4638,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.'" }, "sendAccessTaglineSignUp": { - "message": "inscreva-se", + "message": "registe-se", "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": { @@ -4896,7 +4896,7 @@ "message": "Foi convidado a configurar um novo fornecedor. Para continuar, é necessário iniciar sessão ou criar uma nova conta Bitwarden." }, "setupProviderDesc": { - "message": "Introduza os dados abaixo para concluir a configuração do fornecedor. Contacte o apoio ao cliente se tiver alguma dúvida." + "message": "Por favor, introduza os dados abaixo para concluir a configuração do fornecedor. Contacte o apoio ao cliente se tiver alguma dúvida." }, "providerName": { "message": "Nome do fornecedor" @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Adicionar organização existente" }, + "addNewOrganization": { + "message": "Adicionar nova organização" + }, "myProvider": { "message": "O meu fornecedor" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "O acesso à coleção é restrito" }, + "readOnlyCollectionAccess": { + "message": "Não tem acesso para gerir esta coleção." + }, "grantCollectionAccess": { "message": "Conceder a grupos ou membros acesso a esta coleção." }, @@ -7542,7 +7548,7 @@ "message": "Detalhes da confirmação" }, "smFreeTrialThankYou": { - "message": "Obrigado por se inscrever no Gestor de Segredos Bitwarden!" + "message": "Obrigado por se registar no Gestor de Segredos Bitwarden!" }, "smFreeTrialConfirmationEmail": { "message": "Enviámos um e-mail de confirmação para o seu e-mail:" @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portal do fornecedor" }, + "viewCollection": { + "message": "Ver coleção" + }, "restrictedGroupAccess": { "message": "Não se pode adicionar a si próprio a grupos." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Itens" + }, + "assignedSeats": { + "message": "Lugares atribuídos" + }, + "assigned": { + "message": "Atribuídos" + }, + "used": { + "message": "Utilizados" + }, + "remaining": { + "message": "Restantes" + }, + "unlinkOrganization": { + "message": "Desvincular a organização" + }, + "manageSeats": { + "message": "GERIR LUGARES" + }, + "manageSeatsDescription": { + "message": "Os ajustes nos lugares serão refletidos no ciclo de faturação seguinte." + }, + "unassignedSeatsDescription": { + "message": "Lugares de subscrição não atribuídos" + }, + "purchaseSeatDescription": { + "message": "Lugares adicionais adquiridos" + }, + "assignedSeatCannotUpdate": { + "message": "Os lugares atribuídos não podem ser atualizados. Por favor, contacte o proprietário da organização para obter assistência." + }, + "subscriptionUpdateFailed": { + "message": "Falha na atualização da subscrição" + }, + "trial": { + "message": "Período experimental", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Vencida", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscrição expirada", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Dispõe de um período de carência de $DAYS$ dias a partir da data de expiração da sua subscrição para manter a sua subscrição. Por favor, resolva as faturas vencidas até $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Dispõe de um período de carência de $DAYS$ dias a partir da data de vencimento da sua primeira fatura não paga para manter a sua subscrição. Por favor, resolva as faturas vencidas até $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Fatura não paga", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Para reativar a sua subscrição, por favor, resolva as faturas vencidas.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Data de cancelamento", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "As contas automáticas não podem ser criadas em organizações suspensas. Por favor, contacte o proprietário da organização para obter assistência." + }, + "machineAccount": { + "message": "Conta automática", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Contas automáticas", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Nova conta automática", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Crie uma nova conta automática para começar a automatizar o acesso a segredos.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Ainda não há nada para mostrar", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Eliminar contas automáticas", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Eliminar conta automática", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Ver conta automática", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "A eliminação da conta automática $MACHINE_ACCOUNT$ é permanente e irreversível.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "A eliminação de contas automáticas é permanente e irreversível." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Eliminar $COUNT$ contas automáticas", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Conta automática eliminada" + }, + "deleteMachineAccountsToast": { + "message": "Contas automáticas eliminadas" + }, + "searchMachineAccounts": { + "message": "Procurar contas automáticas", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Editar conta automática", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Nome da conta automática", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Conta automática criada", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Conta automática atualizada", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Conceder acesso a este projeto às contas automáticas." + }, + "projectMachineAccountsSelectHint": { + "message": "Escreva ou selecione contas automáticas" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Adicionar contas automáticas para conceder acesso" + }, + "machineAccountPeopleDescription": { + "message": "Conceder a grupos ou pessoas acesso a esta conta automática." + }, + "machineAccountProjectsDescription": { + "message": "Atribuir projetos a esta conta automática. " + }, + "createMachineAccount": { + "message": "Criar uma conta automática" + }, + "maPeopleWarningMessage": { + "message": "Remover pessoas de uma conta automática não remove os tokens de acesso que criaram. Como prática recomendada de segurança, recomenda-se a revogação dos tokens de acesso criados por pessoas removidas de uma conta automática." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remover o acesso a esta conta automática" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Esta ação retirará o seu acesso à conta automática." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ contas automáticas incluídas", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ por mês para contas automáticas adicionais", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Contas automáticas adicionais" + }, + "includedMachineAccounts": { + "message": "O seu plano inclui $COUNT$ contas automáticas.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Pode adicionar contas automáticas adicionais por $COST$ por mês.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limitar contas automáticas (opcional)" + }, + "limitMachineAccountsDesc": { + "message": "Defina um limite para as suas contas automáticas. Quando este limite for atingido, não será possível criar novas contas automáticas." + }, + "machineAccountLimit": { + "message": "Limite de contas automáticas (opcional)" + }, + "maxMachineAccountCost": { + "message": "Custo potencial máximo da conta automática" + }, + "machineAccountAccessUpdated": { + "message": "Acesso à conta automática atualizado" + }, + "unassignedItemsBanner": { + "message": "Aviso: Os itens da organização não atribuídos já não são visíveis na sua vista Todos os cofres em todos os dispositivos e agora só estão acessíveis através da Consola de administração. Atribua estes itens a uma coleção a partir da Consola de administração para os tornar visíveis." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 244395daaa..f0624013b0 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Adăugare organizație existentă" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Furnizorul meu" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index b68b045bbb..c09830eb0c 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -615,7 +615,7 @@ "message": "Войти с мастер-паролем" }, "readingPasskeyLoading": { - "message": "Чтение ключа доступа..." + "message": "Чтение passkey..." }, "readingPasskeyLoadingInfo": { "message": "Не закрывайте это окно и следуйте запросам браузера." @@ -624,40 +624,40 @@ "message": "Использовать другой способ авторизации" }, "loginWithPasskey": { - "message": "Войти с ключом доступа" + "message": "Войти с passkey" }, "invalidPasskeyPleaseTryAgain": { - "message": "Неверный ключ доступа. Попробуйте снова." + "message": "Неверный passkey. Попробуйте снова." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "2FA для ключей доступа не поддерживается. Для авторизации обновите приложение." + "message": "2FA для passkey не поддерживается. Для авторизации обновите приложение." }, "loginWithPasskeyInfo": { - "message": "Используйте сгенерированный ключ доступа для автоматической авторизации без пароля. Ваша личность будет подтверждена биометрическими данными (распознаванием лица, отпечатком пальца или другим методом безопасности FIDO2)." + "message": "Используйте сгенерированный passkey для автоматической авторизации без пароля. Ваша личность будет подтверждена биометрическими данными (распознаванием лица, отпечатком пальца или другим методом безопасности FIDO2)." }, "newPasskey": { - "message": "Новый ключ доступа" + "message": "Новый passkey" }, "learnMoreAboutPasswordless": { "message": "Подробнее о беспарольном режиме" }, "creatingPasskeyLoading": { - "message": "Создание ключа доступа..." + "message": "Создание passkey..." }, "creatingPasskeyLoadingInfo": { "message": "Не закрывайте это окно и следуйте запросам браузера." }, "errorCreatingPasskey": { - "message": "Ошибка создания ключа доступа" + "message": "Ошибка создания passkey" }, "errorCreatingPasskeyInfo": { - "message": "При создании ключа доступа возникла проблема." + "message": "При создании passkey возникла проблема." }, "passkeySuccessfullyCreated": { - "message": "Ключ доступа успешно создан!" + "message": "Passkey успешно создан!" }, "customPasskeyNameInfo": { - "message": "Назовите ключ доступа так, чтобы вы могли его идентифицировать." + "message": "Назовите passkey так, чтобы вы могли его идентифицировать." }, "useForVaultEncryption": { "message": "Использовать для шифрования хранилища" @@ -666,7 +666,7 @@ "message": "Авторизация и разблокировка на поддерживаемых устройствах без мастер-пароля. Для завершения настройки следуйте подсказкам браузера." }, "useForVaultEncryptionErrorReadingPasskey": { - "message": "Ошибка чтения ключа доступа. Попробуйте еще раз или снимите флажок с этой опции." + "message": "Ошибка чтения passkey. Попробуйте еще раз или снимите флажок с этой опции." }, "encryptionNotSupported": { "message": "Шифрование не поддерживается" @@ -678,7 +678,7 @@ "message": "Используется для шифрования" }, "loginWithPasskeyEnabled": { - "message": "Авторизоваться с помощью ключа доступа" + "message": "Авторизоваться с помощью passkey" }, "passkeySaved": { "message": "$NAME$ сохранен", @@ -690,16 +690,16 @@ } }, "passkeyRemoved": { - "message": "Ключ доступа удален" + "message": "Passkey удален" }, "removePasskey": { - "message": "Удалить ключ доступа" + "message": "Удалить passkey" }, "removePasskeyInfo": { - "message": "Если будут удалены все ключи доступа, вы не сможете авторизоваться на новых устройствах без мастер-пароля." + "message": "Если будут удалены все passkey, вы не сможете авторизоваться на новых устройствах без мастер-пароля." }, "passkeyLimitReachedInfo": { - "message": "Достигнут предел ключей доступа. Удалите какой-нибудь ключ, чтобы добавить другой." + "message": "Достигнут лимит passkey. Удалите какой-нибудь passkey, чтобы добавить другой." }, "tryAgain": { "message": "Попробуйте снова" @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Добавить существующую организацию" }, + "addNewOrganization": { + "message": "Добавить новую организацию" + }, "myProvider": { "message": "Мой поставщик" }, @@ -7453,13 +7456,13 @@ "message": "Как минимум один участник или группа должны иметь разрешение 'Может управлять'." }, "typePasskey": { - "message": "Ключ доступа" + "message": "Passkey" }, "passkeyNotCopied": { - "message": "Ключ доступа не будет скопирован" + "message": "Passkey не будет скопирован" }, "passkeyNotCopiedAlert": { - "message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" + "message": "Passkey не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" }, "modifiedCollectionManagement": { "message": "Изменена настройка управления коллекцией $ID$.", @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Доступ к коллекции ограничен" }, + "readOnlyCollectionAccess": { + "message": "У вас нет доступа к управлению этой коллекцией." + }, "grantCollectionAccess": { "message": "Предоставить группам или участникам доступ к этой коллекции." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Портал провайдера" }, + "viewCollection": { + "message": "Посмотреть коллекцию" + }, "restrictedGroupAccess": { "message": "Нельзя добавить самого себя в группы." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Элементы" + }, + "assignedSeats": { + "message": "Назначенные места" + }, + "assigned": { + "message": "Назначено" + }, + "used": { + "message": "Использовано" + }, + "remaining": { + "message": "Осталось" + }, + "unlinkOrganization": { + "message": "Отвязать организацию" + }, + "manageSeats": { + "message": "УПРАВЛЕНИЕ МЕСТАМИ" + }, + "manageSeatsDescription": { + "message": "Корректировка мест будет отражена в следующем расчетном цикле." + }, + "unassignedSeatsDescription": { + "message": "Нераспределенные места в соответствии с подпиской" + }, + "purchaseSeatDescription": { + "message": "Приобретено дополнительных мест" + }, + "assignedSeatCannotUpdate": { + "message": "Назначенные места не могут быть обновлены. Обратитесь за помощью к владельцу организации." + }, + "subscriptionUpdateFailed": { + "message": "Не удалось обновить подписку" + }, + "trial": { + "message": "Пробная версия", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Просрочено", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Срок действия подписки истек", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "У вас есть льготный период в $DAYS$ дней с даты истечения срока действия подписки, чтобы сохранить подписку. Пожалуйста, решите вопрос с просроченными платежами до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "У вас есть льготный период в $DAYS$ дней с момента оплаты первого неоплаченного счета, чтобы сохранить подписку. Пожалуйста, решите вопрос с просроченными платежами до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Неоплаченный счет", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Чтобы возобновить подписку, пожалуйста, решите вопрос с просроченными платежами.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Дата аннуляции", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Аккаунты компьютеров не могут быть созданы в отключенных организациях. Обратитесь за помощью к владельцу организации." + }, + "machineAccount": { + "message": "Аккаунт компьютера", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Аккаунты компьютеров", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Новый аккаунт компьютера", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Чтобы приступить к автоматизации секретного доступа, создайте новый аккаунт компьютера.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Пока нечего показать", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Удалить аккаунты компьютеров", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Удалить аккаунт компьютера", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Просмотр аккаунта компьютера", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Удаление аккаунта компьютера $MACHINE_ACCOUNT$ окончательно и необратимо.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Удаление аккаунтов компьютеров окончательно и необратимо." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Аккаунтов компьютеров к удалению: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Аккаунт компьютера удален" + }, + "deleteMachineAccountsToast": { + "message": "Аккаунты компьютеров удалены" + }, + "searchMachineAccounts": { + "message": "Поиск аккаунтов компьютеров", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Изменить аккаунт компьютера", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Название аккаунта компьютера", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Аккаунт компьютера создан", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Аккаунт компьютера обновлен", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Предоставить аккаунтам компьютеров доступ к этому проекту." + }, + "projectMachineAccountsSelectHint": { + "message": "Введите или выберите аккаунты компьютеров" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Добавить аккаунты компьютеров для предоставления доступа" + }, + "machineAccountPeopleDescription": { + "message": "Предоставить группам или людям доступ к этому аккаунту компьютера." + }, + "machineAccountProjectsDescription": { + "message": "Назначить проекты этому аккаунту компьютера. " + }, + "createMachineAccount": { + "message": "Создать аккаунт компьютера" + }, + "maPeopleWarningMessage": { + "message": "Удаление пользователей из аккаунта компьютера не приводит к удалению созданных ими токенов доступа. В целях обеспечения безопасности рекомендуется отзывать токены доступа, созданные пользователями, удаленными из аккаунта компьютера." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Удалить доступ к этому аккаунту компьютера" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Это действие лишит вас доступа к аккаунту компьютера." + }, + "machineAccountsIncluded": { + "message": "Включено аккаунтов компьютеров: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "В месяц за дополнительные аккаунты компьютеров: $COST$", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Дополнительные аккаунты компьютеров" + }, + "includedMachineAccounts": { + "message": "Ваш план включает в себя аккаунтов компьютеров: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Стоимость дополнительных аккаунтов компьютеров за месяц: $COST$", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Лимит аккаунтов компьютеров (опционально)" + }, + "limitMachineAccountsDesc": { + "message": "Установите лимит для аккаунтов компьютеров. По достижении этого лимита создание новых аккаунтов компьютеров будет невозможным." + }, + "machineAccountLimit": { + "message": "Лимит аккаунтов компьютеров (опционально)" + }, + "maxMachineAccountCost": { + "message": "Максимальная потенциальная стоимость аккаунта компьютера" + }, + "machineAccountAccessUpdated": { + "message": "Доступ аккаунта компьютера обновлен" + }, + "unassignedItemsBanner": { + "message": "Обратите внимание: неприсвоенные элементы организации больше не видны в представлении \"Все хранилища\" на всех устройствах и теперь доступны только через консоль администратора. Назначьте эти элементы коллекции в консоли администратора, чтобы сделать их видимыми." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index ce4df3eeda..536c05b2e4 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 74f68fc0cc..87ecffe11f 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Pridať existujúcu organizáciu" }, + "addNewOrganization": { + "message": "Pridať novú organizáciu" + }, "myProvider": { "message": "Môj poskytovateľ" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "Nemáte prístup k spravovaniu tejto zbierky." + }, "grantCollectionAccess": { "message": "Povoľte skupinám, alebo jednotlivcom prístup k tejto zbierke." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Portál poskytovateľa" }, + "viewCollection": { + "message": "Pozrieť zbierku" + }, "restrictedGroupAccess": { "message": "Seba nemôžete pridať do skupín." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Položky" + }, + "assignedSeats": { + "message": "Pridelené sedenia" + }, + "assigned": { + "message": "Pridelené" + }, + "used": { + "message": "Použité" + }, + "remaining": { + "message": "Zostáva" + }, + "unlinkOrganization": { + "message": "Odpojiť organizáciu" + }, + "manageSeats": { + "message": "SPRAVOVAŤ SEDENIA" + }, + "manageSeatsDescription": { + "message": "Zmeny v sedeniach sa prejavia v najbližšom fakturačnom období." + }, + "unassignedSeatsDescription": { + "message": "Nepridelené sedenia predplatného" + }, + "purchaseSeatDescription": { + "message": "Boli zakúpené dodatočné sedenia" + }, + "assignedSeatCannotUpdate": { + "message": "Pridelené sedenia sa nedajú aktualizovať. Pre pomoc prosím kontaktujte vlastníka vašej organizácie." + }, + "subscriptionUpdateFailed": { + "message": "Aktualizácia predplatného zlyhala" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 4982120003..e8d8306b40 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index f5fe041433..b70a61b789 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Додај постојећу организацију" }, + "addNewOrganization": { + "message": "Додај нову организацију" + }, "myProvider": { "message": "Мој провајдер" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Приступ колекцији је ограничен" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Одобрите групама или члановима приступ овој колекцији." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Портал провајдера" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "Не можете да се додате у групе." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Ставке" + }, + "assignedSeats": { + "message": "Додељена места" + }, + "assigned": { + "message": "Додељено" + }, + "used": { + "message": "У употреби" + }, + "remaining": { + "message": "Преостало" + }, + "unlinkOrganization": { + "message": "Прекини везу са организацијом" + }, + "manageSeats": { + "message": "УПРАВЉАЈТЕ МЕСТИМА" + }, + "manageSeatsDescription": { + "message": "Прилагођавања местима ће се одразити на следећи обрачунски циклус." + }, + "unassignedSeatsDescription": { + "message": "Недодијељена претплатничка места" + }, + "purchaseSeatDescription": { + "message": "Додатна места су купљена" + }, + "assignedSeatCannotUpdate": { + "message": "Додељена места се не могу ажурирати. За помоћ контактирајте власника организације." + }, + "subscriptionUpdateFailed": { + "message": "Ажурирање претплате није успело" + }, + "trial": { + "message": "Проба", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Протекли задаци", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Претплата је истекла", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "Имате грејс период од $DAYS$ дана од датума истека ваше претплате да бисте одржали претплату. Решите фактуре са кашњењем до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "Имате грејс период од $DAYS$ дана од датума када ваша прва неплаћена фактура треба да одржи претплату. Решите фактуре са кашњењем до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Неплаћен рачун", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Да бисте поново активирали своју претплату, решите фактуре са кашњењем.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Датум отказивања", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "Налози машине се не могу креирати у суспендованим организацијама. За помоћ контактирајте власника своје организације." + }, + "machineAccount": { + "message": "Налог машине", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Налози машине", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Нов налог машине", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Креирајте нови налог машине да бисте започели аутоматизацију тајног приступа.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Нема ништа за приказати", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Избришите налоге машине", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Избришите налог машине", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Приказ налог машине", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Брисање налога машине $MACHINE_ACCOUNT$ је трајно и неповратно.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Брисање налога машине је трајно и неповратно." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Брисање $COUNT$ налога машине", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Налог машине избрисан" + }, + "deleteMachineAccountsToast": { + "message": "Налози машине избрисани" + }, + "searchMachineAccounts": { + "message": "Тражити налоге машине", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Уредити налог машине", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Име налога машине", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Налог машине креиран", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Налог машине ажуриран", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Одобрите налозима машине приступ овом пројекту." + }, + "projectMachineAccountsSelectHint": { + "message": "Унесите или изаберите налоге машине" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Додајте налоге машине да бисте одобрили приступ" + }, + "machineAccountPeopleDescription": { + "message": "Одобрите групама или људима приступ овом налогу машине." + }, + "machineAccountProjectsDescription": { + "message": "Доделите пројекте овом налогу машине. " + }, + "createMachineAccount": { + "message": "Креирајте налог машине" + }, + "maPeopleWarningMessage": { + "message": "Уклањање људи са налога машине не уклања приступне токене које су креирали. Ради најбоље безбедносне праксе, препоручује се да опозовете приступне токене које су креирали људи уклоњени са налога машине." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Уклоните приступ овом налогу машине" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Ова радња ће вам уклонити приступ налогу машине." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ рачуни машина укључени", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ месечно за додатне рачуне машина", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Додатни налози машине" + }, + "includedMachineAccounts": { + "message": "Ваш план долази са $COUNT$ налога машине.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Можете додати још налога машине за $COST$ месечно.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Ограничити рачуне машина (опционо)" + }, + "limitMachineAccountsDesc": { + "message": "Поставите ограничење за рачуне машине. Када се ово ограничење достигне, нећете моћи да креирате нове налоге на машини." + }, + "machineAccountLimit": { + "message": "Ограничење рачуна машине (опционо)" + }, + "maxMachineAccountCost": { + "message": "Максимални потенцијални трошак рачуна машине" + }, + "machineAccountAccessUpdated": { + "message": "Приступ налога машине ажуриран" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 4553f85c33..5424fc8fb4 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 8765baaa3b..ba6f66aaaa 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Lägg till befintlig organisation" }, + "addNewOrganization": { + "message": "Lägg till ny organisation" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Ge grupper eller medlemmar tillgång till denna samling." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "Visa samling" + }, "restrictedGroupAccess": { "message": "Du kan inte lägga till dig själv i grupper." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Objekt" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Provperiod", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Förfallen", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Obetald faktura", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Maskinkonto", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Maskinkonton", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index ad51cf605f..abda98207b 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 69ee59eb26..bb8288380a 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index fb626b82f5..0856068063 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Mevcut kuruluşu ekle" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "Sağlayıcım" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Koleksiyona erişim kısıtlı" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Gruplara veya üyelere bu koleksiyona erişim izni verin." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Sağlayıcı Portalı" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "Kendinizi gruplara ekleyemezsiniz." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Ögeler" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index e2d2e6163c..5d8b803550 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Додати наявну організацію" }, + "addNewOrganization": { + "message": "Додати нову організацію" + }, "myProvider": { "message": "Мій провайдер" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Доступ до збірки обмежено" }, + "readOnlyCollectionAccess": { + "message": "У вас немає доступу до керування цією збіркою." + }, "grantCollectionAccess": { "message": "Надайте групам або учасникам доступ до цієї збірки." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Портал провайдера" }, + "viewCollection": { + "message": "Переглянути збірку" + }, "restrictedGroupAccess": { "message": "Ви не можете додати себе до груп." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Записи" + }, + "assignedSeats": { + "message": "Призначені місця" + }, + "assigned": { + "message": "Призначено" + }, + "used": { + "message": "Використано" + }, + "remaining": { + "message": "Залишилось" + }, + "unlinkOrganization": { + "message": "Від'єднати організацію" + }, + "manageSeats": { + "message": "КЕРУВАТИ МІСЦЯМИ" + }, + "manageSeatsDescription": { + "message": "Скориговані місця будуть відображені в наступному платіжному циклі." + }, + "unassignedSeatsDescription": { + "message": "Непризначені місця передплати" + }, + "purchaseSeatDescription": { + "message": "Додаткові придбані місця" + }, + "assignedSeatCannotUpdate": { + "message": "Призначені місця не можна оновити. Будь ласка, зверніться до власника вашої організації по допомогу." + }, + "subscriptionUpdateFailed": { + "message": "Не вдалося оновити передплату" + }, + "trial": { + "message": "Пробний період", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Протерміновано", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Термін дії передплати завершився", + "description": "The date header used when a subscription is past due." + }, + "pastDueWarningForChargeAutomatically": { + "message": "У вас є $DAYS$ днів пільгового періоду після завершення передплати для можливості її поновлення. Будь ласка, сплатіть протерміновані рахунки до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they are charged automatically." + }, + "pastDueWarningForSendInvoice": { + "message": "У вас є $DAYS$ днів пільгового періоду від дати протермінування першого несплаченого рахунку. Протягом цього часу вам необхідно поновити передплату. Будь ласка, сплатіть протерміновані рахунки до $SUSPENSION_DATE$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Несплачений рахунок", + "description": "The header of a warning box shown to a user whose subscription is unpaid." + }, + "toReactivateYourSubscription": { + "message": "Будь ласка, сплатіть протерміновані рахунки, щоб знову активувати передплату.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Дата скасування", + "description": "The date header used when a subscription is cancelled." + }, + "machineAccountsCannotCreate": { + "message": "У призупинених організаціях не можна створювати машинні облікові записи. Зверніться до власника вашої організації для отримання допомоги." + }, + "machineAccount": { + "message": "Машинний обліковий запис", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Машинні облікові записи", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "Новий машинний обліковий запис", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Створіть новий машинний обліковий запис, щоб почати автоматизацію доступу до секретів.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Наразі немає даних для показу", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Видалити машинні облікові записи", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Видалити машинний обліковий запис", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "Переглянути машинний обліковий запис", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Видалення машинного облікового запису $MACHINE_ACCOUNT$ – це остаточна й незворотна дія.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Видалення машинних облікових записів – це остаточна й незворотна дія." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Видалити машинні облікові записи: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Машинний обліковий запис видалено" + }, + "deleteMachineAccountsToast": { + "message": "Машинні облікові записи видалено" + }, + "searchMachineAccounts": { + "message": "Пошук машинних облікових записів", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Редагувати машинний обліковий запис", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Назва машинного облікового запису", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Машинний обліковий запис створено", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Машинний обліковий запис оновлено", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Надайте машинним обліковим записам доступ до цього проєкту." + }, + "projectMachineAccountsSelectHint": { + "message": "Введіть або виберіть машинні облікові записи" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Додайте машинні облікові записи для надання доступу" + }, + "machineAccountPeopleDescription": { + "message": "Надайте групам або людям доступ до цього машинного облікового запису." + }, + "machineAccountProjectsDescription": { + "message": "Призначте проєкти цьому машинному обліковому запису. " + }, + "createMachineAccount": { + "message": "Створити машинний обліковий запис" + }, + "maPeopleWarningMessage": { + "message": "Вилучення людей з машинного облікового запису не вилучає створені ними токени доступу. З міркувань безпеки рекомендовано відкликати токени доступу, створені людьми, вилученими з машинного облікового запису." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Вилучити доступ до цього машинного облікового запису" + }, + "smAccessRemovalWarningMaMessage": { + "message": "Ця дія призведе до вилучення вашого доступу до цього машинного облікового запису." + }, + "machineAccountsIncluded": { + "message": "Включає машинні облікові записи: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ на місяць за додаткові машинні облікові записи", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Додаткові машинні облікові записи" + }, + "includedMachineAccounts": { + "message": "Ваш тарифний план включає машинні облікові записи: $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "Ви можете додати більше машинних облікових записів за $COST$/місяць.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Обмеження машинних облікових записів (необов'язково)" + }, + "limitMachineAccountsDesc": { + "message": "Встановіть обмеження кількості машинних облікових записів. Після досягнення ліміту ви не зможете створювати нові машинні облікові записи." + }, + "machineAccountLimit": { + "message": "Обмеження машинних облікових записів (необов'язково)" + }, + "maxMachineAccountCost": { + "message": "Потенційна максимальна вартість машинного облікового запису" + }, + "machineAccountAccessUpdated": { + "message": "Доступ до машинного облікового запису оновлено" + }, + "unassignedItemsBanner": { + "message": "Увага: непризначені елементи організації більше не видимі у поданні \"Усі сховища\" на різних пристроях і тепер доступні лише в консолі адміністратора. Щоб зробити їх видимими, призначте ці елементи збірці в консолі адміністратора." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 316704ffdf..777af538dc 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "Add existing organization" }, + "addNewOrganization": { + "message": "Add new organization" + }, "myProvider": { "message": "My Provider" }, @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "Assigned" + }, + "used": { + "message": "Used" + }, + "remaining": { + "message": "Remaining" + }, + "unlinkOrganization": { + "message": "Unlink organization" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index e7668f85d5..c197b40f3f 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -579,7 +579,7 @@ "message": "访问权限" }, "accessLevel": { - "message": "访问级别" + "message": "访问权限等级" }, "loggedOut": { "message": "已注销" @@ -630,7 +630,7 @@ "message": "通行密钥无效。请重试。" }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "不支持通行密钥 2FA。请更新 App 以登录。" + "message": "不支持通行密钥 2FA。请更新 App 再登录。" }, "loginWithPasskeyInfo": { "message": "使用已生成的通行密钥,无需密码即可自动登录。生物识别(例如面部识别或指纹)或其他 FIDO2 安全方法将用于验证您的身份。" @@ -675,7 +675,7 @@ "message": "设置加密" }, "usedForEncryption": { - "message": "用于加密" + "message": "已用于加密" }, "loginWithPasskeyEnabled": { "message": "已启用通行密钥登录" @@ -989,7 +989,7 @@ "message": "选择一个您想将这些项目移至的组织。移动到组织会将这些项目的所有权转让给该组织。移动后,您将不再是这些项目的直接所有者。" }, "collectionsDesc": { - "message": "编辑与此项目共享的集合。只有具有这些集合访问权限的组织用户才能看到此项目。" + "message": "编辑与其共享此项目的集合。只有具有这些集合访问权限的组织用户才能看到此项目。" }, "deleteSelectedItemsDesc": { "message": "$COUNT$ 个项目将被发送到回收站。", @@ -1498,7 +1498,7 @@ "message": "排除" }, "include": { - "message": "包括" + "message": "包含" }, "customize": { "message": "自定义" @@ -2661,7 +2661,7 @@ "message": "外部 ID 是一个 Bitwarden 目录连接器和 API 使用的未经加密的参考。" }, "nestCollectionUnder": { - "message": "嵌套集合在" + "message": "嵌套于集合下" }, "accessControl": { "message": "访问控制" @@ -4646,7 +4646,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.**'" }, "sendAccessCreatorIdentifier": { - "message": "Bitwarden 成员 $USER_IDENTIFIER$ 与您分享了以下内容", + "message": "Bitwarden 成员 $USER_IDENTIFIER$ 与您共享了以下内容", "placeholders": { "user_identifier": { "content": "$1", @@ -4956,6 +4956,9 @@ "addExistingOrganization": { "message": "添加现有组织" }, + "addNewOrganization": { + "message": "添加新组织" + }, "myProvider": { "message": "我的提供商" }, @@ -5582,7 +5585,7 @@ "message": "必填" }, "charactersCurrentAndMaximum": { - "message": "$CURRENT$ / 最多字符数 $MAX$", + "message": "$CURRENT$ / 最多 $MAX$ 个字符", "placeholders": { "current": { "content": "$1", @@ -7393,7 +7396,7 @@ "message": "管理组织的集合行为" }, "limitCollectionCreationDeletionDesc": { - "message": "对所有者和管理员限制集合的创建和删除" + "message": "限制为仅所有者和管理员可以创建和删除集合" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "所有者和管理员可以管理所有集合和项目" @@ -7478,7 +7481,7 @@ "message": "安装浏览器扩展" }, "installBrowserExtensionDetails": { - "message": "使用扩展快速保存登录信息和自动填充表单,而无需打开网页 App。" + "message": "使用扩展快速保存登录信息以及自动填充表单,而无需打开网页 App。" }, "projectAccessUpdated": { "message": "工程访问权限已更新" @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "集合访问权限受限" }, + "readOnlyCollectionAccess": { + "message": "您没有管理此集合的权限。" + }, "grantCollectionAccess": { "message": "授予群组或成员对此集合的访问权限。" }, @@ -7592,7 +7598,7 @@ "message": "欢迎使用全新改进的网页 App。了解更多有关变更的信息。" }, "releaseBlog": { - "message": "阅读发布博客" + "message": "阅读发行博客" }, "adminConsole": { "message": "管理控制台" @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "提供商门户" }, + "viewCollection": { + "message": "查看集合" + }, "restrictedGroupAccess": { "message": "您不能将自己添加到群组。" }, @@ -7616,7 +7625,7 @@ "message": "分配到这些集合" }, "bulkCollectionAssignmentDialogDescription": { - "message": "选择要共享项目的集合。当一个项目在某个集合中更新后,它将反映在所有集合中。只有能够访问这些集合的组织成员才能看到此项目。" + "message": "选择与其共享项目的集合。当一个项目在某个集合中更新后,它将反映到所有集合中。只有具有这些集合访问权限的组织成员才能看到这些项目。" }, "selectCollectionsToAssign": { "message": "选择要分配的集合" @@ -7642,5 +7651,256 @@ }, "items": { "message": "项目" + }, + "assignedSeats": { + "message": "分配的座席" + }, + "assigned": { + "message": "已分配" + }, + "used": { + "message": "已用" + }, + "remaining": { + "message": "余额:" + }, + "unlinkOrganization": { + "message": "脱离组织" + }, + "manageSeats": { + "message": "管理坐席" + }, + "manageSeatsDescription": { + "message": "席位的调整将反映在下一个计费周期中。" + }, + "unassignedSeatsDescription": { + "message": "未分配的订阅座席" + }, + "purchaseSeatDescription": { + "message": "已购买额外座席" + }, + "assignedSeatCannotUpdate": { + "message": "无法更新已分配的坐席。请联系您的组织所有者群求协助。" + }, + "subscriptionUpdateFailed": { + "message": "订阅更新失败" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "取消日期", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "注意:未分配的组织项目在您所有设备的「所有密码库」视图中不再可见,现在只能通过管理控制台访问。通过管理控制台将这些项目分配给集合以使其可见。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 0fa0838f2d..6f512741f2 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -615,7 +615,7 @@ "message": "使用主密碼登入" }, "readingPasskeyLoading": { - "message": "正在讀取密碼金輪..." + "message": "正在讀取金輪..." }, "readingPasskeyLoadingInfo": { "message": "請保持視窗開啟,並按照瀏覽器指示操作。" @@ -627,7 +627,7 @@ "message": "使用密碼金鑰登入" }, "invalidPasskeyPleaseTryAgain": { - "message": "無效的密碼金鑰,請再試一次。" + "message": "無效的金鑰。請再試一次。" }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { "message": "不支援的密碼金鑰的 2FA 兩階段認證。更新 app 以登入" @@ -1355,7 +1355,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.)" }, "onboardingImportDataDetailsLink": { - "message": "new item", + "message": "新項目", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { @@ -2835,7 +2835,7 @@ "message": "不正確的代碼" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "PIN 碼不正確" }, "exportedVault": { "message": "已匯出密碼庫" @@ -4044,7 +4044,7 @@ "message": "您現在可以關閉此分頁,並且回到擴充套件繼續。" }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "你已成功登入" }, "thisWindowWillCloseIn5Seconds": { "message": "This window will automatically close in 5 seconds" @@ -4951,11 +4951,14 @@ "message": "建立一個新的客戶組織,該組織將作為提供者與您建立關聯。您將能夠存取和管理此組織。" }, "newClient": { - "message": "New client" + "message": "新用戶端" }, "addExistingOrganization": { "message": "新增現有組織" }, + "addNewOrganization": { + "message": "新增組織" + }, "myProvider": { "message": "我的提供者" }, @@ -5943,7 +5946,7 @@ "message": "Duo two-step login is required for your account." }, "launchDuo": { - "message": "Launch Duo" + "message": "啟動 Duo" }, "turnOn": { "message": "開啟" @@ -6647,40 +6650,40 @@ "message": "Verification required for this action. Set a PIN to continue." }, "setPin": { - "message": "Set PIN" + "message": "設定 PIN 碼" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "使用生物辨識進行驗證" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "正在等待確認" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "無法完成生物辨識。" }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "需要不同的方法嗎?" }, "useMasterPassword": { - "message": "Use master password" + "message": "使用主密碼" }, "usePin": { - "message": "Use PIN" + "message": "使用 PIN 碼" }, "useBiometrics": { - "message": "Use biometrics" + "message": "使用生物辨識" }, "enterVerificationCodeSentToEmail": { "message": "Enter the verification code that was sent to your email." }, "resendCode": { - "message": "Resend code" + "message": "重新傳送驗證碼" }, "memberColumnHeader": { - "message": "Member" + "message": "成員" }, "groupSlashMemberColumnHeader": { - "message": "Group/Member" + "message": "群組/成員" }, "selectGroupsAndMembers": { "message": "選擇群組和成員" @@ -6934,7 +6937,7 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Create an account" + "message": "建立帳號" }, "createSecret": { "message": "建立機密" @@ -7147,7 +7150,7 @@ } }, "verificationRequired": { - "message": "Verification required", + "message": "需要驗證", "description": "Default title for the user verification dialog." }, "recoverAccount": { @@ -7475,7 +7478,7 @@ "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { - "message": "Install browser extension" + "message": "安裝瀏覽器擴充套件" }, "installBrowserExtensionDetails": { "message": "Use the extension to quickly save logins and auto-fill forms without opening the web app." @@ -7498,6 +7501,9 @@ "collectionAccessRestricted": { "message": "Collection access is restricted" }, + "readOnlyCollectionAccess": { + "message": "You do not have access to manage this collection." + }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." }, @@ -7511,7 +7517,7 @@ "message": "Service account access updated" }, "commonImportFormats": { - "message": "Common formats", + "message": "常見格式", "description": "Label indicating the most common import formats" }, "maintainYourSubscription": { @@ -7525,7 +7531,7 @@ } }, "addAPaymentMethod": { - "message": "add a payment method", + "message": "新增付款方式", "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.'" }, "collectionEnhancementsDesc": { @@ -7536,7 +7542,7 @@ "message": "Learn more about collection management" }, "organizationInformation": { - "message": "Organization information" + "message": "組織資訊" }, "confirmationDetails": { "message": "Confirmation details" @@ -7548,7 +7554,7 @@ "message": "We've sent a confirmation email to your email at " }, "confirmCollectionEnhancementsDialogTitle": { - "message": "This action is irreversible" + "message": "此操作是不可逆轉的" }, "confirmCollectionEnhancementsDialogContent": { "message": "Turning on this feature will deprecate the manager role and replace it with a Can manage permission. This will take a few moments. Do not make any organization changes until it is complete. Are you sure you want to proceed?" @@ -7600,6 +7606,9 @@ "providerPortal": { "message": "Provider Portal" }, + "viewCollection": { + "message": "View collection" + }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." }, @@ -7642,5 +7651,256 @@ }, "items": { "message": "Items" + }, + "assignedSeats": { + "message": "Assigned seats" + }, + "assigned": { + "message": "已指派" + }, + "used": { + "message": "已使用" + }, + "remaining": { + "message": "剩餘" + }, + "unlinkOrganization": { + "message": "取消連結組織" + }, + "manageSeats": { + "message": "MANAGE SEATS" + }, + "manageSeatsDescription": { + "message": "Adjustments to seats will be reflected in the next billing cycle." + }, + "unassignedSeatsDescription": { + "message": "Unassigned subscription seats" + }, + "purchaseSeatDescription": { + "message": "Additional seats purchased" + }, + "assignedSeatCannotUpdate": { + "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + }, + "subscriptionUpdateFailed": { + "message": "Subscription update failed" + }, + "trial": { + "message": "Trial", + "description": "A subscription status label." + }, + "pastDue": { + "message": "Past due", + "description": "A subscription status label" + }, + "subscriptionExpired": { + "message": "Subscription expired", + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "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$.", + "placeholders": { + "days": { + "content": "$1", + "example": "11" + }, + "suspension_date": { + "content": "$2", + "example": "01/10/2024" + } + }, + "description": "A warning shown to the user when their subscription is past due and they pay via invoice." + }, + "unpaidInvoice": { + "message": "Unpaid invoice", + "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.", + "description": "The body of a warning box shown to a user whose subscription is unpaid." + }, + "cancellationDate": { + "message": "Cancellation date", + "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." + }, + "machineAccount": { + "message": "Machine account", + "description": "A machine user which can be used to automate processes and access secrets in the system." + }, + "machineAccounts": { + "message": "Machine accounts", + "description": "The title for the section that deals with machine accounts." + }, + "newMachineAccount": { + "message": "New machine account", + "description": "Title for creating a new machine account." + }, + "machineAccountsNoItemsMessage": { + "message": "Create a new machine account to get started automating secret access.", + "description": "Message to encourage the user to start creating machine accounts." + }, + "machineAccountsNoItemsTitle": { + "message": "Nothing to show yet", + "description": "Title to indicate that there are no machine accounts to display." + }, + "deleteMachineAccounts": { + "message": "Delete machine accounts", + "description": "Title for the action to delete one or multiple machine accounts." + }, + "deleteMachineAccount": { + "message": "Delete machine account", + "description": "Title for the action to delete a single machine account." + }, + "viewMachineAccount": { + "message": "View machine account", + "description": "Action to view the details of a machine account." + }, + "deleteMachineAccountDialogMessage": { + "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "placeholders": { + "machine_account": { + "content": "$1", + "example": "Machine account name" + } + } + }, + "deleteMachineAccountsDialogMessage": { + "message": "Deleting machine accounts is permanent and irreversible." + }, + "deleteMachineAccountsConfirmMessage": { + "message": "Delete $COUNT$ machine accounts", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "deleteMachineAccountToast": { + "message": "Machine account deleted" + }, + "deleteMachineAccountsToast": { + "message": "Machine accounts deleted" + }, + "searchMachineAccounts": { + "message": "Search machine accounts", + "description": "Placeholder text for searching machine accounts." + }, + "editMachineAccount": { + "message": "Edit machine account", + "description": "Title for editing a machine account." + }, + "machineAccountName": { + "message": "Machine account name", + "description": "Label for the name of a machine account" + }, + "machineAccountCreated": { + "message": "Machine account created", + "description": "Notifies that a new machine account has been created" + }, + "machineAccountUpdated": { + "message": "Machine account updated", + "description": "Notifies that a machine account has been updated" + }, + "projectMachineAccountsDescription": { + "message": "Grant machine accounts access to this project." + }, + "projectMachineAccountsSelectHint": { + "message": "Type or select machine accounts" + }, + "projectEmptyMachineAccountAccessPolicies": { + "message": "Add machine accounts to grant access" + }, + "machineAccountPeopleDescription": { + "message": "Grant groups or people access to this machine account." + }, + "machineAccountProjectsDescription": { + "message": "Assign projects to this machine account. " + }, + "createMachineAccount": { + "message": "Create a machine account" + }, + "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." + }, + "smAccessRemovalWarningMaTitle": { + "message": "Remove access to this machine account" + }, + "smAccessRemovalWarningMaMessage": { + "message": "This action will remove your access to the machine account." + }, + "machineAccountsIncluded": { + "message": "$COUNT$ machine accounts included", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "additionalMachineAccountCost": { + "message": "$COST$ per month for additional machine accounts", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "additionalMachineAccounts": { + "message": "Additional machine accounts" + }, + "includedMachineAccounts": { + "message": "Your plan comes with $COUNT$ machine accounts.", + "placeholders": { + "count": { + "content": "$1", + "example": "50" + } + } + }, + "addAdditionalMachineAccounts": { + "message": "You can add additional machine accounts for $COST$ per month.", + "placeholders": { + "cost": { + "content": "$1", + "example": "$0.50" + } + } + }, + "limitMachineAccounts": { + "message": "Limit machine accounts (optional)" + }, + "limitMachineAccountsDesc": { + "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + }, + "machineAccountLimit": { + "message": "Machine account limit (optional)" + }, + "maxMachineAccountCost": { + "message": "Max potential machine account cost" + }, + "machineAccountAccessUpdated": { + "message": "Machine account access updated" + }, + "unassignedItemsBanner": { + "message": "Notice: Unassigned organization items are no longer visible in your All Vaults view across devices and are now only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." } } diff --git a/libs/angular/src/auth/components/login-via-auth-request.component.ts b/libs/angular/src/auth/components/login-via-auth-request.component.ts index 6ba94d3001..5a1180cd38 100644 --- a/libs/angular/src/auth/components/login-via-auth-request.component.ts +++ b/libs/angular/src/auth/components/login-via-auth-request.component.ts @@ -33,6 +33,7 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { UserId } from "@bitwarden/common/types/guid"; import { CaptchaProtectedComponent } from "./captcha-protected.component"; @@ -131,6 +132,7 @@ export class LoginViaAuthRequestComponent // This also prevents it from being lost on refresh as the // login service email does not persist. this.email = await this.stateService.getEmail(); + const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; if (!this.email) { this.platformUtilsService.showToast("error", null, this.i18nService.t("userEmailMissing")); @@ -142,10 +144,10 @@ export class LoginViaAuthRequestComponent // We only allow a single admin approval request to be active at a time // so must check state to see if we have an existing one or not - const adminAuthReqStorable = await this.stateService.getAdminAuthRequest(); + const adminAuthReqStorable = await this.authRequestService.getAdminAuthRequest(userId); if (adminAuthReqStorable) { - await this.handleExistingAdminAuthRequest(adminAuthReqStorable); + await this.handleExistingAdminAuthRequest(adminAuthReqStorable, userId); } else { // No existing admin auth request; so we need to create one await this.startAuthRequestLogin(); @@ -173,7 +175,10 @@ export class LoginViaAuthRequestComponent this.destroy$.complete(); } - private async handleExistingAdminAuthRequest(adminAuthReqStorable: AdminAuthRequestStorable) { + private async handleExistingAdminAuthRequest( + adminAuthReqStorable: AdminAuthRequestStorable, + userId: UserId, + ) { // Note: on login, the SSOLoginStrategy will also call to see an existing admin auth req // has been approved and handle it if so. @@ -183,13 +188,13 @@ export class LoginViaAuthRequestComponent adminAuthReqResponse = await this.apiService.getAuthRequest(adminAuthReqStorable.id); } catch (error) { if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(); + return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); } } // Request doesn't exist anymore if (!adminAuthReqResponse) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(); + return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); } // Re-derive the user's fingerprint phrase @@ -203,7 +208,7 @@ export class LoginViaAuthRequestComponent // Request denied if (adminAuthReqResponse.isAnswered && !adminAuthReqResponse.requestApproved) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(); + return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); } // Request approved @@ -211,6 +216,7 @@ export class LoginViaAuthRequestComponent return await this.handleApprovedAdminAuthRequest( adminAuthReqResponse, adminAuthReqStorable.privateKey, + userId, ); } @@ -219,9 +225,9 @@ export class LoginViaAuthRequestComponent await this.anonymousHubService.createHubConnection(adminAuthReqStorable.id); } - private async handleExistingAdminAuthReqDeletedOrDenied() { + private async handleExistingAdminAuthReqDeletedOrDenied(userId: UserId) { // clear the admin auth request from state - await this.stateService.setAdminAuthRequest(null); + await this.authRequestService.clearAdminAuthRequest(userId); // start new auth request // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. @@ -269,7 +275,8 @@ export class LoginViaAuthRequestComponent privateKey: this.authRequestKeyPair.privateKey, }); - await this.stateService.setAdminAuthRequest(adminAuthReqStorable); + const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + await this.authRequestService.setAdminAuthRequest(adminAuthReqStorable, userId); } else { await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock); reqResponse = await this.apiService.postAuthRequest(this.authRequest); @@ -333,9 +340,11 @@ export class LoginViaAuthRequestComponent // if user has authenticated via SSO if (this.userAuthNStatus === AuthenticationStatus.Locked) { + const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; return await this.handleApprovedAdminAuthRequest( authReqResponse, this.authRequestKeyPair.privateKey, + userId, ); } @@ -363,6 +372,7 @@ export class LoginViaAuthRequestComponent async handleApprovedAdminAuthRequest( adminAuthReqResponse: AuthRequestResponse, privateKey: ArrayBuffer, + userId: UserId, ) { // See verifyAndHandleApprovedAuthReq(...) for flow details // it's flow 2 or 3 based on presence of masterPasswordHash @@ -384,7 +394,7 @@ export class LoginViaAuthRequestComponent // clear the admin auth request from state so it cannot be used again (it's a one time use) // TODO: this should eventually be enforced via deleting this on the server once it is used - await this.stateService.setAdminAuthRequest(null); + await this.authRequestService.clearAdminAuthRequest(userId); this.platformUtilsService.showToast("success", null, this.i18nService.t("loginApproved")); diff --git a/libs/angular/src/auth/guards/unauth.guard.ts b/libs/angular/src/auth/guards/unauth.guard.ts index 35c59b5744..9e1bca98ca 100644 --- a/libs/angular/src/auth/guards/unauth.guard.ts +++ b/libs/angular/src/auth/guards/unauth.guard.ts @@ -2,7 +2,6 @@ import { Injectable, inject } from "@angular/core"; import { CanActivate, CanActivateFn, Router, UrlTree } from "@angular/router"; import { Observable, map } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -43,14 +42,14 @@ const defaultRoutes: UnauthRoutes = { }; function unauthGuard(routes: UnauthRoutes): Observable { - const accountService = inject(AccountService); + const authService = inject(AuthService); const router = inject(Router); - return accountService.activeAccount$.pipe( - map((accountData) => { - if (accountData == null || accountData.status === AuthenticationStatus.LoggedOut) { + return authService.activeAccountStatus$.pipe( + map((status) => { + if (status == null || status === AuthenticationStatus.LoggedOut) { return true; - } else if (accountData.status === AuthenticationStatus.Locked) { + } else if (status === AuthenticationStatus.Locked) { return router.createUrlTree([routes.locked]); } else { return router.createUrlTree([routes.homepage()]); diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 79bb6714d0..b311000fb8 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -740,6 +740,7 @@ const safeProviders: SafeProvider[] = [ LOGOUT_CALLBACK, StateServiceAbstraction, AuthServiceAbstraction, + AuthRequestServiceAbstraction, MessagingServiceAbstraction, ], }), @@ -756,7 +757,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: EventUploadServiceAbstraction, useClass: EventUploadService, - deps: [ApiServiceAbstraction, StateProvider, LogService, AccountServiceAbstraction], + deps: [ApiServiceAbstraction, StateProvider, LogService, AuthServiceAbstraction], }), safeProvider({ provide: EventCollectionServiceAbstraction, @@ -766,7 +767,7 @@ const safeProviders: SafeProvider[] = [ StateProvider, OrganizationServiceAbstraction, EventUploadServiceAbstraction, - AccountServiceAbstraction, + AuthServiceAbstraction, ], }), safeProvider({ @@ -963,6 +964,7 @@ const safeProviders: SafeProvider[] = [ InternalMasterPasswordServiceAbstraction, CryptoServiceAbstraction, ApiServiceAbstraction, + StateProvider, ], }), safeProvider({ diff --git a/libs/angular/src/services/unassigned-items-banner.service.spec.ts b/libs/angular/src/services/unassigned-items-banner.service.spec.ts index 9b2ffc1ef9..ca2487a518 100644 --- a/libs/angular/src/services/unassigned-items-banner.service.spec.ts +++ b/libs/angular/src/services/unassigned-items-banner.service.spec.ts @@ -1,6 +1,7 @@ import { MockProxy, mock } from "jest-mock-extended"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, of } from "rxjs"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { FakeStateProvider, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; @@ -10,13 +11,17 @@ import { SHOW_BANNER_KEY, UnassignedItemsBannerService } from "./unassigned-item describe("UnassignedItemsBanner", () => { let stateProvider: FakeStateProvider; let apiService: MockProxy; + let environmentService: MockProxy; - const sutFactory = () => new UnassignedItemsBannerService(stateProvider, apiService); + const sutFactory = () => + new UnassignedItemsBannerService(stateProvider, apiService, environmentService); beforeEach(() => { const fakeAccountService = mockAccountServiceWith("userId" as UserId); stateProvider = new FakeStateProvider(fakeAccountService); apiService = mock(); + environmentService = mock(); + environmentService.environment$ = of(null); }); it("shows the banner if showBanner local state is true", async () => { diff --git a/libs/angular/src/services/unassigned-items-banner.service.ts b/libs/angular/src/services/unassigned-items-banner.service.ts index faa766a18a..13a745fb82 100644 --- a/libs/angular/src/services/unassigned-items-banner.service.ts +++ b/libs/angular/src/services/unassigned-items-banner.service.ts @@ -1,6 +1,10 @@ import { Injectable } from "@angular/core"; -import { concatMap } from "rxjs"; +import { concatMap, map } from "rxjs"; +import { + EnvironmentService, + Region, +} from "@bitwarden/common/platform/abstractions/environment.service"; import { StateProvider, UNASSIGNED_ITEMS_BANNER_DISK, @@ -36,9 +40,18 @@ export class UnassignedItemsBannerService { }), ); + bannerText$ = this.environmentService.environment$.pipe( + map((e) => + e?.getRegion() == Region.SelfHosted + ? "unassignedItemsBannerSelfHost" + : "unassignedItemsBanner", + ), + ); + constructor( private stateProvider: StateProvider, private apiService: UnassignedItemsBannerApiService, + private environmentService: EnvironmentService, ) {} async hideBanner() { diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index 6a0cfde350..ab09d14c86 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -592,7 +592,7 @@ export class AddEditComponent implements OnInit, OnDestroy { this.writeableCollections.forEach((c) => ((c as any).checked = false)); } if (this.cipher.organizationId != null) { - this.collections = this.writeableCollections.filter( + this.collections = this.writeableCollections?.filter( (c) => c.organizationId === this.cipher.organizationId, ); const org = await this.organizationService.get(this.cipher.organizationId); diff --git a/libs/angular/src/vault/components/vault-items.component.ts b/libs/angular/src/vault/components/vault-items.component.ts index 458b10865c..20e779e77c 100644 --- a/libs/angular/src/vault/components/vault-items.component.ts +++ b/libs/angular/src/vault/components/vault-items.component.ts @@ -52,7 +52,8 @@ export class VaultItemsComponent implements OnInit, OnDestroy { } ngOnDestroy(): void { - throw new Error("Method not implemented."); + this.destroy$.next(); + this.destroy$.complete(); } async load(filter: (cipher: CipherView) => boolean = null, deleted = false) { 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 7af92fc8f8..b7ae903eac 100644 --- a/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts +++ b/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts @@ -1,12 +1,52 @@ import { Observable } from "rxjs"; +import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; +import { UserId } from "@bitwarden/common/types/guid"; import { UserKey, MasterKey } from "@bitwarden/common/types/key"; export abstract class AuthRequestServiceAbstraction { /** Emits an auth request id when an auth request has been approved. */ authRequestPushNotification$: Observable; + + /** + * Returns true if the user has chosen to allow auth requests to show on this client. + * Intended to prevent spamming the user with auth requests. + * @param userId The user id. + * @throws If `userId` is not provided. + */ + abstract getAcceptAuthRequests: (userId: UserId) => Promise; + /** + * Sets whether to allow auth requests to show on this client for this user. + * @param accept Whether to allow auth requests to show on this client. + * @param userId The user id. + * @throws If `userId` is not provided. + */ + abstract setAcceptAuthRequests: (accept: boolean, userId: UserId) => Promise; + /** + * Returns an admin auth request for the given user if it exists. + * @param userId The user id. + * @throws If `userId` is not provided. + */ + abstract getAdminAuthRequest: (userId: UserId) => Promise; + /** + * Sets an admin auth request for the given user. + * Note: use {@link clearAdminAuthRequest} to clear the request. + * @param authRequest The admin auth request. + * @param userId The user id. + * @throws If `authRequest` or `userId` is not provided. + */ + abstract setAdminAuthRequest: ( + authRequest: AdminAuthRequestStorable, + userId: UserId, + ) => Promise; + /** + * Clears an admin auth request for the given user. + * @param userId The user id. + * @throws If `userId` is not provided. + */ + abstract clearAdminAuthRequest: (userId: UserId) => Promise; /** * Approve or deny an auth request. * @param approve True to approve, false to deny. diff --git a/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts b/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts index e47f0f88ee..4035a7be58 100644 --- a/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts @@ -132,7 +132,10 @@ export class AuthRequestLoginStrategy extends LoginStrategy { } } - protected override async setUserKey(response: IdentityTokenResponse): Promise { + protected override async setUserKey( + response: IdentityTokenResponse, + userId: UserId, + ): Promise { const authRequestCredentials = this.cache.value.authRequestCredentials; // User now may or may not have a master password // but set the master key encrypted user key if it exists regardless @@ -143,7 +146,6 @@ export class AuthRequestLoginStrategy extends LoginStrategy { } else { await this.trySetUserKeyWithMasterKey(); - const userId = (await this.stateService.getUserId()) as UserId; // Establish trust if required after setting user key await this.deviceTrustCryptoService.trustDeviceIfRequired(userId); } diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index df6aa171db..94f96d40d0 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -32,6 +32,7 @@ import { AccountProfile, AccountTokens, } from "@bitwarden/common/platform/models/domain/account"; +import { UserId } from "@bitwarden/common/types/guid"; import { InternalUserDecryptionOptionsServiceAbstraction } from "../abstractions/user-decryption-options.service.abstraction"; import { @@ -160,14 +161,11 @@ export abstract class LoginStrategy { * @param {IdentityTokenResponse} tokenResponse - The response from the server containing the identity token. * @returns {Promise} - A promise that resolves when the account information has been successfully saved. */ - protected async saveAccountInformation(tokenResponse: IdentityTokenResponse): Promise { + protected async saveAccountInformation(tokenResponse: IdentityTokenResponse): Promise { const accountInformation = await this.tokenService.decodeAccessToken(tokenResponse.accessToken); const userId = accountInformation.sub; - // If you don't persist existing admin auth requests on login, they will get deleted. - const adminAuthRequest = await this.stateService.getAdminAuthRequest({ userId }); - const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction(); const vaultTimeout = await this.stateService.getVaultTimeout(); @@ -197,7 +195,6 @@ export abstract class LoginStrategy { tokens: { ...new AccountTokens(), }, - adminAuthRequest: adminAuthRequest?.toJSON(), }), ); @@ -206,6 +203,7 @@ export abstract class LoginStrategy { ); await this.billingAccountProfileStateService.setHasPremium(accountInformation.premium, false); + return userId as UserId; } protected async processTokenResponse(response: IdentityTokenResponse): Promise { @@ -228,7 +226,7 @@ export abstract class LoginStrategy { } // Must come before setting keys, user key needs email to update additional keys - await this.saveAccountInformation(response); + const userId = await this.saveAccountInformation(response); if (response.twoFactorToken != null) { // note: we can read email from access token b/c it was saved in saveAccountInformation @@ -238,7 +236,7 @@ export abstract class LoginStrategy { } await this.setMasterKey(response); - await this.setUserKey(response); + await this.setUserKey(response, userId); await this.setPrivateKey(response); this.messagingService.send("loggedIn"); @@ -248,7 +246,7 @@ export abstract class LoginStrategy { // The keys comes from different sources depending on the login strategy protected abstract setMasterKey(response: IdentityTokenResponse): Promise; - protected abstract setUserKey(response: IdentityTokenResponse): Promise; + protected abstract setUserKey(response: IdentityTokenResponse, userId: UserId): Promise; protected abstract setPrivateKey(response: IdentityTokenResponse): Promise; // Old accounts used master key for encryption. We are forcing migrations but only need to diff --git a/libs/auth/src/common/login-strategies/password-login.strategy.ts b/libs/auth/src/common/login-strategies/password-login.strategy.ts index 52c97d5d85..2490c35a00 100644 --- a/libs/auth/src/common/login-strategies/password-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/password-login.strategy.ts @@ -25,6 +25,7 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv import { HashPurpose } from "@bitwarden/common/platform/enums"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; +import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey } from "@bitwarden/common/types/key"; import { LoginStrategyServiceAbstraction } from "../abstractions"; @@ -207,14 +208,16 @@ export class PasswordLoginStrategy extends LoginStrategy { await this.masterPasswordService.setMasterKeyHash(localMasterKeyHash, userId); } - protected override async setUserKey(response: IdentityTokenResponse): Promise { + protected override async setUserKey( + response: IdentityTokenResponse, + userId: UserId, + ): Promise { // If migration is required, we won't have a user key to set yet. if (this.encryptionKeyMigrationRequired(response)) { return; } await this.cryptoService.setMasterKeyEncryptedUserKey(response.key); - const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; const masterKey = await firstValueFrom(this.masterPasswordService.masterKey$(userId)); if (masterKey) { const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey); diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts index bce62681d0..b78ad6dea6 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts @@ -301,7 +301,7 @@ describe("SsoLoginStrategy", () => { id: "1", privateKey: "PRIVATE" as any, } as AdminAuthRequestStorable; - stateService.getAdminAuthRequest.mockResolvedValue( + authRequestService.getAdminAuthRequest.mockResolvedValue( new AdminAuthRequestStorable(adminAuthRequest), ); }); @@ -364,7 +364,7 @@ describe("SsoLoginStrategy", () => { await ssoLoginStrategy.logIn(credentials); - expect(stateService.setAdminAuthRequest).toHaveBeenCalledWith(null); + expect(authRequestService.clearAdminAuthRequest).toHaveBeenCalled(); expect( authRequestService.setKeysAfterDecryptingSharedMasterKeyAndHash, ).not.toHaveBeenCalled(); diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.ts index db0228a338..d8efd78984 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.ts @@ -216,7 +216,10 @@ export class SsoLoginStrategy extends LoginStrategy { // TODO: future passkey login strategy will need to support setting user key (decrypting via TDE or admin approval request) // so might be worth moving this logic to a common place (base login strategy or a separate service?) - protected override async setUserKey(tokenResponse: IdentityTokenResponse): Promise { + protected override async setUserKey( + tokenResponse: IdentityTokenResponse, + userId: UserId, + ): Promise { const masterKeyEncryptedUserKey = tokenResponse.key; // Note: masterKeyEncryptedUserKey is undefined for SSO JIT provisioned users @@ -232,7 +235,7 @@ export class SsoLoginStrategy extends LoginStrategy { // Note: TDE and key connector are mutually exclusive if (userDecryptionOptions?.trustedDeviceOption) { - await this.trySetUserKeyWithApprovedAdminRequestIfExists(); + await this.trySetUserKeyWithApprovedAdminRequestIfExists(userId); const hasUserKey = await this.cryptoService.hasUserKey(); @@ -252,9 +255,9 @@ export class SsoLoginStrategy extends LoginStrategy { // is responsible for deriving master key from MP entry and then decrypting the user key } - private async trySetUserKeyWithApprovedAdminRequestIfExists(): Promise { + private async trySetUserKeyWithApprovedAdminRequestIfExists(userId: UserId): Promise { // At this point a user could have an admin auth request that has been approved - const adminAuthReqStorable = await this.stateService.getAdminAuthRequest(); + const adminAuthReqStorable = await this.authRequestService.getAdminAuthRequest(userId); if (!adminAuthReqStorable) { return; @@ -268,7 +271,7 @@ export class SsoLoginStrategy extends LoginStrategy { } catch (error) { if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) { // if we get a 404, it means the auth request has been deleted so clear it from storage - await this.stateService.setAdminAuthRequest(null); + await this.authRequestService.clearAdminAuthRequest(userId); } // Always return on an error here as we don't want to block the user from logging in @@ -295,12 +298,11 @@ export class SsoLoginStrategy extends LoginStrategy { if (await this.cryptoService.hasUserKey()) { // Now that we have a decrypted user key in memory, we can check if we // need to establish trust on the current device - const userId = (await this.stateService.getUserId()) as UserId; await this.deviceTrustCryptoService.trustDeviceIfRequired(userId); // if we successfully decrypted the user key, we can delete the admin auth request out of state // TODO: eventually we post and clean up DB as well once consumed on client - await this.stateService.setAdminAuthRequest(null); + await this.authRequestService.clearAdminAuthRequest(userId); this.platformUtilsService.showToast("success", null, this.i18nService.t("loginApproved")); } diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts index 421746b49c..4a0d005b1c 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts @@ -18,6 +18,7 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { InternalUserDecryptionOptionsServiceAbstraction } from "../abstractions/user-decryption-options.service.abstraction"; import { UserApiLoginCredentials } from "../models/domain/login-credentials"; @@ -97,7 +98,10 @@ export class UserApiLoginStrategy extends LoginStrategy { } } - protected override async setUserKey(response: IdentityTokenResponse): Promise { + protected override async setUserKey( + response: IdentityTokenResponse, + userId: UserId, + ): Promise { await this.cryptoService.setMasterKeyEncryptedUserKey(response.key); if (response.apiUseKeyConnector) { @@ -116,8 +120,8 @@ export class UserApiLoginStrategy extends LoginStrategy { ); } - protected async saveAccountInformation(tokenResponse: IdentityTokenResponse) { - await super.saveAccountInformation(tokenResponse); + protected async saveAccountInformation(tokenResponse: IdentityTokenResponse): Promise { + const userId = await super.saveAccountInformation(tokenResponse); const vaultTimeout = await this.stateService.getVaultTimeout(); const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction(); @@ -134,6 +138,7 @@ export class UserApiLoginStrategy extends LoginStrategy { vaultTimeoutAction as VaultTimeoutAction, vaultTimeout, ); + return userId; } exportCache(): CacheData { diff --git a/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts b/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts index 843978e2a2..8a62a8fb3c 100644 --- a/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts @@ -17,6 +17,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { UserId } from "@bitwarden/common/types/guid"; import { UserKey } from "@bitwarden/common/types/key"; import { InternalUserDecryptionOptionsServiceAbstraction } from "../abstractions"; @@ -98,7 +99,7 @@ export class WebAuthnLoginStrategy extends LoginStrategy { return Promise.resolve(); } - protected override async setUserKey(idTokenResponse: IdentityTokenResponse) { + protected override async setUserKey(idTokenResponse: IdentityTokenResponse, userId: UserId) { const masterKeyEncryptedUserKey = idTokenResponse.key; if (masterKeyEncryptedUserKey) { 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 f04628ffd9..5907048684 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 @@ -9,6 +9,7 @@ import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.se import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { StateProvider } from "@bitwarden/common/platform/state"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; @@ -18,6 +19,7 @@ import { AuthRequestService } from "./auth-request.service"; describe("AuthRequestService", () => { let sut: AuthRequestService; + const stateProvider = mock(); let accountService: FakeAccountService; let masterPasswordService: FakeMasterPasswordService; const appIdService = mock(); @@ -38,6 +40,7 @@ describe("AuthRequestService", () => { masterPasswordService, cryptoService, apiService, + stateProvider, ); mockPrivateKey = new Uint8Array(64); @@ -59,6 +62,31 @@ describe("AuthRequestService", () => { }); }); + describe("AcceptAuthRequests", () => { + it("returns an error when userId isn't provided", async () => { + await expect(sut.getAcceptAuthRequests(undefined)).rejects.toThrow("User ID is required"); + await expect(sut.setAcceptAuthRequests(true, undefined)).rejects.toThrow( + "User ID is required", + ); + }); + }); + + describe("AdminAuthRequest", () => { + it("returns an error when userId isn't provided", async () => { + await expect(sut.getAdminAuthRequest(undefined)).rejects.toThrow("User ID is required"); + await expect(sut.setAdminAuthRequest(undefined, undefined)).rejects.toThrow( + "User ID is required", + ); + await expect(sut.clearAdminAuthRequest(undefined)).rejects.toThrow("User ID is required"); + }); + + it("does not allow clearing from setAdminAuthRequest", async () => { + await expect(sut.setAdminAuthRequest(null, "USER_ID" as UserId)).rejects.toThrow( + "Auth request is required", + ); + }); + }); + describe("approveOrDenyAuthRequest", () => { beforeEach(() => { cryptoService.rsaEncrypt.mockResolvedValue({ 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 5f8dcfd729..062a10af14 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 @@ -1,8 +1,10 @@ -import { firstValueFrom, Observable, Subject } from "rxjs"; +import { Observable, Subject, firstValueFrom } 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 { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +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 { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; @@ -10,10 +12,43 @@ import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.ser import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { + AUTH_REQUEST_DISK_LOCAL, + StateProvider, + UserKeyDefinition, +} from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; import { AuthRequestServiceAbstraction } from "../../abstractions/auth-request.service.abstraction"; +/** + * Disk-local to maintain consistency between tabs (even though + * approvals are currently only available on desktop). We don't + * want to clear this on logout as it's a user preference. + */ +export const ACCEPT_AUTH_REQUESTS_KEY = new UserKeyDefinition( + AUTH_REQUEST_DISK_LOCAL, + "acceptAuthRequests", + { + deserializer: (value) => value ?? false, + clearOn: [], + }, +); + +/** + * Disk-local to maintain consistency between tabs. We don't want to + * clear this on logout since admin auth requests are long-lived. + */ +export const ADMIN_AUTH_REQUEST_KEY = new UserKeyDefinition>( + AUTH_REQUEST_DISK_LOCAL, + "adminAuthRequest", + { + deserializer: (value) => value, + clearOn: [], + }, +); + export class AuthRequestService implements AuthRequestServiceAbstraction { private authRequestPushNotificationSubject = new Subject(); authRequestPushNotification$: Observable; @@ -24,10 +59,61 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { private masterPasswordService: InternalMasterPasswordServiceAbstraction, private cryptoService: CryptoService, private apiService: ApiService, + private stateProvider: StateProvider, ) { this.authRequestPushNotification$ = this.authRequestPushNotificationSubject.asObservable(); } + async getAcceptAuthRequests(userId: UserId): Promise { + if (userId == null) { + throw new Error("User ID is required"); + } + + const value = await firstValueFrom( + this.stateProvider.getUser(userId, ACCEPT_AUTH_REQUESTS_KEY).state$, + ); + return value; + } + + async setAcceptAuthRequests(accept: boolean, userId: UserId): Promise { + if (userId == null) { + throw new Error("User ID is required"); + } + + await this.stateProvider.setUserState(ACCEPT_AUTH_REQUESTS_KEY, accept, userId); + } + + async getAdminAuthRequest(userId: UserId): Promise { + if (userId == null) { + throw new Error("User ID is required"); + } + + const authRequestSerialized = await firstValueFrom( + this.stateProvider.getUser(userId, ADMIN_AUTH_REQUEST_KEY).state$, + ); + const adminAuthRequestStorable = AdminAuthRequestStorable.fromJSON(authRequestSerialized); + return adminAuthRequestStorable; + } + + async setAdminAuthRequest(authRequest: AdminAuthRequestStorable, userId: UserId): Promise { + if (userId == null) { + throw new Error("User ID is required"); + } + if (authRequest == null) { + throw new Error("Auth request is required"); + } + + await this.stateProvider.setUserState(ADMIN_AUTH_REQUEST_KEY, authRequest.toJSON(), userId); + } + + async clearAdminAuthRequest(userId: UserId): Promise { + if (userId == null) { + throw new Error("User ID is required"); + } + + await this.stateProvider.setUserState(ADMIN_AUTH_REQUEST_KEY, null, userId); + } + async approveOrDenyAuthRequest( approve: boolean, authRequest: AuthRequestResponse, diff --git a/libs/auth/src/common/services/user-decryption-options/user-decryption-options.service.spec.ts b/libs/auth/src/common/services/user-decryption-options/user-decryption-options.service.spec.ts index e8bb1b38ce..16479f19ea 100644 --- a/libs/auth/src/common/services/user-decryption-options/user-decryption-options.service.spec.ts +++ b/libs/auth/src/common/services/user-decryption-options/user-decryption-options.service.spec.ts @@ -1,6 +1,5 @@ import { firstValueFrom } from "rxjs"; -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FakeAccountService, @@ -66,7 +65,6 @@ describe("UserDecryptionOptionsService", () => { await fakeAccountService.addAccount(givenUser, { name: "Test User 1", email: "test1@email.com", - status: AuthenticationStatus.Locked, }); await fakeStateProvider.setUserState( USER_DECRYPTION_OPTIONS, diff --git a/libs/common/spec/fake-account-service.ts b/libs/common/spec/fake-account-service.ts index bd35d901c2..a8b09b7417 100644 --- a/libs/common/spec/fake-account-service.ts +++ b/libs/common/spec/fake-account-service.ts @@ -1,8 +1,7 @@ import { mock } from "jest-mock-extended"; -import { Observable, ReplaySubject } from "rxjs"; +import { ReplaySubject } from "rxjs"; import { AccountInfo, AccountService } from "../src/auth/abstractions/account.service"; -import { AuthenticationStatus } from "../src/auth/enums/authentication-status"; import { UserId } from "../src/types/guid"; export function mockAccountServiceWith( @@ -14,7 +13,6 @@ export function mockAccountServiceWith( ...{ name: "name", email: "email", - status: AuthenticationStatus.Locked, }, }; const service = new FakeAccountService({ [userId]: fullInfo }); @@ -34,8 +32,6 @@ export class FakeAccountService implements AccountService { } accounts$ = this.accountsSubject.asObservable(); activeAccount$ = this.activeAccountSubject.asObservable(); - accountLock$: Observable; - accountLogout$: Observable; constructor(initialData: Record) { this.accountsSubject.next(initialData); @@ -57,14 +53,6 @@ export class FakeAccountService implements AccountService { await this.mock.setAccountEmail(userId, email); } - async setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise { - await this.mock.setAccountStatus(userId, status); - } - - async setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise { - await this.mock.setMaxAccountStatus(userId, maxStatus); - } - async switchAccount(userId: UserId): Promise { const next = userId == null ? null : { id: userId, ...this.accountsSubject["_buffer"]?.[0]?.[userId] }; diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index 20ed3216a5..6962a44268 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -220,7 +220,7 @@ export abstract class ApiService { putMoveCiphers: (request: CipherBulkMoveRequest) => Promise; putShareCipher: (id: string, request: CipherShareRequest) => Promise; putShareCiphers: (request: CipherBulkShareRequest) => Promise; - putCipherCollections: (id: string, request: CipherCollectionsRequest) => Promise; + putCipherCollections: (id: string, request: CipherCollectionsRequest) => Promise; putCipherCollectionsAdmin: (id: string, request: CipherCollectionsRequest) => Promise; postPurgeCiphers: (request: SecretVerificationRequest, organizationId?: string) => Promise; putDeleteCipher: (id: string) => Promise; diff --git a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts index a1ae64a885..fefcac3a57 100644 --- a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts +++ b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts @@ -121,7 +121,11 @@ export abstract class OrganizationService { get$: (id: string) => Observable; get: (id: string) => Promise; getAll: (userId?: string) => Promise; - // + + /** + * Publishes state for all organizations for the given user id or the active user. + */ + getAll$: (userId?: UserId) => Observable; } /** diff --git a/libs/common/src/admin-console/services/organization/organization.service.ts b/libs/common/src/admin-console/services/organization/organization.service.ts index 411850fe30..7013863c5c 100644 --- a/libs/common/src/admin-console/services/organization/organization.service.ts +++ b/libs/common/src/admin-console/services/organization/organization.service.ts @@ -73,6 +73,10 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti return this.organizations$.pipe(mapToSingleOrganization(id)); } + getAll$(userId?: UserId): Observable { + return this.getOrganizationsFromState$(userId); + } + async getAll(userId?: string): Promise { return await firstValueFrom(this.getOrganizationsFromState$(userId as UserId)); } diff --git a/libs/common/src/admin-console/services/policy/policy.service.spec.ts b/libs/common/src/admin-console/services/policy/policy.service.spec.ts index b67ef4619f..88264d1c3b 100644 --- a/libs/common/src/admin-console/services/policy/policy.service.spec.ts +++ b/libs/common/src/admin-console/services/policy/policy.service.spec.ts @@ -32,7 +32,8 @@ describe("PolicyService", () => { organizationService = mock(); activeUserState = stateProvider.activeUser.getFake(POLICIES); - organizationService.organizations$ = of([ + + const organizations$ = of([ // User organization("org1", true, true, OrganizationUserStatusType.Confirmed, false), // Owner @@ -54,6 +55,10 @@ describe("PolicyService", () => { organization("org6", true, true, OrganizationUserStatusType.Confirmed, true), ]); + organizationService.organizations$ = organizations$; + + organizationService.getAll$.mockReturnValue(organizations$); + policyService = new PolicyService(stateProvider, organizationService); }); diff --git a/libs/common/src/admin-console/services/policy/policy.service.ts b/libs/common/src/admin-console/services/policy/policy.service.ts index a093dad61a..e36902cbf9 100644 --- a/libs/common/src/admin-console/services/policy/policy.service.ts +++ b/libs/common/src/admin-console/services/policy/policy.service.ts @@ -51,7 +51,7 @@ export class PolicyService implements InternalPolicyServiceAbstraction { map((policies) => policies.filter((p) => p.type === policyType)), ); - return combineLatest([filteredPolicies$, this.organizationService.organizations$]).pipe( + return combineLatest([filteredPolicies$, this.organizationService.getAll$(userId)]).pipe( map(([policies, organizations]) => this.enforcedPolicyFilter(policies, organizations)), ); } diff --git a/libs/common/src/auth/abstractions/account.service.ts b/libs/common/src/auth/abstractions/account.service.ts index 4e2a462755..fa9ad36378 100644 --- a/libs/common/src/auth/abstractions/account.service.ts +++ b/libs/common/src/auth/abstractions/account.service.ts @@ -1,27 +1,23 @@ import { Observable } from "rxjs"; import { UserId } from "../../types/guid"; -import { AuthenticationStatus } from "../enums/authentication-status"; /** * Holds information about an account for use in the AccountService * if more information is added, be sure to update the equality method. */ export type AccountInfo = { - status: AuthenticationStatus; email: string; name: string | undefined; }; export function accountInfoEqual(a: AccountInfo, b: AccountInfo) { - return a?.status === b?.status && a?.email === b?.email && a?.name === b?.name; + return a?.email === b?.email && a?.name === b?.name; } export abstract class AccountService { accounts$: Observable>; activeAccount$: Observable<{ id: UserId | undefined } & AccountInfo>; - accountLock$: Observable; - accountLogout$: Observable; /** * Updates the `accounts$` observable with the new account data. * @param userId @@ -40,24 +36,6 @@ export abstract class AccountService { * @param email */ abstract setAccountEmail(userId: UserId, email: string): Promise; - /** - * Updates the `accounts$` observable with the new account status. - * Also emits the `accountLock$` or `accountLogout$` observable if the status is `Locked` or `LoggedOut` respectively. - * @param userId - * @param status - */ - abstract setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise; - /** - * Updates the `accounts$` observable with the new account status if the current status is higher than the `maxStatus`. - * - * This method only downgrades status to the maximum value sent in, it will not increase authentication status. - * - * @example An account is transitioning from unlocked to logged out. If callbacks that set the status to locked occur - * after it is updated to logged out, the account will be in the incorrect state. - * @param userId The user id of the account to be updated. - * @param maxStatus The new status of the account. - */ - abstract setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise; /** * Updates the `activeAccount$` observable with the new active account. * @param userId diff --git a/libs/common/src/auth/abstractions/auth.service.ts b/libs/common/src/auth/abstractions/auth.service.ts index de08dbd4e9..36d5d219b2 100644 --- a/libs/common/src/auth/abstractions/auth.service.ts +++ b/libs/common/src/auth/abstractions/auth.service.ts @@ -6,6 +6,8 @@ import { AuthenticationStatus } from "../enums/authentication-status"; export abstract class AuthService { /** Authentication status for the active user */ abstract activeAccountStatus$: Observable; + /** Authentication status for all known users */ + abstract authStatuses$: Observable>; /** * Returns an observable authentication status for the given user id. * @note userId is a required parameter, null values will always return `AuthenticationStatus.LoggedOut` diff --git a/libs/common/src/auth/models/domain/admin-auth-req-storable.ts b/libs/common/src/auth/models/domain/admin-auth-req-storable.ts index 1eae7eeab1..df0341ac16 100644 --- a/libs/common/src/auth/models/domain/admin-auth-req-storable.ts +++ b/libs/common/src/auth/models/domain/admin-auth-req-storable.ts @@ -1,11 +1,7 @@ +import { Jsonify } from "type-fest"; + import { Utils } from "../../../platform/misc/utils"; -// TODO: Tech Debt: potentially create a type Storage shape vs using a class here in the future -// type StorageShape { -// id: string; -// privateKey: string; -// } -// so we can get rid of the any type passed into fromJSON and coming out of ToJSON export class AdminAuthRequestStorable { id: string; privateKey: Uint8Array; @@ -23,7 +19,7 @@ export class AdminAuthRequestStorable { }; } - static fromJSON(obj: any): AdminAuthRequestStorable { + static fromJSON(obj: Jsonify): AdminAuthRequestStorable { if (obj == null) { return null; } diff --git a/libs/common/src/auth/services/account.service.spec.ts b/libs/common/src/auth/services/account.service.spec.ts index e4195365f4..a9cec82c51 100644 --- a/libs/common/src/auth/services/account.service.spec.ts +++ b/libs/common/src/auth/services/account.service.spec.ts @@ -8,7 +8,6 @@ import { LogService } from "../../platform/abstractions/log.service"; import { MessagingService } from "../../platform/abstractions/messaging.service"; import { UserId } from "../../types/guid"; import { AccountInfo } from "../abstractions/account.service"; -import { AuthenticationStatus } from "../enums/authentication-status"; import { ACCOUNT_ACCOUNTS, @@ -24,9 +23,7 @@ describe("accountService", () => { let accountsState: FakeGlobalState>; let activeAccountIdState: FakeGlobalState; const userId = "userId" as UserId; - function userInfo(status: AuthenticationStatus): AccountInfo { - return { status, email: "email", name: "name" }; - } + const userInfo = { email: "email", name: "name" }; beforeEach(() => { messagingService = mock(); @@ -50,61 +47,49 @@ describe("accountService", () => { expect(emissions).toEqual([undefined]); }); - it("should emit the active account and status", async () => { + it("should emit the active account", async () => { const emissions = trackEmissions(sut.activeAccount$); - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); + accountsState.stateSubject.next({ [userId]: userInfo }); activeAccountIdState.stateSubject.next(userId); expect(emissions).toEqual([ undefined, // initial value - { id: userId, ...userInfo(AuthenticationStatus.Unlocked) }, - ]); - }); - - it("should update the status if the account status changes", async () => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); - activeAccountIdState.stateSubject.next(userId); - const emissions = trackEmissions(sut.activeAccount$); - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Locked) }); - - expect(emissions).toEqual([ - { id: userId, ...userInfo(AuthenticationStatus.Unlocked) }, - { id: userId, ...userInfo(AuthenticationStatus.Locked) }, + { id: userId, ...userInfo }, ]); }); it("should remember the last emitted value", async () => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); + accountsState.stateSubject.next({ [userId]: userInfo }); activeAccountIdState.stateSubject.next(userId); expect(await firstValueFrom(sut.activeAccount$)).toEqual({ id: userId, - ...userInfo(AuthenticationStatus.Unlocked), + ...userInfo, }); }); }); describe("accounts$", () => { it("should maintain an accounts cache", async () => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Locked) }); + accountsState.stateSubject.next({ [userId]: userInfo }); + accountsState.stateSubject.next({ [userId]: userInfo }); expect(await firstValueFrom(sut.accounts$)).toEqual({ - [userId]: userInfo(AuthenticationStatus.Locked), + [userId]: userInfo, }); }); }); describe("addAccount", () => { it("should emit the new account", async () => { - await sut.addAccount(userId, userInfo(AuthenticationStatus.Unlocked)); + await sut.addAccount(userId, userInfo); const currentValue = await firstValueFrom(sut.accounts$); - expect(currentValue).toEqual({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); + expect(currentValue).toEqual({ [userId]: userInfo }); }); }); describe("setAccountName", () => { - const initialState = { [userId]: userInfo(AuthenticationStatus.Unlocked) }; + const initialState = { [userId]: userInfo }; beforeEach(() => { accountsState.stateSubject.next(initialState); }); @@ -114,7 +99,7 @@ describe("accountService", () => { const currentState = await firstValueFrom(accountsState.state$); expect(currentState).toEqual({ - [userId]: { ...userInfo(AuthenticationStatus.Unlocked), name: "new name" }, + [userId]: { ...userInfo, name: "new name" }, }); }); @@ -127,7 +112,7 @@ describe("accountService", () => { }); describe("setAccountEmail", () => { - const initialState = { [userId]: userInfo(AuthenticationStatus.Unlocked) }; + const initialState = { [userId]: userInfo }; beforeEach(() => { accountsState.stateSubject.next(initialState); }); @@ -137,7 +122,7 @@ describe("accountService", () => { const currentState = await firstValueFrom(accountsState.state$); expect(currentState).toEqual({ - [userId]: { ...userInfo(AuthenticationStatus.Unlocked), email: "new email" }, + [userId]: { ...userInfo, email: "new email" }, }); }); @@ -149,49 +134,9 @@ describe("accountService", () => { }); }); - describe("setAccountStatus", () => { - const initialState = { [userId]: userInfo(AuthenticationStatus.Unlocked) }; - beforeEach(() => { - accountsState.stateSubject.next(initialState); - }); - - it("should update the account", async () => { - await sut.setAccountStatus(userId, AuthenticationStatus.Locked); - const currentState = await firstValueFrom(accountsState.state$); - - expect(currentState).toEqual({ - [userId]: { - ...userInfo(AuthenticationStatus.Unlocked), - status: AuthenticationStatus.Locked, - }, - }); - }); - - it("should not update if the status is the same", async () => { - await sut.setAccountStatus(userId, AuthenticationStatus.Unlocked); - const currentState = await firstValueFrom(accountsState.state$); - - expect(currentState).toEqual(initialState); - }); - - it("should emit logout if the status is logged out", async () => { - const emissions = trackEmissions(sut.accountLogout$); - await sut.setAccountStatus(userId, AuthenticationStatus.LoggedOut); - - expect(emissions).toEqual([userId]); - }); - - it("should emit lock if the status is locked", async () => { - const emissions = trackEmissions(sut.accountLock$); - await sut.setAccountStatus(userId, AuthenticationStatus.Locked); - - expect(emissions).toEqual([userId]); - }); - }); - describe("switchAccount", () => { beforeEach(() => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); + accountsState.stateSubject.next({ [userId]: userInfo }); activeAccountIdState.stateSubject.next(userId); }); @@ -207,26 +152,4 @@ describe("accountService", () => { expect(sut.switchAccount("unknown" as UserId)).rejects.toThrowError("Account does not exist"); }); }); - - describe("setMaxAccountStatus", () => { - it("should update the account", async () => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.Unlocked) }); - await sut.setMaxAccountStatus(userId, AuthenticationStatus.Locked); - const currentState = await firstValueFrom(accountsState.state$); - - expect(currentState).toEqual({ - [userId]: userInfo(AuthenticationStatus.Locked), - }); - }); - - it("should not update if the new max status is higher than the current", async () => { - accountsState.stateSubject.next({ [userId]: userInfo(AuthenticationStatus.LoggedOut) }); - await sut.setMaxAccountStatus(userId, AuthenticationStatus.Locked); - const currentState = await firstValueFrom(accountsState.state$); - - expect(currentState).toEqual({ - [userId]: userInfo(AuthenticationStatus.LoggedOut), - }); - }); - }); }); diff --git a/libs/common/src/auth/services/account.service.ts b/libs/common/src/auth/services/account.service.ts index 8ef235d815..77d61fae91 100644 --- a/libs/common/src/auth/services/account.service.ts +++ b/libs/common/src/auth/services/account.service.ts @@ -14,7 +14,6 @@ import { KeyDefinition, } from "../../platform/state"; import { UserId } from "../../types/guid"; -import { AuthenticationStatus } from "../enums/authentication-status"; export const ACCOUNT_ACCOUNTS = KeyDefinition.record( ACCOUNT_MEMORY, @@ -36,8 +35,6 @@ export class AccountServiceImplementation implements InternalAccountService { accounts$; activeAccount$; - accountLock$ = this.lock.asObservable(); - accountLogout$ = this.logout.asObservable(); constructor( private messagingService: MessagingService, @@ -74,34 +71,6 @@ export class AccountServiceImplementation implements InternalAccountService { await this.setAccountInfo(userId, { email }); } - async setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise { - await this.setAccountInfo(userId, { status }); - - if (status === AuthenticationStatus.LoggedOut) { - this.logout.next(userId); - } else if (status === AuthenticationStatus.Locked) { - this.lock.next(userId); - } - } - - async setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise { - await this.accountsState.update( - (accounts) => { - accounts[userId].status = maxStatus; - return accounts; - }, - { - shouldUpdate: (accounts) => { - if (accounts?.[userId] == null) { - throw new Error("Account does not exist"); - } - - return accounts[userId].status > maxStatus; - }, - }, - ); - } - async switchAccount(userId: UserId): Promise { await this.activeAccountIdState.update( (_, accounts) => { diff --git a/libs/common/src/auth/services/auth.service.spec.ts b/libs/common/src/auth/services/auth.service.spec.ts index 07e38def4b..3bdf85d3e1 100644 --- a/libs/common/src/auth/services/auth.service.spec.ts +++ b/libs/common/src/auth/services/auth.service.spec.ts @@ -122,6 +122,25 @@ describe("AuthService", () => { }); }); + describe("authStatuses$", () => { + it("requests auth status for all known users", async () => { + const userId2 = Utils.newGuid() as UserId; + + await accountService.addAccount(userId2, { email: "email2", name: "name2" }); + + const mockFn = jest.fn().mockReturnValue(of(AuthenticationStatus.Locked)); + sut.authStatusFor$ = mockFn; + + await expect(firstValueFrom(await sut.authStatuses$)).resolves.toEqual({ + [userId]: AuthenticationStatus.Locked, + [userId2]: AuthenticationStatus.Locked, + }); + expect(mockFn).toHaveBeenCalledTimes(2); + expect(mockFn).toHaveBeenCalledWith(userId); + expect(mockFn).toHaveBeenCalledWith(userId2); + }); + }); + describe("authStatusFor$", () => { beforeEach(() => { tokenService.hasAccessToken$.mockReturnValue(of(true)); diff --git a/libs/common/src/auth/services/auth.service.ts b/libs/common/src/auth/services/auth.service.ts index de5eb66c06..7a29d313e7 100644 --- a/libs/common/src/auth/services/auth.service.ts +++ b/libs/common/src/auth/services/auth.service.ts @@ -21,6 +21,7 @@ import { AuthenticationStatus } from "../enums/authentication-status"; export class AuthService implements AuthServiceAbstraction { activeAccountStatus$: Observable; + authStatuses$: Observable>; constructor( protected accountService: AccountService, @@ -36,6 +37,26 @@ export class AuthService implements AuthServiceAbstraction { return this.authStatusFor$(userId); }), ); + + this.authStatuses$ = this.accountService.accounts$.pipe( + map((accounts) => Object.keys(accounts) as UserId[]), + switchMap((entries) => + combineLatest( + entries.map((userId) => + this.authStatusFor$(userId).pipe(map((status) => ({ userId, status }))), + ), + ), + ), + map((statuses) => { + return statuses.reduce( + (acc, { userId, status }) => { + acc[userId] = status; + return acc; + }, + {} as Record, + ); + }), + ); } authStatusFor$(userId: UserId): Observable { 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 408ed33c97..fc5060af5f 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 @@ -8,7 +8,6 @@ import { OrganizationAutoEnrollStatusResponse } from "../../admin-console/models import { CryptoService } from "../../platform/abstractions/crypto.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { AccountInfo, AccountService } from "../abstractions/account.service"; -import { AuthenticationStatus } from "../enums/authentication-status"; import { PasswordResetEnrollmentServiceImplementation } from "./password-reset-enrollment.service.implementation"; @@ -91,7 +90,6 @@ describe("PasswordResetEnrollmentServiceImplementation", () => { const user1AccountInfo: AccountInfo = { name: "Test User 1", email: "test1@email.com", - status: AuthenticationStatus.Unlocked, }; activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "userId" as UserId })); diff --git a/libs/common/src/platform/abstractions/state.service.ts b/libs/common/src/platform/abstractions/state.service.ts index 227cb43879..fd76cad6d1 100644 --- a/libs/common/src/platform/abstractions/state.service.ts +++ b/libs/common/src/platform/abstractions/state.service.ts @@ -1,6 +1,5 @@ import { Observable } from "rxjs"; -import { AdminAuthRequestStorable } from "../../auth/models/domain/admin-auth-req-storable"; import { KdfConfig } from "../../auth/models/domain/kdf-config"; import { BiometricKey } from "../../auth/types/biometric-key"; import { GeneratorOptions } from "../../tools/generator/generator-options"; @@ -33,10 +32,6 @@ export type InitOptions = { export abstract class StateService { accounts$: Observable<{ [userId: string]: T }>; activeAccount$: Observable; - /** - * @deprecated use accountService.activeAccount$ instead - */ - activeAccountUnlocked$: Observable; addAccount: (account: T) => Promise; setActiveUser: (userId: string) => Promise; @@ -128,11 +123,6 @@ export abstract class StateService { setDecryptedPinProtected: (value: EncString, options?: StorageOptions) => Promise; getDuckDuckGoSharedKey: (options?: StorageOptions) => Promise; setDuckDuckGoSharedKey: (value: string, options?: StorageOptions) => Promise; - getAdminAuthRequest: (options?: StorageOptions) => Promise; - setAdminAuthRequest: ( - adminAuthRequest: AdminAuthRequestStorable, - options?: StorageOptions, - ) => Promise; getEmail: (options?: StorageOptions) => Promise; setEmail: (value: string, options?: StorageOptions) => Promise; getEmailVerified: (options?: StorageOptions) => Promise; @@ -211,7 +201,5 @@ export abstract class StateService { setVaultTimeout: (value: number, options?: StorageOptions) => Promise; getVaultTimeoutAction: (options?: StorageOptions) => Promise; setVaultTimeoutAction: (value: string, options?: StorageOptions) => Promise; - getApproveLoginRequests: (options?: StorageOptions) => Promise; - setApproveLoginRequests: (value: boolean, options?: StorageOptions) => Promise; nextUpActiveUser: () => Promise; } diff --git a/libs/common/src/platform/models/domain/account.ts b/libs/common/src/platform/models/domain/account.ts index 753b15c09b..759a903514 100644 --- a/libs/common/src/platform/models/domain/account.ts +++ b/libs/common/src/platform/models/domain/account.ts @@ -1,6 +1,5 @@ import { Jsonify } from "type-fest"; -import { AdminAuthRequestStorable } from "../../../auth/models/domain/admin-auth-req-storable"; import { UriMatchStrategySetting } from "../../../models/domain/domain-service"; import { GeneratorOptions } from "../../../tools/generator/generator-options"; import { @@ -169,7 +168,6 @@ export class AccountSettings { protectedPin?: string; vaultTimeout?: number; vaultTimeoutAction?: string = "lock"; - approveLoginRequests?: boolean; /** @deprecated July 2023, left for migration purposes*/ pinProtected?: EncryptionPair = new EncryptionPair(); @@ -206,7 +204,6 @@ export class Account { profile?: AccountProfile = new AccountProfile(); settings?: AccountSettings = new AccountSettings(); tokens?: AccountTokens = new AccountTokens(); - adminAuthRequest?: Jsonify = null; constructor(init: Partial) { Object.assign(this, { @@ -230,7 +227,6 @@ export class Account { ...new AccountTokens(), ...init?.tokens, }, - adminAuthRequest: init?.adminAuthRequest, }); } @@ -245,7 +241,6 @@ export class Account { profile: AccountProfile.fromJSON(json?.profile), settings: AccountSettings.fromJSON(json?.settings), tokens: AccountTokens.fromJSON(json?.tokens), - adminAuthRequest: AdminAuthRequestStorable.fromJSON(json?.adminAuthRequest), }); } } diff --git a/libs/common/src/platform/services/crypto.service.spec.ts b/libs/common/src/platform/services/crypto.service.spec.ts index 6d0fdb1423..16e6d4aa63 100644 --- a/libs/common/src/platform/services/crypto.service.spec.ts +++ b/libs/common/src/platform/services/crypto.service.spec.ts @@ -4,7 +4,6 @@ import { firstValueFrom, of, tap } from "rxjs"; import { FakeAccountService, mockAccountServiceWith } from "../../../spec/fake-account-service"; import { FakeActiveUserState, FakeSingleUserState } from "../../../spec/fake-state"; import { FakeStateProvider } from "../../../spec/fake-state-provider"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { FakeMasterPasswordService } from "../../auth/services/master-password/fake-master-password.service"; import { CsprngArray } from "../../types/csprng"; import { UserId } from "../../types/guid"; @@ -273,15 +272,6 @@ describe("cryptoService", () => { await expect(cryptoService.setUserKey(null, mockUserId)).rejects.toThrow("No key provided."); }); - it("should update the user's lock state", async () => { - await cryptoService.setUserKey(mockUserKey, mockUserId); - - expect(accountService.mock.setAccountStatus).toHaveBeenCalledWith( - mockUserId, - AuthenticationStatus.Unlocked, - ); - }); - describe("Pin Key refresh", () => { let cryptoSvcMakePinKey: jest.SpyInstance; const protectedPin = @@ -353,23 +343,6 @@ describe("cryptoService", () => { accountService.activeAccount$ = accountService.activeAccountSubject.asObservable(); }); - it("sets the maximum account status of the active user id to locked when user id is not specified", async () => { - await cryptoService.clearKeys(); - expect(accountService.mock.setMaxAccountStatus).toHaveBeenCalledWith( - mockUserId, - AuthenticationStatus.Locked, - ); - }); - - it("sets the maximum account status of the specified user id to locked when user id is specified", async () => { - const userId = "someOtherUser" as UserId; - await cryptoService.clearKeys(userId); - expect(accountService.mock.setMaxAccountStatus).toHaveBeenCalledWith( - userId, - AuthenticationStatus.Locked, - ); - }); - describe.each([ USER_ENCRYPTED_ORGANIZATION_KEYS, USER_ENCRYPTED_PROVIDER_KEYS, diff --git a/libs/common/src/platform/services/crypto.service.ts b/libs/common/src/platform/services/crypto.service.ts index ae588cbc31..c091b6a5a9 100644 --- a/libs/common/src/platform/services/crypto.service.ts +++ b/libs/common/src/platform/services/crypto.service.ts @@ -7,7 +7,6 @@ import { ProfileProviderOrganizationResponse } from "../../admin-console/models/ import { ProfileProviderResponse } from "../../admin-console/models/response/profile-provider.response"; import { AccountService } from "../../auth/abstractions/account.service"; import { InternalMasterPasswordServiceAbstraction } from "../../auth/abstractions/master-password.service.abstraction"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { KdfConfig } from "../../auth/models/domain/kdf-config"; import { Utils } from "../../platform/misc/utils"; import { CsprngArray } from "../../types/csprng"; @@ -152,8 +151,6 @@ export class CryptoService implements CryptoServiceAbstraction { [userId, key] = await this.stateProvider.setUserState(USER_KEY, key, userId); await this.stateProvider.setUserState(USER_EVER_HAD_USER_KEY, true, userId); - await this.accountService.setAccountStatus(userId, AuthenticationStatus.Unlocked); - await this.storeAdditionalKeys(key, userId); } @@ -256,14 +253,13 @@ export class CryptoService implements CryptoServiceAbstraction { * Clears the user key. Clears all stored versions of the user keys as well, such as the biometrics key * @param userId The desired user */ - async clearUserKey(userId: UserId): Promise { + private async clearUserKey(userId: UserId): Promise { if (userId == null) { // nothing to do return; } // Set userId to ensure we have one for the account status update await this.stateProvider.setUserState(USER_KEY, null, userId); - await this.accountService.setMaxAccountStatus(userId, AuthenticationStatus.Locked); await this.clearAllStoredUserKeys(userId); } diff --git a/libs/common/src/platform/services/default-environment.service.spec.ts b/libs/common/src/platform/services/default-environment.service.spec.ts index a70ab3d179..dd504dc302 100644 --- a/libs/common/src/platform/services/default-environment.service.spec.ts +++ b/libs/common/src/platform/services/default-environment.service.spec.ts @@ -2,7 +2,6 @@ import { firstValueFrom } from "rxjs"; import { FakeStateProvider, awaitAsync } from "../../../spec"; import { FakeAccountService } from "../../../spec/fake-account-service"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { UserId } from "../../types/guid"; import { CloudRegion, Region } from "../abstractions/environment.service"; @@ -32,12 +31,10 @@ describe("EnvironmentService", () => { [testUser]: { name: "name", email: "email", - status: AuthenticationStatus.Locked, }, [alternateTestUser]: { name: "name", email: "email", - status: AuthenticationStatus.Locked, }, }); stateProvider = new FakeStateProvider(accountService); @@ -50,7 +47,6 @@ describe("EnvironmentService", () => { id: userId, email: "test@example.com", name: `Test Name ${userId}`, - status: AuthenticationStatus.Unlocked, }); await awaitAsync(); }; diff --git a/libs/common/src/platform/services/state.service.ts b/libs/common/src/platform/services/state.service.ts index b3e33cf362..3d512175a8 100644 --- a/libs/common/src/platform/services/state.service.ts +++ b/libs/common/src/platform/services/state.service.ts @@ -1,10 +1,8 @@ -import { BehaviorSubject, Observable, map } from "rxjs"; +import { BehaviorSubject } from "rxjs"; import { Jsonify, JsonValue } from "type-fest"; import { AccountService } from "../../auth/abstractions/account.service"; import { TokenService } from "../../auth/abstractions/token.service"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; -import { AdminAuthRequestStorable } from "../../auth/models/domain/admin-auth-req-storable"; import { KdfConfig } from "../../auth/models/domain/kdf-config"; import { BiometricKey } from "../../auth/types/biometric-key"; import { GeneratorOptions } from "../../tools/generator/generator-options"; @@ -68,8 +66,6 @@ export class StateService< protected activeAccountSubject = new BehaviorSubject(null); activeAccount$ = this.activeAccountSubject.asObservable(); - activeAccountUnlocked$: Observable; - private hasBeenInited = false; protected isRecoveredSession = false; @@ -89,13 +85,7 @@ export class StateService< protected tokenService: TokenService, private migrationRunner: MigrationRunner, protected useAccountCache: boolean = true, - ) { - this.activeAccountUnlocked$ = this.accountService.activeAccount$.pipe( - map((a) => { - return a?.status === AuthenticationStatus.Unlocked; - }), - ); - } + ) {} async init(initOptions: InitOptions = {}): Promise { // Deconstruct and apply defaults @@ -151,7 +141,6 @@ export class StateService< await this.accountService.addAccount(state.activeUserId as UserId, { name: activeDiskAccount.profile.name, email: activeDiskAccount.profile.email, - status: AuthenticationStatus.LoggedOut, }); } await this.accountService.switchAccount(state.activeUserId as UserId); @@ -177,16 +166,7 @@ export class StateService< // TODO: Temporary update to avoid routing all account status changes through account service for now. // The determination of state should be handled by the various services that control those values. - const token = await this.tokenService.getAccessToken(userId as UserId); - const autoKey = await this.getUserKeyAutoUnlock({ userId: userId }); - const accountStatus = - token == null - ? AuthenticationStatus.LoggedOut - : autoKey == null - ? AuthenticationStatus.Locked - : AuthenticationStatus.Unlocked; await this.accountService.addAccount(userId as UserId, { - status: accountStatus, name: diskAccount.profile.name, email: diskAccount.profile.email, }); @@ -206,7 +186,6 @@ export class StateService< await this.setLastActive(new Date().getTime(), { userId: account.profile.userId }); // TODO: Temporary update to avoid routing all account status changes through account service for now. await this.accountService.addAccount(account.profile.userId as UserId, { - status: AuthenticationStatus.Locked, name: account.profile.name, email: account.profile.email, }); @@ -568,37 +547,6 @@ export class StateService< : await this.secureStorageService.save(DDG_SHARED_KEY, value, options); } - async getAdminAuthRequest(options?: StorageOptions): Promise { - options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()); - - if (options?.userId == null) { - return null; - } - - const account = await this.getAccount(options); - - return account?.adminAuthRequest - ? AdminAuthRequestStorable.fromJSON(account.adminAuthRequest) - : null; - } - - async setAdminAuthRequest( - adminAuthRequest: AdminAuthRequestStorable, - options?: StorageOptions, - ): Promise { - options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()); - - if (options?.userId == null) { - return; - } - - const account = await this.getAccount(options); - - account.adminAuthRequest = adminAuthRequest?.toJSON(); - - await this.saveAccount(account, options); - } - async getEmail(options?: StorageOptions): Promise { return ( await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) @@ -1052,24 +1000,6 @@ export class StateService< ); } - async getApproveLoginRequests(options?: StorageOptions): Promise { - const approveLoginRequests = ( - await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions())) - )?.settings?.approveLoginRequests; - return approveLoginRequests; - } - - async setApproveLoginRequests(value: boolean, options?: StorageOptions): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()), - ); - account.settings.approveLoginRequests = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()), - ); - } - protected async getGlobals(options: StorageOptions): Promise { let globals: TGlobalState; if (this.useMemory(options.storageLocation)) { @@ -1406,15 +1336,12 @@ export class StateService< return state; }); - // TODO: Invert this logic, we should remove accounts based on logged out emit - await this.accountService.setAccountStatus(userId as UserId, AuthenticationStatus.LoggedOut); } // settings persist even on reset, and are not affected by this method protected resetAccount(account: TAccount) { const persistentAccountInformation = { settings: account.settings, - adminAuthRequest: account.adminAuthRequest, }; return Object.assign(this.createAccount(), persistentAccountInformation); } diff --git a/libs/common/src/platform/state/implementations/default-active-user-state.spec.ts b/libs/common/src/platform/state/implementations/default-active-user-state.spec.ts index 6e01b615d7..51a972a9dc 100644 --- a/libs/common/src/platform/state/implementations/default-active-user-state.spec.ts +++ b/libs/common/src/platform/state/implementations/default-active-user-state.spec.ts @@ -9,7 +9,6 @@ import { Jsonify } from "type-fest"; import { awaitAsync, trackEmissions } from "../../../../spec"; import { FakeStorageService } from "../../../../spec/fake-storage.service"; import { AccountInfo } from "../../../auth/abstractions/account.service"; -import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; import { UserId } from "../../../types/guid"; import { StorageServiceProvider } from "../../services/storage-service.provider"; import { StateDefinition } from "../state-definition"; @@ -84,7 +83,6 @@ describe("DefaultActiveUserState", () => { id: userId, email: `test${id}@example.com`, name: `Test User ${id}`, - status: AuthenticationStatus.Unlocked, }); await awaitAsync(); }; diff --git a/libs/common/src/platform/state/state-definitions.ts b/libs/common/src/platform/state/state-definitions.ts index ed6ef1590d..518e5c51d6 100644 --- a/libs/common/src/platform/state/state-definitions.ts +++ b/libs/common/src/platform/state/state-definitions.ts @@ -45,6 +45,9 @@ export const LOGIN_EMAIL_DISK = new StateDefinition("loginEmail", "disk", { web: "disk-local", }); export const LOGIN_STRATEGY_MEMORY = new StateDefinition("loginStrategy", "memory"); +export const AUTH_REQUEST_DISK_LOCAL = new StateDefinition("authRequestLocal", "disk", { + web: "disk-local", +}); export const SSO_DISK = new StateDefinition("ssoLogin", "disk"); export const TOKEN_DISK = new StateDefinition("token", "disk"); export const TOKEN_DISK_LOCAL = new StateDefinition("tokenDiskLocal", "disk", { diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 6306eb1e28..c7a8f3f091 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -565,8 +565,12 @@ export class ApiService implements ApiServiceAbstraction { return this.send("PUT", "/ciphers/share", request, true, false); } - putCipherCollections(id: string, request: CipherCollectionsRequest): Promise { - return this.send("PUT", "/ciphers/" + id + "/collections", request, true, false); + async putCipherCollections( + id: string, + request: CipherCollectionsRequest, + ): Promise { + const response = await this.send("PUT", "/ciphers/" + id + "/collections", request, true, true); + return new CipherResponse(response); } putCipherCollectionsAdmin(id: string, request: CipherCollectionsRequest): Promise { diff --git a/libs/common/src/services/event/event-collection.service.ts b/libs/common/src/services/event/event-collection.service.ts index 2d2b553062..641c1b4d44 100644 --- a/libs/common/src/services/event/event-collection.service.ts +++ b/libs/common/src/services/event/event-collection.service.ts @@ -3,7 +3,7 @@ import { firstValueFrom, map, from, zip } from "rxjs"; import { EventCollectionService as EventCollectionServiceAbstraction } from "../../abstractions/event/event-collection.service"; import { EventUploadService } from "../../abstractions/event/event-upload.service"; import { OrganizationService } from "../../admin-console/abstractions/organization/organization.service.abstraction"; -import { AccountService } from "../../auth/abstractions/account.service"; +import { AuthService } from "../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { EventType } from "../../enums"; import { EventData } from "../../models/data/event.data"; @@ -18,7 +18,7 @@ export class EventCollectionService implements EventCollectionServiceAbstraction private stateProvider: StateProvider, private organizationService: OrganizationService, private eventUploadService: EventUploadService, - private accountService: AccountService, + private authService: AuthService, ) {} /** Adds an event to the active user's event collection @@ -71,12 +71,12 @@ export class EventCollectionService implements EventCollectionServiceAbstraction const cipher$ = from(this.cipherService.get(cipherId)); - const [accountInfo, orgIds, cipher] = await firstValueFrom( - zip(this.accountService.activeAccount$, orgIds$, cipher$), + const [authStatus, orgIds, cipher] = await firstValueFrom( + zip(this.authService.activeAccountStatus$, orgIds$, cipher$), ); // The user must be authorized - if (accountInfo.status != AuthenticationStatus.Unlocked) { + if (authStatus != AuthenticationStatus.Unlocked) { return false; } diff --git a/libs/common/src/services/event/event-upload.service.ts b/libs/common/src/services/event/event-upload.service.ts index 4ee4300c39..6f229751bf 100644 --- a/libs/common/src/services/event/event-upload.service.ts +++ b/libs/common/src/services/event/event-upload.service.ts @@ -2,7 +2,7 @@ import { firstValueFrom, map } from "rxjs"; import { ApiService } from "../../abstractions/api.service"; import { EventUploadService as EventUploadServiceAbstraction } from "../../abstractions/event/event-upload.service"; -import { AccountService } from "../../auth/abstractions/account.service"; +import { AuthService } from "../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { EventData } from "../../models/data/event.data"; import { EventRequest } from "../../models/request/event.request"; @@ -18,7 +18,7 @@ export class EventUploadService implements EventUploadServiceAbstraction { private apiService: ApiService, private stateProvider: StateProvider, private logService: LogService, - private accountService: AccountService, + private authService: AuthService, ) {} init(checkOnInterval: boolean) { @@ -43,13 +43,16 @@ export class EventUploadService implements EventUploadServiceAbstraction { userId = await firstValueFrom(this.stateProvider.activeUserId$); } - // Get the auth status from the provided user or the active user - const userAuth$ = this.accountService.accounts$.pipe( - map((accounts) => accounts[userId]?.status === AuthenticationStatus.Unlocked), - ); + if (!userId) { + return; + } - const isAuthenticated = await firstValueFrom(userAuth$); - if (!isAuthenticated) { + const isUnlocked = await firstValueFrom( + this.authService + .authStatusFor$(userId) + .pipe(map((status) => status === AuthenticationStatus.Unlocked)), + ); + if (!isUnlocked) { return; } diff --git a/libs/common/src/services/notifications.service.ts b/libs/common/src/services/notifications.service.ts index 4dc8772d00..7dc54b849f 100644 --- a/libs/common/src/services/notifications.service.ts +++ b/libs/common/src/services/notifications.service.ts @@ -2,6 +2,7 @@ import * as signalR from "@microsoft/signalr"; import * as signalRMsgPack from "@microsoft/signalr-protocol-msgpack"; import { firstValueFrom } from "rxjs"; +import { AuthRequestServiceAbstraction } from "../../../auth/src/common/abstractions"; import { ApiService } from "../abstractions/api.service"; import { NotificationsService as NotificationsServiceAbstraction } from "../abstractions/notifications.service"; import { AuthService } from "../auth/abstractions/auth.service"; @@ -18,6 +19,7 @@ import { EnvironmentService } from "../platform/abstractions/environment.service import { LogService } from "../platform/abstractions/log.service"; import { MessagingService } from "../platform/abstractions/messaging.service"; import { StateService } from "../platform/abstractions/state.service"; +import { UserId } from "../types/guid"; import { SyncService } from "../vault/abstractions/sync/sync.service.abstraction"; export class NotificationsService implements NotificationsServiceAbstraction { @@ -37,6 +39,7 @@ export class NotificationsService implements NotificationsServiceAbstraction { private logoutCallback: (expired: boolean) => Promise, private stateService: StateService, private authService: AuthService, + private authRequestService: AuthRequestServiceAbstraction, private messagingService: MessagingService, ) { this.environmentService.environment$.subscribe(() => { @@ -199,10 +202,13 @@ export class NotificationsService implements NotificationsServiceAbstraction { await this.syncService.syncDeleteSend(notification.payload as SyncSendNotification); break; case NotificationType.AuthRequest: - if (await this.stateService.getApproveLoginRequests()) { - this.messagingService.send("openLoginApproval", { - notificationId: notification.payload.id, - }); + { + const userId = await this.stateService.getUserId(); + if (await this.authRequestService.getAcceptAuthRequests(userId as UserId)) { + this.messagingService.send("openLoginApproval", { + notificationId: notification.payload.id, + }); + } } break; default: diff --git a/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts b/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts index 0594de741c..243b644dd8 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts +++ b/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts @@ -138,7 +138,6 @@ describe("VaultTimeoutService", () => { if (globalSetups?.userId) { accountService.activeAccountSubject.next({ id: globalSetups.userId as UserId, - status: accounts[globalSetups.userId]?.authStatus, email: null, name: null, }); diff --git a/libs/common/src/state-migrations/migrate.ts b/libs/common/src/state-migrations/migrate.ts index 76f0d7fd46..77b949126f 100644 --- a/libs/common/src/state-migrations/migrate.ts +++ b/libs/common/src/state-migrations/migrate.ts @@ -52,6 +52,7 @@ import { DeleteInstalledVersion } from "./migrations/52-delete-installed-version import { DeviceTrustCryptoServiceStateProviderMigrator } from "./migrations/53-migrate-device-trust-crypto-svc-to-state-providers"; import { SendMigrator } from "./migrations/54-move-encrypted-sends"; import { MoveMasterKeyStateToProviderMigrator } from "./migrations/55-move-master-key-state-to-provider"; +import { AuthRequestMigrator } from "./migrations/56-move-auth-requests"; import { RemoveLegacyEtmKeyMigrator } from "./migrations/6-remove-legacy-etm-key"; import { MoveBiometricAutoPromptToAccount } from "./migrations/7-move-biometric-auto-prompt-to-account"; import { MoveStateVersionMigrator } from "./migrations/8-move-state-version"; @@ -59,7 +60,7 @@ import { MoveBrowserSettingsToGlobal } from "./migrations/9-move-browser-setting import { MinVersionMigrator } from "./migrations/min-version"; export const MIN_VERSION = 3; -export const CURRENT_VERSION = 55; +export const CURRENT_VERSION = 56; export type MinVersion = typeof MIN_VERSION; @@ -117,7 +118,8 @@ export function createMigrationBuilder() { .with(DeleteInstalledVersion, 51, 52) .with(DeviceTrustCryptoServiceStateProviderMigrator, 52, 53) .with(SendMigrator, 53, 54) - .with(MoveMasterKeyStateToProviderMigrator, 54, CURRENT_VERSION); + .with(MoveMasterKeyStateToProviderMigrator, 54, 55) + .with(AuthRequestMigrator, 55, CURRENT_VERSION); } export async function currentVersion( diff --git a/libs/common/src/state-migrations/migrations/56-move-auth-requests.spec.ts b/libs/common/src/state-migrations/migrations/56-move-auth-requests.spec.ts new file mode 100644 index 0000000000..f6bddbce7d --- /dev/null +++ b/libs/common/src/state-migrations/migrations/56-move-auth-requests.spec.ts @@ -0,0 +1,138 @@ +import { MockProxy } from "jest-mock-extended"; + +import { KeyDefinitionLike, MigrationHelper } from "../migration-helper"; +import { mockMigrationHelper } from "../migration-helper.spec"; + +import { AuthRequestMigrator } from "./56-move-auth-requests"; + +function exampleJSON() { + return { + global: { + otherStuff: "otherStuff1", + }, + authenticatedAccounts: ["FirstAccount", "SecondAccount"], + FirstAccount: { + settings: { + otherStuff: "otherStuff2", + approveLoginRequests: true, + }, + otherStuff: "otherStuff3", + adminAuthRequest: { + id: "id1", + privateKey: "privateKey1", + }, + }, + SecondAccount: { + settings: { + otherStuff: "otherStuff4", + }, + otherStuff: "otherStuff5", + }, + }; +} + +function rollbackJSON() { + return { + user_FirstAccount_authRequestLocal_adminAuthRequest: { + id: "id1", + privateKey: "privateKey1", + }, + user_FirstAccount_authRequestLocal_acceptAuthRequests: true, + global: { + otherStuff: "otherStuff1", + }, + authenticatedAccounts: ["FirstAccount", "SecondAccount"], + FirstAccount: { + settings: { + otherStuff: "otherStuff2", + }, + otherStuff: "otherStuff3", + }, + SecondAccount: { + settings: { + otherStuff: "otherStuff4", + }, + otherStuff: "otherStuff5", + }, + }; +} + +const ADMIN_AUTH_REQUEST_KEY: KeyDefinitionLike = { + stateDefinition: { + name: "authRequestLocal", + }, + key: "adminAuthRequest", +}; + +const ACCEPT_AUTH_REQUESTS_KEY: KeyDefinitionLike = { + stateDefinition: { + name: "authRequestLocal", + }, + key: "acceptAuthRequests", +}; + +describe("AuthRequestMigrator", () => { + let helper: MockProxy; + let sut: AuthRequestMigrator; + + describe("migrate", () => { + beforeEach(() => { + helper = mockMigrationHelper(exampleJSON(), 55); + sut = new AuthRequestMigrator(55, 56); + }); + + it("removes the existing adminAuthRequest and approveLoginRequests", async () => { + await sut.migrate(helper); + + expect(helper.set).toHaveBeenCalledWith("FirstAccount", { + settings: { + otherStuff: "otherStuff2", + }, + otherStuff: "otherStuff3", + }); + expect(helper.set).not.toHaveBeenCalledWith("SecondAccount"); + }); + + it("sets the adminAuthRequest and approveLoginRequests under the new key definitions", async () => { + await sut.migrate(helper); + + expect(helper.setToUser).toHaveBeenCalledWith("FirstAccount", ADMIN_AUTH_REQUEST_KEY, { + id: "id1", + privateKey: "privateKey1", + }); + + expect(helper.setToUser).toHaveBeenCalledWith("FirstAccount", ACCEPT_AUTH_REQUESTS_KEY, true); + expect(helper.setToUser).not.toHaveBeenCalledWith("SecondAccount"); + }); + }); + + describe("rollback", () => { + beforeEach(() => { + helper = mockMigrationHelper(rollbackJSON(), 56); + sut = new AuthRequestMigrator(55, 56); + }); + + it("nulls the new adminAuthRequest and acceptAuthRequests values", async () => { + await sut.rollback(helper); + + expect(helper.setToUser).toHaveBeenCalledWith("FirstAccount", ADMIN_AUTH_REQUEST_KEY, null); + expect(helper.setToUser).toHaveBeenCalledWith("FirstAccount", ACCEPT_AUTH_REQUESTS_KEY, null); + }); + + it("sets back the adminAuthRequest and approveLoginRequests under old account object", async () => { + await sut.rollback(helper); + + expect(helper.set).toHaveBeenCalledWith("FirstAccount", { + adminAuthRequest: { + id: "id1", + privateKey: "privateKey1", + }, + settings: { + otherStuff: "otherStuff2", + approveLoginRequests: true, + }, + otherStuff: "otherStuff3", + }); + }); + }); +}); diff --git a/libs/common/src/state-migrations/migrations/56-move-auth-requests.ts b/libs/common/src/state-migrations/migrations/56-move-auth-requests.ts new file mode 100644 index 0000000000..4fec3b2de0 --- /dev/null +++ b/libs/common/src/state-migrations/migrations/56-move-auth-requests.ts @@ -0,0 +1,104 @@ +import { KeyDefinitionLike, MigrationHelper } from "../migration-helper"; +import { Migrator } from "../migrator"; + +type AdminAuthRequestStorable = { + id: string; + privateKey: string; +}; + +type ExpectedAccountType = { + adminAuthRequest?: AdminAuthRequestStorable; + settings?: { + approveLoginRequests?: boolean; + }; +}; + +const ADMIN_AUTH_REQUEST_KEY: KeyDefinitionLike = { + stateDefinition: { + name: "authRequestLocal", + }, + key: "adminAuthRequest", +}; + +const ACCEPT_AUTH_REQUESTS_KEY: KeyDefinitionLike = { + stateDefinition: { + name: "authRequestLocal", + }, + key: "acceptAuthRequests", +}; + +export class AuthRequestMigrator extends Migrator<55, 56> { + async migrate(helper: MigrationHelper): Promise { + const accounts = await helper.getAccounts(); + + async function migrateAccount(userId: string, account: ExpectedAccountType): Promise { + let updatedAccount = false; + + // Migrate admin auth request + const existingAdminAuthRequest = account?.adminAuthRequest; + + if (existingAdminAuthRequest != null) { + await helper.setToUser(userId, ADMIN_AUTH_REQUEST_KEY, existingAdminAuthRequest); + delete account.adminAuthRequest; + updatedAccount = true; + } + + // Migrate approve login requests + const existingApproveLoginRequests = account?.settings?.approveLoginRequests; + + if (existingApproveLoginRequests != null) { + await helper.setToUser(userId, ACCEPT_AUTH_REQUESTS_KEY, existingApproveLoginRequests); + delete account.settings.approveLoginRequests; + updatedAccount = true; + } + + if (updatedAccount) { + // Save the migrated account + await helper.set(userId, account); + } + } + + await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]); + } + + async rollback(helper: MigrationHelper): Promise { + const accounts = await helper.getAccounts(); + + async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise { + let updatedAccount = false; + // Rollback admin auth request + const migratedAdminAuthRequest: AdminAuthRequestStorable = await helper.getFromUser( + userId, + ADMIN_AUTH_REQUEST_KEY, + ); + + if (migratedAdminAuthRequest != null) { + account.adminAuthRequest = migratedAdminAuthRequest; + updatedAccount = true; + } + + await helper.setToUser(userId, ADMIN_AUTH_REQUEST_KEY, null); + + // Rollback approve login requests + const migratedAcceptAuthRequest: boolean = await helper.getFromUser( + userId, + ACCEPT_AUTH_REQUESTS_KEY, + ); + + if (migratedAcceptAuthRequest != null) { + account.settings = Object.assign(account.settings ?? {}, { + approveLoginRequests: migratedAcceptAuthRequest, + }); + updatedAccount = true; + } + + await helper.setToUser(userId, ACCEPT_AUTH_REQUESTS_KEY, null); + + if (updatedAccount) { + await helper.set(userId, account); + } + } + + await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]); + } +} diff --git a/libs/common/src/tools/generator/state/buffered-key-definition.spec.ts b/libs/common/src/tools/generator/state/buffered-key-definition.spec.ts new file mode 100644 index 0000000000..b056cba397 --- /dev/null +++ b/libs/common/src/tools/generator/state/buffered-key-definition.spec.ts @@ -0,0 +1,119 @@ +import { GENERATOR_DISK, UserKeyDefinition } from "../../../platform/state"; + +import { BufferedKeyDefinition } from "./buffered-key-definition"; + +describe("BufferedKeyDefinition", () => { + const deserializer = (jsonValue: number) => jsonValue + 1; + + describe("toKeyDefinition", () => { + it("should create a key definition", () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + cleanupDelayMs: 5, + clearOn: [], + }); + + const result = key.toKeyDefinition(); + + expect(result).toBeInstanceOf(UserKeyDefinition); + expect(result.stateDefinition).toBe(GENERATOR_DISK); + expect(result.key).toBe("test"); + expect(result.deserializer(1)).toEqual(2); + expect(result.cleanupDelayMs).toEqual(5); + }); + }); + + describe("shouldOverwrite", () => { + it("should call the shouldOverwrite function when its defined", async () => { + const shouldOverwrite = jest.fn(() => true); + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + shouldOverwrite, + clearOn: [], + }); + + const result = await key.shouldOverwrite(true); + + expect(shouldOverwrite).toHaveBeenCalledWith(true); + expect(result).toStrictEqual(true); + }); + + it("should return true when shouldOverwrite is not defined and the input is truthy", async () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + clearOn: [], + }); + + const result = await key.shouldOverwrite(1); + + expect(result).toStrictEqual(true); + }); + + it("should return false when shouldOverwrite is not defined and the input is falsy", async () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + clearOn: [], + }); + + const result = await key.shouldOverwrite(0); + + expect(result).toStrictEqual(false); + }); + }); + + describe("map", () => { + it("should call the map function when its defined", async () => { + const map = jest.fn((value: number) => Promise.resolve(`${value}`)); + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + map, + clearOn: [], + }); + + const result = await key.map(1, true); + + expect(map).toHaveBeenCalledWith(1, true); + expect(result).toStrictEqual("1"); + }); + + it("should fall back to an identity function when map is not defined", async () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { deserializer, clearOn: [] }); + + const result = await key.map(1, null); + + expect(result).toStrictEqual(1); + }); + }); + + describe("isValid", () => { + it("should call the isValid function when its defined", async () => { + const isValid = jest.fn(() => Promise.resolve(true)); + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { + deserializer, + isValid, + clearOn: [], + }); + + const result = await key.isValid(1, true); + + expect(isValid).toHaveBeenCalledWith(1, true); + expect(result).toStrictEqual(true); + }); + + it("should return true when isValid is not defined and the input is truthy", async () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { deserializer, clearOn: [] }); + + const result = await key.isValid(1, null); + + expect(result).toStrictEqual(true); + }); + + it("should return false when isValid is not defined and the input is falsy", async () => { + const key = new BufferedKeyDefinition(GENERATOR_DISK, "test", { deserializer, clearOn: [] }); + + const result = await key.isValid(0, null); + + expect(result).toStrictEqual(false); + }); + }); +}); diff --git a/libs/common/src/tools/generator/state/buffered-key-definition.ts b/libs/common/src/tools/generator/state/buffered-key-definition.ts new file mode 100644 index 0000000000..5457410f80 --- /dev/null +++ b/libs/common/src/tools/generator/state/buffered-key-definition.ts @@ -0,0 +1,100 @@ +import { UserKeyDefinition, UserKeyDefinitionOptions } from "../../../platform/state"; +// eslint-disable-next-line -- `StateDefinition` used as an argument +import { StateDefinition } from "../../../platform/state/state-definition"; + +/** A set of options for customizing the behavior of a {@link BufferedKeyDefinition} + */ +export type BufferedKeyDefinitionOptions = + UserKeyDefinitionOptions & { + /** Checks whether the input type can be converted to the output type. + * @param input the data that is rolling over. + * @returns `true` if the definition is valid, otherwise `false`. If this + * function is not specified, any truthy input is valid. + * + * @remarks this is intended for cases where you're working with validated or + * signed data. It should be used to prevent data from being "laundered" through + * synchronized state. + */ + isValid?: (input: Input, dependency: Dependency) => Promise; + + /** Transforms the input data format to its output format. + * @param input the data that is rolling over. + * @returns the converted value. If this function is not specified, the value + * is asserted as the output type. + * + * @remarks This is intended for converting between, say, a replication format + * and a disk format or rotating encryption keys. + */ + map?: (input: Input, dependency: Dependency) => Promise; + + /** Checks whether an overwrite should occur + * @param dependency the latest value from the dependency observable provided + * to the buffered state. + * @returns `true` if a overwrite should occur, otherwise `false`. If this + * function is not specified, overwrites occur when the dependency is truthy. + * + * @remarks This is intended for waiting to overwrite until a dependency becomes + * available (e.g. an encryption key or a user confirmation). + */ + shouldOverwrite?: (dependency: Dependency) => boolean; + }; + +/** Storage and mapping settings for data stored by a `BufferedState`. + */ +export class BufferedKeyDefinition { + /** + * Defines a buffered state + * @param stateDefinition The domain of the buffer + * @param key Domain key that identifies the buffered value. This key must + * not be reused in any capacity. + * @param options Configures the operation of the buffered state. + */ + constructor( + readonly stateDefinition: StateDefinition, + readonly key: string, + readonly options: BufferedKeyDefinitionOptions, + ) {} + + /** Converts the buffered key definition to a state provider + * key definition + */ + toKeyDefinition() { + const bufferedKey = new UserKeyDefinition(this.stateDefinition, this.key, this.options); + + return bufferedKey; + } + + /** Checks whether the dependency triggers an overwrite. */ + shouldOverwrite(dependency: Dependency) { + const shouldOverwrite = this.options?.shouldOverwrite; + if (shouldOverwrite) { + return shouldOverwrite(dependency); + } + + return dependency ? true : false; + } + + /** Converts the input data format to its output format. + * @returns the converted value. + */ + map(input: Input, dependency: Dependency) { + const map = this.options?.map; + if (map) { + return map(input, dependency); + } + + return Promise.resolve(input as unknown as Output); + } + + /** Checks whether the input type can be converted to the output type. + * @returns `true` if the definition is valid, otherwise `false`. + */ + isValid(input: Input, dependency: Dependency) { + const isValid = this.options?.isValid; + if (isValid) { + return isValid(input, dependency); + } + + return Promise.resolve(input ? true : false); + } +} diff --git a/libs/common/src/tools/generator/state/buffered-state.spec.ts b/libs/common/src/tools/generator/state/buffered-state.spec.ts new file mode 100644 index 0000000000..7f9722d384 --- /dev/null +++ b/libs/common/src/tools/generator/state/buffered-state.spec.ts @@ -0,0 +1,375 @@ +import { BehaviorSubject, firstValueFrom, of } from "rxjs"; + +import { + mockAccountServiceWith, + FakeStateProvider, + awaitAsync, + trackEmissions, +} from "../../../../spec"; +import { GENERATOR_DISK, KeyDefinition } from "../../../platform/state"; +import { UserId } from "../../../types/guid"; + +import { BufferedKeyDefinition } from "./buffered-key-definition"; +import { BufferedState } from "./buffered-state"; + +const SomeUser = "SomeUser" as UserId; +const accountService = mockAccountServiceWith(SomeUser); +type SomeType = { foo: boolean; bar: boolean }; + +const SOME_KEY = new KeyDefinition(GENERATOR_DISK, "fooBar", { + deserializer: (jsonValue) => jsonValue as SomeType, +}); +const BUFFER_KEY = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + clearOn: [], +}); + +describe("BufferedState", () => { + describe("state$", function () { + it("reads from the output state", async () => { + const provider = new FakeStateProvider(accountService); + const value = { foo: true, bar: false }; + const outputState = provider.getUser(SomeUser, SOME_KEY); + await outputState.update(() => value); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(value); + }); + + it("updates when the output state updates", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + const secondValue = { foo: true, bar: true }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = trackEmissions(bufferedState.state$); + await outputState.update(() => secondValue); + await awaitAsync(); + + expect(result).toEqual([firstValue, secondValue]); + }); + + // this test is important for data migrations, which set + // the buffered state without using the `BufferedState` abstraction. + it.each([[null], [undefined]])( + "reads from the output state when the buffered state is '%p'", + async (bufferValue) => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + await provider.setUserState(BUFFER_KEY.toKeyDefinition(), bufferValue, SomeUser); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(firstValue); + }, + ); + + // also important for data migrations + it("rolls over pending values from the buffered state immediately by default", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + await outputState.update(() => ({ foo: true, bar: false })); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + const bufferedValue = { foo: true, bar: true }; + await provider.setUserState(BUFFER_KEY.toKeyDefinition(), bufferedValue, SomeUser); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(bufferedValue); + }); + + // also important for data migrations + it("reads from the output state when its dependency is false", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const value = { foo: true, bar: false }; + await outputState.update(() => value); + const dependency = new BehaviorSubject(false).asObservable(); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState, dependency); + await provider.setUserState(BUFFER_KEY.toKeyDefinition(), { foo: true, bar: true }, SomeUser); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(value); + }); + + // also important for data migrations + it("overwrites the output state when its dependency emits a truthy value", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const dependency = new BehaviorSubject(false); + const bufferedState = new BufferedState( + provider, + BUFFER_KEY, + outputState, + dependency.asObservable(), + ); + const bufferedValue = { foo: true, bar: true }; + await provider.setUserState(BUFFER_KEY.toKeyDefinition(), bufferedValue, SomeUser); + + const result = trackEmissions(bufferedState.state$); + dependency.next(true); + await awaitAsync(); + + expect(result).toEqual([firstValue, bufferedValue]); + }); + + it("overwrites the output state when shouldOverwrite returns a truthy value", async () => { + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + shouldOverwrite: () => true, + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + await outputState.update(() => ({ foo: true, bar: false })); + const bufferedState = new BufferedState(provider, bufferedKey, outputState); + const bufferedValue = { foo: true, bar: true }; + await provider.setUserState(bufferedKey.toKeyDefinition(), bufferedValue, SomeUser); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(bufferedValue); + }); + + it("reads from the output state when shouldOverwrite returns a falsy value", async () => { + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + shouldOverwrite: () => false, + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const value = { foo: true, bar: false }; + await outputState.update(() => value); + const bufferedState = new BufferedState(provider, bufferedKey, outputState); + await provider.setUserState( + bufferedKey.toKeyDefinition(), + { foo: true, bar: true }, + SomeUser, + ); + + const result = await firstValueFrom(bufferedState.state$); + + expect(result).toEqual(value); + }); + + it("replaces the output state when shouldOverwrite transforms its dependency to a truthy value", async () => { + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + shouldOverwrite: (dependency) => !dependency, + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const dependency = new BehaviorSubject(true); + const bufferedState = new BufferedState( + provider, + bufferedKey, + outputState, + dependency.asObservable(), + ); + const bufferedValue = { foo: true, bar: true }; + await provider.setUserState(bufferedKey.toKeyDefinition(), bufferedValue, SomeUser); + + const result = trackEmissions(bufferedState.state$); + dependency.next(false); + await awaitAsync(); + + expect(result).toEqual([firstValue, bufferedValue]); + }); + }); + + describe("userId", () => { + const AnotherUser = "anotherUser" as UserId; + + it.each([[SomeUser], [AnotherUser]])("gets the userId", (userId) => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(userId, SOME_KEY); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = bufferedState.userId; + + expect(result).toEqual(userId); + }); + }); + + describe("update", () => { + it("updates state$", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + const secondValue = { foo: true, bar: true }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.update(() => secondValue); + await awaitAsync(); + + expect(result).toEqual([firstValue, secondValue]); + }); + + it("respects update options", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + const secondValue = { foo: true, bar: true }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.update(() => secondValue, { + shouldUpdate: (_, latest) => latest, + combineLatestWith: of(false), + }); + await awaitAsync(); + + expect(result).toEqual([firstValue]); + }); + }); + + describe("buffer", () => { + it("updates state$ once per overwrite", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + const secondValue = { foo: true, bar: true }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer(secondValue); + await awaitAsync(); + + expect(result).toEqual([firstValue, secondValue]); + }); + + it("emits the output state when its dependency is false", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const dependency = new BehaviorSubject(false); + const bufferedState = new BufferedState( + provider, + BUFFER_KEY, + outputState, + dependency.asObservable(), + ); + const bufferedValue = { foo: true, bar: true }; + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer(bufferedValue); + await awaitAsync(); + + expect(result).toEqual([firstValue, firstValue]); + }); + + it("replaces the output state when its dependency becomes true", async () => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const dependency = new BehaviorSubject(false); + const bufferedState = new BufferedState( + provider, + BUFFER_KEY, + outputState, + dependency.asObservable(), + ); + const bufferedValue = { foo: true, bar: true }; + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer(bufferedValue); + dependency.next(true); + await awaitAsync(); + + expect(result).toEqual([firstValue, firstValue, bufferedValue]); + }); + + it.each([[null], [undefined]])("ignores `%p`", async (bufferedValue) => { + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, BUFFER_KEY, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer(bufferedValue); + await awaitAsync(); + + expect(result).toEqual([firstValue]); + }); + + it("discards the buffered data when isValid returns false", async () => { + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + isValid: () => Promise.resolve(false), + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, bufferedKey, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer({ foo: true, bar: true }); + await awaitAsync(); + + expect(result).toEqual([firstValue, firstValue]); + }); + + it("overwrites the output when isValid returns true", async () => { + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + isValid: () => Promise.resolve(true), + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, bufferedKey, outputState); + const bufferedValue = { foo: true, bar: true }; + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer(bufferedValue); + await awaitAsync(); + + expect(result).toEqual([firstValue, bufferedValue]); + }); + + it("maps the buffered data when it overwrites the state", async () => { + const mappedValue = { foo: true, bar: true }; + const bufferedKey = new BufferedKeyDefinition(GENERATOR_DISK, "fooBar_buffer", { + deserializer: (jsonValue) => jsonValue as SomeType, + map: () => Promise.resolve(mappedValue), + clearOn: [], + }); + const provider = new FakeStateProvider(accountService); + const outputState = provider.getUser(SomeUser, SOME_KEY); + const firstValue = { foo: true, bar: false }; + await outputState.update(() => firstValue); + const bufferedState = new BufferedState(provider, bufferedKey, outputState); + + const result = trackEmissions(bufferedState.state$); + await bufferedState.buffer({ foo: false, bar: false }); + await awaitAsync(); + + expect(result).toEqual([firstValue, mappedValue]); + }); + }); +}); diff --git a/libs/common/src/tools/generator/state/buffered-state.ts b/libs/common/src/tools/generator/state/buffered-state.ts new file mode 100644 index 0000000000..42b14b815c --- /dev/null +++ b/libs/common/src/tools/generator/state/buffered-state.ts @@ -0,0 +1,144 @@ +import { Observable, combineLatest, concatMap, filter, map, of } from "rxjs"; + +import { + StateProvider, + SingleUserState, + CombinedState, + StateUpdateOptions, +} from "../../../platform/state"; + +import { BufferedKeyDefinition } from "./buffered-key-definition"; + +/** Stateful storage that overwrites one state with a buffered state. + * When a overwrite occurs, the input state is automatically deleted. + * @remarks The buffered state can only overwrite non-nullish values. If the + * buffer key contains `null` or `undefined`, it will do nothing. + */ +export class BufferedState implements SingleUserState { + /** + * Instantiate a buffered state + * @param provider constructs the buffer. + * @param key defines the buffer location. + * @param output updates when a overwrite occurs + * @param dependency$ provides data the buffer depends upon to evaluate and + * transform its data. If this is omitted, then `true` is injected as + * a dependency, which with a default output will trigger a overwrite immediately. + * + * @remarks `dependency$` enables overwrite control during dynamic circumstances, + * such as when a overwrite should occur only if a user key is available. + */ + constructor( + provider: StateProvider, + private key: BufferedKeyDefinition, + private output: SingleUserState, + dependency$: Observable = null, + ) { + this.bufferState = provider.getUser(output.userId, key.toKeyDefinition()); + + const watching = [ + this.bufferState.state$, + this.output.state$, + dependency$ ?? of(true as unknown as Dependency), + ] as const; + + this.state$ = combineLatest(watching).pipe( + concatMap(async ([input, output, dependency]) => { + const normalized = input ?? null; + + const canOverwrite = normalized !== null && key.shouldOverwrite(dependency); + if (canOverwrite) { + await this.updateOutput(dependency); + + // prevent duplicate updates by suppressing the update + return [false, output] as const; + } + + return [true, output] as const; + }), + filter(([updated]) => updated), + map(([, output]) => output), + ); + + this.combinedState$ = this.state$.pipe(map((state) => [this.output.userId, state])); + + this.bufferState$ = this.bufferState.state$; + } + + private bufferState: SingleUserState; + + private async updateOutput(dependency: Dependency) { + // retrieve the latest input value + let input: Input; + await this.bufferState.update((state) => state, { + shouldUpdate: (state) => { + input = state; + return false; + }, + }); + + // bail if this update lost the race with the last update + if (input === null) { + return; + } + + // destroy invalid data and bail + if (!(await this.key.isValid(input, dependency))) { + await this.bufferState.update(() => null); + return; + } + + // overwrite anything left to the output; the updates need to be awaited with `Promise.all` + // so that `inputState.update(() => null)` runs before `shouldUpdate` reads the value (above). + // This lets the emission from `this.outputState.update` renter the `concatMap`. If the + // awaits run in sequence, it can win the race and cause a double emission. + const output = await this.key.map(input, dependency); + await Promise.all([this.output.update(() => output), this.bufferState.update(() => null)]); + + return; + } + + /** {@link SingleUserState.userId} */ + get userId() { + return this.output.userId; + } + + /** Observes changes to the output state. This updates when the output + * state updates, when the buffer is moved to the output, and when `BufferedState.buffer` + * is invoked. + */ + readonly state$: Observable; + + /** {@link SingleUserState.combinedState$} */ + readonly combinedState$: Observable>; + + /** Buffers a value state. The buffered state overwrites the output + * state when a subscription occurs. + * @param value the state to roll over. Setting this to `null` or `undefined` + * has no effect. + */ + async buffer(value: Input): Promise { + const normalized = value ?? null; + if (normalized !== null) { + await this.bufferState.update(() => normalized); + } + } + + /** The data presently being buffered. This emits the pending value each time + * new buffer data is provided. It emits null when the buffer is empty. + */ + readonly bufferState$: Observable; + + /** Updates the output state. + * @param configureState a callback that returns an updated output + * state. The callback receives the state's present value as its + * first argument and the dependencies listed in `options.combinedLatestWith` + * as its second argument. + * @param options configures how the update is applied. See {@link StateUpdateOptions}. + */ + update( + configureState: (state: Output, dependencies: TCombine) => Output, + options: StateUpdateOptions = null, + ): Promise { + return this.output.update(configureState, options); + } +} diff --git a/libs/common/src/tools/send/services/send.service.spec.ts b/libs/common/src/tools/send/services/send.service.spec.ts index fc793dba67..41183c42af 100644 --- a/libs/common/src/tools/send/services/send.service.spec.ts +++ b/libs/common/src/tools/send/services/send.service.spec.ts @@ -8,7 +8,6 @@ import { awaitAsync, mockAccountServiceWith, } from "../../../../spec"; -import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; import { CryptoService } from "../../../platform/abstractions/crypto.service"; import { EncryptService } from "../../../platform/abstractions/encrypt.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; @@ -64,7 +63,6 @@ describe("SendService", () => { id: mockUserId, email: "email", name: "name", - status: AuthenticationStatus.Unlocked, }); // Initial encrypted state diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 7d3772f8c5..dffbf5cbbe 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -683,8 +683,8 @@ export class CipherService implements CipherServiceAbstraction { async saveCollectionsWithServer(cipher: Cipher): Promise { const request = new CipherCollectionsRequest(cipher.collectionIds); - await this.apiService.putCipherCollections(cipher.id, request); - const data = cipher.toCipherData(); + const response = await this.apiService.putCipherCollections(cipher.id, request); + const data = new CipherData(response); await this.upsert(data); }