feat(locales): Add kick offline confirmation and success messages in multiple languages

This commit is contained in:
web@ppanel 2025-02-13 21:37:05 +07:00
parent 1c0ecaecbd
commit 5db5343e4b
27 changed files with 89 additions and 43 deletions

View File

@ -66,15 +66,15 @@ export function SubscriptionDetail({
},
{
accessorKey: 'user_agent',
header: 'User Agent',
header: t('userAgent'),
},
{
accessorKey: 'token',
header: 'Token',
header: t('token'),
},
{
accessorKey: 'created_at',
header: 'Time',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('created_at')),
},
]}
@ -96,17 +96,17 @@ export function SubscriptionDetail({
columns={[
{
accessorKey: 'download',
header: 'Download',
header: t('download'),
cell: ({ row }) => <Display type='traffic' value={row.getValue('download')} />,
},
{
accessorKey: 'upload',
header: 'Upload',
header: t('upload'),
cell: ({ row }) => <Display type='traffic' value={row.getValue('upload')} />,
},
{
accessorKey: 'timestamp',
header: 'Time',
header: t('time'),
cell: ({ row }) => formatDate(row.getValue('timestamp')),
},
]}
@ -128,7 +128,7 @@ export function SubscriptionDetail({
columns={[
{
accessorKey: 'enabled',
header: 'Enabled',
header: t('enable'),
cell: ({ row }) => (
<Switch
checked={row.getValue('enabled')}
@ -148,7 +148,7 @@ export function SubscriptionDetail({
},
{
accessorKey: 'user_agent',
header: 'User Agent',
header: t('userAgent'),
},
{
accessorKey: 'ip',
@ -156,16 +156,16 @@ export function SubscriptionDetail({
},
{
accessorKey: 'online',
header: 'Online',
header: t('loginStatus'),
cell: ({ row }) => (
<Badge variant={row.getValue('online') ? 'default' : 'destructive'}>
{row.getValue('online') ? 'Online' : 'Offline'}
{row.getValue('online') ? t('online') : t('offline')}
</Badge>
),
},
{
accessorKey: 'updated_at',
header: 'Last Seen',
header: t('lastSeen'),
cell: ({ row }) => formatDate(row.getValue('updated_at')),
},
]}
@ -188,13 +188,13 @@ export function SubscriptionDetail({
key='offline'
trigger={<Button variant='destructive'>{t('confirmOffline')}</Button>}
title={t('confirmOffline')}
description={`Are you sure to offline IP ${row.ip}?`}
description={t('kickOfflineConfirm', { ip: row.ip })}
onConfirm={async () => {
await kickOfflineByUserDevice({ id: row.id });
toast.success('已通知下线');
toast.success(t('kickOfflineSuccess'));
}}
cancelText='Cancel'
confirmText='Confirm'
cancelText={t('cancel')}
confirmText={t('confirm')}
/>,
];
},

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Neplatný formát e-mailu",
"inviteCode": "Pozvánkový kód",
"inviteCodePlaceholder": "Zadejte kód pozvánky (ponechte prázdné pro vygenerování)",
"kickOfflineConfirm": "Opravdu chcete odpojit IP {ip}?",
"kickOfflineSuccess": "Úspěšně oznámeno odpojení",
"loading": "Načítání...",
"loginIp": "Přihlašovací IP",
"loginNotifications": "Oznámení o přihlášení",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Ungültiges E-Mail-Format",
"inviteCode": "Einladungscode",
"inviteCodePlaceholder": "Einladungscode eingeben (leer lassen, um zu generieren)",
"kickOfflineConfirm": "Sind Sie sicher, dass Sie die IP {ip} abmelden möchten?",
"kickOfflineSuccess": "Erfolgreich offline benachrichtigt",
"loading": "Laden...",
"loginIp": "Login-IP",
"loginNotifications": "Anmeldebenachrichtigungen",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Invalid email format",
"inviteCode": "Invite Code",
"inviteCodePlaceholder": "Enter invite code (leave blank to generate)",
"kickOfflineConfirm": "Are you sure to kick offline IP {ip}?",
"kickOfflineSuccess": "Successfully notified offline",
"loading": "Loading...",
"loginIp": "Login IP",
"loginNotifications": "Login Notifications",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Formato de correo electrónico no válido",
"inviteCode": "Código de invitación",
"inviteCodePlaceholder": "Introduce el código de invitación (déjalo en blanco para generar uno)",
"kickOfflineConfirm": "¿Estás seguro de que deseas desconectar la IP {ip}?",
"kickOfflineSuccess": "Notificación de desconexión exitosa",
"loading": "Cargando...",
"loginIp": "IP de inicio de sesión",
"loginNotifications": "Notificaciones de inicio de sesión",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Formato de correo electrónico no válido",
"inviteCode": "Código de Invitación",
"inviteCodePlaceholder": "Ingresa el código de invitación (déjalo en blanco para generar uno)",
"kickOfflineConfirm": "¿Estás seguro de desconectar la IP {ip}?",
"kickOfflineSuccess": "Notificación de desconexión exitosa",
"loading": "Cargando...",
"loginIp": "IP de inicio de sesión",
"loginNotifications": "Notificaciones de inicio de sesión",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "فرمت ایمیل نامعتبر است",
"inviteCode": "کد دعوت",
"inviteCodePlaceholder": "کد دعوت را وارد کنید (برای تولید خالی بگذارید)",
"kickOfflineConfirm": "آیا مطمئن هستید که می‌خواهید IP {ip} را از سیستم خارج کنید؟",
"kickOfflineSuccess": "با موفقیت اطلاع‌رسانی به حالت آفلاین انجام شد",
"loading": "در حال بارگذاری...",
"loginIp": "آی‌پی ورود",
"loginNotifications": "اعلان‌های ورود",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Virheellinen sähköpostimuoto",
"inviteCode": "Kutsukoodi",
"inviteCodePlaceholder": "Syötä kutsukoodi (jätä tyhjäksi luodaksesi uuden)",
"kickOfflineConfirm": "Oletko varma, että haluat poistaa IP-osoitteen {ip} käytöstä?",
"kickOfflineSuccess": "Poistaminen käytöstä onnistui",
"loading": "Ladataan...",
"loginIp": "Kirjautumis-IP",
"loginNotifications": "Kirjautumisilmoitukset",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Format d'email invalide",
"inviteCode": "Code d'invitation",
"inviteCodePlaceholder": "Entrez le code d'invitation (laissez vide pour générer)",
"kickOfflineConfirm": "Êtes-vous sûr de vouloir déconnecter l'IP {ip} ?",
"kickOfflineSuccess": "Notification de déconnexion réussie",
"loading": "Chargement...",
"loginIp": "IP de connexion",
"loginNotifications": "Notifications de connexion",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "अमान्य ईमेल प्रारूप",
"inviteCode": "आमंत्रण कोड",
"inviteCodePlaceholder": "आमंत्रण कोड दर्ज करें (उत्पन्न करने के लिए खाली छोड़ें)",
"kickOfflineConfirm": "क्या आप सुनिश्चित हैं कि IP {ip} को ऑफलाइन करें?",
"kickOfflineSuccess": "सफलता से ऑफलाइन करने की सूचना दी गई",
"loading": "लोड हो रहा है...",
"loginIp": "लॉगिन आईपी",
"loginNotifications": "लॉगिन सूचनाएं",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Érvénytelen e-mail formátum",
"inviteCode": "Meghívókód",
"inviteCodePlaceholder": "Adja meg a meghívó kódot (hagyja üresen a generáláshoz)",
"kickOfflineConfirm": "Biztosan ki szeretnéd léptetni a {ip} IP címet?",
"kickOfflineSuccess": "Sikeresen értesítettük a kikapcsolásról",
"loading": "Betöltés...",
"loginIp": "Bejelentkezési IP",
"loginNotifications": "Bejelentkezési értesítések",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "無効なメール形式です",
"inviteCode": "招待コード",
"inviteCodePlaceholder": "招待コードを入力してください(生成するには空白のままにしてください)",
"kickOfflineConfirm": "IP {ip} をオフラインにすることを本当に確認しますか?",
"kickOfflineSuccess": "オフライン通知が成功しました",
"loading": "読み込み中...",
"loginIp": "ログインIP",
"loginNotifications": "ログイン通知",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "잘못된 이메일 형식입니다",
"inviteCode": "초대 코드",
"inviteCodePlaceholder": "초대 코드를 입력하세요 (생성을 원하시면 비워두세요)",
"kickOfflineConfirm": "정말로 오프라인 IP {ip}를 강제로 종료하시겠습니까?",
"kickOfflineSuccess": "오프라인 알림이 성공적으로 전송되었습니다.",
"loading": "로딩 중...",
"loginIp": "로그인 IP",
"loginNotifications": "로그인 알림",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Ugyldig e-postformat",
"inviteCode": "Invitasjonskode",
"inviteCodePlaceholder": "Skriv inn invitasjonskode (la stå tom for å generere)",
"kickOfflineConfirm": "Er du sikker på at du vil fjerne IP {ip} fra nettverket?",
"kickOfflineSuccess": "Varsel om fjerning ble sendt med suksess",
"loading": "Laster inn...",
"loginIp": "Innloggings-IP",
"loginNotifications": "Påloggingsvarsler",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Nieprawidłowy format adresu e-mail",
"inviteCode": "Kod zaproszenia",
"inviteCodePlaceholder": "Wprowadź kod zaproszenia (pozostaw puste, aby wygenerować)",
"kickOfflineConfirm": "Czy na pewno chcesz wylogować IP {ip}?",
"kickOfflineSuccess": "Pomyślnie powiadomiono o wylogowaniu",
"loading": "Ładowanie...",
"loginIp": "IP logowania",
"loginNotifications": "Powiadomienia o logowaniu",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Formato de e-mail inválido",
"inviteCode": "Código de Convite",
"inviteCodePlaceholder": "Digite o código de convite (deixe em branco para gerar)",
"kickOfflineConfirm": "Você tem certeza de que deseja desconectar o IP {ip}?",
"kickOfflineSuccess": "Notificação de desconexão enviada com sucesso",
"loading": "Carregando...",
"loginIp": "IP de Login",
"loginNotifications": "Notificações de Login",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Format de email invalid",
"inviteCode": "Cod de invitație",
"inviteCodePlaceholder": "Introduceți codul de invitație (lăsați necompletat pentru a genera)",
"kickOfflineConfirm": "Ești sigur că vrei să deconectezi IP-ul {ip}?",
"kickOfflineSuccess": "Notificare de deconectare reușită",
"loading": "Se încarcă...",
"loginIp": "IP de autentificare",
"loginNotifications": "Notificări de autentificare",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Неверный формат электронной почты",
"inviteCode": "Код приглашения",
"inviteCodePlaceholder": "Введите код приглашения (оставьте пустым для генерации)",
"kickOfflineConfirm": "Вы уверены, что хотите отключить IP {ip}?",
"kickOfflineSuccess": "Успешно уведомлено об отключении",
"loading": "Загрузка...",
"loginIp": "IP-адрес входа",
"loginNotifications": "Уведомления о входе",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
"inviteCode": "รหัสเชิญ",
"inviteCodePlaceholder": "กรอกรหัสเชิญ (เว้นว่างไว้เพื่อสร้างใหม่)",
"kickOfflineConfirm": "คุณแน่ใจหรือว่าต้องการเตะ IP {ip} ออกจากระบบ?",
"kickOfflineSuccess": "แจ้งเตือนการเตะออกสำเร็จ",
"loading": "กำลังโหลด...",
"loginIp": "ไอพีที่เข้าสู่ระบบ",
"loginNotifications": "การแจ้งเตือนการเข้าสู่ระบบ",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Geçersiz e-posta formatı",
"inviteCode": "Davet Kodu",
"inviteCodePlaceholder": "Davet kodunu girin (oluşturmak için boş bırakın)",
"kickOfflineConfirm": "IP {ip}'yi çevrimdışı olarak atmak istediğinize emin misiniz?",
"kickOfflineSuccess": "Başarıyla çevrimdışı bildirildi",
"loading": "Yükleniyor...",
"loginIp": "Giriş IP'si",
"loginNotifications": "Giriş Bildirimleri",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Неправильний формат електронної пошти",
"inviteCode": "Код запрошення",
"inviteCodePlaceholder": "Введіть код запрошення (залиште порожнім для генерації)",
"kickOfflineConfirm": "Ви впевнені, що хочете відключити IP {ip}?",
"kickOfflineSuccess": "Успішно надіслано повідомлення про відключення",
"loading": "Завантаження...",
"loginIp": "IP-адреса входу",
"loginNotifications": "Сповіщення про вхід",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "Định dạng email không hợp lệ",
"inviteCode": "Mã Mời",
"inviteCodePlaceholder": "Nhập mã mời (để trống để tạo mới)",
"kickOfflineConfirm": "Bạn có chắc chắn muốn ngắt kết nối IP {ip} không?",
"kickOfflineSuccess": "Thông báo ngắt kết nối thành công",
"loading": "Đang tải...",
"loginIp": "Địa chỉ IP đăng nhập",
"loginNotifications": "Thông báo Đăng nhập",

View File

@ -1,16 +1,16 @@
{
"accountEnable": "账启用",
"accountEnable": "账启用",
"actions": "操作",
"add": "添加",
"administrator": "管理员",
"areaCode": "区号",
"areaCodePlaceholder": "区号",
"areaCodePlaceholder": "输入区号",
"auth": "认证",
"authIdentifier": "认证标识",
"authIdentifierPlaceholder": "输入认证标识",
"authMethodsTitle": "身份验证设置",
"authIdentifier": "认证标识",
"authIdentifierPlaceholder": "输入认证标识",
"authMethodsTitle": "证设置",
"authType": "认证类型",
"authUser": "授权用户",
"authUser": "认证用户",
"avatar": "头像",
"balance": "余额",
"balanceNotifications": "余额变动通知",
@ -20,16 +20,16 @@
"commission": "佣金",
"commissionPlaceholder": "输入佣金",
"confirm": "确认",
"confirmDelete": "您确定要删除吗?",
"confirmOffline": "确认线",
"confirmDelete": "确认删除",
"confirmOffline": "确认线",
"create": "创建",
"createSubscription": "创建订阅",
"createSuccess": "创建成功",
"createUser": "创建用户",
"createdAt": "注册时间",
"createdAt": "创建时间",
"delete": "删除",
"deleteDescription": "删除后无法恢复数据,请谨慎操作",
"deleteSubscriptionDescription": "确定要删除此订阅吗?",
"deleteDescription": "删除后数据无法恢复,请谨慎操作",
"deleteSubscriptionDescription": "确定要删除此订阅吗?",
"deleteSuccess": "删除成功",
"detail": "详情",
"deviceLimit": "设备限制",
@ -39,16 +39,18 @@
"editSubscription": "编辑订阅",
"editUser": "编辑用户",
"email": "邮箱",
"emailNotifications": "电子邮件通知",
"emailNotifications": "邮件通知",
"enable": "启用",
"expireTime": "期时间",
"expireTime": "期时间",
"expiredAt": "过期时间",
"failed": "失败",
"giftAmount": "礼物金额",
"giftAmountPlaceholder": "输入礼品金额",
"invalidEmailFormat": "电子邮件格式无效",
"giftAmount": "赠送金额",
"giftAmountPlaceholder": "输入赠送金额",
"invalidEmailFormat": "邮箱格式不正确",
"inviteCode": "邀请码",
"inviteCodePlaceholder": "输入邀请码(留空以生成)",
"inviteCodePlaceholder": "输入邀请码(留空自动生成)",
"kickOfflineConfirm": "确定要下线 IP {ip} 吗?",
"kickOfflineSuccess": "已通知下线",
"loading": "加载中...",
"loginIp": "登录IP",
"loginNotifications": "登录通知",
@ -58,9 +60,9 @@
"notifySettingsTitle": "通知设置",
"onlineDevices": "在线设备",
"password": "密码",
"passwordPlaceholder": "输入新密码(选)",
"passwordPlaceholder": "输入新密码(",
"permanent": "永久",
"pleaseEnterEmail": "请输入电子邮件",
"pleaseEnterEmail": "请输入邮箱",
"referer": "推荐人",
"refererId": "推荐人ID",
"refererIdPlaceholder": "输入推荐人ID",
@ -71,7 +73,7 @@
"save": "保存",
"searchIp": "搜索IP地址",
"selectAuthType": "选择认证类型",
"speedLimit": "速",
"speedLimit": "度限制",
"subscription": "订阅",
"subscriptionDetails": "订阅详情",
"subscriptionList": "订阅列表",
@ -79,14 +81,14 @@
"subscriptionName": "订阅名称",
"subscriptionNotifications": "订阅通知",
"success": "成功",
"telegramNotifications": "Telegram 通知",
"telephone": "电话号码",
"telephonePlaceholder": "输入电话号码",
"telegramNotifications": "Telegram通知",
"telephone": "手机号",
"telephonePlaceholder": "输入手机号",
"totalTraffic": "总流量",
"tradeNotifications": "交易通知",
"trafficLimit": "流量限制",
"trafficLogs": "流量日志",
"unlimited": "无限",
"unlimited": "无限",
"unverified": "未验证",
"update": "更新",
"updateSuccess": "更新成功",
@ -97,7 +99,7 @@
"userEmailPlaceholder": "输入用户邮箱",
"userList": "用户列表",
"userLogs": "登录历史",
"userName": "用户标识",
"userName": "用户标识",
"userOrders": "订单",
"userProfile": "个人资料",
"userSubscriptions": "订阅",

View File

@ -49,6 +49,8 @@
"invalidEmailFormat": "電郵格式無效",
"inviteCode": "邀請碼",
"inviteCodePlaceholder": "輸入邀請碼(留空以生成)",
"kickOfflineConfirm": "您確定要踢掉 IP {ip} 嗎?",
"kickOfflineSuccess": "成功通知已下線",
"loading": "載入中...",
"loginIp": "登入 IP",
"loginNotifications": "登入通知",

View File

@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as announcement from './announcement';

View File

@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';

View File

@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';