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:
2026-09-19 00:13:12 -07:00
parent 9d2de725c9
commit bb25355c23
59 changed files with 444 additions and 2436 deletions
+11 -12
View File
@@ -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.": "Пароль вводится на странице входа вашего почтового сервера.",