AGPL source offer and name cleanup
Every build writes the exact source it was built from, uncommitted work and new files included, as source.tar.gz next to the app, named after that tree. Docker builds, which have no git, pack the build context and name it by a hash of its files. The sign-in page and Settings > About link to it instead of a repository that can drift. What users, operators and packagers see no longer names the upstream server: - interface text, in all nine catalogues, with a token-session line for Security; - server messages; - the settings, now MAIL_SERVER_URL, MAIL_SERVERS_FILE, ADMIN_URL and MAIL_SERVER_FOLLOW_ADVERTISED_URLS, and mail-servers.example.json; - the Tenants notice, which is gone; - the README, CONTRIBUTING and SECURITY. ihasmail's own FEATURES, KNOWN-ISSUES and ROADMAP stay with public ihasmail, and INBUXA.md is folded into the README.
This commit is contained in:
Vendored
+2
@@ -6,3 +6,5 @@
|
||||
* `scripts/version.mjs`.
|
||||
*/
|
||||
declare const __IHASMAIL_VERSION__: string;
|
||||
/** ihasmail-inbuxa: the identity of the source this build was made from (scripts/source-archive.mjs). */
|
||||
declare const __SOURCE_ID__: string;
|
||||
|
||||
@@ -40,7 +40,7 @@ export interface JmapSession {
|
||||
server?: {
|
||||
/** "oss" | "community" | "enterprise". Stalwart publishes no version. */
|
||||
edition?: string | null;
|
||||
/** Where Stalwart's own administration is (STALWART_ADMIN_URL), for a session that may administer. */
|
||||
/** Where Stalwart's own administration is (ADMIN_URL), for a session that may administer. */
|
||||
adminUrl?: string | null;
|
||||
/** SHOW_ENTERPRISE_NOTICES: an Enterprise-only section says so even on Enterprise. */
|
||||
enterpriseNotices?: boolean;
|
||||
|
||||
@@ -6,3 +6,10 @@
|
||||
* parts are what they are.
|
||||
*/
|
||||
export const APP_VERSION = __IHASMAIL_VERSION__;
|
||||
|
||||
/**
|
||||
* ihasmail-inbuxa: the source this build was made from, which the build writes
|
||||
* next to the app as `source.tar.gz`. The AGPL's offer links there.
|
||||
*/
|
||||
export const SOURCE_ID = __SOURCE_ID__;
|
||||
export const SOURCE_ARCHIVE = "/source.tar.gz";
|
||||
|
||||
+11
-12
@@ -147,8 +147,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Die Zahlen, die Ihre Rolle sehen darf, so wie der Server sie meldet.",
|
||||
"Nothing to show": "Nichts anzuzeigen",
|
||||
"Could not be loaded": "Konnte nicht geladen werden",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Detaillierte Metriken, die Zustellwarteschlange, Protokolle und Servereinstellungen finden Sie in der Verwaltung von Stalwart selbst.",
|
||||
"Open Stalwart admin": "Stalwart-Verwaltung öffnen",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Detaillierte Metriken, die Zustellwarteschlange, Protokolle und Servereinstellungen finden Sie in INBUXA Admin.",
|
||||
"Open INBUXA Admin": "INBUXA Admin öffnen",
|
||||
"Default group role": "Standardrolle für Gruppen",
|
||||
"A group needs an address.": "Eine Gruppe braucht eine Adresse.",
|
||||
"New group": "Neue Gruppe",
|
||||
@@ -217,10 +217,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Neue Rolle",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Diese Rolle hat Berechtigungen, die Ihre nicht hat. Sie können sie ansehen, aber nicht ändern.",
|
||||
"Your role lets you view roles but not change them.": "Ihre Rolle erlaubt es, Rollen anzusehen, aber nicht zu ändern.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart vergibt diese Rolle standardmäßig an {kinds}. Eine Änderung betrifft alle, die sie auf diesem Weg haben.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Der Mailserver vergibt diese Rolle standardmäßig an {kinds}. Eine Änderung betrifft alle, die sie auf diesem Weg haben.",
|
||||
"Builds on": "Baut auf",
|
||||
"Permissions": "Berechtigungen",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart vergibt diese Rolle standardmäßig, daher kann sie nicht gelöscht werden. Ändern Sie zuerst die Standardwerte in der Verwaltung von Stalwart selbst.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "Der Mailserver vergibt diese Rolle standardmäßig, daher kann sie nicht gelöscht werden. Ändern Sie zuerst die Standardwerte in INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Diese Rolle hat Berechtigungen, die Ihre nicht hat.",
|
||||
"Create role": "Rolle anlegen",
|
||||
"builds on this one": "baut auf dieser auf",
|
||||
@@ -247,7 +247,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Rolle löschen",
|
||||
"It can't be undone.": "Das lässt sich nicht rückgängig machen.",
|
||||
"Type {name} to confirm": "Geben Sie {name} zur Bestätigung ein",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Die Berechtigungsliste von Stalwart konnte nicht geladen werden, daher lassen sich Berechtigungen hier nicht ändern. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Die Berechtigungsliste des Mailservers konnte nicht geladen werden, daher lassen sich Berechtigungen hier nicht ändern. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Benannte Sätze von Berechtigungen, vergeben an Konten, Gruppen und Mandanten.",
|
||||
"Search roles": "Rollen durchsuchen",
|
||||
"No roles match": "Keine passenden Rollen",
|
||||
@@ -270,11 +270,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} belegt",
|
||||
"Your role lets you view tenants but not change them.": "Ihre Rolle erlaubt es, Mandanten anzusehen, aber nicht zu ändern.",
|
||||
"Logo": "Logo",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Eine https-Adresse oder eine Data-URL eines Bildes. Stalwart zeigt es den Personen des Mandanten dort, wo es ein Logo zeigt.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Eine https-Adresse oder eine Data-URL eines Bildes. Der Mailserver zeigt es den Personen des Mandanten dort, wo er ein Logo zeigt.",
|
||||
"What it holds": "Enthält",
|
||||
"{n} of {limit}": "{n} von {limit}",
|
||||
"Limits": "Limits",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart verweigert es, mehr anzulegen, als ein Limit erlaubt. Ein leeres Feld bedeutet kein Limit.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "Der Mailserver verweigert es, mehr anzulegen, als ein Limit erlaubt. Ein leeres Feld bedeutet kein Limit.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Das Höchste, was jemandem in diesem Mandanten erlaubt sein kann: Die eigenen Rollen werden auf das beschränkt, was diese gewähren. Angeboten werden nur Rollen, deren Berechtigungen Sie selbst haben.",
|
||||
"Checking what is still in this tenant…": "Es wird geprüft, was noch in diesem Mandanten ist…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "Er enthält noch Konten, Domains oder anderes. Verschieben Sie diese zuerst.",
|
||||
@@ -290,7 +290,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Enthält noch {things}. Verschieben Sie diese zuerst.",
|
||||
"Delete tenant": "Mandant löschen",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Getrennte Organisationen auf einem Server, jede mit eigenen Personen, Domains und Limits.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Mandanten sind eine Funktion von Stalwart Enterprise.",
|
||||
"Search tenants": "Mandanten durchsuchen",
|
||||
"No tenants match": "Keine passenden Mandanten",
|
||||
"No tenants yet": "Noch keine Mandanten",
|
||||
@@ -1081,14 +1080,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Ihr Mailserver stellt diese direkt an Ihren Browser zu, sodass sie auch ohne geöffneten ihasmail-Tab ankommen — mit Absender und Betreff. Ihr Browser muss dennoch laufen: Beenden Sie ihn vollständig, warten die Benachrichtigungen und kommen an, sobald Sie ihn wieder öffnen.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Ihr Mailserver kann diesen Browser wecken, übermittelt aber weder Absender noch Betreff. Ihr Browser muss dennoch laufen.",
|
||||
"This is what a new-mail notification looks like.": "So sieht eine Benachrichtigung über neue Post aus.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Sie sind als {user} angemeldet. Ihr Passwort wird nie im Browser gespeichert; der Server hält es pro Sitzung verschlüsselt vor, um mit Stalwart zu kommunizieren.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Sie sind als {user} angemeldet. Ihr Passwort wird nie im Browser gespeichert; der Server hält es pro Sitzung verschlüsselt vor, um mit dem Mailserver zu kommunizieren.",
|
||||
"App passwords are managed by your mail administrator.": "App-Passwörter werden von Ihrer Mail-Administration verwaltet.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Wenn Sie Ihr Passwort ändern, werden Ihre anderen Webmail-Sitzungen abgemeldet. App-Passwörter funktionieren weiterhin.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Für dieses Konto ist die Zwei-Faktor-Authentifizierung aktiviert. ihasmail kann Sie noch nicht per Code anmelden; die Anmeldung auf einem anderen Gerät benötigt daher ein App-Passwort — oder Sie deaktivieren die Zwei-Faktor-Authentifizierung hier.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Ein eigenes Passwort für ein E-Mail-Programm oder Gerät, das Sie einzeln widerrufen können. App-Passwörter umgehen Zwei-Faktor-Codes und funktionieren daher auch in Programmen, die keinen abfragen können.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Übertragen Sie es jetzt nach {name} — es wird nicht erneut angezeigt.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "Im Verzeichnis wurden keine weiteren Benutzer gefunden, es kann also niemand Neues hinzugefügt werden. Bestehende Freigaben sind unten aufgeführt und können weiterhin entfernt werden.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart gibt seine Versionsnummer nicht an E-Mail-Programme weiter, daher nennt ihasmail die Edition, sofern der Server eine angibt. ihasmail benötigt 0.16 oder neuer; die Anmeldung verweigert ältere Versionen.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Diese Webmail arbeitet mit dem INBUXA-Mailserver, und die Anmeldung verweigert einen Server, der nicht bietet, was sie braucht.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Es {damage}, daher können die enthaltenen Regeln weder angezeigt noch bearbeitet werden — das Speichern des angekommenen Teils würde den Rest überschreiben. Laden Sie die Seite neu und versuchen Sie es erneut. Ihre Regeln liegen weiterhin auf dem Server; hier wurde nichts daran geändert.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "Der visuelle Regeleditor verwaltet nur Skripte, die er selbst erstellt hat. Sie können das Skript im Reiter {tab} bearbeiten oder neu mit Regeln beginnen (das vorhandene Skript bleibt erhalten, wird aber deaktiviert).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Ihr Filterskript {damage}, daher ist nur ein Teil angekommen. Eine Regel hinzuzufügen würde diesen Teil über das Ganze schreiben. Laden Sie die Seite neu und versuchen Sie es erneut.",
|
||||
@@ -1138,8 +1137,7 @@ export const catalog: Catalog = {
|
||||
"Drop here for the top level": "Hierher ziehen für die oberste Ebene",
|
||||
|
||||
// ── Remaining prose ────────────────────────────────────────────────
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "Die Version von ihasmail ist das Datum des Commits, aus dem es gebaut wurde, gefolgt davon, woher dieser Commit stammt: {example} wurde aus einem Commit vom 30. August 2026 gebaut, der über Pull Request 129 kam. Ein Commit, der nicht über einen solchen kam, trägt stattdessen seinen kurzen SHA — {sha}. Die Version sagt bewusst nichts über Stalwart aus; was dieser Build vom Server benötigt, steht in der Zeile darüber.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "Die Version von ihasmail ist das Datum des Commits, aus dem es gebaut wurde, gefolgt davon, woher dieser Commit stammt: {example} wurde aus einem Commit vom 30. August 2026 gebaut, der über Pull Request 129 kam. Ein Commit, der nicht über einen solchen kam, trägt stattdessen seinen kurzen SHA — {sha}. Die Version sagt bewusst nichts über den Mailserver aus; was dieser Build vom Server benötigt, steht in der Zeile darüber.",
|
||||
// ── Weekdays, schedule presets, rule operators ─────────────────────
|
||||
// Header names (List-Id, X-Spam-Status) stay English: they are the actual
|
||||
// field names in the message, not words.
|
||||
@@ -1242,6 +1240,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Filter konnten nicht gespeichert werden: {error}",
|
||||
"Could not send the receipt: {error}": "Die Lesebestätigung konnte nicht gesendet werden: {error}",
|
||||
"Could not sign in.": "Anmeldung fehlgeschlagen.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Sie sind als {user} angemeldet. Diese Webmail sieht Ihr Passwort nie: Sie hält ein Anmelde-Token Ihres Mailservers, pro Sitzung verschlüsselt.",
|
||||
"About INBUXA webmail": "Über INBUXA Webmail",
|
||||
"Mail server": "Mailserver",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Ihr Passwort geben Sie auf der Anmeldeseite Ihres Mailservers ein.",
|
||||
|
||||
+11
-12
@@ -139,8 +139,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Las cifras que su rol puede ver, tal como las informa el servidor.",
|
||||
"Nothing to show": "Nada que mostrar",
|
||||
"Could not be loaded": "No se pudo cargar",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Las métricas detalladas, la cola de entrega, los registros y la configuración del servidor están en la administración de Stalwart.",
|
||||
"Open Stalwart admin": "Abrir la administración de Stalwart",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Las métricas detalladas, la cola de entrega, los registros y los ajustes del servidor están en INBUXA Admin.",
|
||||
"Open INBUXA Admin": "Abrir INBUXA Admin",
|
||||
"Default group role": "Rol de grupo predeterminado",
|
||||
"A group needs an address.": "Un grupo necesita una dirección.",
|
||||
"New group": "Nuevo grupo",
|
||||
@@ -209,10 +209,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Nuevo rol",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Este rol tiene permisos que el suyo no tiene, así que puede verlo pero no modificarlo.",
|
||||
"Your role lets you view roles but not change them.": "Su rol le permite ver los roles, pero no modificarlos.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart asigna este rol de forma predeterminada a {kinds}. Un cambio aquí afecta a todos los que lo tienen de esa forma.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "El servidor de correo asigna este rol de forma predeterminada a {kinds}. Un cambio aquí afecta a todos los que lo tienen así.",
|
||||
"Builds on": "Se basa en",
|
||||
"Permissions": "Permisos",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart asigna este rol de forma predeterminada, así que no se puede eliminar. Cambie primero los valores predeterminados en la administración de Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "El servidor de correo asigna este rol de forma predeterminada, así que no se puede eliminar. Cambie primero los valores predeterminados en INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Este rol tiene permisos que el suyo no tiene.",
|
||||
"Create role": "Crear rol",
|
||||
"builds on this one": "se basa en este",
|
||||
@@ -239,7 +239,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Eliminar rol",
|
||||
"It can't be undone.": "No se puede deshacer.",
|
||||
"Type {name} to confirm": "Escriba {name} para confirmar",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "No se pudo cargar la lista de permisos de Stalwart, así que aquí no se pueden cambiar los permisos. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "No se pudo cargar la lista de permisos del servidor de correo, así que aquí no se pueden cambiar los permisos. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Conjuntos de permisos con nombre, asignados a cuentas, grupos e inquilinos.",
|
||||
"Search roles": "Buscar roles",
|
||||
"No roles match": "Ningún rol coincide",
|
||||
@@ -262,11 +262,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} usados",
|
||||
"Your role lets you view tenants but not change them.": "Su rol le permite ver los inquilinos, pero no modificarlos.",
|
||||
"Logo": "Logotipo",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Una dirección https o una URL data de una imagen. Stalwart la muestra a las personas del inquilino donde muestra un logotipo.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Una dirección https o una URL de datos de una imagen. El servidor de correo la muestra a las personas del inquilino donde muestra un logotipo.",
|
||||
"What it holds": "Contenido",
|
||||
"{n} of {limit}": "{n} de {limit}",
|
||||
"Limits": "Límites",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart se niega a crear más de lo que permite un límite. Un campo vacío significa sin límite.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "El servidor de correo se niega a crear más de lo que permite un límite. Un campo vacío significa sin límite.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Lo máximo que se puede permitir a cualquiera en este inquilino: sus propios roles se reducen a lo que estos conceden. Solo se ofrecen los roles cuyos permisos usted mismo tiene.",
|
||||
"Checking what is still in this tenant…": "Comprobando lo que aún hay en este inquilino…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "Aún tiene cuentas, dominios u otros elementos. Muévalos primero.",
|
||||
@@ -282,7 +282,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Aún tiene {things}. Muévalos primero.",
|
||||
"Delete tenant": "Eliminar inquilino",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Organizaciones separadas en un mismo servidor, cada una con sus propias personas, dominios y límites.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Los inquilinos son una función de Stalwart Enterprise.",
|
||||
"Search tenants": "Buscar inquilinos",
|
||||
"No tenants match": "Ningún inquilino coincide",
|
||||
"No tenants yet": "Aún no hay inquilinos",
|
||||
@@ -1143,14 +1142,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Su servidor de correo las entrega directamente a su navegador, así que llegan sin ninguna pestaña de ihasmail abierta, con el remitente y el asunto. Aun así, su navegador debe estar en marcha: si lo cierra por completo, las notificaciones esperan y llegan cuando vuelva a abrirlo.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Su servidor de correo puede despertar a este navegador, pero no incluirá el remitente ni el asunto. Aun así, su navegador debe estar en marcha.",
|
||||
"This is what a new-mail notification looks like.": "Así es una notificación de correo nuevo.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Ha iniciado sesión como {user}. Su contraseña nunca se guarda en el navegador; el servidor la conserva cifrada por sesión para comunicarse con Stalwart.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Ha iniciado sesión como {user}. Su contraseña nunca se guarda en el navegador; el servidor la conserva cifrada por sesión para comunicarse con el servidor de correo.",
|
||||
"App passwords are managed by your mail administrator.": "Las contraseñas de aplicación las gestiona su administrador de correo.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Cambiar la contraseña cierra sus demás sesiones de webmail. Las contraseñas de aplicación siguen funcionando.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Esta cuenta tiene activada la autenticación en dos pasos. ihasmail todavía no puede iniciar su sesión con un código, así que iniciar sesión en otro dispositivo requiere una contraseña de aplicación; o puede desactivar aquí la autenticación en dos pasos.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Una contraseña aparte para una aplicación de correo o un dispositivo, que puede revocar por separado. Las contraseñas de aplicación se saltan los códigos de dos pasos, así que siguen funcionando en aplicaciones que no pueden pedir uno.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Cópiela ahora en {name}: no se volverá a mostrar.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "No se han encontrado más usuarios en el directorio, así que no se puede añadir a nadie nuevo. Lo que ya está compartido aparece abajo y todavía se puede quitar.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart no comunica su número de versión a los clientes de correo, así que ihasmail indica la edición cuando el servidor la proporciona. ihasmail requiere la versión 0.16 o posterior, y el inicio de sesión rechaza cualquier versión anterior.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Este webmail funciona con el servidor de correo INBUXA, y el inicio de sesión rechaza un servidor que no ofrezca lo que necesita.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "{damage}, así que las reglas que contiene no se pueden mostrar ni editar: guardar lo que sí llegó sobrescribiría el resto. Recargue la página para intentarlo de nuevo. Sus reglas siguen en el servidor; aquí no se ha cambiado nada.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "El editor visual de reglas solo gestiona los scripts que él mismo ha creado. Puede editar el script en la pestaña {tab}, o empezar de nuevo con reglas (el script existente se conservará pero quedará desactivado).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Su script de filtrado {damage}, así que solo ha llegado en parte. Añadir una regla escribiría esa parte sobre el conjunto. Recargue la página e inténtelo de nuevo.",
|
||||
@@ -1159,8 +1158,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Aquí solo aparecen los idiomas a los que se ha traducido ihasmail, así que la lista crece a medida que llegan las traducciones y no antes: un idioma ofrecido sin textos detrás haría que la página afirmara estar en un idioma que no es el suyo.",
|
||||
"tell us about it": "cuéntenoslo",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Esta traducción la ha generado una IA y no la ha revisado ninguna persona de habla nativa, así que está marcada como Beta hasta que alguien la dé por buena. Todo lo que suene mal merece un aviso: {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "La versión de ihasmail es la fecha del commit a partir del cual se compiló, seguida de su procedencia: {example} se compiló a partir de un commit del 30 de agosto de 2026 que llegó mediante la pull request 129. Un commit que no llegó por esa vía lleva en su lugar su SHA corto: {sha}. La versión no dice nada sobre Stalwart a propósito; lo que esta compilación necesita del servidor está en la línea de arriba.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "La versión de ihasmail es la fecha del commit a partir del cual se compiló, seguida de su procedencia: {example} se compiló a partir de un commit del 30 de agosto de 2026 que llegó mediante la pull request 129. Un commit que no llegó por esa vía lleva en su lugar su SHA corto: {sha}. La versión no dice nada sobre el servidor de correo a propósito; lo que esta compilación necesita del servidor está en la línea de arriba.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Mensaje nuevo",
|
||||
"Start a new message with what was shared?": "¿Empezar un mensaje nuevo con lo que se ha compartido?",
|
||||
@@ -1215,6 +1213,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "No se pudieron guardar los filtros: {error}",
|
||||
"Could not send the receipt: {error}": "No se pudo enviar la confirmación de lectura: {error}",
|
||||
"Could not sign in.": "No se pudo iniciar sesión.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Ha iniciado sesión como {user}. Este webmail nunca ve su contraseña: guarda un token de inicio de sesión de su servidor de correo, cifrado por sesión.",
|
||||
"About INBUXA webmail": "Acerca de INBUXA webmail",
|
||||
"Mail server": "Servidor de correo",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Introducirá su contraseña en la página de inicio de sesión de su servidor de correo.",
|
||||
|
||||
+11
-12
@@ -144,8 +144,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Les chiffres que votre rôle permet de voir, tels que le serveur les indique.",
|
||||
"Nothing to show": "Rien à afficher",
|
||||
"Could not be loaded": "Chargement impossible",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Les métriques détaillées, la file de distribution, les journaux et les réglages du serveur se trouvent dans l’administration de Stalwart.",
|
||||
"Open Stalwart admin": "Ouvrir l’administration de Stalwart",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Les métriques détaillées, la file de distribution, les journaux et les réglages du serveur se trouvent dans INBUXA Admin.",
|
||||
"Open INBUXA Admin": "Ouvrir INBUXA Admin",
|
||||
"Default group role": "Rôle de groupe par défaut",
|
||||
"A group needs an address.": "Un groupe a besoin d’une adresse.",
|
||||
"New group": "Nouveau groupe",
|
||||
@@ -214,10 +214,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Nouveau rôle",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Ce rôle comporte des autorisations que le vôtre n’a pas : vous pouvez le consulter, mais pas le modifier.",
|
||||
"Your role lets you view roles but not change them.": "Votre rôle vous permet de consulter les rôles, mais pas de les modifier.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart attribue ce rôle par défaut aux {kinds}. Une modification ici touche tous ceux qui l’ont de cette façon.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Le serveur de messagerie attribue ce rôle par défaut à {kinds}. Une modification ici s’applique à tous ceux qui l’ont ainsi.",
|
||||
"Builds on": "S’appuie sur",
|
||||
"Permissions": "Autorisations",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart attribue ce rôle par défaut, il ne peut donc pas être supprimé. Modifiez d’abord les valeurs par défaut dans l’administration de Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "Le serveur de messagerie attribue ce rôle par défaut : il ne peut donc pas être supprimé. Modifiez d’abord les valeurs par défaut dans INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Ce rôle comporte des autorisations que le vôtre n’a pas.",
|
||||
"Create role": "Créer le rôle",
|
||||
"builds on this one": "s’appuie sur celui-ci",
|
||||
@@ -244,7 +244,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Supprimer le rôle",
|
||||
"It can't be undone.": "C’est irréversible.",
|
||||
"Type {name} to confirm": "Saisissez {name} pour confirmer",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "La liste des autorisations de Stalwart n’a pas pu être chargée : les autorisations ne peuvent donc pas être modifiées ici. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "La liste des autorisations du serveur de messagerie n’a pas pu être chargée : les autorisations ne peuvent donc pas être modifiées ici. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Des ensembles nommés d’autorisations, attribués aux comptes, groupes et locataires.",
|
||||
"Search roles": "Rechercher des rôles",
|
||||
"No roles match": "Aucun rôle ne correspond",
|
||||
@@ -267,11 +267,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} utilisés",
|
||||
"Your role lets you view tenants but not change them.": "Votre rôle vous permet de consulter les locataires, mais pas de les modifier.",
|
||||
"Logo": "Logo",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Une adresse https ou une URL data d’image. Stalwart l’affiche aux personnes du locataire là où il affiche un logo.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Une adresse https ou une URL de données d’une image. Le serveur de messagerie l’affiche aux personnes du locataire là où il affiche un logo.",
|
||||
"What it holds": "Contenu",
|
||||
"{n} of {limit}": "{n} sur {limit}",
|
||||
"Limits": "Limites",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart refuse de créer au-delà d’une limite. Un champ vide signifie aucune limite.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "Le serveur de messagerie refuse de créer plus que ce qu’une limite autorise. Un champ vide signifie aucune limite.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Le maximum autorisé à quiconque dans ce locataire : ses propres rôles sont réduits à ce que ceux-ci accordent. Seuls les rôles dont vous détenez vous-même les autorisations sont proposés.",
|
||||
"Checking what is still in this tenant…": "Vérification de ce que contient encore ce locataire…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "Il contient encore des comptes, des domaines ou d’autres éléments. Déplacez-les d’abord.",
|
||||
@@ -287,7 +287,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Contient encore {things}. Déplacez-les d’abord.",
|
||||
"Delete tenant": "Supprimer le locataire",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Des organisations distinctes sur un même serveur, chacune avec ses personnes, ses domaines et ses limites.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Les locataires sont une fonctionnalité de Stalwart Enterprise.",
|
||||
"Search tenants": "Rechercher des locataires",
|
||||
"No tenants match": "Aucun locataire ne correspond",
|
||||
"No tenants yet": "Aucun locataire pour l’instant",
|
||||
@@ -1148,14 +1147,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Votre serveur les remet directement à votre navigateur : elles arrivent donc sans onglet ihasmail ouvert, avec l'expéditeur et l'objet. Votre navigateur doit tout de même être en cours d'exécution — si vous le quittez complètement, les notifications attendent et arrivent à sa réouverture.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Votre serveur peut réveiller ce navigateur, mais sans indiquer l'expéditeur ni l'objet. Votre navigateur doit tout de même être en cours d'exécution.",
|
||||
"This is what a new-mail notification looks like.": "Voici à quoi ressemble une notification de nouveau message.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Vous êtes connecté en tant que {user}. Votre mot de passe n'est jamais enregistré dans le navigateur ; le serveur le conserve chiffré, par session, pour dialoguer avec Stalwart.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Vous êtes connecté en tant que {user}. Votre mot de passe n’est jamais stocké dans le navigateur ; le serveur le conserve chiffré, par session, pour communiquer avec le serveur de messagerie.",
|
||||
"App passwords are managed by your mail administrator.": "Les mots de passe d'application sont gérés par votre administrateur de messagerie.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Changer votre mot de passe déconnecte vos autres sessions webmail. Les mots de passe d'application continuent de fonctionner.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "L'authentification à deux facteurs est activée sur ce compte. ihasmail ne sait pas encore vous connecter avec un code : la connexion sur un autre appareil nécessite donc un mot de passe d'application — ou vous pouvez désactiver l'authentification à deux facteurs ici.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Un mot de passe distinct pour une application ou un appareil, révocable indépendamment. Les mots de passe d'application contournent les codes à deux facteurs et fonctionnent donc dans les applications qui ne peuvent pas en demander.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Copiez-le dans {name} maintenant — il ne sera plus affiché.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "Aucun autre utilisateur trouvé dans l'annuaire : personne de nouveau ne peut être ajouté. Les partages déjà en place sont listés ci-dessous et restent supprimables.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart ne communique pas son numéro de version aux clients de messagerie ; ihasmail indique donc l'édition lorsque le serveur en fournit une. ihasmail requiert la version 0.16 ou ultérieure, et la connexion refuse toute version antérieure.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Ce webmail fonctionne avec le serveur de messagerie INBUXA, et la connexion refuse un serveur qui n’offre pas ce dont il a besoin.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Il {damage} : les règles qu'il contient ne peuvent donc être ni affichées ni modifiées — enregistrer ce qui est arrivé écraserait le reste. Rechargez la page pour réessayer. Vos règles sont toujours sur le serveur ; rien ici ne les a modifiées.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "L'éditeur visuel de règles ne gère que les scripts qu'il a créés. Vous pouvez modifier le script dans l'onglet {tab}, ou repartir de zéro avec des règles (le script existant sera conservé mais désactivé).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Votre script de filtrage {damage} : il n'est arrivé que partiellement. Ajouter une règle écraserait l'ensemble par cette partie. Rechargez la page et réessayez.",
|
||||
@@ -1164,8 +1163,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Seules les langues dans lesquelles ihasmail a été traduit apparaissent ici : la liste s'allonge donc à mesure que les traductions arrivent, et non avant — une langue proposée sans textes derrière elle ferait prétendre à la page qu'elle est dans une langue qui n'est pas la sienne.",
|
||||
"tell us about it": "signalez-le-nous",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Cette traduction a été générée par une IA et n'a pas été relue par une personne de langue maternelle française ; elle est donc marquée Beta jusqu'à validation. Tout ce qui sonne faux mérite d'être signalé — {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "La version de ihasmail est la date du commit à partir duquel elle a été construite, suivie de l'origine de ce commit : {example} provient d'un commit daté du 30 août 2026 arrivé via la pull request 129. Un commit qui n'est pas passé par là porte à la place son SHA court — {sha}. La version ne dit délibérément rien de Stalwart ; ce dont cette build a besoin du serveur figure à la ligne ci-dessus.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "La version de ihasmail est la date du commit à partir duquel elle a été construite, suivie de l'origine de ce commit : {example} provient d'un commit daté du 30 août 2026 arrivé via la pull request 129. Un commit qui n'est pas passé par là porte à la place son SHA court — {sha}. La version ne dit délibérément rien du serveur de messagerie ; ce dont cette build a besoin du serveur figure à la ligne ci-dessus.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Nouveau message",
|
||||
"Start a new message with what was shared?": "Commencer un nouveau message avec le contenu partagé ?",
|
||||
@@ -1220,6 +1218,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Impossible d’enregistrer les filtres : {error}",
|
||||
"Could not send the receipt: {error}": "Impossible d’envoyer l’accusé de lecture : {error}",
|
||||
"Could not sign in.": "Connexion impossible.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Vous êtes connecté en tant que {user}. Ce webmail ne voit jamais votre mot de passe : il conserve un jeton de connexion de votre serveur de messagerie, chiffré par session.",
|
||||
"About INBUXA webmail": "À propos d’INBUXA webmail",
|
||||
"Mail server": "Serveur de messagerie",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Vous saisirez votre mot de passe sur la page de connexion de votre serveur de messagerie.",
|
||||
|
||||
+11
-12
@@ -138,8 +138,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "あなたのロールで見られる数値を、サーバーの報告どおりに表示します。",
|
||||
"Nothing to show": "表示するものはありません",
|
||||
"Could not be loaded": "読み込めませんでした",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "詳しいメトリクス、配送キュー、ログ、サーバー設定は Stalwart 自体の管理画面にあります。",
|
||||
"Open Stalwart admin": "Stalwart の管理画面を開く",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "詳細なメトリクス、配信キュー、ログ、サーバー設定は INBUXA Admin にあります。",
|
||||
"Open INBUXA Admin": "INBUXA Admin を開く",
|
||||
"Default group role": "グループの既定ロール",
|
||||
"A group needs an address.": "グループにはアドレスが必要です。",
|
||||
"New group": "新しいグループ",
|
||||
@@ -208,10 +208,10 @@ export const catalog: Catalog = {
|
||||
"New role": "新しいロール",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "このロールにはあなたのロールにない権限があるため、閲覧はできますが変更はできません。",
|
||||
"Your role lets you view roles but not change them.": "あなたのロールでは、ロールの閲覧はできますが変更はできません。",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart はこのロールを既定で {kinds} に付与しています。ここでの変更は、その方法でこのロールを持つ全員に及びます。",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "メールサーバーはこのロールを既定で {kinds} に付与します。ここでの変更は、この方法でロールを持つ全員に反映されます。",
|
||||
"Builds on": "継承元",
|
||||
"Permissions": "権限",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart が既定で付与するロールのため、削除できません。先に Stalwart 自体の管理画面で既定値を変更してください。",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "メールサーバーがこのロールを既定で付与するため、削除できません。先に INBUXA Admin で既定値を変更してください。",
|
||||
"This role carries permissions yours doesn't.": "このロールにはあなたのロールにない権限があります。",
|
||||
"Create role": "ロールを作成",
|
||||
"builds on this one": "このロールを継承しています",
|
||||
@@ -238,7 +238,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "ロールを削除",
|
||||
"It can't be undone.": "元に戻せません。",
|
||||
"Type {name} to confirm": "確認のため {name} と入力してください",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Stalwart の権限一覧を読み込めなかったため、ここでは権限を変更できません。({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "メールサーバーの権限一覧を読み込めなかったため、ここでは権限を変更できません。({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "アカウント、グループ、テナントに付与する、名前付きの権限のまとまりです。",
|
||||
"Search roles": "ロールを検索",
|
||||
"No roles match": "一致するロールはありません",
|
||||
@@ -261,11 +261,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} 使用中",
|
||||
"Your role lets you view tenants but not change them.": "あなたのロールでは、テナントの閲覧はできますが変更はできません。",
|
||||
"Logo": "ロゴ",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "https のアドレス、または画像の data URL です。Stalwart はロゴを表示する場所で、テナントの利用者に表示します。",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "画像の https アドレスまたはデータ URL。メールサーバーは、ロゴを表示する場所でテナントのユーザーにこれを表示します。",
|
||||
"What it holds": "含まれるもの",
|
||||
"{n} of {limit}": "{limit} 件中 {n} 件",
|
||||
"Limits": "上限",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart は上限を超える作成を拒否します。空欄は上限なしです。",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "メールサーバーは上限を超える作成を拒否します。空欄は上限なしを意味します。",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "このテナント内の誰にでも許可できる最大の範囲です。各自のロールは、これらが付与する範囲に絞られます。表示されるのは、あなた自身が権限を持つロールだけです。",
|
||||
"Checking what is still in this tenant…": "このテナントに残っているものを確認しています…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "まだアカウント、ドメインなどが含まれています。先に移動してください。",
|
||||
@@ -281,7 +281,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "まだ {things} が含まれています。先に移動してください。",
|
||||
"Delete tenant": "テナントを削除",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "1 台のサーバー上の別々の組織で、それぞれに利用者、ドメイン、上限があります。",
|
||||
"Tenants are a Stalwart Enterprise feature.": "テナントは Stalwart Enterprise の機能です。",
|
||||
"Search tenants": "テナントを検索",
|
||||
"No tenants match": "一致するテナントはありません",
|
||||
"No tenants yet": "まだテナントがありません",
|
||||
@@ -1096,16 +1095,15 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "メールサーバーが通知をブラウザーへ直接届けるため、ihasmail のタブを開いていなくても、差出人と件名つきで届きます。ただしブラウザーは起動している必要があります。完全に終了すると、通知は次に起動したときにまとめて届きます。",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "メールサーバーはこのブラウザーを呼び起こせますが、差出人や件名は含めません。ブラウザーは起動している必要があります。",
|
||||
"This is what a new-mail notification looks like.": "新着メールの通知はこのように表示されます。",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "{user} としてサインインしています。パスワードがブラウザーに保存されることはありません。サーバーが Stalwart との通信のために、セッションごとに暗号化して保持します。",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "{user} としてサインインしています。パスワードがブラウザーに保存されることはありません。メールサーバーとの通信用に、サーバーがセッションごとに暗号化して保持します。",
|
||||
"App passwords are managed by your mail administrator.": "アプリパスワードはメール管理者が管理しています。",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "パスワードを変更すると、他のウェブメールのセッションはサインアウトされます。アプリパスワードはそのまま使えます。",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "このアカウントでは 2 段階認証が有効です。ihasmail はまだ確認コードでのサインインに対応していないため、他のデバイスからサインインするにはアプリパスワードが必要です。ここで 2 段階認証をオフにすることもできます。",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "メールアプリやデバイスごとに用意する別のパスワードで、単独で無効化できます。アプリパスワードは 2 段階認証の確認コードを省くため、コードを入力できないアプリでも使えます。",
|
||||
"Copy it into {name} now — it isn't shown again.": "いま {name} にコピーしてください。二度と表示されません。",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "ディレクトリに他のユーザーが見つからないため、新しく追加することはできません。すでに設定されている共有は下に表示され、解除はできます。",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart はメールクライアントにバージョン番号を公開しないため、ihasmail はサーバーが示すエディションだけを表示します。ihasmail には 0.16 以降が必要で、それより古いサーバーへのサインインは拒否されます。",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "ihasmail 自身のバージョンは、ビルド元となったコミットの日付と、そのコミットの出どころを並べたものです。{example} は 2026 年 8 月 30 日付のコミットから作られ、そのコミットはプルリクエスト 129 を通って届きました。プルリクエストを経ていないコミットは、代わりに短い SHA が付きます — {sha}。バージョンには Stalwart に関する情報をあえて含めていません。このビルドがサーバーに求めるものは、上の行に示されています。",
|
||||
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "このウェブメールは INBUXA メールサーバーで動作し、必要な機能を提供しないサーバーへのサインインは拒否されます。",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "ihasmail 自身のバージョンは、ビルド元となったコミットの日付と、そのコミットの出どころを並べたものです。{example} は 2026 年 8 月 30 日付のコミットから作られ、そのコミットはプルリクエスト 129 を通って届きました。プルリクエストを経ていないコミットは、代わりに短い SHA が付きます — {sha}。バージョンには メールサーバーに関する情報をあえて含めていません。このビルドがサーバーに求めるものは、上の行に示されています。",
|
||||
// ── Constant labels ────────────────────────────────────────────────
|
||||
"Add": "追加",
|
||||
"Create subfolders": "サブフォルダーの作成",
|
||||
@@ -1223,6 +1221,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "フィルターを保存できませんでした: {error}",
|
||||
"Could not send the receipt: {error}": "開封確認を送信できませんでした: {error}",
|
||||
"Could not sign in.": "サインインできませんでした。",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "{user} としてサインインしています。このウェブメールがパスワードを見ることはありません。メールサーバーから受け取ったサインイン用トークンを、セッションごとに暗号化して保持します。",
|
||||
"About INBUXA webmail": "INBUXA ウェブメールについて",
|
||||
"Mail server": "メールサーバー",
|
||||
"You'll enter your password on your mail server's sign-in page.": "パスワードはメールサーバーのサインインページで入力します。",
|
||||
|
||||
+11
-12
@@ -135,8 +135,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "De cijfers die uw rol mag zien, zoals de server ze meldt.",
|
||||
"Nothing to show": "Niets om te tonen",
|
||||
"Could not be loaded": "Kon niet worden geladen",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Gedetailleerde statistieken, de bezorgwachtrij, logboeken en serverinstellingen vindt u in de beheeromgeving van Stalwart.",
|
||||
"Open Stalwart admin": "Stalwart-beheer openen",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Gedetailleerde statistieken, de bezorgwachtrij, logboeken en serverinstellingen vindt u in INBUXA Admin.",
|
||||
"Open INBUXA Admin": "INBUXA Admin openen",
|
||||
"Default group role": "Standaardrol voor groepen",
|
||||
"A group needs an address.": "Een groep heeft een adres nodig.",
|
||||
"New group": "Nieuwe groep",
|
||||
@@ -205,10 +205,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Nieuwe rol",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Deze rol heeft rechten die uw rol niet heeft, dus u kunt hem bekijken maar niet wijzigen.",
|
||||
"Your role lets you view roles but not change them.": "Met uw rol kunt u rollen bekijken, maar niet wijzigen.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart geeft deze rol standaard aan {kinds}. Een wijziging hier geldt voor iedereen die hem zo heeft.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "De mailserver geeft deze rol standaard aan {kinds}. Een wijziging hier geldt voor iedereen die hem zo heeft.",
|
||||
"Builds on": "Bouwt voort op",
|
||||
"Permissions": "Rechten",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart geeft standaard deze rol, dus hij kan niet worden verwijderd. Wijzig eerst de standaardwaarden in de beheeromgeving van Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "De mailserver geeft standaard deze rol, dus hij kan niet worden verwijderd. Wijzig eerst de standaardwaarden in INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Deze rol heeft rechten die uw rol niet heeft.",
|
||||
"Create role": "Rol aanmaken",
|
||||
"builds on this one": "bouwt voort op deze",
|
||||
@@ -236,7 +236,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Rol verwijderen",
|
||||
"It can't be undone.": "Dit kan niet ongedaan worden gemaakt.",
|
||||
"Type {name} to confirm": "Typ {name} om te bevestigen",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "De lijst met rechten van Stalwart kon niet worden geladen, dus rechten kunnen hier niet worden gewijzigd. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "De lijst met rechten van de mailserver kon niet worden geladen, dus rechten kunnen hier niet worden gewijzigd. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Benoemde sets rechten, toegekend aan accounts, groepen en tenants.",
|
||||
"Search roles": "Rollen zoeken",
|
||||
"No roles match": "Geen rollen gevonden",
|
||||
@@ -259,11 +259,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} gebruikt",
|
||||
"Your role lets you view tenants but not change them.": "Met uw rol kunt u tenants bekijken, maar niet wijzigen.",
|
||||
"Logo": "Logo",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Een https-adres of een data-URL van een afbeelding. Stalwart toont het aan de mensen van de tenant waar het een logo toont.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Een https-adres of een data-URL van een afbeelding. De mailserver toont het aan de mensen van de tenant waar hij een logo toont.",
|
||||
"What it holds": "Inhoud",
|
||||
"{n} of {limit}": "{n} van {limit}",
|
||||
"Limits": "Limieten",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart weigert meer aan te maken dan een limiet toestaat. Een leeg veld betekent geen limiet.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "De mailserver weigert meer aan te maken dan een limiet toestaat. Een leeg veld betekent geen limiet.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Het meeste dat iemand in deze tenant kan worden toegestaan: hun eigen rollen worden beperkt tot wat deze toekennen. Alleen rollen waarvan u zelf de rechten hebt worden aangeboden.",
|
||||
"Checking what is still in this tenant…": "Nagaan wat er nog in deze tenant zit…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "Er zitten nog accounts, domeinen of andere dingen in. Verplaats die eerst.",
|
||||
@@ -279,7 +279,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Bevat nog {things}. Verplaats die eerst.",
|
||||
"Delete tenant": "Tenant verwijderen",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Afzonderlijke organisaties op één server, elk met eigen mensen, domeinen en limieten.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Tenants zijn een functie van Stalwart Enterprise.",
|
||||
"Search tenants": "Tenants zoeken",
|
||||
"No tenants match": "Geen tenants gevonden",
|
||||
"No tenants yet": "Nog geen tenants",
|
||||
@@ -1141,14 +1140,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Uw mailserver levert deze rechtstreeks bij uw browser af, dus ze komen aan zonder geopend ihasmail-tabblad, met afzender en onderwerp erbij. Uw browser moet wel draaien — sluit u hem helemaal af, dan wachten de meldingen en komen ze binnen zodra u hem weer opent.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Uw mailserver kan deze browser wekken, maar vermeldt geen afzender of onderwerp. Uw browser moet wel draaien.",
|
||||
"This is what a new-mail notification looks like.": "Zo ziet een melding van nieuwe post eruit.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "U bent ingelogd als {user}. Uw wachtwoord wordt nooit in de browser opgeslagen; de server bewaart het versleuteld per sessie om met Stalwart te communiceren.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "U bent ingelogd als {user}. Uw wachtwoord wordt nooit in de browser opgeslagen; de server bewaart het versleuteld per sessie om met de mailserver te communiceren.",
|
||||
"App passwords are managed by your mail administrator.": "App-wachtwoorden worden beheerd door uw mailbeheerder.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Als u uw wachtwoord wijzigt, worden uw andere webmailsessies uitgelogd. App-wachtwoorden blijven werken.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Voor dit account staat tweefactorauthenticatie aan. ihasmail kan u nog niet met een code inloggen, dus inloggen op een ander apparaat vereist een app-wachtwoord — of u schakelt tweefactorauthenticatie hier uit.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Een apart wachtwoord voor een e-mailprogramma of apparaat, dat u afzonderlijk kunt intrekken. App-wachtwoorden slaan tweefactorcodes over en blijven dus werken in programma's die er geen kunnen vragen.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Neem het nu over in {name} — het wordt niet opnieuw getoond.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "Geen andere gebruikers gevonden in de directory, dus er kan niemand nieuws worden toegevoegd. Bestaande gedeelde items staan hieronder en kunnen nog worden verwijderd.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart geeft zijn versienummer niet door aan e-mailprogramma's, dus ihasmail noemt de editie als de server die opgeeft. ihasmail vereist 0.16 of nieuwer; inloggen weigert alles wat ouder is.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Deze webmail werkt met de INBUXA-mailserver, en aanmelden weigert een server die niet biedt wat nodig is.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Het {damage}, dus de regels erin kunnen niet worden getoond of bewerkt — wat wél is aangekomen opslaan zou de rest overschrijven. Laad de pagina opnieuw om het nog eens te proberen. Uw regels staan nog op de server; hier is er niets aan veranderd.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "De visuele regeleditor beheert alleen scripts die hij zelf heeft gemaakt. U kunt het script bewerken op het tabblad {tab}, of opnieuw beginnen met regels (het bestaande script blijft bewaard maar wordt gedeactiveerd).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Uw filterscript {damage}, dus slechts een deel is aangekomen. Een regel toevoegen zou dat deel over het geheel heen schrijven. Laad de pagina opnieuw en probeer het nog eens.",
|
||||
@@ -1157,8 +1156,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Hier verschijnen alleen talen waarin ihasmail is vertaald; de lijst groeit dus mee met de vertalingen en niet erop vooruit — een taal die wordt aangeboden zonder teksten erachter zou de pagina laten beweren dat ze in een taal is die ze niet is.",
|
||||
"tell us about it": "laat het ons weten",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Deze vertaling is door AI gemaakt en niet gecontroleerd door iemand met Nederlands als moedertaal; ze is daarom als Beta gemarkeerd tot iemand haar goedkeurt. Alles wat verkeerd klinkt, is een melding waard — {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "De eigen versie van ihasmail is de datum van de commit waaruit het is gebouwd, gevolgd door waar die commit vandaan kwam: {example} is gebouwd uit een commit van 30 augustus 2026 die via pull request 129 binnenkwam. Een commit die niet via zo'n verzoek kwam, draagt in plaats daarvan zijn korte SHA — {sha}. De versie zegt bewust niets over Stalwart; wat deze build van de server nodig heeft, staat op de regel hierboven.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "De eigen versie van ihasmail is de datum van de commit waaruit het is gebouwd, gevolgd door waar die commit vandaan kwam: {example} is gebouwd uit een commit van 30 augustus 2026 die via pull request 129 binnenkwam. Een commit die niet via zo'n verzoek kwam, draagt in plaats daarvan zijn korte SHA — {sha}. De versie zegt bewust niets over de mailserver; wat deze build van de server nodig heeft, staat op de regel hierboven.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Nieuw bericht",
|
||||
"Start a new message with what was shared?": "Een nieuw bericht beginnen met wat is gedeeld?",
|
||||
@@ -1213,6 +1211,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Filters opslaan mislukt: {error}",
|
||||
"Could not send the receipt: {error}": "De leesbevestiging kon niet worden verzonden: {error}",
|
||||
"Could not sign in.": "Aanmelden mislukt.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "U bent ingelogd als {user}. Deze webmail ziet uw wachtwoord nooit: hij bewaart een aanmeldtoken van uw mailserver, versleuteld per sessie.",
|
||||
"About INBUXA webmail": "Over INBUXA webmail",
|
||||
"Mail server": "Mailserver",
|
||||
"You'll enter your password on your mail server's sign-in page.": "U voert uw wachtwoord in op de aanmeldpagina van uw mailserver.",
|
||||
|
||||
+11
-12
@@ -142,8 +142,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Os números que sua função pode ver, como o servidor os informa.",
|
||||
"Nothing to show": "Nada para mostrar",
|
||||
"Could not be loaded": "Não foi possível carregar",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Métricas detalhadas, a fila de entrega, os logs e as configurações do servidor ficam na administração do próprio Stalwart.",
|
||||
"Open Stalwart admin": "Abrir a administração do Stalwart",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Métricas detalhadas, a fila de entrega, os registros e as configurações do servidor ficam no INBUXA Admin.",
|
||||
"Open INBUXA Admin": "Abrir o INBUXA Admin",
|
||||
"Default group role": "Função padrão de grupo",
|
||||
"A group needs an address.": "Um grupo precisa de um endereço.",
|
||||
"New group": "Novo grupo",
|
||||
@@ -212,10 +212,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Nova função",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Esta função tem permissões que a sua não tem, então você pode vê-la, mas não alterá-la.",
|
||||
"Your role lets you view roles but not change them.": "Sua função permite ver as funções, mas não alterá-las.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "O Stalwart atribui esta função por padrão a {kinds}. Uma alteração aqui afeta todos que a têm dessa forma.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "O servidor de e-mail atribui esta função por padrão a {kinds}. Uma alteração aqui vale para todos que a têm dessa forma.",
|
||||
"Builds on": "Baseia-se em",
|
||||
"Permissions": "Permissões",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "O Stalwart atribui esta função por padrão, então ela não pode ser excluída. Altere primeiro os padrões na administração do próprio Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "O servidor de e-mail atribui esta função por padrão, então ela não pode ser excluída. Altere primeiro os padrões no INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Esta função tem permissões que a sua não tem.",
|
||||
"Create role": "Criar função",
|
||||
"builds on this one": "baseia-se nesta",
|
||||
@@ -242,7 +242,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Excluir função",
|
||||
"It can't be undone.": "Isso não pode ser desfeito.",
|
||||
"Type {name} to confirm": "Digite {name} para confirmar",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Não foi possível carregar a lista de permissões do Stalwart, então as permissões não podem ser alteradas aqui. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Não foi possível carregar a lista de permissões do servidor de e-mail, então as permissões não podem ser alteradas aqui. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Conjuntos nomeados de permissões, atribuídos a contas, grupos e locatários.",
|
||||
"Search roles": "Pesquisar funções",
|
||||
"No roles match": "Nenhuma função corresponde",
|
||||
@@ -265,11 +265,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "{used} usados",
|
||||
"Your role lets you view tenants but not change them.": "Sua função permite ver os locatários, mas não alterá-los.",
|
||||
"Logo": "Logotipo",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Um endereço https ou uma URL data de uma imagem. O Stalwart a mostra às pessoas do locatário onde mostra um logotipo.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Um endereço https ou uma URL de dados de uma imagem. O servidor de e-mail a mostra às pessoas do locatário onde mostra um logotipo.",
|
||||
"What it holds": "O que contém",
|
||||
"{n} of {limit}": "{n} de {limit}",
|
||||
"Limits": "Limites",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "O Stalwart se recusa a criar mais do que um limite permite. Um campo vazio significa sem limite.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "O servidor de e-mail se recusa a criar mais do que um limite permite. Um campo vazio significa sem limite.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "O máximo que alguém neste locatário pode ter: as funções próprias são reduzidas ao que estas concedem. Só são oferecidas funções cujas permissões você mesmo tem.",
|
||||
"Checking what is still in this tenant…": "Verificando o que ainda há neste locatário…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "Ele ainda tem contas, domínios ou outros itens. Mova-os primeiro.",
|
||||
@@ -285,7 +285,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Ainda tem {things}. Mova-os primeiro.",
|
||||
"Delete tenant": "Excluir locatário",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Organizações separadas em um mesmo servidor, cada uma com suas próprias pessoas, domínios e limites.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Locatários são um recurso do Stalwart Enterprise.",
|
||||
"Search tenants": "Pesquisar locatários",
|
||||
"No tenants match": "Nenhum locatário corresponde",
|
||||
"No tenants yet": "Nenhum locatário ainda",
|
||||
@@ -1146,14 +1145,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Seu servidor de e-mail as entrega direto ao navegador, então elas chegam sem nenhuma aba do ihasmail aberta, com o remetente e o assunto. Mesmo assim o navegador precisa estar em execução — se você fechá-lo por completo, as notificações esperam e chegam quando você abri-lo de novo.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Seu servidor de e-mail consegue acordar este navegador, mas não informa o remetente nem o assunto. Mesmo assim o navegador precisa estar em execução.",
|
||||
"This is what a new-mail notification looks like.": "É assim que uma notificação de e-mail novo aparece.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Você está conectado como {user}. Sua senha nunca é guardada no navegador; o servidor a mantém criptografada por sessão para falar com o Stalwart.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Você entrou como {user}. Sua senha nunca é guardada no navegador; o servidor a mantém criptografada por sessão para se comunicar com o servidor de e-mail.",
|
||||
"App passwords are managed by your mail administrator.": "As senhas de aplicativo são gerenciadas pelo seu administrador de e-mail.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Mudar sua senha encerra suas outras sessões de webmail. As senhas de aplicativo continuam funcionando.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Esta conta está com a autenticação em duas etapas ativada. O ihasmail ainda não consegue conectar você com um código, então entrar em outro dispositivo exige uma senha de aplicativo — ou você pode desativar a autenticação em duas etapas aqui.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Uma senha separada para um aplicativo de e-mail ou dispositivo, que você pode revogar sozinha. As senhas de aplicativo dispensam os códigos de duas etapas, então continuam funcionando em aplicativos que não conseguem pedir um.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Copie-a para {name} agora — ela não será mostrada de novo.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "Nenhum outro usuário encontrado no diretório, então ninguém novo pode ser adicionado. O que já está compartilhado aparece abaixo e ainda pode ser removido.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "O Stalwart não informa seu número de versão aos clientes de e-mail, então o ihasmail indica a edição quando o servidor fornece uma. O ihasmail exige a versão 0.16 ou mais recente, e o login recusa qualquer versão anterior.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Este webmail funciona com o servidor de e-mail INBUXA, e a entrada recusa um servidor que não ofereça o que ele precisa.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Ele {damage}, então as regras nele não podem ser mostradas nem editadas — salvar o que chegou sobrescreveria o resto. Recarregue a página para tentar de novo. Suas regras continuam no servidor; nada aqui as alterou.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "O editor visual de regras só gerencia os scripts que ele mesmo criou. Você pode editar o script na aba {tab}, ou começar do zero com regras (o script existente será mantido, mas desativado).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Seu script de filtragem {damage}, então só parte dele chegou. Adicionar uma regra escreveria essa parte por cima do todo. Recarregue a página e tente de novo.",
|
||||
@@ -1162,8 +1161,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Aqui aparecem só os idiomas para os quais o ihasmail foi traduzido, então a lista cresce conforme as traduções chegam, e não antes — um idioma oferecido sem textos por trás faria a página afirmar estar em um idioma que não é o dela.",
|
||||
"tell us about it": "conte para nós",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Esta tradução foi gerada por IA e não foi revisada por uma pessoa nativa, então está marcada como Beta até que alguém a aprove. Tudo o que soar errado vale um aviso — {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "A versão do próprio ihasmail é a data do commit a partir do qual ele foi compilado, seguida da origem desse commit: {example} foi compilado a partir de um commit de 30 de agosto de 2026 que veio pela pull request 129. Um commit que não veio por uma delas carrega no lugar o SHA curto — {sha}. A versão não diz nada sobre o Stalwart de propósito; o que esta compilação precisa do servidor está na linha acima.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "A versão do próprio ihasmail é a data do commit a partir do qual ele foi compilado, seguida da origem desse commit: {example} foi compilado a partir de um commit de 30 de agosto de 2026 que veio pela pull request 129. Um commit que não veio por uma delas carrega no lugar o SHA curto — {sha}. A versão não diz nada sobre o servidor de e-mail de propósito; o que esta compilação precisa do servidor está na linha acima.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Nova mensagem",
|
||||
"Start a new message with what was shared?": "Iniciar uma nova mensagem com o que foi compartilhado?",
|
||||
@@ -1218,6 +1216,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Não foi possível salvar os filtros: {error}",
|
||||
"Could not send the receipt: {error}": "Não foi possível enviar a confirmação de leitura: {error}",
|
||||
"Could not sign in.": "Não foi possível entrar.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Você entrou como {user}. Este webmail nunca vê sua senha: ele guarda um token de entrada do seu servidor de e-mail, criptografado por sessão.",
|
||||
"About INBUXA webmail": "Sobre o INBUXA webmail",
|
||||
"Mail server": "Servidor de e-mail",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Você vai digitar sua senha na página de entrada do seu servidor de e-mail.",
|
||||
|
||||
+11
-12
@@ -141,8 +141,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Показатели, доступные вашей роли, в том виде, в каком их сообщает сервер.",
|
||||
"Nothing to show": "Нечего показать",
|
||||
"Could not be loaded": "Не удалось загрузить",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Подробные метрики, очередь доставки, журналы и настройки сервера находятся в собственной панели администрирования Stalwart.",
|
||||
"Open Stalwart admin": "Открыть администрирование Stalwart",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Подробные метрики, очередь доставки, журналы и настройки сервера находятся в INBUXA Admin.",
|
||||
"Open INBUXA Admin": "Открыть INBUXA Admin",
|
||||
"Default group role": "Роль группы по умолчанию",
|
||||
"A group needs an address.": "Группе нужен адрес.",
|
||||
"New group": "Новая группа",
|
||||
@@ -211,10 +211,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Новая роль",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "У этой роли есть разрешения, которых нет у вашей, поэтому её можно просматривать, но не изменять.",
|
||||
"Your role lets you view roles but not change them.": "Ваша роль позволяет просматривать роли, но не изменять их.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart по умолчанию выдаёт эту роль {kinds}. Изменение здесь затронет всех, кто получил её так.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Почтовый сервер по умолчанию выдаёт эту роль: {kinds}. Изменение здесь затронет всех, кто получил её так.",
|
||||
"Builds on": "Основана на",
|
||||
"Permissions": "Разрешения",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart выдаёт эту роль по умолчанию, поэтому её нельзя удалить. Сначала измените значения по умолчанию в собственной панели администрирования Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "Почтовый сервер выдаёт эту роль по умолчанию, поэтому её нельзя удалить. Сначала измените значения по умолчанию в INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "У этой роли есть разрешения, которых нет у вашей.",
|
||||
"Create role": "Создать роль",
|
||||
"builds on this one": "основана на этой",
|
||||
@@ -241,7 +241,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Удалить роль",
|
||||
"It can't be undone.": "Это нельзя отменить.",
|
||||
"Type {name} to confirm": "Введите {name} для подтверждения",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Не удалось загрузить список разрешений Stalwart, поэтому изменить разрешения здесь нельзя. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Не удалось загрузить список разрешений почтового сервера, поэтому здесь нельзя изменить разрешения. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Именованные наборы разрешений для учётных записей, групп и арендаторов.",
|
||||
"Search roles": "Поиск ролей",
|
||||
"No roles match": "Нет подходящих ролей",
|
||||
@@ -264,11 +264,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "Занято {used}",
|
||||
"Your role lets you view tenants but not change them.": "Ваша роль позволяет просматривать арендаторов, но не изменять их.",
|
||||
"Logo": "Логотип",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Адрес https или data-URL изображения. Stalwart показывает его людям арендатора там, где показывает логотип.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Адрес https или data-URL изображения. Почтовый сервер показывает его людям арендатора там, где показывает логотип.",
|
||||
"What it holds": "Содержимое",
|
||||
"{n} of {limit}": "{n} из {limit}",
|
||||
"Limits": "Лимиты",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart не даёт создать больше, чем позволяет лимит. Пустое поле — без лимита.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "Почтовый сервер не позволяет создать больше, чем разрешает лимит. Пустое поле означает отсутствие лимита.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Максимум того, что может быть разрешено любому в этом арендаторе: их собственные роли урезаются до того, что дают эти. Предлагаются только роли, разрешения которых есть у вас самих.",
|
||||
"Checking what is still in this tenant…": "Проверка того, что ещё есть у этого арендатора…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "У него ещё есть учётные записи, домены или что-то другое. Сначала перенесите их.",
|
||||
@@ -284,7 +284,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Ещё содержит: {things}. Сначала перенесите их.",
|
||||
"Delete tenant": "Удалить арендатора",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Отдельные организации на одном сервере, у каждой свои люди, домены и лимиты.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Арендаторы — функция Stalwart Enterprise.",
|
||||
"Search tenants": "Поиск арендаторов",
|
||||
"No tenants match": "Нет подходящих арендаторов",
|
||||
"No tenants yet": "Арендаторов пока нет",
|
||||
@@ -1145,14 +1144,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Почтовый сервер доставляет их прямо в браузер, поэтому они приходят без открытой вкладки ihasmail и содержат отправителя и тему. Браузер при этом должен быть запущен: если закрыть его полностью, уведомления подождут и придут при следующем запуске.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Почтовый сервер может разбудить этот браузер, но не сообщит отправителя и тему. Браузер при этом должен быть запущен.",
|
||||
"This is what a new-mail notification looks like.": "Так выглядит уведомление о новом письме.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Вы вошли как {user}. Пароль никогда не хранится в браузере: сервер держит его в зашифрованном виде на время сеанса, чтобы общаться со Stalwart.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Вы вошли как {user}. Пароль никогда не хранится в браузере; сервер хранит его в зашифрованном виде для каждого сеанса, чтобы обращаться к почтовому серверу.",
|
||||
"App passwords are managed by your mail administrator.": "Паролями приложений управляет ваш почтовый администратор.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Смена пароля завершает остальные сеансы веб-почты. Пароли приложений продолжают работать.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Для этой учётной записи включена двухфакторная аутентификация. ihasmail пока не умеет входить по коду, поэтому для входа на другом устройстве нужен пароль приложения — либо двухфакторную аутентификацию можно отключить здесь.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Отдельный пароль для почтовой программы или устройства, который можно отозвать по отдельности. Пароли приложений обходят двухфакторные коды и поэтому работают там, где запросить код невозможно.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Скопируйте его в {name} сейчас — больше он не показывается.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "В каталоге не найдено других пользователей, поэтому добавить некого. Уже открытый доступ перечислен ниже, и его по-прежнему можно закрыть.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart не сообщает почтовым клиентам номер версии, поэтому ihasmail показывает редакцию, если сервер её называет. ihasmail требует версию 0.16 или новее, и вход с более старой не выполняется.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Эта веб-почта работает с почтовым сервером INBUXA, а вход отклоняет сервер, который не предоставляет нужного.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Он {damage}, поэтому правила в нём нельзя показать или изменить: сохранение полученной части затёрло бы остальное. Перезагрузите страницу и попробуйте снова. Ваши правила остаются на сервере, здесь их ничто не меняло.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "Визуальный редактор правил работает только со скриптами, которые создал сам. Скрипт можно изменить на вкладке {tab} или начать заново с правил (существующий скрипт сохранится, но будет отключён).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Ваш скрипт фильтрации {damage}, поэтому получена только его часть. Добавление правила затёрло бы этой частью весь скрипт. Перезагрузите страницу и попробуйте снова.",
|
||||
@@ -1161,8 +1160,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Здесь показаны только языки, на которые ihasmail переведён, поэтому список растёт вместе с переводами, а не опережает их: язык без текстов заставил бы страницу утверждать, что она написана на языке, которым не является.",
|
||||
"tell us about it": "сообщите нам",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Этот перевод сделан ИИ и не проверен носителем языка, поэтому помечен как Beta до тех пор, пока кто-нибудь его не подтвердит. Обо всём, что звучит неправильно, стоит сообщить — {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "Собственная версия ihasmail — это дата коммита, из которого он собран, и указание, откуда этот коммит взялся: {example} собран из коммита от 30 августа 2026 года, пришедшего через pull request 129. Коммит, пришедший иначе, несёт вместо этого короткий SHA — {sha}. Версия намеренно ничего не сообщает о Stalwart; то, что этой сборке нужно от сервера, указано строкой выше.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "Собственная версия ihasmail — это дата коммита, из которого он собран, и указание, откуда этот коммит взялся: {example} собран из коммита от 30 августа 2026 года, пришедшего через pull request 129. Коммит, пришедший иначе, несёт вместо этого короткий SHA — {sha}. Версия намеренно ничего не сообщает о почтовом сервере; то, что этой сборке нужно от сервера, указано строкой выше.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Новое письмо",
|
||||
"Start a new message with what was shared?": "Начать новое письмо с полученным содержимым?",
|
||||
@@ -1217,6 +1215,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Не удалось сохранить фильтры: {error}",
|
||||
"Could not send the receipt: {error}": "Не удалось отправить уведомление о прочтении: {error}",
|
||||
"Could not sign in.": "Не удалось войти.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Вы вошли как {user}. Эта веб-почта никогда не видит ваш пароль: она хранит токен входа от вашего почтового сервера, зашифрованный для каждого сеанса.",
|
||||
"About INBUXA webmail": "О веб-почте INBUXA",
|
||||
"Mail server": "Почтовый сервер",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Пароль вводится на странице входа вашего почтового сервера.",
|
||||
|
||||
+11
-12
@@ -135,8 +135,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "Показники, доступні вашій ролі, у тому вигляді, як їх повідомляє сервер.",
|
||||
"Nothing to show": "Нічого показати",
|
||||
"Could not be loaded": "Не вдалося завантажити",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Докладні метрики, черга доставки, журнали та налаштування сервера є у власній панелі адміністрування Stalwart.",
|
||||
"Open Stalwart admin": "Відкрити адміністрування Stalwart",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "Докладні метрики, черга доставлення, журнали й налаштування сервера є в INBUXA Admin.",
|
||||
"Open INBUXA Admin": "Відкрити INBUXA Admin",
|
||||
"Default group role": "Роль групи за замовчуванням",
|
||||
"A group needs an address.": "Групі потрібна адреса.",
|
||||
"New group": "Нова група",
|
||||
@@ -205,10 +205,10 @@ export const catalog: Catalog = {
|
||||
"New role": "Нова роль",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "Ця роль має дозволи, яких немає у вашої, тому її можна переглядати, але не змінювати.",
|
||||
"Your role lets you view roles but not change them.": "Ваша роль дозволяє переглядати ролі, але не змінювати їх.",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart за замовчуванням надає цю роль {kinds}. Зміна тут стосується всіх, хто отримав її так.",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Поштовий сервер типово надає цю роль: {kinds}. Зміна тут стосується всіх, хто отримав її так.",
|
||||
"Builds on": "Базується на",
|
||||
"Permissions": "Дозволи",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart надає цю роль за замовчуванням, тому її не можна видалити. Спершу змініть значення за замовчуванням у власній панелі адміністрування Stalwart.",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "Поштовий сервер типово надає цю роль, тому її не можна видалити. Спершу змініть типові значення в INBUXA Admin.",
|
||||
"This role carries permissions yours doesn't.": "Ця роль має дозволи, яких немає у вашої.",
|
||||
"Create role": "Створити роль",
|
||||
"builds on this one": "базується на цій",
|
||||
@@ -235,7 +235,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "Видалити роль",
|
||||
"It can't be undone.": "Це не можна скасувати.",
|
||||
"Type {name} to confirm": "Введіть {name} для підтвердження",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Не вдалося завантажити список дозволів Stalwart, тому змінити дозволи тут не можна. ({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "Не вдалося завантажити список дозволів поштового сервера, тому тут не можна змінити дозволи. ({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "Іменовані набори дозволів для облікових записів, груп та орендарів.",
|
||||
"Search roles": "Пошук ролей",
|
||||
"No roles match": "Немає відповідних ролей",
|
||||
@@ -258,11 +258,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "Зайнято {used}",
|
||||
"Your role lets you view tenants but not change them.": "Ваша роль дозволяє переглядати орендарів, але не змінювати їх.",
|
||||
"Logo": "Логотип",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "Адреса https або data-URL зображення. Stalwart показує його людям орендаря там, де показує логотип.",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "Адреса https або data-URL зображення. Поштовий сервер показує його людям орендаря там, де показує логотип.",
|
||||
"What it holds": "Вміст",
|
||||
"{n} of {limit}": "{n} з {limit}",
|
||||
"Limits": "Ліміти",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart не дає створити більше, ніж дозволяє ліміт. Порожнє поле — без ліміту.",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "Поштовий сервер не дозволяє створити більше, ніж дозволяє ліміт. Порожнє поле означає відсутність ліміту.",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "Максимум того, що може бути дозволено будь-кому в цьому орендарі: їхні власні ролі обмежуються тим, що надають ці. Пропонуються лише ролі, дозволи яких маєте ви самі.",
|
||||
"Checking what is still in this tenant…": "Перевірка того, що ще є в цього орендаря…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "У нього ще є облікові записи, домени чи щось інше. Спершу перенесіть їх.",
|
||||
@@ -278,7 +278,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "Ще містить: {things}. Спершу перенесіть їх.",
|
||||
"Delete tenant": "Видалити орендаря",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "Окремі організації на одному сервері, кожна зі своїми людьми, доменами й лімітами.",
|
||||
"Tenants are a Stalwart Enterprise feature.": "Орендарі — функція Stalwart Enterprise.",
|
||||
"Search tenants": "Пошук орендарів",
|
||||
"No tenants match": "Немає відповідних орендарів",
|
||||
"No tenants yet": "Орендарів поки немає",
|
||||
@@ -1139,14 +1138,14 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Поштовий сервер доставляє їх прямо в браузер, тому вони надходять без відкритої вкладки ihasmail і містять відправника й тему. Браузер при цьому має бути запущений: якщо закрити його повністю, сповіщення почекають і надійдуть під час наступного запуску.",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Поштовий сервер може розбудити цей браузер, але не повідомить відправника й тему. Браузер при цьому має бути запущений.",
|
||||
"This is what a new-mail notification looks like.": "Так виглядає сповіщення про новий лист.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Ви увійшли як {user}. Пароль ніколи не зберігається в браузері: сервер тримає його зашифрованим на час сеансу, щоб спілкуватися зі Stalwart.",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "Ви ввійшли як {user}. Пароль ніколи не зберігається в браузері; сервер зберігає його зашифрованим для кожного сеансу, щоб звертатися до поштового сервера.",
|
||||
"App passwords are managed by your mail administrator.": "Паролями програм керує ваш поштовий адміністратор.",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Зміна пароля завершує інші сеанси вебпошти. Паролі програм продовжують працювати.",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Для цього облікового запису увімкнено двофакторну автентифікацію. ihasmail поки не вміє входити за кодом, тому для входу на іншому пристрої потрібен пароль програми — або двофакторну автентифікацію можна вимкнути тут.",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Окремий пароль для поштової програми чи пристрою, який можна відкликати окремо. Паролі програм обходять двофакторні коди й тому працюють там, де запитати код неможливо.",
|
||||
"Copy it into {name} now — it isn't shown again.": "Скопіюйте його до {name} зараз — більше він не показується.",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "У каталозі не знайдено інших користувачів, тому додати нікого. Уже відкритий доступ перелічено нижче, і його й далі можна закрити.",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart не повідомляє поштовим клієнтам номер версії, тому ihasmail показує редакцію, якщо сервер її називає. ihasmail потребує версію 0.16 або новішу, і вхід зі старішою не виконується.",
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "Ця вебпошта працює з поштовим сервером INBUXA, а вхід відхиляє сервер, який не надає потрібного.",
|
||||
"It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Він {damage}, тому правила в ньому не можна показати чи змінити: збереження отриманої частини затерло б решту. Перезавантажте сторінку й спробуйте знову. Ваші правила залишаються на сервері, тут їх ніщо не змінювало.",
|
||||
"The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "Візуальний редактор правил працює лише зі скриптами, які створив сам. Скрипт можна змінити на вкладці {tab} або почати заново з правил (наявний скрипт збережеться, але буде вимкнено).",
|
||||
"Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Ваш скрипт фільтрації {damage}, тому отримано лише його частину. Додавання правила затерло б цією частиною весь скрипт. Перезавантажте сторінку й спробуйте знову.",
|
||||
@@ -1155,8 +1154,7 @@ export const catalog: Catalog = {
|
||||
"Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Тут показано лише мови, якими перекладено ihasmail, тому список зростає разом із перекладами, а не випереджає їх: мова без текстів змусила б сторінку стверджувати, що вона написана мовою, якою не є.",
|
||||
"tell us about it": "повідомте нам",
|
||||
"This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Цей переклад зроблено ШІ й не перевірено носієм мови, тому його позначено як Beta, доки хтось його не підтвердить. Про все, що звучить неправильно, варто повідомити — {report}.",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "Власна версія ihasmail — це дата коміту, з якого його зібрано, і вказівка, звідки цей коміт узявся: {example} зібрано з коміту від 30 серпня 2026 року, що надійшов через pull request 129. Коміт, який надійшов інакше, несе замість цього короткий SHA — {sha}. Версія навмисно нічого не повідомляє про Stalwart; те, що цій збірці потрібно від сервера, вказано рядком вище.",
|
||||
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "Власна версія ihasmail — це дата коміту, з якого його зібрано, і вказівка, звідки цей коміт узявся: {example} зібрано з коміту від 30 серпня 2026 року, що надійшов через pull request 129. Коміт, який надійшов інакше, несе замість цього короткий SHA — {sha}. Версія навмисно нічого не повідомляє про поштовий сервер; те, що цій збірці потрібно від сервера, вказано рядком вище.",
|
||||
// ── Composer status, calendar title ────────────────────────────────
|
||||
"New message": "Новий лист",
|
||||
"Start a new message with what was shared?": "Почати новий лист з отриманим вмістом?",
|
||||
@@ -1211,6 +1209,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "Не вдалося зберегти фільтри: {error}",
|
||||
"Could not send the receipt: {error}": "Не вдалося надіслати сповіщення про прочитання: {error}",
|
||||
"Could not sign in.": "Не вдалося увійти.",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "Ви ввійшли як {user}. Ця вебпошта ніколи не бачить ваш пароль: вона зберігає токен входу від вашого поштового сервера, зашифрований для кожного сеансу.",
|
||||
"About INBUXA webmail": "Про вебпошту INBUXA",
|
||||
"Mail server": "Поштовий сервер",
|
||||
"You'll enter your password on your mail server's sign-in page.": "Пароль вводиться на сторінці входу вашого поштового сервера.",
|
||||
|
||||
+11
-12
@@ -137,8 +137,8 @@ export const catalog: Catalog = {
|
||||
"The numbers your role can see, as the server reports them.": "您的角色可以查看的数字,按服务器报告显示。",
|
||||
"Nothing to show": "没有可显示的内容",
|
||||
"Could not be loaded": "无法加载",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "详细指标、投递队列、日志和服务器设置位于 Stalwart 自身的管理界面中。",
|
||||
"Open Stalwart admin": "打开 Stalwart 管理界面",
|
||||
"Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.": "详细指标、投递队列、日志和服务器设置都在 INBUXA Admin 中。",
|
||||
"Open INBUXA Admin": "打开 INBUXA Admin",
|
||||
"Default group role": "默认群组角色",
|
||||
"A group needs an address.": "群组需要一个地址。",
|
||||
"New group": "新建群组",
|
||||
@@ -207,10 +207,10 @@ export const catalog: Catalog = {
|
||||
"New role": "新建角色",
|
||||
"This role carries permissions yours doesn't, so you can view it but not change it.": "此角色拥有您的角色所没有的权限,因此您可以查看但不能更改。",
|
||||
"Your role lets you view roles but not change them.": "您的角色可以查看角色,但不能更改。",
|
||||
"Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "Stalwart 默认将此角色授予 {kinds}。此处的更改会影响所有以这种方式获得它的人。",
|
||||
"The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.": "邮件服务器默认将此角色授予{kinds}。在此处的更改会影响所有以此方式拥有该角色的人。",
|
||||
"Builds on": "基于",
|
||||
"Permissions": "权限",
|
||||
"Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.": "Stalwart 默认授予此角色,因此无法删除。请先在 Stalwart 自身的管理界面中更改默认设置。",
|
||||
"The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.": "邮件服务器默认授予此角色,因此无法删除。请先在 INBUXA Admin 中更改默认设置。",
|
||||
"This role carries permissions yours doesn't.": "此角色拥有您的角色所没有的权限。",
|
||||
"Create role": "创建角色",
|
||||
"builds on this one": "基于此角色",
|
||||
@@ -237,7 +237,7 @@ export const catalog: Catalog = {
|
||||
"Delete role": "删除角色",
|
||||
"It can't be undone.": "此操作无法撤销。",
|
||||
"Type {name} to confirm": "输入 {name} 以确认",
|
||||
"Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "无法加载 Stalwart 的权限列表,因此无法在此更改权限。({reason})",
|
||||
"The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})": "无法加载邮件服务器的权限列表,因此无法在此更改权限。({reason})",
|
||||
"Named sets of permissions, given to accounts, groups and tenants.": "命名的权限集合,授予账户、群组和租户。",
|
||||
"Search roles": "搜索角色",
|
||||
"No roles match": "没有匹配的角色",
|
||||
@@ -260,11 +260,11 @@ export const catalog: Catalog = {
|
||||
"{used} used": "已用 {used}",
|
||||
"Your role lets you view tenants but not change them.": "您的角色可以查看租户,但不能更改。",
|
||||
"Logo": "徽标",
|
||||
"An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.": "https 地址或图片的 data URL。Stalwart 会在显示徽标的地方向租户成员展示它。",
|
||||
"An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.": "图片的 https 地址或 data URL。邮件服务器会在显示徽标的位置向该租户的成员显示它。",
|
||||
"What it holds": "包含内容",
|
||||
"{n} of {limit}": "{n}/{limit}",
|
||||
"Limits": "限额",
|
||||
"Stalwart refuses to create more than a limit allows. An empty field is no limit.": "Stalwart 会拒绝超出限额的创建。留空表示不限。",
|
||||
"The mail server refuses to create more than a limit allows. An empty field is no limit.": "邮件服务器会拒绝创建超出限额的内容。留空表示不限。",
|
||||
"The most anyone in this tenant can be allowed: their own roles are cut down to what these grant. Only roles whose permissions you hold yourself are offered.": "此租户中任何人可被允许的上限:各自的角色会被缩减到这些角色授予的范围。只提供您自己拥有其权限的角色。",
|
||||
"Checking what is still in this tenant…": "正在检查此租户中还有什么…",
|
||||
"It still holds accounts, domains or other things. Move them out first.": "它仍包含账户、域名或其他内容。请先将其移出。",
|
||||
@@ -280,7 +280,6 @@ export const catalog: Catalog = {
|
||||
"Still holds {things}. Move them out first.": "仍包含 {things}。请先将其移出。",
|
||||
"Delete tenant": "删除租户",
|
||||
"Separate organizations on one server, each with its own people, domains and limits.": "同一服务器上相互独立的组织,各有自己的成员、域名和限额。",
|
||||
"Tenants are a Stalwart Enterprise feature.": "租户是 Stalwart Enterprise 的功能。",
|
||||
"Search tenants": "搜索租户",
|
||||
"No tenants match": "没有匹配的租户",
|
||||
"No tenants yet": "还没有租户",
|
||||
@@ -1095,16 +1094,15 @@ export const catalog: Catalog = {
|
||||
"Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "您的邮件服务器会把通知直接送到浏览器,因此不必打开 ihasmail 标签页也能收到,并会显示发件人和主题。但浏览器仍需保持运行——如果完全退出浏览器,通知会等到您再次打开时送达。",
|
||||
"Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "您的邮件服务器可以唤醒此浏览器,但不会包含发件人或主题。浏览器仍需保持运行。",
|
||||
"This is what a new-mail notification looks like.": "新邮件通知就是这个样子。",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "您当前以 {user} 登录。您的密码从不保存在浏览器中;服务器会按会话加密保存,用于与 Stalwart 通信。",
|
||||
"You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.": "您已以 {user} 身份登录。您的密码从不保存在浏览器中;服务器会按会话加密保存它,用于与邮件服务器通信。",
|
||||
"App passwords are managed by your mail administrator.": "应用专用密码由您的邮件管理员管理。",
|
||||
"Changing your password signs out your other webmail sessions. Any app passwords keep working.": "更改密码会让您的其他网页邮箱会话退出登录。已有的应用专用密码仍可继续使用。",
|
||||
"This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "此账户已开启两步验证。ihasmail 目前还不能通过验证码登录,因此在其他设备上登录需要使用应用专用密码——您也可以在这里关闭两步验证。",
|
||||
"A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "为某个邮件应用或设备单独设置的密码,可以单独吊销。应用专用密码会跳过两步验证码,因此在无法输入验证码的应用中仍然可用。",
|
||||
"Copy it into {name} now — it isn't shown again.": "请立即把它复制到 {name}——它不会再次显示。",
|
||||
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "目录中没有找到其他用户,因此无法添加新的共享对象。已有的共享列在下方,仍可移除。",
|
||||
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart 不会向邮件客户端公布版本号,因此只有在服务器给出版本类型时,ihasmail 才会报告它。ihasmail 需要 0.16 或更高版本,更旧的版本一律无法登录。",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "ihasmail 自身的版本号是其构建所用提交的日期,后面跟着该提交的来源:{example} 表示由 2026 年 8 月 30 日的一个提交构建而成,而该提交来自第 129 号拉取请求。未经拉取请求的提交则改用简短 SHA 表示——{sha}。版本号刻意不包含任何关于 Stalwart 的信息;此版本对服务器的要求见上一行。",
|
||||
|
||||
"This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.": "此网页邮箱配合 INBUXA 邮件服务器使用,登录时会拒绝不提供所需功能的服务器。",
|
||||
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.": "ihasmail 自身的版本号是其构建所用提交的日期,后面跟着该提交的来源:{example} 表示由 2026 年 8 月 30 日的一个提交构建而成,而该提交来自第 129 号拉取请求。未经拉取请求的提交则改用简短 SHA 表示——{sha}。版本号刻意不包含任何关于邮件服务器的信息;此版本对服务器的要求见上一行。",
|
||||
// ── Constant labels ────────────────────────────────────────────────
|
||||
"Add": "添加",
|
||||
"Create subfolders": "创建子文件夹",
|
||||
@@ -1222,6 +1220,7 @@ export const catalog: Catalog = {
|
||||
"Could not save filters: {error}": "无法保存过滤器:{error}",
|
||||
"Could not send the receipt: {error}": "无法发送已读回执:{error}",
|
||||
"Could not sign in.": "无法登录。",
|
||||
"You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.": "您已以 {user} 身份登录。此网页邮箱从不接触您的密码:它保存的是来自邮件服务器的登录令牌,并按会话加密。",
|
||||
"About INBUXA webmail": "关于 INBUXA 网页邮箱",
|
||||
"Mail server": "邮件服务器",
|
||||
"You'll enter your password on your mail server's sign-in page.": "您将在邮件服务器的登录页面上输入密码。",
|
||||
|
||||
@@ -3,8 +3,7 @@ import { Eye, EyeOff, LogIn } from "lucide-react";
|
||||
import { useSession } from "@/store/session";
|
||||
import { ApiError } from "@/jmap/client";
|
||||
import { withBase } from "@/lib/basePath";
|
||||
import { DEFAULT_SOURCE_URL } from "@/lib/source";
|
||||
import { APP_VERSION } from "@/lib/version";
|
||||
import { APP_VERSION, SOURCE_ARCHIVE, SOURCE_ID } from "@/lib/version";
|
||||
import { DEFAULT_APP_NAME } from "@/lib/brand";
|
||||
import { t } from "@/lib/i18n";
|
||||
import { InbuxaWordmark } from "@/ui/InbuxaWordmark";
|
||||
@@ -12,9 +11,9 @@ import { InbuxaWordmark } from "@/ui/InbuxaWordmark";
|
||||
export function LoginPage() {
|
||||
const login = useSession((s) => s.login);
|
||||
// The AGPL's offer has to reach everyone who interacts with the app over the
|
||||
// network, and that includes whoever is looking at this form. The server says
|
||||
// where its own source lives, so a modified deployment points at its own.
|
||||
const [sourceUrl, setSourceUrl] = useState(DEFAULT_SOURCE_URL);
|
||||
// network, and that includes whoever is looking at this form. ihasmail-inbuxa
|
||||
// offers the exact source of this build, which the build writes next to the
|
||||
// app (see SOURCE_ARCHIVE), rather than a repository link that can drift.
|
||||
/*
|
||||
* What this instance calls itself.
|
||||
*
|
||||
@@ -42,7 +41,6 @@ export function LoginPage() {
|
||||
.then((r) => (r.ok ? r.json() : null))
|
||||
.then((c) => {
|
||||
if (!live || !c) return;
|
||||
if (c.sourceUrl) setSourceUrl(c.sourceUrl as string);
|
||||
if (typeof c.appName === "string" && c.appName.trim()) setAppName(c.appName.trim());
|
||||
setSignIn(c.signIn === "oauth" ? "oauth" : "password");
|
||||
setDirect(c.signIn === "oauth" && c.signInDirect === true);
|
||||
@@ -157,7 +155,9 @@ export function LoginPage() {
|
||||
<br />
|
||||
<a href="https://ihasmail.org" target="_blank" rel="noopener noreferrer">{t("ihasmail.org")}</a>
|
||||
{" · "}
|
||||
<a href={sourceUrl} target="_blank" rel="noopener noreferrer">{t("AGPL-3.0 source")}</a>
|
||||
<a href={withBase(SOURCE_ARCHIVE)} download>{t("AGPL-3.0 source")}</a>
|
||||
{" "}
|
||||
<span className="notranslate" translate="no">({SOURCE_ID})</span>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -115,12 +115,12 @@ export function AdminDashboard() {
|
||||
more numbers will be: this is a glance, and operating the server is
|
||||
Stalwart's own administration. The link is the operator's to give. */}
|
||||
<p className="hint admin-dashboard-note">
|
||||
{t("Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.")}
|
||||
{t("Detailed metrics, the delivery queue, logs and server settings are in INBUXA Admin.")}
|
||||
{adminUrl && (
|
||||
<>
|
||||
{" "}
|
||||
<a href={adminUrl} target="_blank" rel="noopener noreferrer">
|
||||
{t("Open Stalwart admin")} <ExternalLink size={13} aria-hidden="true" />
|
||||
{t("Open INBUXA Admin")} <ExternalLink size={13} aria-hidden="true" />
|
||||
</a>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -153,7 +153,7 @@ export function RoleSheet({ role, roles, defaults, entries, permissionsError, on
|
||||
{!creating && !locked && !can(perms, "Role", "Update") && <p className="admin-notice">{t("Your role lets you view roles but not change them.")}</p>}
|
||||
{kinds.length > 0 && (
|
||||
<p className="admin-notice warn">
|
||||
<span>{t("Stalwart gives this role by default to {kinds}. A change here reaches everyone who has it that way.", { kinds: kinds.join(", ") })}</span>
|
||||
<span>{t("The mail server gives this role by default to {kinds}. A change here reaches everyone who has it that way.", { kinds: kinds.join(", ") })}</span>
|
||||
</p>
|
||||
)}
|
||||
|
||||
@@ -186,7 +186,7 @@ export function RoleSheet({ role, roles, defaults, entries, permissionsError, on
|
||||
{!creating && can(perms, "Role", "Destroy") && (
|
||||
<DeleteRole
|
||||
role={role}
|
||||
blocked={kinds.length ? t("Stalwart gives this role by default, so it can't be deleted. Change the defaults in Stalwart's own administration first.") : locked ? t("This role carries permissions yours doesn't.") : null}
|
||||
blocked={kinds.length ? t("The mail server gives this role by default, so it can't be deleted. Change the defaults in INBUXA Admin first.") : locked ? t("This role carries permissions yours doesn't.") : null}
|
||||
onDeleted={onDeleted}
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -50,7 +50,7 @@ export function RolesAdmin({ selectedId }: { selectedId?: string }) {
|
||||
let canceled = false;
|
||||
Promise.all([loadPermissionList(), loadPermissionCatalog()]).then(
|
||||
([list, catalog]) => !canceled && setEntries(describePermissions(list, catalog, t("General"))),
|
||||
(err) => !canceled && setPermissionsError(t("Stalwart's list of permissions could not be loaded, so permissions can't be changed here. ({reason})", { reason: describeDirectoryError(err, "role") })),
|
||||
(err) => !canceled && setPermissionsError(t("The mail server's list of permissions could not be loaded, so permissions can't be changed here. ({reason})", { reason: describeDirectoryError(err, "role") })),
|
||||
);
|
||||
return () => {
|
||||
canceled = true;
|
||||
|
||||
@@ -176,7 +176,7 @@ export function TenantSheet({ tenant, roles, onClose, onChanged, onCreated, onDe
|
||||
<div className="field">
|
||||
<label htmlFor="admin-tenant-logo">{t("Logo")}</label>
|
||||
<input id="admin-tenant-logo" className="input" value={logo} disabled={!editable} placeholder="https://…" spellCheck={false} onChange={(e) => setLogo(e.target.value)} />
|
||||
<span className="hint">{t("An https address or a data URL of an image. Stalwart shows it to the tenant's people where it shows a logo.")}</span>
|
||||
<span className="hint">{t("An https address or a data URL of an image. The mail server shows it to the tenant's people where it shows a logo.")}</span>
|
||||
</div>
|
||||
|
||||
{!creating && (
|
||||
@@ -215,7 +215,7 @@ export function TenantSheet({ tenant, roles, onClose, onChanged, onCreated, onDe
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<p className="hint">{t("Stalwart refuses to create more than a limit allows. An empty field is no limit.")}</p>
|
||||
<p className="hint">{t("The mail server refuses to create more than a limit allows. An empty field is no limit.")}</p>
|
||||
|
||||
<h3>{t("Role")}</h3>
|
||||
<select className="input admin-wide" aria-label={t("Role")} value={role} disabled={!editable} onChange={(e) => setRole(e.target.value)}>
|
||||
|
||||
@@ -7,7 +7,6 @@ import { drawableLogo, getTenants, queryTenants, type DirectoryTenant } from "@/
|
||||
import { formatSize } from "@/lib/format";
|
||||
import { proxiedImageUrl } from "@/lib/text/html";
|
||||
import { plural, t } from "@/lib/i18n";
|
||||
import { useSession } from "@/store/session";
|
||||
import { Empty, Spinner } from "@/ui/misc";
|
||||
import { usePermissions } from "./usePermissions";
|
||||
import { TenantSheet } from "./TenantSheet";
|
||||
@@ -18,23 +17,15 @@ const PAGE_SIZE = 50;
|
||||
* Tenants: separate organizations on one server, each with its own people,
|
||||
* domains and limits.
|
||||
*
|
||||
* The section is offered to whoever may read tenants. INBUXA ships tenants to
|
||||
* everybody, whatever edition the server reports, so there is no edition
|
||||
* check here (public ihasmail shows only a notice unless the server reports
|
||||
* Enterprise). SHOW_ENTERPRISE_NOTICES still adds the notice, for talking to
|
||||
* upstream Stalwart.
|
||||
* The section is offered to whoever may read tenants. The INBUXA mail server
|
||||
* has one edition with tenants in it, so there is no edition check and no
|
||||
* notice here, unlike public ihasmail.
|
||||
*/
|
||||
export function TenantsAdmin({ selectedId }: { selectedId?: string }) {
|
||||
const notices = useSession((s) => s.session?.ihasmail?.server?.enterpriseNotices === true);
|
||||
return <EnterpriseTenants selectedId={selectedId} notice={notices} />;
|
||||
return <EnterpriseTenants selectedId={selectedId} />;
|
||||
}
|
||||
|
||||
/** Said on every Tenants page, Enterprise or not. */
|
||||
function EnterpriseNotice({ warn }: { warn: boolean }) {
|
||||
return <p className={`admin-notice${warn ? " warn" : ""}`}>{t("Tenants are a Stalwart Enterprise feature.")}</p>;
|
||||
}
|
||||
|
||||
function EnterpriseTenants({ selectedId, notice }: { selectedId?: string; notice: boolean }) {
|
||||
function EnterpriseTenants({ selectedId }: { selectedId?: string }) {
|
||||
const [, navigate] = useLocation();
|
||||
const perms = usePermissions();
|
||||
const [text, setText] = useState("");
|
||||
@@ -111,7 +102,6 @@ function EnterpriseTenants({ selectedId, notice }: { selectedId?: string; notice
|
||||
)}
|
||||
</div>
|
||||
|
||||
{notice && <EnterpriseNotice warn={false} />}
|
||||
|
||||
<div className="admin-toolbar">
|
||||
<label className="admin-search">
|
||||
|
||||
@@ -112,7 +112,7 @@ describe("the Administration dashboard", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("the pointer to Stalwart's own administration", () => {
|
||||
describe("the pointer to INBUXA Admin", () => {
|
||||
let host: HTMLDivElement;
|
||||
let root: Root;
|
||||
beforeEach(() => {
|
||||
@@ -136,7 +136,7 @@ describe("the pointer to Stalwart's own administration", () => {
|
||||
it("names it, and links it where the operator has said where it is", async () => {
|
||||
await renderWith("https://admin.example.com");
|
||||
const note = host.querySelector(".admin-dashboard-note")!;
|
||||
expect(note.textContent).toContain("Stalwart's own administration");
|
||||
expect(note.textContent).toContain("INBUXA Admin");
|
||||
const link = note.querySelector("a")!;
|
||||
expect(link.getAttribute("href")).toBe("https://admin.example.com");
|
||||
expect(link.getAttribute("rel")).toBe("noopener noreferrer");
|
||||
@@ -144,7 +144,7 @@ describe("the pointer to Stalwart's own administration", () => {
|
||||
|
||||
it("names it without a link where nobody has", async () => {
|
||||
await renderWith(null);
|
||||
expect(host.querySelector(".admin-dashboard-note")?.textContent).toContain("Stalwart's own administration");
|
||||
expect(host.querySelector(".admin-dashboard-note")?.textContent).toContain("INBUXA Admin");
|
||||
expect(host.querySelector(".admin-dashboard-note a")).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -86,7 +86,7 @@ describe("the role sheet", () => {
|
||||
it("warns about a default role and will not delete it", async () => {
|
||||
signIn(VIEWER);
|
||||
await render(roles.get("user")!, { user: ["user"], group: [], tenant: [], admin: [] });
|
||||
expect(host.textContent).toContain("Stalwart gives this role by default to users");
|
||||
expect(host.textContent).toContain("The mail server gives this role by default to users");
|
||||
expect(button(host, "Delete role…")?.disabled).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -69,15 +69,14 @@ describe("the Tenants page where the installation asks for Enterprise notices",
|
||||
host.remove();
|
||||
});
|
||||
|
||||
it("says tenants are Enterprise above the list, as the demo does", async () => {
|
||||
it("shows no Enterprise notice, even where the installation asks for one", async () => {
|
||||
signIn("enterprise", true);
|
||||
const { hook } = memoryLocation({ path: "/admin/tenants" });
|
||||
await act(async () => {
|
||||
root.render(<Router hook={hook}><TenantsAdmin /></Router>);
|
||||
});
|
||||
await act(async () => {});
|
||||
expect(host.querySelector(".admin-notice")?.textContent).toBe("Tenants are a Stalwart Enterprise feature.");
|
||||
expect(host.querySelector(".admin-notice.warn")).toBeNull();
|
||||
expect(host.querySelector(".admin-notice")).toBeNull();
|
||||
expect(host.querySelector(".admin-table")?.textContent).toContain("Acme Corp");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useSession } from "@/store/session";
|
||||
import { client } from "@/jmap/client";
|
||||
import { DEFAULT_SOURCE_URL } from "@/lib/source";
|
||||
import { APP_VERSION } from "@/lib/version";
|
||||
import { APP_VERSION, SOURCE_ARCHIVE, SOURCE_ID } from "@/lib/version";
|
||||
import { withBase } from "@/lib/basePath";
|
||||
import { t, tNode } from "@/lib/i18n";
|
||||
import { InbuxaWordmark } from "@/ui/InbuxaWordmark";
|
||||
@@ -9,8 +8,7 @@ import { InbuxaWordmark } from "@/ui/InbuxaWordmark";
|
||||
export function AboutSettings() {
|
||||
const session = useSession((s) => s.session);
|
||||
const caps = Object.keys(session?.capabilities ?? {});
|
||||
// A deployment running modified code should offer its own source, not ours.
|
||||
const sourceUrl = session?.ihasmail?.sourceUrl ?? DEFAULT_SOURCE_URL;
|
||||
// The exact source of this build, written next to the app by the build.
|
||||
return (
|
||||
<div>
|
||||
{/* ihasmail-inbuxa: INBUXA's webmail, built on ihasmail, whose version
|
||||
@@ -23,7 +21,7 @@ export function AboutSettings() {
|
||||
<InbuxaWordmark height={26} />
|
||||
{/* A product name and a version string: neither is a word to translate. */}
|
||||
<div style={{ fontWeight: 700 }} className="notranslate" translate="no">ihasmail v{APP_VERSION}</div>
|
||||
<div className="hint">{tNode("AGPL-3.0-or-later · {source}", { source: <a href={sourceUrl} target="_blank" rel="noreferrer">{sourceUrl.replace(/^https?:\/\//, "")}</a> })}</div>
|
||||
<div className="hint">{tNode("AGPL-3.0-or-later · {source}", { source: <a href={withBase(SOURCE_ARCHIVE)} download className="notranslate" translate="no">source.tar.gz ({SOURCE_ID})</a> })}</div>
|
||||
</div>
|
||||
</div>
|
||||
<h2>{t("Server")}</h2>
|
||||
@@ -36,8 +34,8 @@ export function AboutSettings() {
|
||||
<tr><td>{t("Image privacy proxy")}</td><td>{session?.ihasmail?.imageProxy ? t("enabled") : t("disabled")}</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p className="hint" style={{ marginTop: 6 }}>{t("Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.")}</p>
|
||||
<p className="hint">{tNode("ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.", { example: <strong className="notranslate" translate="no">v2026.8.30+pr129</strong>, sha: <code>+g1fa6578</code> })}</p>
|
||||
<p className="hint" style={{ marginTop: 6 }}>{t("This webmail works with the INBUXA mail server, and sign-in refuses a server that doesn't offer what it needs.")}</p>
|
||||
<p className="hint">{tNode("ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about the mail server; what this build needs from the server is the line above.", { example: <strong className="notranslate" translate="no">v2026.8.30+pr129</strong>, sha: <code>+g1fa6578</code> })}</p>
|
||||
<h2>{t("Server capabilities")}</h2>
|
||||
<div className="row wrap gap-4">
|
||||
{caps.map((c) => <span key={c} className="chip mono" style={{ fontSize: ".78em" }}>{c.replace("urn:ietf:params:jmap:", "")}</span>)}
|
||||
|
||||
@@ -60,7 +60,11 @@ export function SecuritySettings() {
|
||||
return (
|
||||
<div>
|
||||
<h1>{t("Security & sessions")}</h1>
|
||||
<p className="lead">{tNode("You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.", { user: <b className="notranslate" translate="no">{session?.username}</b> })}</p>
|
||||
<p className="lead">
|
||||
{session?.ihasmail?.signIn === "oauth"
|
||||
? tNode("You're signed in as {user}. This webmail never sees your password: it holds a sign-in token from your mail server, encrypted per session.", { user: <b className="notranslate" translate="no">{session?.username}</b> })
|
||||
: tNode("You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to the mail server.", { user: <b className="notranslate" translate="no">{session?.username}</b> })}
|
||||
</p>
|
||||
|
||||
<h2>{t("Password")}</h2>
|
||||
{unsupported ? (
|
||||
|
||||
+22
-2
@@ -3,11 +3,31 @@ import react from "@vitejs/plugin-react";
|
||||
import { fileURLToPath, URL } from "node:url";
|
||||
import { resolveVersion } from "../scripts/version.mjs";
|
||||
import { baseUrlOf } from "../scripts/basePath.mjs";
|
||||
import { sourceIdentity, writeSourceArchive } from "../scripts/source-archive.mjs";
|
||||
|
||||
// Resolved here, at build time: the browser has no git to ask, and neither does
|
||||
// the Docker build, which is handed the answer as IHASMAIL_VERSION instead.
|
||||
const version = resolveVersion();
|
||||
|
||||
/*
|
||||
* ihasmail-inbuxa: the AGPL's offer for this build. The whole project's source
|
||||
* (web and server), exactly as built, goes into dist/source.tar.gz, and its
|
||||
* identity into the app so the download link can name it. See
|
||||
* scripts/source-archive.mjs.
|
||||
*/
|
||||
const projectRoot = fileURLToPath(new URL("..", import.meta.url));
|
||||
const source = sourceIdentity(projectRoot);
|
||||
|
||||
function sourceArchive(): Plugin {
|
||||
return {
|
||||
name: "inbuxa-source-archive",
|
||||
apply: "build",
|
||||
closeBundle() {
|
||||
writeSourceArchive(projectRoot, fileURLToPath(new URL("./dist/source.tar.gz", import.meta.url)), "ihasmail-inbuxa", source);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Where the app is mounted. Unlike everything else ihasmail is told, this one
|
||||
* cannot wait until the process starts: the hashed asset URLs are written into
|
||||
@@ -59,8 +79,8 @@ function assetList(): Plugin {
|
||||
|
||||
export default defineConfig({
|
||||
base,
|
||||
plugins: [react(), assetList()],
|
||||
define: { __IHASMAIL_VERSION__: JSON.stringify(version) },
|
||||
plugins: [react(), assetList(), sourceArchive()],
|
||||
define: { __IHASMAIL_VERSION__: JSON.stringify(version), __SOURCE_ID__: JSON.stringify(source.id) },
|
||||
resolve: {
|
||||
alias: { "@": fileURLToPath(new URL("./src", import.meta.url)) },
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user