feat: Highlight notification card (#11705)

* feat: highlight card

* feat: highlight card

* feat: highlight card

* fix: add missing translation

* fix: add missing translation

* fix: action link
This commit is contained in:
René Wang
2026-01-24 18:01:01 +08:00
committed by GitHub
parent 8ae345647e
commit 113b491dc7
23 changed files with 334 additions and 3 deletions

View File

@@ -324,6 +324,9 @@
"pin": "تثبيت",
"pinOff": "إلغاء التثبيت",
"privacy": "سياسة الخصوصية",
"productHunt.actionLabel": "ادعمنا",
"productHunt.description": "ادعمنا على Product Hunt. دعمك يعني لنا الكثير!",
"productHunt.title": "نحن على Product Hunt!",
"regenerate": "إعادة التوليد",
"releaseNotes": "تفاصيل الإصدار",
"rename": "إعادة التسمية",
@@ -332,6 +335,11 @@
"run": "تشغيل",
"save": "حفظ",
"send": "إرسال",
"serverVersionOutdated.desc": "إصدار العميل الخاص بك (v{{version}}) يتطلب إصدار خادم أحدث.",
"serverVersionOutdated.dismiss": "المتابعة على أي حال",
"serverVersionOutdated.title": "إصدار الخادم قديم",
"serverVersionOutdated.upgrade": "دليل التحديث",
"serverVersionOutdated.warning": "قد لا تعمل بعض الميزات بشكل صحيح أو قد تتصرف بشكل غير متوقع. يُرجى تحديث الخادم للحصول على أفضل تجربة.",
"setting": "الإعدادات",
"share": "مشاركة",
"stop": "إيقاف",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "ترقية",
"upgradeVersion.hasNew": "تحديث متوفر",
"upgradeVersion.newVersion": "تحديث متوفر: {{version}}",
"upgradeVersion.serverVersion": "الخادم: {{version}}",
"userPanel.anonymousNickName": "مستخدم مجهول",
"userPanel.billing": "إدارة الفوترة",
"userPanel.cloud": "تشغيل {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Закачи",
"pinOff": "Откачи",
"privacy": "Политика за поверителност",
"productHunt.actionLabel": "Подкрепете ни",
"productHunt.description": "Подкрепете ни в Product Hunt. Вашата подкрепа означава много за нас!",
"productHunt.title": "Ние сме в Product Hunt!",
"regenerate": "Генерирай отново",
"releaseNotes": "Детайли за версията",
"rename": "Преименувай",
@@ -332,6 +335,11 @@
"run": "Стартирай",
"save": "Запази",
"send": "Изпрати",
"serverVersionOutdated.desc": "Вашата клиентска версия (v{{version}}) изисква по-нова версия на сървъра.",
"serverVersionOutdated.dismiss": "Продължи въпреки това",
"serverVersionOutdated.title": "Остаряла версия на сървъра",
"serverVersionOutdated.upgrade": "Ръководство за надграждане",
"serverVersionOutdated.warning": "Някои функции може да не работят правилно или да се държат неочаквано. Моля, актуализирайте сървъра си за най-добро изживяване.",
"setting": "Настройки",
"share": "Сподели",
"stop": "Спри",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Актуализирай",
"upgradeVersion.hasNew": "Налична е актуализация",
"upgradeVersion.newVersion": "Налична е актуализация: {{version}}",
"upgradeVersion.serverVersion": "Сървър: {{version}}",
"userPanel.anonymousNickName": "Анонимен потребител",
"userPanel.billing": "Управление на плащания",
"userPanel.cloud": "Стартирай {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Anheften",
"pinOff": "Lösen",
"privacy": "Datenschutzrichtlinie",
"productHunt.actionLabel": "Unterstütze uns",
"productHunt.description": "Unterstütze uns auf Product Hunt. Deine Unterstützung bedeutet uns viel!",
"productHunt.title": "Wir sind auf Product Hunt!",
"regenerate": "Neu generieren",
"releaseNotes": "Versionshinweise",
"rename": "Umbenennen",
@@ -332,6 +335,11 @@
"run": "Ausführen",
"save": "Speichern",
"send": "Senden",
"serverVersionOutdated.desc": "Deine Client-Version (v{{version}}) erfordert eine neuere Server-Version.",
"serverVersionOutdated.dismiss": "Trotzdem fortfahren",
"serverVersionOutdated.title": "Server-Version veraltet",
"serverVersionOutdated.upgrade": "Upgrade-Anleitung",
"serverVersionOutdated.warning": "Einige Funktionen könnten nicht richtig funktionieren oder sich unerwartet verhalten. Bitte aktualisiere deinen Server für das beste Nutzungserlebnis.",
"setting": "Einstellungen",
"share": "Teilen",
"stop": "Stopp",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Aktualisieren",
"upgradeVersion.hasNew": "Aktualisierung verfügbar",
"upgradeVersion.newVersion": "Neue Version verfügbar: {{version}}",
"upgradeVersion.serverVersion": "Server: {{version}}",
"userPanel.anonymousNickName": "Anonymer Benutzer",
"userPanel.billing": "Abrechnungsverwaltung",
"userPanel.cloud": "{{name}} starten",

View File

@@ -324,6 +324,9 @@
"pin": "Pin",
"pinOff": "Unpin",
"privacy": "Privacy Policy",
"productHunt.actionLabel": "Support us",
"productHunt.description": "Support us on Product Hunt. Your support means a lot to us!",
"productHunt.title": "We're on Product Hunt!",
"regenerate": "Regenerate",
"releaseNotes": "Version Details",
"rename": "Rename",

View File

@@ -324,6 +324,9 @@
"pin": "Fijar",
"pinOff": "Desfijar",
"privacy": "Política de privacidad",
"productHunt.actionLabel": "Apóyanos",
"productHunt.description": "Apóyanos en Product Hunt. ¡Tu apoyo significa mucho para nosotros!",
"productHunt.title": "¡Estamos en Product Hunt!",
"regenerate": "Regenerar",
"releaseNotes": "Detalles de la versión",
"rename": "Renombrar",
@@ -332,6 +335,11 @@
"run": "Ejecutar",
"save": "Guardar",
"send": "Enviar",
"serverVersionOutdated.desc": "Tu versión del cliente (v{{version}}) requiere una versión del servidor más reciente.",
"serverVersionOutdated.dismiss": "Continuar de todos modos",
"serverVersionOutdated.title": "Versión del servidor desactualizada",
"serverVersionOutdated.upgrade": "Guía de actualización",
"serverVersionOutdated.warning": "Es posible que algunas funciones no funcionen correctamente o se comporten de forma inesperada. Por favor, actualiza tu servidor para una mejor experiencia.",
"setting": "Configuración",
"share": "Compartir",
"stop": "Detener",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Actualizar",
"upgradeVersion.hasNew": "Actualización disponible",
"upgradeVersion.newVersion": "Actualización disponible: {{version}}",
"upgradeVersion.serverVersion": "Servidor: {{version}}",
"userPanel.anonymousNickName": "Usuario anónimo",
"userPanel.billing": "Gestión de facturación",
"userPanel.cloud": "Lanzar {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "سنجاق کردن",
"pinOff": "برداشتن سنجاق",
"privacy": "سیاست حفظ حریم خصوصی",
"productHunt.actionLabel": "از ما حمایت کنید",
"productHunt.description": "در Product Hunt از ما حمایت کنید. حمایت شما برای ما بسیار ارزشمند است!",
"productHunt.title": "ما در Product Hunt هستیم!",
"regenerate": "تولید مجدد",
"releaseNotes": "جزئیات نسخه",
"rename": "تغییر نام",
@@ -332,6 +335,11 @@
"run": "اجرا",
"save": "ذخیره",
"send": "ارسال",
"serverVersionOutdated.desc": "نسخه کلاینت شما (v{{version}}) به نسخه جدیدتری از سرور نیاز دارد.",
"serverVersionOutdated.dismiss": "ادامه با همین وضعیت",
"serverVersionOutdated.title": "نسخه سرور قدیمی است",
"serverVersionOutdated.upgrade": "راهنمای ارتقاء",
"serverVersionOutdated.warning": "برخی قابلیت‌ها ممکن است به درستی کار نکنند یا رفتار غیرمنتظره‌ای داشته باشند. لطفاً برای بهترین تجربه، سرور خود را به‌روزرسانی کنید.",
"setting": "تنظیمات",
"share": "اشتراک‌گذاری",
"stop": "توقف",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "ارتقاء",
"upgradeVersion.hasNew": "به‌روزرسانی در دسترس است",
"upgradeVersion.newVersion": "به‌روزرسانی در دسترس: {{version}}",
"upgradeVersion.serverVersion": "سرور: {{version}}",
"userPanel.anonymousNickName": "کاربر ناشناس",
"userPanel.billing": "مدیریت صورتحساب",
"userPanel.cloud": "اجرای {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Épingler",
"pinOff": "Désépingler",
"privacy": "Politique de confidentialité",
"productHunt.actionLabel": "Soutenez-nous",
"productHunt.description": "Soutenez-nous sur Product Hunt. Votre soutien compte beaucoup pour nous !",
"productHunt.title": "Nous sommes sur Product Hunt !",
"regenerate": "Régénérer",
"releaseNotes": "Détails de la version",
"rename": "Renommer",
@@ -332,6 +335,11 @@
"run": "Exécuter",
"save": "Enregistrer",
"send": "Envoyer",
"serverVersionOutdated.desc": "Votre version du client (v{{version}}) nécessite une version plus récente du serveur.",
"serverVersionOutdated.dismiss": "Continuer quand même",
"serverVersionOutdated.title": "Version du serveur obsolète",
"serverVersionOutdated.upgrade": "Guide de mise à jour",
"serverVersionOutdated.warning": "Certaines fonctionnalités peuvent ne pas fonctionner correctement ou se comporter de manière inattendue. Veuillez mettre à jour votre serveur pour une expérience optimale.",
"setting": "Paramètres",
"share": "Partager",
"stop": "Arrêter",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Mettre à jour",
"upgradeVersion.hasNew": "Mise à jour disponible",
"upgradeVersion.newVersion": "Mise à jour disponible : {{version}}",
"upgradeVersion.serverVersion": "Serveur : {{version}}",
"userPanel.anonymousNickName": "Utilisateur anonyme",
"userPanel.billing": "Gestion de la facturation",
"userPanel.cloud": "Lancer {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Fissa",
"pinOff": "Sblocca",
"privacy": "Informativa sulla privacy",
"productHunt.actionLabel": "Sostienici",
"productHunt.description": "Sostienici su Product Hunt. Il tuo supporto è molto importante per noi!",
"productHunt.title": "Siamo su Product Hunt!",
"regenerate": "Rigenera",
"releaseNotes": "Dettagli versione",
"rename": "Rinomina",
@@ -332,6 +335,11 @@
"run": "Esegui",
"save": "Salva",
"send": "Invia",
"serverVersionOutdated.desc": "La tua versione del client (v{{version}}) richiede una versione del server più recente.",
"serverVersionOutdated.dismiss": "Continua comunque",
"serverVersionOutdated.title": "Versione del server obsoleta",
"serverVersionOutdated.upgrade": "Guida all'aggiornamento",
"serverVersionOutdated.warning": "Alcune funzionalità potrebbero non funzionare correttamente o comportarsi in modo imprevisto. Aggiorna il server per un'esperienza ottimale.",
"setting": "Impostazioni",
"share": "Condividi",
"stop": "Ferma",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Aggiorna",
"upgradeVersion.hasNew": "Aggiornamento disponibile",
"upgradeVersion.newVersion": "Aggiornamento disponibile: {{version}}",
"upgradeVersion.serverVersion": "Server: {{version}}",
"userPanel.anonymousNickName": "Utente anonimo",
"userPanel.billing": "Gestione fatturazione",
"userPanel.cloud": "Avvia {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "ピン留め",
"pinOff": "ピン留め解除",
"privacy": "プライバシーポリシー",
"productHunt.actionLabel": "応援する",
"productHunt.description": "Product Huntで私たちを応援してください。皆さまのサポートが大きな力になります",
"productHunt.title": "Product Huntに掲載されました",
"regenerate": "再生成",
"releaseNotes": "バージョン詳細",
"rename": "名前を変更",
@@ -332,6 +335,11 @@
"run": "実行",
"save": "保存",
"send": "送信",
"serverVersionOutdated.desc": "ご利用のクライアントバージョンv{{version}})は、より新しいサーバーバージョンが必要です。",
"serverVersionOutdated.dismiss": "このまま続行",
"serverVersionOutdated.title": "サーバーバージョンが古くなっています",
"serverVersionOutdated.upgrade": "アップグレードガイド",
"serverVersionOutdated.warning": "一部の機能が正しく動作しない、または予期しない動作をする可能性があります。最適な体験のためにサーバーを更新してください。",
"setting": "設定",
"share": "共有",
"stop": "停止",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "アップグレード",
"upgradeVersion.hasNew": "アップデートがあります",
"upgradeVersion.newVersion": "利用可能なアップデート:{{version}}",
"upgradeVersion.serverVersion": "サーバー:{{version}}",
"userPanel.anonymousNickName": "匿名ユーザー",
"userPanel.billing": "請求管理",
"userPanel.cloud": "{{name}} を体験",

View File

@@ -324,6 +324,9 @@
"pin": "상단 고정",
"pinOff": "고정 해제",
"privacy": "개인정보 보호정책",
"productHunt.actionLabel": "응원하기",
"productHunt.description": "Product Hunt에서 저희를 응원해 주세요. 여러분의 응원이 큰 힘이 됩니다!",
"productHunt.title": "우리는 Product Hunt에 있어요!",
"regenerate": "다시 생성",
"releaseNotes": "버전 정보",
"rename": "이름 변경",
@@ -332,6 +335,11 @@
"run": "실행",
"save": "저장",
"send": "보내기",
"serverVersionOutdated.desc": "현재 클라이언트 버전(v{{version}})은 더 최신의 서버 버전이 필요합니다.",
"serverVersionOutdated.dismiss": "계속 진행하기",
"serverVersionOutdated.title": "서버 버전이 오래되었습니다",
"serverVersionOutdated.upgrade": "업그레이드 가이드",
"serverVersionOutdated.warning": "일부 기능이 제대로 작동하지 않거나 예기치 않게 동작할 수 있습니다. 최상의 사용을 위해 서버를 업데이트해 주세요.",
"setting": "설정",
"share": "공유",
"stop": "중지",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "업그레이드",
"upgradeVersion.hasNew": "업데이트 가능",
"upgradeVersion.newVersion": "사용 가능한 업데이트: {{version}}",
"upgradeVersion.serverVersion": "서버: {{version}}",
"userPanel.anonymousNickName": "익명 사용자",
"userPanel.billing": "청구 관리",
"userPanel.cloud": "{{name}} 체험하기",

View File

@@ -324,6 +324,9 @@
"pin": "Vastmaken",
"pinOff": "Losmaken",
"privacy": "Privacybeleid",
"productHunt.actionLabel": "Steun ons",
"productHunt.description": "Steun ons op Product Hunt. Jouw steun betekent veel voor ons!",
"productHunt.title": "We staan op Product Hunt!",
"regenerate": "Opnieuw genereren",
"releaseNotes": "Versiedetails",
"rename": "Hernoemen",
@@ -332,6 +335,11 @@
"run": "Uitvoeren",
"save": "Opslaan",
"send": "Verzenden",
"serverVersionOutdated.desc": "Je clientversie (v{{version}}) vereist een nieuwere serverversie.",
"serverVersionOutdated.dismiss": "Toch doorgaan",
"serverVersionOutdated.title": "Verouderde serverversie",
"serverVersionOutdated.upgrade": "Upgradehandleiding",
"serverVersionOutdated.warning": "Sommige functies werken mogelijk niet goed of gedragen zich onverwacht. Werk je server bij voor de beste ervaring.",
"setting": "Instellingen",
"share": "Delen",
"stop": "Stoppen",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Upgraden",
"upgradeVersion.hasNew": "Update beschikbaar",
"upgradeVersion.newVersion": "Update beschikbaar: {{version}}",
"upgradeVersion.serverVersion": "Server: {{version}}",
"userPanel.anonymousNickName": "Anonieme gebruiker",
"userPanel.billing": "Facturatiebeheer",
"userPanel.cloud": "Start {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Przypnij",
"pinOff": "Odepnij",
"privacy": "Polityka prywatności",
"productHunt.actionLabel": "Wesprzyj nas",
"productHunt.description": "Wesprzyj nas na Product Hunt. Twoje wsparcie wiele dla nas znaczy!",
"productHunt.title": "Jesteśmy na Product Hunt!",
"regenerate": "Wygeneruj ponownie",
"releaseNotes": "Szczegóły wersji",
"rename": "Zmień nazwę",
@@ -332,6 +335,11 @@
"run": "Uruchom",
"save": "Zapisz",
"send": "Wyślij",
"serverVersionOutdated.desc": "Twoja wersja klienta (v{{version}}) wymaga nowszej wersji serwera.",
"serverVersionOutdated.dismiss": "Kontynuuj mimo to",
"serverVersionOutdated.title": "Nieaktualna wersja serwera",
"serverVersionOutdated.upgrade": "Przewodnik aktualizacji",
"serverVersionOutdated.warning": "Niektóre funkcje mogą nie działać poprawnie lub zachowywać się nieoczekiwanie. Zaktualizuj serwer, aby uzyskać najlepsze wrażenia.",
"setting": "Ustawienia",
"share": "Udostępnij",
"stop": "Zatrzymaj",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Zaktualizuj",
"upgradeVersion.hasNew": "Dostępna aktualizacja",
"upgradeVersion.newVersion": "Dostępna aktualizacja: {{version}}",
"upgradeVersion.serverVersion": "Serwer: {{version}}",
"userPanel.anonymousNickName": "Użytkownik anonimowy",
"userPanel.billing": "Zarządzanie płatnościami",
"userPanel.cloud": "Uruchom {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Fixar",
"pinOff": "Desafixar",
"privacy": "Política de Privacidade",
"productHunt.actionLabel": "Apoie-nos",
"productHunt.description": "Apoie-nos no Product Hunt. Seu apoio é muito importante para nós!",
"productHunt.title": "Estamos no Product Hunt!",
"regenerate": "Regenerar",
"releaseNotes": "Detalhes da Versão",
"rename": "Renomear",
@@ -332,6 +335,11 @@
"run": "Executar",
"save": "Salvar",
"send": "Enviar",
"serverVersionOutdated.desc": "Sua versão do cliente (v{{version}}) requer uma versão mais recente do servidor.",
"serverVersionOutdated.dismiss": "Continuar mesmo assim",
"serverVersionOutdated.title": "Versão do Servidor Desatualizada",
"serverVersionOutdated.upgrade": "Guia de Atualização",
"serverVersionOutdated.warning": "Alguns recursos podem não funcionar corretamente ou apresentar comportamentos inesperados. Atualize seu servidor para a melhor experiência.",
"setting": "Configurações",
"share": "Compartilhar",
"stop": "Parar",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Atualizar",
"upgradeVersion.hasNew": "Atualização disponível",
"upgradeVersion.newVersion": "Atualização disponível: {{version}}",
"upgradeVersion.serverVersion": "Servidor: {{version}}",
"userPanel.anonymousNickName": "Usuário Anônimo",
"userPanel.billing": "Gerenciamento de Pagamentos",
"userPanel.cloud": "Iniciar {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Закрепить",
"pinOff": "Открепить",
"privacy": "Политика конфиденциальности",
"productHunt.actionLabel": "Поддержите нас",
"productHunt.description": "Поддержите нас на Product Hunt. Ваша поддержка очень важна для нас!",
"productHunt.title": "Мы на Product Hunt!",
"regenerate": "Сгенерировать заново",
"releaseNotes": "Информация о версии",
"rename": "Переименовать",
@@ -332,6 +335,11 @@
"run": "Запустить",
"save": "Сохранить",
"send": "Отправить",
"serverVersionOutdated.desc": "Ваша версия клиента (v{{version}}) требует более новой версии сервера.",
"serverVersionOutdated.dismiss": "Продолжить всё равно",
"serverVersionOutdated.title": "Устаревшая версия сервера",
"serverVersionOutdated.upgrade": "Руководство по обновлению",
"serverVersionOutdated.warning": "Некоторые функции могут работать некорректно или вести себя непредсказуемо. Пожалуйста, обновите сервер для наилучшей работы.",
"setting": "Настройки",
"share": "Поделиться",
"stop": "Остановить",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Обновить",
"upgradeVersion.hasNew": "Доступно обновление",
"upgradeVersion.newVersion": "Доступно обновление: {{version}}",
"upgradeVersion.serverVersion": "Сервер: {{version}}",
"userPanel.anonymousNickName": "Анонимный пользователь",
"userPanel.billing": "Управление оплатой",
"userPanel.cloud": "Запустить {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "Sabitle",
"pinOff": "Sabitlemeyi Kaldır",
"privacy": "Gizlilik Politikası",
"productHunt.actionLabel": "Bizi destekleyin",
"productHunt.description": "Product Hunt'ta bize destek olun. Desteğiniz bizim için çok değerli!",
"productHunt.title": "Product Hunt'tayız!",
"regenerate": "Yeniden Oluştur",
"releaseNotes": "Sürüm Detayları",
"rename": "Yeniden Adlandır",
@@ -332,6 +335,11 @@
"run": "Çalıştır",
"save": "Kaydet",
"send": "Gönder",
"serverVersionOutdated.desc": "İstemci sürümünüz (v{{version}}), daha yeni bir sunucu sürümü gerektiriyor.",
"serverVersionOutdated.dismiss": "Yine de devam et",
"serverVersionOutdated.title": "Sunucu Sürümü Eski",
"serverVersionOutdated.upgrade": "Yükseltme Rehberi",
"serverVersionOutdated.warning": "Bazı özellikler düzgün çalışmayabilir veya beklenmedik şekilde davranabilir. En iyi deneyim için lütfen sunucunuzu güncelleyin.",
"setting": "Ayarlar",
"share": "Paylaş",
"stop": "Durdur",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Yükselt",
"upgradeVersion.hasNew": "Güncelleme mevcut",
"upgradeVersion.newVersion": "Yeni sürüm mevcut: {{version}}",
"upgradeVersion.serverVersion": "Sunucu: {{version}}",
"userPanel.anonymousNickName": "Anonim Kullanıcı",
"userPanel.billing": "Faturalandırma Yönetimi",
"userPanel.cloud": "{{name}}'i Başlat",

View File

@@ -324,6 +324,9 @@
"pin": "Ghim",
"pinOff": "Bỏ ghim",
"privacy": "Chính sách quyền riêng tư",
"productHunt.actionLabel": "Ủng hộ chúng tôi",
"productHunt.description": "Ủng hộ chúng tôi trên Product Hunt. Sự ủng hộ của bạn rất có ý nghĩa với chúng tôi!",
"productHunt.title": "Chúng tôi đã có mặt trên Product Hunt!",
"regenerate": "Tạo lại",
"releaseNotes": "Chi tiết phiên bản",
"rename": "Đổi tên",
@@ -332,6 +335,11 @@
"run": "Chạy",
"save": "Lưu",
"send": "Gửi",
"serverVersionOutdated.desc": "Phiên bản ứng dụng của bạn (v{{version}}) yêu cầu phiên bản máy chủ mới hơn.",
"serverVersionOutdated.dismiss": "Vẫn tiếp tục",
"serverVersionOutdated.title": "Phiên bản máy chủ đã lỗi thời",
"serverVersionOutdated.upgrade": "Hướng dẫn nâng cấp",
"serverVersionOutdated.warning": "Một số tính năng có thể không hoạt động đúng hoặc hoạt động không như mong đợi. Vui lòng cập nhật máy chủ để có trải nghiệm tốt nhất.",
"setting": "Cài đặt",
"share": "Chia sẻ",
"stop": "Dừng",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "Nâng cấp",
"upgradeVersion.hasNew": "Có bản cập nhật mới",
"upgradeVersion.newVersion": "Có bản cập nhật mới: {{version}}",
"upgradeVersion.serverVersion": "Máy chủ: {{version}}",
"userPanel.anonymousNickName": "Người dùng ẩn danh",
"userPanel.billing": "Quản lý thanh toán",
"userPanel.cloud": "Khởi chạy {{name}}",

View File

@@ -324,6 +324,9 @@
"pin": "置顶",
"pinOff": "取消置顶",
"privacy": "隐私政策",
"productHunt.actionLabel": "支持我们",
"productHunt.description": "在 Product Hunt 上支持我们,您的支持对我们意义重大!",
"productHunt.title": "我们登上 Product Hunt 了!",
"regenerate": "重新生成",
"releaseNotes": "版本详情",
"rename": "重命名",

View File

@@ -324,6 +324,9 @@
"pin": "置頂",
"pinOff": "取消置頂",
"privacy": "隱私政策",
"productHunt.actionLabel": "支持我們",
"productHunt.description": "在 Product Hunt 上支持我們。您的支持對我們意義重大!",
"productHunt.title": "我們上架 Product Hunt 了!",
"regenerate": "重新生成",
"releaseNotes": "版本詳細",
"rename": "重新命名",
@@ -332,6 +335,11 @@
"run": "執行",
"save": "儲存",
"send": "發送",
"serverVersionOutdated.desc": "您的用戶端版本v{{version}})需要較新的伺服器版本。",
"serverVersionOutdated.dismiss": "仍要繼續",
"serverVersionOutdated.title": "伺服器版本過舊",
"serverVersionOutdated.upgrade": "升級指南",
"serverVersionOutdated.warning": "某些功能可能無法正常運作或出現異常行為。請更新您的伺服器以獲得最佳體驗。",
"setting": "設定",
"share": "分享",
"stop": "停止",
@@ -380,6 +388,7 @@
"upgradeVersion.action": "升級",
"upgradeVersion.hasNew": "有可用的更新",
"upgradeVersion.newVersion": "有可用的更新:{{version}}",
"upgradeVersion.serverVersion": "伺服器版本:{{version}}",
"userPanel.anonymousNickName": "匿名使用者",
"userPanel.billing": "帳單管理",
"userPanel.cloud": "體驗 {{name}}",

View File

@@ -4,23 +4,60 @@ import { BRANDING_EMAIL, SOCIAL_URL } from '@lobechat/business-const';
import { ActionIcon, DropdownMenu, Icon, type MenuProps } from '@lobehub/ui';
import { Flexbox } from '@lobehub/ui';
import { DiscordIcon } from '@lobehub/ui/icons';
import { Book, CircleHelp, Feather, FileClockIcon, FlaskConical, Github, Mail } from 'lucide-react';
import { memo, useMemo, useState } from 'react';
import {
Book,
CircleHelp,
Feather,
FileClockIcon,
FlaskConical,
Github,
Mail,
Rocket,
} from 'lucide-react';
import { memo, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import ChangelogModal from '@/components/ChangelogModal';
import HighlightNotification from '@/components/HighlightNotification';
import LabsModal from '@/components/LabsModal';
import { DOCUMENTS_REFER_URL, GITHUB, mailTo } from '@/const/url';
import ThemeButton from '@/features/User/UserPanel/ThemeButton';
import { useFeedbackModal } from '@/hooks/useFeedbackModal';
import { useGlobalStore } from '@/store/global';
import { systemStatusSelectors } from '@/store/global/selectors/systemStatus';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
const PRODUCT_HUNT_NOTIFICATION = {
actionHref: 'https://www.producthunt.com/products/lobehub?launch=lobehub',
endTime: new Date('2026-02-01T00:00:00Z'),
image: 'https://hub-apac-1.lobeobjects.space/og/lobehub-ph.png',
slug: 'product-hunt-2026',
startTime: new Date('2026-01-27T08:00:00Z'),
};
const Footer = memo(() => {
const { t } = useTranslation('common');
const { hideGitHub } = useServerConfigStore(featureFlagsSelectors);
const [isLabsModalOpen, setIsLabsModalOpen] = useState(false);
const [shouldLoadChangelog, setShouldLoadChangelog] = useState(false);
const [isChangelogModalOpen, setIsChangelogModalOpen] = useState(false);
const [isProductHuntCardOpen, setIsProductHuntCardOpen] = useState(false);
const [isNotificationRead, updateSystemStatus] = useGlobalStore((s) => [
systemStatusSelectors.isNotificationRead(PRODUCT_HUNT_NOTIFICATION.slug)(s),
s.updateSystemStatus,
]);
const isWithinTimeWindow = useMemo(() => {
const now = new Date();
return now >= PRODUCT_HUNT_NOTIFICATION.startTime && now <= PRODUCT_HUNT_NOTIFICATION.endTime;
}, []);
useEffect(() => {
if (isWithinTimeWindow && !isNotificationRead) {
setIsProductHuntCardOpen(true);
}
}, [isWithinTimeWindow, isNotificationRead]);
const { open: openFeedbackModal } = useFeedbackModal();
@@ -45,6 +82,20 @@ const Footer = memo(() => {
openFeedbackModal();
};
const handleOpenProductHuntCard = () => {
setIsProductHuntCardOpen(true);
};
const handleCloseProductHuntCard = () => {
setIsProductHuntCardOpen(false);
if (!isNotificationRead) {
const currentSlugs = useGlobalStore.getState().status.readNotificationSlugs || [];
updateSystemStatus({
readNotificationSlugs: [...currentSlugs, PRODUCT_HUNT_NOTIFICATION.slug],
});
}
};
const helpMenuItems: MenuProps['items'] = useMemo(
() => [
{
@@ -95,8 +146,18 @@ const Footer = memo(() => {
label: t('labs'),
onClick: handleOpenLabsModal,
},
...(isWithinTimeWindow
? [
{
icon: <Icon icon={Rocket} />,
key: 'productHunt',
label: 'Product Hunt',
onClick: handleOpenProductHuntCard,
},
]
: []),
],
[t],
[t, isWithinTimeWindow],
);
return (
@@ -120,6 +181,15 @@ const Footer = memo(() => {
open={isChangelogModalOpen}
shouldLoad={shouldLoadChangelog}
/>
<HighlightNotification
actionHref={PRODUCT_HUNT_NOTIFICATION.actionHref}
actionLabel={t('productHunt.actionLabel')}
description={t('productHunt.description')}
image={PRODUCT_HUNT_NOTIFICATION.image}
onClose={handleCloseProductHuntCard}
open={isProductHuntCardOpen}
title={t('productHunt.title')}
/>
</>
);
});

View File

@@ -0,0 +1,98 @@
'use client';
import { HeartFilled } from '@ant-design/icons';
import { ActionIcon, Button, Flexbox } from '@lobehub/ui';
import { createStaticStyles, cssVar } from 'antd-style';
import { X } from 'lucide-react';
import Link from 'next/link';
import { type ReactNode, memo } from 'react';
export interface HighlightNotificationProps {
actionHref?: string;
actionLabel?: ReactNode;
description?: ReactNode;
image?: string;
onClose?: () => void;
open?: boolean;
title?: ReactNode;
}
const styles = createStaticStyles(({ css }) => ({
action: css`
margin-top: 8px;
display: block;
width: 100%;
`,
card: css`
position: fixed;
bottom: 56px;
left: 8px;
z-index: 1000;
width: 300px;
max-width: calc(100vw - 32px);
padding: 0px;
background: ${cssVar.colorBgContainer};
border: 1px solid ${cssVar.colorBorder};
border-radius: 12px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);
overflow: hidden;
`,
closeButton: css`
position: absolute;
top: 8px;
right: 8px;
`,
description: css`
font-size: 14px;
color: ${cssVar.colorTextSecondary};
`,
image: css`
width: 100%;
height: auto;
border-bottom: 1px solid ${cssVar.colorBorderSecondary};
`,
title: css`
font-size: 16px;
font-weight: 600;
color: ${cssVar.colorText};
`,
}));
const HighlightNotification = memo<HighlightNotificationProps>(
({ open, onClose, image, title, description, actionLabel, actionHref }) => {
if (!open) return null;
return (
<Flexbox className={styles.card}>
<ActionIcon className={styles.closeButton} icon={X} onClick={onClose} size={14} />
<Flexbox gap={0}>
{image && <img alt="" className={styles.image} src={image} />}
<Flexbox gap={4} padding={12}>
{title && <div className={styles.title}>{title}</div>}
{description && <div className={styles.description}>{description}</div>}
{actionLabel && (
<Link
className={styles.action}
href={actionHref || '/'}
rel="noopener noreferrer"
target="_blank"
>
<Button block icon={HeartFilled} size="small" type="primary">
{actionLabel}
</Button>
</Link>
)}
</Flexbox>
</Flexbox>
</Flexbox>
);
},
);
HighlightNotification.displayName = 'HighlightNotification';
export default HighlightNotification;

View File

@@ -342,6 +342,9 @@ export default {
'pin': 'Pin',
'pinOff': 'Unpin',
'privacy': 'Privacy Policy',
'productHunt.actionLabel': 'Support us',
'productHunt.description': 'Support us on Product Hunt. Your support means a lot to us!',
'productHunt.title': "We're on Product Hunt!",
'regenerate': 'Regenerate',
'releaseNotes': 'Version Details',
'rename': 'Rename',

View File

@@ -120,6 +120,7 @@ export interface SystemStatus {
lastSelectedImageProvider?: string;
latestChangelogId?: string;
leftPanelWidth: number;
readNotificationSlugs?: string[];
mobileShowPortal?: boolean;
mobileShowTopic?: boolean;
/**
@@ -222,6 +223,7 @@ export const INITIAL_STATUS = {
pageAgentPanelWidth: 360,
pagePageSize: 20,
portalWidth: 400,
readNotificationSlugs: [],
resourceManagerColumnWidths: {
date: 160,
name: 574,

View File

@@ -57,6 +57,13 @@ const getAgentSystemRoleExpanded =
const disabledModelProvidersSortType = (s: GlobalState) =>
s.status.disabledModelProvidersSortType || 'default';
const disabledModelsSortType = (s: GlobalState) => s.status.disabledModelsSortType || 'default';
const isNotificationRead =
(slug: string) =>
(s: GlobalState): boolean => {
const slugs = s.status.readNotificationSlugs || [];
return slugs.includes(slug);
};
const tokenDisplayFormatShort = (s: GlobalState) =>
s.status.tokenDisplayFormatShort !== undefined ? s.status.tokenDisplayFormatShort : true;
@@ -74,6 +81,7 @@ export const systemStatusSelectors = {
imagePanelWidth,
imageTopicPanelWidth,
inZenMode,
isNotificationRead,
isShowCredit,
isStatusInit,
language,