+
Internet Identity
{
'Unauthorized' : IDL.Principal,
'NoSuchCredentials' : IDL.Text,
});
+ const DkimCheckName = IDL.Variant({
+ 'DkimSignaturePresent' : IDL.Null,
+ 'PublicKeyFetched' : IDL.Null,
+ 'AlgorithmSupported' : IDL.Null,
+ 'BodyHashValid' : IDL.Null,
+ 'SignatureValid' : IDL.Null,
+ 'SignatureParsed' : IDL.Null,
+ 'RequiredHeadersSigned' : IDL.Null,
+ });
+ const DkimCheckStatus = IDL.Variant({
+ 'Skipped' : IDL.Null,
+ 'Fail' : IDL.Null,
+ 'Pass' : IDL.Null,
+ });
+ const DkimCheck = IDL.Record({
+ 'status' : DkimCheckStatus,
+ 'name' : DkimCheckName,
+ 'detail' : IDL.Opt(IDL.Text),
+ });
+ const DkimVerificationStatus = IDL.Variant({
+ 'Unverified' : IDL.Record({ 'checks' : IDL.Vec(DkimCheck) }),
+ 'Verified' : IDL.Record({ 'checks' : IDL.Vec(DkimCheck) }),
+ 'Pending' : IDL.Null,
+ });
+ const PostboxEmail = IDL.Record({
+ 'dkim_status' : IDL.Opt(DkimVerificationStatus),
+ 'subject' : IDL.Text,
+ 'body' : IDL.Text,
+ 'recipient' : IDL.Text,
+ 'sender' : IDL.Text,
+ });
+ const PushSubscription = IDL.Record({
+ 'endpoint' : IDL.Text,
+ 'p256dh' : IDL.Vec(IDL.Nat8),
+ 'auth' : IDL.Vec(IDL.Nat8),
+ });
+ const PushSubscribeError = IDL.Variant({
+ 'InvalidSubscription' : IDL.Text,
+ 'TooManySubscriptions' : IDL.Null,
+ 'Unauthorized' : IDL.Principal,
+ 'InternalCanisterError' : IDL.Text,
+ });
+ const PushUnsubscribeError = IDL.Variant({
+ 'Unauthorized' : IDL.Principal,
+ 'InternalCanisterError' : IDL.Text,
+ });
const HeaderField = IDL.Tuple(IDL.Text, IDL.Text);
const HttpRequest = IDL.Record({
'url' : IDL.Text,
@@ -587,6 +633,26 @@ export const idlFactory = ({ IDL }) => {
'anchor_number' : UserNumber,
}),
});
+ const SmtpAddress = IDL.Record({ 'domain' : IDL.Text, 'user' : IDL.Text });
+ const SmtpEnvelope = IDL.Record({ 'to' : SmtpAddress, 'from' : SmtpAddress });
+ const SmtpHeader = IDL.Record({ 'value' : IDL.Text, 'name' : IDL.Text });
+ const SmtpMessage = IDL.Record({
+ 'body' : IDL.Vec(IDL.Nat8),
+ 'headers' : IDL.Vec(SmtpHeader),
+ });
+ const SmtpRequest = IDL.Record({
+ 'envelope' : IDL.Opt(SmtpEnvelope),
+ 'message' : IDL.Opt(SmtpMessage),
+ 'gateway_flags' : IDL.Opt(IDL.Vec(IDL.Text)),
+ });
+ const SmtpRequestError = IDL.Record({
+ 'code' : IDL.Nat64,
+ 'message' : IDL.Text,
+ });
+ const SmtpResponse = IDL.Variant({
+ 'Ok' : IDL.Record({}),
+ 'Err' : SmtpRequestError,
+ });
const ArchiveInfo = IDL.Record({
'archive_config' : IDL.Opt(ArchiveConfig),
'archive_canister' : IDL.Opt(IDL.Principal),
@@ -802,6 +868,27 @@ export const idlFactory = ({ IDL }) => {
[IDL.Variant({ 'Ok' : IdAliasCredentials, 'Err' : GetIdAliasError })],
['query'],
),
+ 'get_postbox' : IDL.Func([UserNumber], [IDL.Vec(PostboxEmail)], ['query']),
+ 'push_subscribe' : IDL.Func(
+ [UserNumber, PushSubscription],
+ [IDL.Variant({ 'Ok' : IDL.Null, 'Err' : PushSubscribeError })],
+ [],
+ ),
+ 'push_unsubscribe' : IDL.Func(
+ [UserNumber, IDL.Text],
+ [IDL.Variant({ 'Ok' : IDL.Null, 'Err' : PushUnsubscribeError })],
+ [],
+ ),
+ 'push_vapid_public_key' : IDL.Func(
+ [],
+ [IDL.Opt(IDL.Vec(IDL.Nat8))],
+ ['query'],
+ ),
+ 'push_init_vapid_key' : IDL.Func(
+ [],
+ [IDL.Variant({ 'Ok' : IDL.Vec(IDL.Nat8), 'Err' : PushSubscribeError })],
+ [],
+ ),
'get_principal' : IDL.Func(
[UserNumber, FrontendHostname],
[IDL.Principal],
@@ -968,6 +1055,12 @@ export const idlFactory = ({ IDL }) => {
[IDL.Variant({ 'Ok' : AccountInfo, 'Err' : SetDefaultAccountError })],
[],
),
+ 'smtp_request' : IDL.Func([SmtpRequest], [SmtpResponse], []),
+ 'smtp_request_validate' : IDL.Func(
+ [SmtpRequest],
+ [SmtpResponse],
+ ['query'],
+ ),
'stats' : IDL.Func([], [InternetIdentityStats], ['query']),
'update' : IDL.Func([UserNumber, DeviceKey, DeviceData], [], []),
'update_account' : IDL.Func(
diff --git a/src/frontend/src/lib/generated/internet_identity_types.d.ts b/src/frontend/src/lib/generated/internet_identity_types.d.ts
index bc8525e3e8..5510599028 100644
--- a/src/frontend/src/lib/generated/internet_identity_types.d.ts
+++ b/src/frontend/src/lib/generated/internet_identity_types.d.ts
@@ -472,6 +472,26 @@ export interface DeviceWithUsage {
* discovery at openid_configuration for { issuer, jwks_uri }.
*/
export interface DiscoverableOidcConfig { 'discovery_domain' : string }
+export interface DkimCheck {
+ 'status' : DkimCheckStatus,
+ 'name' : DkimCheckName,
+ 'detail' : [] | [string],
+}
+export type DkimCheckName = { 'DkimSignaturePresent' : null } |
+ { 'PublicKeyFetched' : null } |
+ { 'AlgorithmSupported' : null } |
+ { 'BodyHashValid' : null } |
+ { 'SignatureValid' : null } |
+ { 'SignatureParsed' : null } |
+ { 'RequiredHeadersSigned' : null };
+export type DkimCheckStatus = { 'Skipped' : null } |
+ { 'Fail' : null } |
+ { 'Pass' : null };
+export type DkimVerificationStatus = {
+ 'Unverified' : { 'checks' : Array }
+ } |
+ { 'Verified' : { 'checks' : Array } } |
+ { 'Pending' : null };
export interface DummyAuthConfig {
/**
* Prompts user for a index value (0 - 255) when set to true,
@@ -992,6 +1012,24 @@ export interface OpenIdPrepareDelegationResponse {
'expiration' : Timestamp,
'anchor_number' : UserNumber,
}
+export interface PostboxEmail {
+ 'dkim_status' : [] | [DkimVerificationStatus],
+ 'subject' : string,
+ 'body' : string,
+ 'recipient' : string,
+ 'sender' : string,
+}
+export interface PushSubscription {
+ 'endpoint' : string,
+ 'p256dh' : Uint8Array | number[],
+ 'auth' : Uint8Array | number[],
+}
+export type PushSubscribeError = { 'InvalidSubscription' : string } |
+ { 'TooManySubscriptions' : null } |
+ { 'Unauthorized' : Principal } |
+ { 'InternalCanisterError' : string };
+export type PushUnsubscribeError = { 'Unauthorized' : Principal } |
+ { 'InternalCanisterError' : string };
export interface PrepareAccountDelegation {
'user_key' : UserKey,
'expiration' : Timestamp,
@@ -1184,6 +1222,25 @@ export interface SignedIdAlias {
'id_alias' : Principal,
'id_dapp' : Principal,
}
+export interface SmtpAddress { 'domain' : string, 'user' : string }
+export interface SmtpEnvelope { 'to' : SmtpAddress, 'from' : SmtpAddress }
+/**
+ * SMTP Gateway Protocol types
+ * ============================
+ */
+export interface SmtpHeader { 'value' : string, 'name' : string }
+export interface SmtpMessage {
+ 'body' : Uint8Array | number[],
+ 'headers' : Array,
+}
+export interface SmtpRequest {
+ 'envelope' : [] | [SmtpEnvelope],
+ 'message' : [] | [SmtpMessage],
+ 'gateway_flags' : [] | [Array],
+}
+export interface SmtpRequestError { 'code' : bigint, 'message' : string }
+export type SmtpResponse = { 'Ok' : {} } |
+ { 'Err' : SmtpRequestError };
export interface StreamingCallbackHttpResponse {
'token' : [] | [Token],
'body' : Uint8Array | number[],
@@ -1431,7 +1488,40 @@ export interface _SERVICE {
{ 'Ok' : IdAliasCredentials } |
{ 'Err' : GetIdAliasError }
>,
+ 'get_postbox' : ActorMethod<[UserNumber], Array>,
'get_principal' : ActorMethod<[UserNumber, FrontendHostname], Principal>,
+ /**
+ * Subscribes the caller's browser for Web Push notifications on new emails
+ * arriving at the given identity's postbox. Generates the canister's VAPID
+ * key pair on first call.
+ */
+ 'push_subscribe' : ActorMethod<
+ [UserNumber, PushSubscription],
+ { 'Ok' : null } |
+ { 'Err' : PushSubscribeError }
+ >,
+ /** Removes a previously registered push subscription by endpoint URL. */
+ 'push_unsubscribe' : ActorMethod<
+ [UserNumber, string],
+ { 'Ok' : null } |
+ { 'Err' : PushUnsubscribeError }
+ >,
+ /**
+ * Returns the canister's VAPID public key (65-byte uncompressed SEC-1).
+ * Returns empty if the key hasn't been generated yet — use
+ * `push_init_vapid_key` to generate it.
+ */
+ 'push_vapid_public_key' : ActorMethod<[], [] | [Uint8Array | number[]]>,
+ /**
+ * Ensures the canister has a VAPID key pair and returns the public key.
+ * The frontend calls this at the start of the opt-in flow to obtain the
+ * `applicationServerKey` required by `PushManager.subscribe()`.
+ */
+ 'push_init_vapid_key' : ActorMethod<
+ [],
+ { 'Ok' : Uint8Array | number[] } |
+ { 'Err' : PushSubscribeError }
+ >,
/**
* HTTP Gateway protocol
* =====================
@@ -1618,6 +1708,12 @@ export interface _SERVICE {
{ 'Ok' : AccountInfo } |
{ 'Err' : SetDefaultAccountError }
>,
+ /**
+ * SMTP Gateway Protocol
+ * =====================
+ */
+ 'smtp_request' : ActorMethod<[SmtpRequest], SmtpResponse>,
+ 'smtp_request_validate' : ActorMethod<[SmtpRequest], SmtpResponse>,
'stats' : ActorMethod<[], InternetIdentityStats>,
'update' : ActorMethod<[UserNumber, DeviceKey, DeviceData], undefined>,
'update_account' : ActorMethod<
diff --git a/src/frontend/src/lib/locales/de.po b/src/frontend/src/lib/locales/de.po
index 2e7f4309cf..7b9e0bf1c3 100644
--- a/src/frontend/src/lib/locales/de.po
+++ b/src/frontend/src/lib/locales/de.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Marco Walz\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0}-Logo"
@@ -343,9 +346,15 @@ msgstr "{name} bearbeiten"
msgid "Edit account"
msgstr "Konto bearbeiten"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "E-Mail:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Mehrere Konten aktivieren"
@@ -386,6 +395,21 @@ msgstr "Zum Beispiel meldet sich Nutzer A bei Internet Identity mit seinem Googl
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Vergessen Sie komplizierte Benutzernamen und Passwörter. Mit Passkeys wählen Sie einfach Ihren Namen zum Einloggen – schnell, sicher und unkompliziert."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Volle Kontrolle"
@@ -674,6 +698,42 @@ msgstr "Name:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Es werden keine Daten an Google, Microsoft oder Apple darüber weitergegeben, bei welchen Anwendungen Sie sich mit Internet Identity anmelden."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Keine Identität gefunden"
@@ -755,6 +815,9 @@ msgstr "Wählen Sie etwas Erkennbares, zum Beispiel Ihren Namen"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Gehen Sie zu Ihrem <0>bestehenden Gerät0> zurück und wählen Sie <1>Neu starten1>, um es erneut zu versuchen."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Unterstützt durch"
@@ -1296,6 +1359,9 @@ msgstr "Alles bereit. Ihr Passkey wurde registriert."
msgid "You're signing in as <0>{name}0>."
msgstr "Sie melden sich als <0>{name}0> an."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Ihre Identität und Anmeldemethoden auf einen Blick."
diff --git a/src/frontend/src/lib/locales/en.po b/src/frontend/src/lib/locales/en.po
index 2ad341f181..39d7322ee8 100644
--- a/src/frontend/src/lib/locales/en.po
+++ b/src/frontend/src/lib/locales/en.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
+msgid "(no subject)"
+msgstr "(no subject)"
+
msgid "{0} logo"
msgstr "{0} logo"
@@ -343,9 +346,15 @@ msgstr "Edit {name}"
msgid "Edit account"
msgstr "Edit account"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Email:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Enable multiple accounts"
@@ -386,6 +395,21 @@ msgstr "For example, user A logs into Internet Identity with their Google accoun
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
+msgid "From:"
+msgstr "From:"
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr "To:"
+
msgid "Full control"
msgstr "Full control"
@@ -674,6 +698,42 @@ msgstr "Name:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
+msgid "No email selected."
+msgstr "No email selected."
+
+msgid "DKIM verified"
+msgstr "DKIM verified"
+
+msgid "Not verified"
+msgstr "Not verified"
+
+msgid "Verifying..."
+msgstr "Verifying..."
+
+msgid "Verification details"
+msgstr "Verification details"
+
+msgid "DKIM-Signature header present"
+msgstr "DKIM-Signature header present"
+
+msgid "Signature parsed"
+msgstr "Signature parsed"
+
+msgid "Algorithm supported"
+msgstr "Algorithm supported"
+
+msgid "Required headers signed"
+msgstr "Required headers signed"
+
+msgid "Body hash valid"
+msgstr "Body hash valid"
+
+msgid "Public key fetched via DNS"
+msgstr "Public key fetched via DNS"
+
+msgid "RSA signature valid"
+msgstr "RSA signature valid"
+
msgid "No identity found"
msgstr "No identity found"
@@ -755,6 +815,9 @@ msgstr "Pick something recognizable, like your name"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
+msgid "Postbox"
+msgstr "Postbox"
+
msgid "Powered by"
msgstr "Powered by"
@@ -1296,6 +1359,9 @@ msgstr "You're all set. Your passkey has been registered."
msgid "You're signing in as <0>{name}0>."
msgstr "You're signing in as <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Your identity and sign-in methods at a glance."
diff --git a/src/frontend/src/lib/locales/es.po b/src/frontend/src/lib/locales/es.po
index 6dd77a86cb..e637abaea8 100644
--- a/src/frontend/src/lib/locales/es.po
+++ b/src/frontend/src/lib/locales/es.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Llorenç Muntaner Perello\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "Logo de {0}"
@@ -343,9 +346,15 @@ msgstr "Editar {name}"
msgid "Edit account"
msgstr "Editar cuenta"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Correo electrónico:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Activar cuentas múltiples"
@@ -386,6 +395,21 @@ msgstr "Por ejemplo, el usuario A inicia sesión en Internet Identity con su cue
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Olvídate de recordar nombres de usuario y contraseñas complicadas. Con passkeys, simplemente eliges tu nombre para iniciar sesión — rápido, seguro y sin complicaciones."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Control total"
@@ -674,6 +698,42 @@ msgstr "Nombre:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "No se comparten datos con Google, Microsoft o Apple sobre en qué aplicaciones inicias sesión con Internet Identity."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "No se encontró ninguna identidad"
@@ -755,6 +815,9 @@ msgstr "Elija algo que puedas reconocer fácilmente, como tu nombre"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Vuelve a tu <0>dispositivo existente0> y elige <1>Empezar de nuevo1> para volver a intentarlo."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Desarrollado por"
@@ -1296,6 +1359,9 @@ msgstr "Todo listo. Tu passkey ha sido registrada."
msgid "You're signing in as <0>{name}0>."
msgstr "Estás iniciando sesión como <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Tu identidad y métodos de inicio de sesión de un vistazo."
diff --git a/src/frontend/src/lib/locales/fr.po b/src/frontend/src/lib/locales/fr.po
index a7b7fdb8a7..f68be9fa47 100644
--- a/src/frontend/src/lib/locales/fr.po
+++ b/src/frontend/src/lib/locales/fr.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Mathieu Ducroux, Nicolas Mattia\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "Logo {0}"
@@ -343,9 +346,15 @@ msgstr "Modifier {name}"
msgid "Edit account"
msgstr "Modifier le compte"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Adresse e-mail :"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Activer plusieurs comptes"
@@ -386,6 +395,21 @@ msgstr "Par exemple, l’utilisateur A se connecte à Internet Identity avec son
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Oubliez les noms d’utilisateur et mots de passe compliqués. Avec les passkeys, il vous suffit de choisir votre nom pour vous connecter: rapide, sûr et sans effort."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Contrôle total"
@@ -674,6 +698,42 @@ msgstr "Nom :"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Aucune donnée n’est partagée avec Google, Microsoft ou Apple concernant les applications auxquelles vous vous connectez avec Internet Identity."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Aucune identité trouvée"
@@ -755,6 +815,9 @@ msgstr "Choisissez quelque chose de reconnaissable, comme votre nom"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Veuillez retourner sur votre <0>appareil existant0> et sélectionner <1>Recommencer1> pour réessayer."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Propulsé par"
@@ -1296,6 +1359,9 @@ msgstr "Tout est prêt. Votre passkey a été enregistrée."
msgid "You're signing in as <0>{name}0>."
msgstr "Vous vous connectez en tant que <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Votre identité et vos méthodes de connexion en un coup d’œil."
diff --git a/src/frontend/src/lib/locales/id.po b/src/frontend/src/lib/locales/id.po
index 03c2c90f99..635f9f37d5 100644
--- a/src/frontend/src/lib/locales/id.po
+++ b/src/frontend/src/lib/locales/id.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "Logo {0}"
@@ -343,9 +346,15 @@ msgstr "Edit {name}"
msgid "Edit account"
msgstr "Edit akun"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Email:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Aktifkan banyak akun"
@@ -386,6 +395,21 @@ msgstr "Misalnya, pengguna A masuk ke Internet Identity dengan akun Google merek
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Lupakan tentang mengingat nama pengguna dan kata sandi yang rumit. Dengan passkey, Anda cukup memilih nama Anda untuk masuk — cepat, aman, dan mudah."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Kontrol penuh"
@@ -674,6 +698,42 @@ msgstr "Nama:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Tidak ada data yang dibagikan kepada Google, Microsoft, atau Apple mengenai aplikasi mana yang Anda masuk dengan Internet Identity."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Tidak ada identitas yang ditemukan"
@@ -755,6 +815,9 @@ msgstr "Pilih sesuatu yang mudah dikenali, seperti nama Anda"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Silakan kembali ke <0>perangkat Anda yang ada0> dan pilih <1>Mulai ulang1> untuk mencoba lagi."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Didukung oleh"
@@ -1296,6 +1359,9 @@ msgstr "Semua siap. Passkey Anda telah terdaftar."
msgid "You're signing in as <0>{name}0>."
msgstr "Anda masuk sebagai <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Identitas dan metode masuk Anda sekilas."
diff --git a/src/frontend/src/lib/locales/it.po b/src/frontend/src/lib/locales/it.po
index ccd31dbaf1..80eea4ff59 100644
--- a/src/frontend/src/lib/locales/it.po
+++ b/src/frontend/src/lib/locales/it.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Francesco Rizzi, Antonio Ventilii\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "Logo {0}"
@@ -343,9 +346,15 @@ msgstr "Modifica {name}"
msgid "Edit account"
msgstr "Modifica account"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Email:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Abilita account multipli"
@@ -386,6 +395,21 @@ msgstr "Ad esempio, l'utente A accede a Internet Identity con il proprio account
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Dimentica di dover ricordare nomi utente e password complicati. Con le passkey, ti basta scegliere il tuo nome per accedere: veloce, sicuro e senza problemi."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Controllo totale"
@@ -674,6 +698,42 @@ msgstr "Nome:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Nessun dato relativo alle applicazioni a cui accedi con Internet Identity viene condiviso con Google, Microsoft o Apple."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Nessuna identità trovata"
@@ -755,6 +815,9 @@ msgstr "Scegli qualcosa di riconoscibile, come il tuo nome"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Torna al tuo <0>dispositivo esistente0> e scegli <1>Inizia da capo1> per riprovare."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Basato su"
@@ -1296,6 +1359,9 @@ msgstr "Hai finito. La tua passkey è stata registrata."
msgid "You're signing in as <0>{name}0>."
msgstr "Stai accedendo come <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "La tua identità e i metodi di accesso a colpo d'occhio."
diff --git a/src/frontend/src/lib/locales/nl.po b/src/frontend/src/lib/locales/nl.po
index 9f5beed574..78004d1b83 100644
--- a/src/frontend/src/lib/locales/nl.po
+++ b/src/frontend/src/lib/locales/nl.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Thomas Gladdines\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0} logo"
@@ -343,9 +346,15 @@ msgstr "Bewerk {name}"
msgid "Edit account"
msgstr "Account bewerken"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "E-mailadres:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Meerdere accounts inschakelen"
@@ -386,6 +395,21 @@ msgstr "Voorbeeld: gebruiker A logt in op Internet Identity met hun Google-accou
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Geen gebruikersnamen of wachtwoorden meer. Met discoverable passkeys logt u in door simpelweg uw naam te kiezen."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Volledige controle"
@@ -674,6 +698,42 @@ msgstr "Naam:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Er worden geen gegevens gedeeld met Google, Microsoft of Apple over op welke applicaties u inlogt met Internet Identity."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Geen identiteit gevonden"
@@ -755,6 +815,9 @@ msgstr "Kies iets herkenbaars, zoals uw naam"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Ga terug naar uw <0>bestaande apparaat0> en kies <1>Opnieuw beginnen1> om het opnieuw te proberen."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Aangedreven door"
@@ -1296,6 +1359,9 @@ msgstr "U bent klaar. Uw passkey is geregistreerd."
msgid "You're signing in as <0>{name}0>."
msgstr "U logt in als <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Uw identiteit en inlogmethoden in één oogopslag."
diff --git a/src/frontend/src/lib/locales/pl.po b/src/frontend/src/lib/locales/pl.po
index 3d1bc59382..03da96fdc5 100644
--- a/src/frontend/src/lib/locales/pl.po
+++ b/src/frontend/src/lib/locales/pl.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2));\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0} logo"
@@ -343,9 +346,15 @@ msgstr "Edytuj {name}"
msgid "Edit account"
msgstr "Edytuj konto"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Adres e-mail:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Włącz wiele kont"
@@ -386,6 +395,21 @@ msgstr "Na przykład użytkownik A loguje się do Internet Identity za pomocą s
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Zapomnij o zapamiętywaniu skomplikowanych nazw użytkowników i haseł. Dzięki kluczom dostępu po prostu wybierasz swoją nazwę, aby się zalogować — szybko, bezpiecznie i bezproblemowo."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Pełna kontrola"
@@ -674,6 +698,42 @@ msgstr "Nazwa:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Nie są udostępniane żadne dane Google, Microsoft ani Apple dotyczące aplikacji, w których logujesz się za pomocą Internet Identity."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Nie znaleziono tożsamości"
@@ -755,6 +815,9 @@ msgstr "Wybierz coś rozpoznawalnego, na przykład swoje imię"
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Wróć do swojego <0>istniejącego urządzenia0> i wybierz <1>Zacznij od nowa1>, aby spróbować ponownie."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Zasilane przez"
@@ -1296,6 +1359,9 @@ msgstr "Wszystko gotowe. Twój klucz dostępu został zarejestrowany."
msgid "You're signing in as <0>{name}0>."
msgstr "Logujesz się jako <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Twoja tożsamość i metody logowania w skrócie."
diff --git a/src/frontend/src/lib/locales/ru.po b/src/frontend/src/lib/locales/ru.po
index 1a19f2a4a7..e4d38b5456 100644
--- a/src/frontend/src/lib/locales/ru.po
+++ b/src/frontend/src/lib/locales/ru.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Аршавир Тер-Габриелян\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0} логотип"
@@ -343,9 +346,15 @@ msgstr "Редактировать {name}"
msgid "Edit account"
msgstr "Редактировать аккаунт"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Email:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Включить несколько аккаунтов"
@@ -386,6 +395,21 @@ msgstr "Например, пользователь А входит в Internet I
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Не нужно придумывать и запоминать логины и пароли. Используйте ключ доступа — это быстрее и безопаснее."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Полный контроль"
@@ -674,6 +698,42 @@ msgstr "Имя:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Никакие данные о том, в какие приложения вы входите с помощью Internet Identity, не передаются Google, Microsoft или Apple."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Учётная запись не найдена"
@@ -755,6 +815,9 @@ msgstr "Выберите что-то узнаваемое, например, в
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Пожалуйста, вернитесь на ваше <0>существующее устройство0> и выберите <1>Начать заново1>, чтобы повторить попытку."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Разработано"
@@ -1296,6 +1359,9 @@ msgstr "Все готово. Ваш ключ доступа зарегистри
msgid "You're signing in as <0>{name}0>."
msgstr "Вы входите как <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Ваша учётная запись и способы входа — всё в одном месте."
diff --git a/src/frontend/src/lib/locales/uk.po b/src/frontend/src/lib/locales/uk.po
index 4414a78258..060c7d9b1f 100644
--- a/src/frontend/src/lib/locales/uk.po
+++ b/src/frontend/src/lib/locales/uk.po
@@ -13,6 +13,9 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 3.9\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0} логотип"
@@ -343,9 +346,15 @@ msgstr "Редагувати {name}"
msgid "Edit account"
msgstr "Редагувати обліковий запис"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "Електронна пошта:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "Увімкнути кілька облікових записів"
@@ -386,6 +395,21 @@ msgstr "Наприклад, користувач A входить до Internet
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "Забудьте про запам'ятовування складних імен користувача та паролів. Завдяки ключам доступу ви просто обираєте своє ім'я для входу — швидко, безпечно та без проблем."
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "Повний контроль"
@@ -674,6 +698,42 @@ msgstr "Ім'я:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Жодні дані про те, в які застосунки ви входите через Internet Identity, не передаються Google, Microsoft чи Apple."
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "Ідентифікатор не знайдено"
@@ -755,6 +815,9 @@ msgstr "Виберіть щось впізнаване, наприклад, св
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "Будь ласка, поверніться до свого <0>наявного пристрою0> та виберіть <1>Почати спочатку1>, щоб спробувати знову."
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "Працює на"
@@ -1296,6 +1359,9 @@ msgstr "Усе готово. Ваш ключ доступу зареєстров
msgid "You're signing in as <0>{name}0>."
msgstr "Ви входите як <0>{name}0>."
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "Ваш ідентифікатор та способи входу — все в одному місці."
diff --git a/src/frontend/src/lib/locales/ur.po b/src/frontend/src/lib/locales/ur.po
index 468e9e4959..a582a89284 100644
--- a/src/frontend/src/lib/locales/ur.po
+++ b/src/frontend/src/lib/locales/ur.po
@@ -13,6 +13,9 @@ msgstr ""
"Language-Team: Muhammad Abdullah, Muhammad Umar\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "(no subject)"
+msgstr ""
+
msgid "{0} logo"
msgstr "{0} لوگو"
@@ -343,9 +346,15 @@ msgstr "{name} میں ترمیم کریں"
msgid "Edit account"
msgstr "اکاؤنٹ میں ترمیم کریں"
+msgid "Email notifications"
+msgstr "Email notifications"
+
msgid "Email:"
msgstr "ای میل:"
+msgid "Emails received for your identity."
+msgstr "Emails received for your identity."
+
msgid "Enable multiple accounts"
msgstr "متعدد اکاؤنٹس فعال کریں"
@@ -386,6 +395,21 @@ msgstr "مثال کے طور پر، صارف A اپنی Google اکاؤنٹ “A
msgid "Forget about remembering complicated usernames and passwords. With passkeys, you simply pick your name to log in — quick, safe, and hassle-free."
msgstr "مشکل یوزرنیم اور پاس ورڈ یاد رکھنے کی فکر چھوڑ دیں۔ پاس کیز کے ساتھ آپ بس اپنا نام منتخب کر کے لاگ اِن کرتے ہیں — تیز، محفوظ اور بے جھنجھٹ۔"
+msgid "From:"
+msgstr ""
+
+msgid "Get notified on this device when a new email arrives."
+msgstr "Get notified on this device when a new email arrives."
+
+msgid "Notifications failed"
+msgstr "Notifications failed"
+
+msgid "Notifications not enabled"
+msgstr "Notifications not enabled"
+
+msgid "To:"
+msgstr ""
+
msgid "Full control"
msgstr "مکمل کنٹرول"
@@ -674,6 +698,42 @@ msgstr "نام:"
msgid "No data is shared with Google, Microsoft or Apple on which applications you log in with Internet Identity."
msgstr "Google، Microsoft یا Apple کے ساتھ یہ معلومات شیئر نہیں کی جاتیں کہ آپ Internet Identity کے ذریعے کن ایپلیکیشنز میں لاگ اِن کرتے ہیں۔"
+msgid "No email selected."
+msgstr ""
+
+msgid "DKIM verified"
+msgstr ""
+
+msgid "Not verified"
+msgstr ""
+
+msgid "Verifying..."
+msgstr ""
+
+msgid "Verification details"
+msgstr ""
+
+msgid "DKIM-Signature header present"
+msgstr ""
+
+msgid "Signature parsed"
+msgstr ""
+
+msgid "Algorithm supported"
+msgstr ""
+
+msgid "Required headers signed"
+msgstr ""
+
+msgid "Body hash valid"
+msgstr ""
+
+msgid "Public key fetched via DNS"
+msgstr ""
+
+msgid "RSA signature valid"
+msgstr ""
+
msgid "No identity found"
msgstr "کوئی شناخت نہیں ملی"
@@ -755,6 +815,9 @@ msgstr "ایسی چیز منتخب کریں جسے پہچانا جا سکے، ج
msgid "Please go back to your <0>existing device0> and choose <1>Start over1> to try again."
msgstr "براہِ کرم اپنے <0>موجودہ ڈیوائس0> پر واپس جائیں اور دوبارہ کوشش کرنے کے لیے <1>دوبارہ شروع کریں1> منتخب کریں۔"
+msgid "Postbox"
+msgstr ""
+
msgid "Powered by"
msgstr "بذریعہ"
@@ -1296,6 +1359,9 @@ msgstr "سب تیار ہے۔ آپ کی پاس کی رجسٹر ہو گئی ہے۔
msgid "You're signing in as <0>{name}0>."
msgstr "آپ بطور <0>{name}0> سائن اِن کر رہے ہیں۔"
+msgid "Your browser blocked the permission prompt."
+msgstr "Your browser blocked the permission prompt."
+
msgid "Your identity and sign-in methods at a glance."
msgstr "آپ کی شناخت اور سائن اِن کے طریقے ایک نظر میں۔"
diff --git a/src/frontend/src/lib/utils/pushNotifications.ts b/src/frontend/src/lib/utils/pushNotifications.ts
new file mode 100644
index 0000000000..fccc9eb97a
--- /dev/null
+++ b/src/frontend/src/lib/utils/pushNotifications.ts
@@ -0,0 +1,203 @@
+/**
+ * Web Push notification helpers.
+ *
+ * Browser flow on first opt-in (must run inside a user gesture, otherwise
+ * `Notification.requestPermission()` is rejected by modern browsers):
+ *
+ * 1. Register the service worker at `/sw.js`.
+ * 2. Ask for notification permission.
+ * 3. Fetch the canister's VAPID public key (triggers canister-side
+ * generation if this is the first subscriber).
+ * 4. Call `PushManager.subscribe()` with that key as `applicationServerKey`.
+ * 5. Forward the resulting `PushSubscription` to the canister so it can POST
+ * to the endpoint when new emails arrive.
+ *
+ * V1 does not use the `p256dh`/`auth` keys for payload encryption — the
+ * canister sends empty-body pushes. We still send them to the canister so
+ * they're stored for when we add RFC 8291 encryption later.
+ */
+import type { ActorSubclass } from "@icp-sdk/core/agent";
+import type { _SERVICE } from "$lib/generated/internet_identity_types";
+
+export const isPushSupported = (): boolean =>
+ typeof window !== "undefined" &&
+ "serviceWorker" in navigator &&
+ "PushManager" in window &&
+ "Notification" in window;
+
+/** Returns the active subscription if one exists for this browser. */
+export const getExistingSubscription =
+ async (): Promise => {
+ if (!isPushSupported()) return null;
+ const registration = await navigator.serviceWorker.getRegistration("/");
+ if (!registration) return null;
+ return registration.pushManager.getSubscription();
+ };
+
+/** Convenience wrapper for "is this browser currently subscribed?". */
+export const isCurrentlySubscribed = async (): Promise => {
+ const sub = await getExistingSubscription();
+ return sub !== null;
+};
+
+/**
+ * PoC side-channel: posts the newest email's sender/subject to the active
+ * service worker so the next `push` event can show meaningful content
+ * instead of the generic fallback. Silently no-ops when no service worker
+ * is registered or active.
+ *
+ * Not a long-term solution — the service worker's in-memory cache is wiped
+ * whenever the worker is terminated (which can happen any time the page is
+ * closed or idle). The proper fix is RFC 8291 payload encryption in the
+ * canister so the push itself carries the metadata. Until that ships this
+ * gives the postbox page a way to keep the SW's cache warm.
+ */
+export const postLatestEmailToServiceWorker = async (email: {
+ sender: string;
+ subject: string;
+}): Promise => {
+ if (!("serviceWorker" in navigator)) return;
+ const registration = await navigator.serviceWorker.getRegistration("/");
+ if (!registration?.active) return;
+ registration.active.postMessage({
+ type: "LATEST_EMAIL",
+ from: email.sender,
+ subject: email.subject,
+ });
+};
+
+/**
+ * Full opt-in flow. Must be called from within a user gesture (e.g. a click
+ * handler) so the browser allows `Notification.requestPermission()`.
+ *
+ * Returns the created subscription on success, or `null` if the user denied
+ * the permission prompt. Throws for other errors (network, canister).
+ */
+export const subscribeToPush = async (
+ actor: ActorSubclass<_SERVICE>,
+ identityNumber: bigint,
+): Promise => {
+ if (!isPushSupported()) {
+ throw new Error("Push notifications are not supported in this browser");
+ }
+
+ // 1. Register the service worker (idempotent).
+ const registration = await navigator.serviceWorker.register("/sw.js", {
+ scope: "/",
+ });
+ // Wait for it to be active — `pushManager.subscribe` can fail otherwise.
+ if (registration.installing || registration.waiting) {
+ await navigator.serviceWorker.ready;
+ }
+
+ // 2. Ask for notification permission.
+ const permission = await Notification.requestPermission();
+ if (permission !== "granted") {
+ return null;
+ }
+
+ // 3. Fetch (or generate) the VAPID public key from the canister.
+ // `push_init_vapid_key` is an update call that generates the key if
+ // it doesn't exist yet, so the first subscriber on this canister pays
+ // an extra raw_rand + state write. Subsequent subscribers get the
+ // already-stored key immediately.
+ const initResult = await actor.push_init_vapid_key();
+ if ("Err" in initResult) {
+ throw new Error(
+ `Failed to initialize VAPID key: ${JSON.stringify(initResult.Err)}`,
+ );
+ }
+ // Copy into a fresh ArrayBuffer-backed Uint8Array. PushManager.subscribe
+ // rejects Uint8Array, which the generated TS types
+ // include as a possibility.
+ const vapidSrc =
+ initResult.Ok instanceof Uint8Array
+ ? initResult.Ok
+ : new Uint8Array(initResult.Ok);
+ const vapidKey = new Uint8Array(new ArrayBuffer(vapidSrc.length));
+ vapidKey.set(vapidSrc);
+
+ // 4. Subscribe with PushManager.
+ const subscription = await registration.pushManager.subscribe({
+ userVisibleOnly: true,
+ applicationServerKey: vapidKey,
+ });
+
+ // 5. Send the subscription to the canister.
+ const json = subscription.toJSON();
+ if (
+ json.endpoint === undefined ||
+ json.keys?.p256dh === undefined ||
+ json.keys?.auth === undefined
+ ) {
+ // Revert the local subscription so the user isn't in a weird state.
+ await subscription.unsubscribe();
+ throw new Error("Browser returned an incomplete PushSubscription");
+ }
+
+ const result = await actor.push_subscribe(identityNumber, {
+ endpoint: json.endpoint,
+ p256dh: base64UrlToBytes(json.keys.p256dh),
+ auth: base64UrlToBytes(json.keys.auth),
+ });
+ if ("Err" in result) {
+ await subscription.unsubscribe();
+ throw new Error(
+ `Canister rejected subscription: ${JSON.stringify(result.Err)}`,
+ );
+ }
+
+ return subscription;
+};
+
+/**
+ * Removes the current browser's subscription from the canister and from
+ * the browser's PushManager. Silently no-ops if not subscribed.
+ */
+export const unsubscribeFromPush = async (
+ actor: ActorSubclass<_SERVICE>,
+ identityNumber: bigint,
+): Promise => {
+ const subscription = await getExistingSubscription();
+ if (subscription === null) return;
+
+ // Tell the canister first — if that fails, we still want to unsubscribe
+ // locally so the user sees the UI flip off.
+ try {
+ await actor.push_unsubscribe(identityNumber, subscription.endpoint);
+ } catch {
+ // ignore
+ }
+ await subscription.unsubscribe();
+};
+
+/**
+ * Fetches the canister's VAPID public key. Returns `null` if it hasn't been
+ * generated yet (which happens before any browser has ever subscribed).
+ */
+export const getVapidPublicKey = async (
+ actor: ActorSubclass<_SERVICE>,
+): Promise => {
+ const result = await actor.push_vapid_public_key();
+ if (result.length === 0) return null;
+ const raw = result[0];
+ return raw instanceof Uint8Array ? raw : new Uint8Array(raw);
+};
+
+/**
+ * Decodes a base64url string (as used by PushSubscription keys) to bytes.
+ * `PushSubscription.toJSON()` returns base64url-encoded strings for `p256dh`
+ * and `auth`; the canister expects raw bytes.
+ */
+const base64UrlToBytes = (b64url: string): Uint8Array => {
+ // Restore standard base64 padding/chars.
+ const padded = b64url.replace(/-/g, "+").replace(/_/g, "/");
+ const padding =
+ padded.length % 4 === 0 ? "" : "=".repeat(4 - (padded.length % 4));
+ const binary = atob(padded + padding);
+ const bytes = new Uint8Array(binary.length);
+ for (let i = 0; i < binary.length; i++) {
+ bytes[i] = binary.charCodeAt(i);
+ }
+ return bytes;
+};
diff --git a/src/frontend/src/routes/(new-styling)/manage/(authenticated)/(postbox)/postbox/+page.svelte b/src/frontend/src/routes/(new-styling)/manage/(authenticated)/(postbox)/postbox/+page.svelte
new file mode 100644
index 0000000000..49e3d46871
--- /dev/null
+++ b/src/frontend/src/routes/(new-styling)/manage/(authenticated)/(postbox)/postbox/+page.svelte
@@ -0,0 +1,421 @@
+
+
+
+