: null}
{ if (!open) setConfirm(null) }}
title={t(confirm === 'revoke' ? 'invitation.revokeTitle' : 'invitation.replaceTitle')}
description={t(confirm === 'revoke' ? 'invitation.revokeDescription' : 'invitation.replaceDescription')}
diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json
index f89f70cb..2f91cc42 100644
--- a/web/src/i18n/locales/en.json
+++ b/web/src/i18n/locales/en.json
@@ -1406,7 +1406,6 @@
"invalid": "This invitation link is invalid or expired. Ask a space admin for a new link.",
"loading": "Checking invitation…",
"networkError": "Connection failed. Try again.",
- "retry": "Retry",
"namespace": "Space: {{name}}",
"account": "Current account: {{name}}",
"permissions": "Confirm to join as MEMBER. You can access space resources and publish skills.",
@@ -1416,7 +1415,19 @@
"activeUnavailable": "The invitation is active, but this tab has no saved link. Copy it from the tab that created it, or confirm creating a replacement to invalidate the old link.",
"localLinkHint": "The link is saved only for this account in this browser tab; one new member can use it within 24 hours.",
"copy": "Copy link",
- "storageUnavailable": "Your browser could not save the link. Copy it now; it cannot be restored after closing this dialog or refreshing."
+ "storageUnavailable": "Your browser could not save the link. Copy it now; it cannot be restored after closing this dialog or refreshing.",
+ "statusLoading": "Checking invitation status",
+ "statusActive": "Invitation active",
+ "statusInactive": "No active invitation",
+ "detailsTitle": "How joining works",
+ "singleUse": "One new member can use this invitation within 24 hours.",
+ "memberAccess": "The recipient joins as a member and can access skills shared with this space.",
+ "accessPolicy": "The recipient must sign in and meet existing admission rules. Opening the link does not join automatically.",
+ "replaceAction": "Replace invitation link",
+ "managementTitle": "Manage invitation",
+ "retry": "Refresh status",
+ "expiresAtLabel": "Expires at",
+ "statusError": "Unable to check invitation status"
},
"members": {
"title": "Member Management",
diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json
index 39371feb..528981dd 100644
--- a/web/src/i18n/locales/ru.json
+++ b/web/src/i18n/locales/ru.json
@@ -1471,7 +1471,6 @@
"invalid": "Ссылка-приглашение недействительна или истекла. Запросите новую ссылку у администратора.",
"loading": "Проверка приглашения…",
"networkError": "Ошибка соединения. Попробуйте ещё раз.",
- "retry": "Повторить",
"namespace": "Пространство: {{name}}",
"account": "Текущая учётная запись: {{name}}",
"permissions": "Подтвердите вступление с ролью MEMBER. Вы сможете просматривать ресурсы и публиковать навыки.",
@@ -1481,7 +1480,19 @@
"activeUnavailable": "Приглашение активно, но ссылка не сохранена в этой вкладке. Скопируйте её из вкладки, в которой создали приглашение, или подтвердите замену ссылки.",
"localLinkHint": "Ссылка сохранена только для текущего аккаунта в этой вкладке; один новый участник может использовать её в течение 24 часов.",
"copy": "Копировать ссылку",
- "storageUnavailable": "Браузер не смог сохранить ссылку. Скопируйте её сейчас; после закрытия окна или обновления восстановить её не получится."
+ "storageUnavailable": "Браузер не смог сохранить ссылку. Скопируйте её сейчас; после закрытия окна или обновления восстановить её не получится.",
+ "statusLoading": "Проверка приглашения",
+ "statusActive": "Приглашение активно",
+ "statusInactive": "Нет активного приглашения",
+ "detailsTitle": "Правила вступления",
+ "singleUse": "Приглашение действует 24 часа и доступно одному новому участнику.",
+ "memberAccess": "Получатель становится участником и получает доступ к навыкам пространства, доступным участникам.",
+ "accessPolicy": "Получатель должен войти и пройти действующие правила допуска. Открытие ссылки не добавляет его автоматически.",
+ "replaceAction": "Заменить ссылку приглашения",
+ "managementTitle": "Управление приглашением",
+ "retry": "Обновить статус",
+ "expiresAtLabel": "Истекает",
+ "statusError": "Не удалось проверить статус приглашения"
},
"members": {
"title": "Управление участниками",
diff --git a/web/src/i18n/locales/zh.json b/web/src/i18n/locales/zh.json
index 36f2369c..b18d75a5 100644
--- a/web/src/i18n/locales/zh.json
+++ b/web/src/i18n/locales/zh.json
@@ -1406,7 +1406,6 @@
"invalid": "邀请链接无效或已失效,请联系空间管理员获取新链接。",
"loading": "正在核对邀请…",
"networkError": "连接失败,请重试。",
- "retry": "重试",
"namespace": "目标空间:{{name}}",
"account": "当前账号:{{name}}",
"permissions": "确认后,你将以 MEMBER 身份加入,可访问空间资源并发布技能。",
@@ -1416,7 +1415,19 @@
"activeUnavailable": "当前邀请仍有效,但此标签页没有保存完整链接。可在创建链接的标签页复制,或确认生成新链接使旧链接失效。",
"localLinkHint": "链接仅保存在当前账号的这个浏览器标签页;24 小时内可供一名新成员使用。",
"copy": "复制链接",
- "storageUnavailable": "浏览器未能保存链接,请现在复制;关闭此窗口或刷新后将无法恢复。"
+ "storageUnavailable": "浏览器未能保存链接,请现在复制;关闭此窗口或刷新后将无法恢复。",
+ "statusLoading": "正在获取邀请状态",
+ "statusActive": "邀请有效",
+ "statusInactive": "暂无有效邀请",
+ "detailsTitle": "加入规则",
+ "singleUse": "单次邀请:仅限一名新成员使用,有效期 24 小时。",
+ "memberAccess": "加入后获得成员权限,可访问空间内对成员开放的技能。",
+ "accessPolicy": "对方须先登录并通过平台现有准入,打开链接不会自动加入。",
+ "replaceAction": "替换邀请链接",
+ "managementTitle": "管理邀请",
+ "retry": "重新获取状态",
+ "expiresAtLabel": "到期时间",
+ "statusError": "邀请状态获取失败"
},
"members": {
"title": "成员管理",
diff --git a/web/src/pages/dashboard/namespace-members.tsx b/web/src/pages/dashboard/namespace-members.tsx
index 14f78e71..dfab9b88 100644
--- a/web/src/pages/dashboard/namespace-members.tsx
+++ b/web/src/pages/dashboard/namespace-members.tsx
@@ -180,9 +180,9 @@ export function NamespaceMembersPage() {
{canManageMembers ? (