feat(messages): update homepage hero content and features across multiple languages

This commit is contained in:
Fatih Kadir Akın
2025-12-11 17:02:46 +03:00
parent a13edaa631
commit 601690491d
12 changed files with 144 additions and 67 deletions

View File

@@ -416,9 +416,13 @@
"mostContributed": "الأكثر مساهمة"
},
"homepage": {
"heroTitle": "اجمع، نظّم وشارك",
"heroTitle": "المنصة الاجتماعية لـ",
"heroSubtitle": "أوامر الذكاء الاصطناعي",
"heroDescription": "منصة مفتوحة المصدر لإدارة أوامر الذكاء الاصطناعي. استضافة ذاتية باستخدام Docker.",
"heroDescription": "شارك واكتشف واجمع الأوامر من المجتمع. مجاني ومفتوح المصدر — استضافة ذاتية لمؤسستك بخصوصية تامة.",
"heroFeature1": "مجاني ومفتوح المصدر",
"heroFeature2": "استضافة ذاتية للخصوصية",
"heroFeature3": "للفرق والمؤسسات",
"cloneOnGithub": "استنساخ على GitHub",
"browsePrompts": "تصفح الأوامر",
"readyToStart": "مستعد للبدء؟",
"freeAndOpen": "مجاني ومفتوح المصدر.",
@@ -432,7 +436,8 @@
"githubStars": "نجوم GitHub",
"mostStarredRepo": "#33 المستودع الأكثر نجومية في العالم",
"usedByThousands": "يستخدمه الآلاف يومياً",
"sponsoredBy": "برعاية"
"sponsoredBy": "برعاية",
"becomeSponsor": "كن راعياً"
}
},
"notifications": {

View File

@@ -515,9 +515,13 @@
"mostContributed": "Most Contributed"
},
"homepage": {
"heroTitle": "Collect, Organize & Share",
"heroTitle": "The Social Platform for",
"heroSubtitle": "AI Prompts",
"heroDescription": "Open-source platform for managing AI prompts. Self-host with Docker.",
"heroDescription": "Share, discover, and collect prompts from the community. Free and open source — self-host for your organization with complete privacy.",
"heroFeature1": "Free & Open Source",
"heroFeature2": "Self-host for Privacy",
"heroFeature3": "For Teams & Organizations",
"cloneOnGithub": "Clone on GitHub",
"browsePrompts": "Browse Prompts",
"readyToStart": "Ready to get started?",
"freeAndOpen": "Free and open source.",
@@ -531,7 +535,8 @@
"githubStars": "GitHub Stars",
"mostStarredRepo": "#33 Most Starred Repo in the World",
"usedByThousands": "Used by Thousands Daily",
"sponsoredBy": "Sponsored by"
"sponsoredBy": "Sponsored by",
"becomeSponsor": "Become a Sponsor"
}
},
"notifications": {

View File

@@ -433,9 +433,13 @@
"mostContributed": "Más Contribuidos"
},
"homepage": {
"heroTitle": "Recolecta, Organiza y Comparte",
"heroTitle": "La Plataforma Social para",
"heroSubtitle": "Prompts de IA",
"heroDescription": "Plataforma de código abierto para gestionar prompts de IA. Auto-hospeda con Docker.",
"heroDescription": "Comparte, descubre y colecciona prompts de la comunidad. Gratis y de código abierto — auto-hospeda para tu organización con privacidad total.",
"heroFeature1": "Gratis y Código Abierto",
"heroFeature2": "Auto-hospeda para Privacidad",
"heroFeature3": "Para Equipos y Organizaciones",
"cloneOnGithub": "Clonar en GitHub",
"browsePrompts": "Explorar Prompts",
"readyToStart": "¿Listo para comenzar?",
"freeAndOpen": "Gratis y de código abierto.",
@@ -449,7 +453,8 @@
"githubStars": "Estrellas en GitHub",
"mostStarredRepo": "#33 Repo Más Destacado del Mundo",
"usedByThousands": "Usado por Miles Diariamente",
"sponsoredBy": "Patrocinado por"
"sponsoredBy": "Patrocinado por",
"becomeSponsor": "Conviértete en Patrocinador"
}
},
"notifications": {

View File

@@ -410,9 +410,13 @@
"mostContributed": "最も貢献されたプロンプト"
},
"homepage": {
"heroTitle": "収集・整理・共有",
"heroSubtitle": "AIプロンプト",
"heroDescription": "AIプロンプトを管理するオープンソースプラットフォーム。Dockerでセルフホスト。",
"heroTitle": "AIプロンプトの",
"heroSubtitle": "ソーシャルプラットフォーム",
"heroDescription": "コミュニティからプロンプトを共有、発見、収集。無料でオープンソース — 完全なプライバシーで組織向けにセルフホスト。",
"heroFeature1": "無料 & オープンソース",
"heroFeature2": "プライバシーのためセルフホスト",
"heroFeature3": "チーム & 組織向け",
"cloneOnGithub": "GitHubでクローン",
"browsePrompts": "プロンプトを見る",
"readyToStart": "始める準備はできましたか?",
"freeAndOpen": "無料でオープンソース。",
@@ -426,7 +430,8 @@
"githubStars": "GitHubスター",
"mostStarredRepo": "世界で#33最もスターされたリポジトリ",
"usedByThousands": "毎日何千人もが利用",
"sponsoredBy": "スポンサー"
"sponsoredBy": "スポンサー",
"becomeSponsor": "スポンサーになる"
}
},
"notifications": {

View File

@@ -515,9 +515,13 @@
"mostContributed": "En Çok Katkı Alanlar"
},
"homepage": {
"heroTitle": "Topla, Düzenle ve Paylaş",
"heroSubtitle": "AI Promptları",
"heroDescription": "AI promptlarını yönetmek için açık kaynak platform. Docker ile kendi sunucunuzda çalıştırın.",
"heroTitle": "AI Promptları için",
"heroSubtitle": "Sosyal Platform",
"heroDescription": "Topluluktan promptları paylaşın, keşfedin ve toplayın. Ücretsiz ve açık kaynak — tam gizlilik için kendi sunucunuzda barındırın.",
"heroFeature1": "Ücretsiz & Açık Kaynak",
"heroFeature2": "Gizlilik için Self-host",
"heroFeature3": "Ekipler & Organizasyonlar için",
"cloneOnGithub": "GitHub'dan Klonla",
"browsePrompts": "Promptlara Göz At",
"readyToStart": "Başlamaya hazır mısınız?",
"freeAndOpen": "Ücretsiz ve açık kaynak.",
@@ -531,7 +535,8 @@
"githubStars": "GitHub Yıldızı",
"mostStarredRepo": "Dünyada #33 En Çok Yıldızlanan Repo",
"usedByThousands": "Her Gün Binlerce Aktif Kullanıcı",
"sponsoredBy": "Sponsor"
"sponsoredBy": "Sponsor",
"becomeSponsor": "Sponsor Ol"
}
},
"notifications": {

View File

@@ -410,9 +410,13 @@
"mostContributed": "贡献最多"
},
"homepage": {
"heroTitle": "收集、整理和分享",
"heroSubtitle": "AI 提示词",
"heroDescription": "管理 AI 提示词的开源平台。使用 Docker 自托管。",
"heroTitle": "AI 提示词的",
"heroSubtitle": "社交平台",
"heroDescription": "从社区分享、发现和收集提示词。免费开源 — 为您的组织自托管,完全私密。",
"heroFeature1": "免费 & 开源",
"heroFeature2": "自托管保护隐私",
"heroFeature3": "适用于团队和组织",
"cloneOnGithub": "在 GitHub 上克隆",
"browsePrompts": "浏览提示词",
"readyToStart": "准备好开始了吗?",
"freeAndOpen": "免费且开源。",
@@ -426,7 +430,8 @@
"githubStars": "GitHub 星标",
"mostStarredRepo": "全球第 #33 最受欢迎的仓库",
"usedByThousands": "每天被数千人使用",
"sponsoredBy": "赞助商"
"sponsoredBy": "赞助商",
"becomeSponsor": "成为赞助商"
}
},
"notifications": {

View File

@@ -23,6 +23,21 @@ const nextConfig: NextConfig = {
},
],
},
// Redirects
async redirects() {
return [
{
source: "/vibe",
destination: "/categories/vibe",
permanent: true,
},
{
source: "/sponsors",
destination: "/categories/sponsors",
permanent: true,
},
];
},
};
export default withNextIntl(nextConfig);

View File

@@ -68,6 +68,7 @@ export default defineConfig({
items: [
// Add sponsors here
{ name: "Clemta", logo: "https://clemta.com/wp-content/uploads/2023/03/logo-clemta-com-1.png.webp", url: "https://clemta.com" },
{ name: "warp.dev", className: 'p-2', logo: `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 79 18" overflow="visible"><g><path d="M 10.651 0 L 18.482 0 C 19.749 0 20.777 1.059 20.777 2.365 L 20.777 11.545 C 20.777 12.851 19.749 13.91 18.482 13.91 L 7.276 13.91 Z" fill="rgb(0,0,0)"></path><path d="M 8.583 2.663 L 2.276 2.663 C 1.019 2.663 0 3.721 0 5.027 L 0 14.208 C 0 15.514 1.019 16.573 2.275 16.573 L 10.039 16.573 L 10.35 15.279 L 5.548 15.279 Z M 30.145 13.932 L 26.693 2.666 L 28.643 2.666 L 31.086 11.272 L 33.732 2.666 L 35.57 2.666 L 38.215 11.272 L 40.636 2.666 L 42.631 2.666 L 39.156 13.932 L 37.296 13.932 L 34.651 5.371 L 32.005 13.932 Z M 51.231 6.601 C 51.231 5.058 50.132 4.075 48.473 4.075 C 46.927 4.075 45.828 4.991 45.671 6.511 L 43.901 6.176 C 44.237 3.941 46.097 2.488 48.473 2.488 C 51.208 2.488 53.114 4.097 53.114 6.712 L 53.114 13.932 L 51.231 13.932 L 51.231 12.01 C 50.581 13.306 49.101 14.111 47.465 14.111 C 45.201 14.111 43.654 12.725 43.654 10.78 C 43.654 8.612 45.425 7.427 49.034 7.07 L 51.231 6.824 Z M 45.559 10.758 C 45.559 11.808 46.456 12.546 47.756 12.546 C 49.953 12.546 51.231 11.093 51.231 8.836 L 51.231 8.299 L 49.034 8.545 C 46.747 8.791 45.559 9.573 45.559 10.758 Z M 65.94 6.489 L 64.035 6.846 C 63.945 5.17 62.892 4.209 61.188 4.209 C 59.103 4.209 57.758 6.086 57.758 9.104 L 57.758 13.932 L 55.853 13.932 L 55.853 2.666 L 57.758 2.666 L 57.758 4.88 C 58.588 3.27 59.977 2.488 61.636 2.488 C 64.147 2.488 65.851 4.053 65.94 6.489 Z M 67.971 18 L 67.971 2.666 L 69.877 2.666 L 69.877 4.298 C 70.482 3.27 71.961 2.488 73.598 2.488 C 77.072 2.488 79 4.991 79 8.299 C 79 11.607 77.028 14.11 73.553 14.11 C 72.118 14.11 70.639 13.395 69.877 12.367 L 69.877 18 L 67.971 18 Z M 73.374 12.412 C 75.615 12.412 77.072 10.78 77.072 8.299 C 77.072 5.818 75.615 4.186 73.374 4.186 C 71.177 4.186 69.72 5.818 69.72 8.299 C 69.72 10.78 71.177 12.412 73.374 12.412 Z" fill="rgb(0,0,0)"></path></g></svg>`, url: "https://warp.dev" },
{ name: "MCPTools", logo: "https://github.com/f/mcptools/raw/master/.github/resources/logo.png", url: "https://github.com/f/mcptools" },
],
},

BIN
public/animation.mp4 Executable file

Binary file not shown.

View File

@@ -1,7 +1,7 @@
import Link from "next/link";
import Image from "next/image";
import { getTranslations } from "next-intl/server";
import { ArrowRight, Bell, FolderOpen, Sparkles, Star, Heart, Trophy, Users } from "lucide-react";
import { ArrowRight, Bell, FolderOpen, Sparkles, Star, Heart, Trophy, Users, HeartHandshake, Code, Lock, Building2, Github } from "lucide-react";
import { auth } from "@/lib/auth";
import { db } from "@/lib/db";
import { getConfig } from "@/lib/config";
@@ -186,48 +186,67 @@ export default async function HomePage() {
return (
<div className="flex flex-col">
{/* Hero Section */}
<section className="py-12 md:py-20 border-b">
<div className="container">
<div className="flex flex-col md:flex-row md:items-center md:justify-between gap-8">
<div className="max-w-3xl">
<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl">
{tHomepage("heroTitle")}
<span className="block text-muted-foreground">{tHomepage("heroSubtitle")}</span>
</h1>
<p className="mt-4 text-muted-foreground max-w-xl">
{tHomepage("heroDescription")}
</p>
<div className="mt-6 flex flex-wrap gap-3">
<Button asChild>
<Link href="/prompts">
{tHomepage("browsePrompts")}
<ArrowRight className="ml-1.5 h-4 w-4" />
</Link>
</Button>
{showRegisterButton && (
<Button variant="outline" asChild>
<Link href={isOAuth ? "/login" : "/register"}>
{isOAuth ? tNav("login") : tNav("register")}
</Link>
</Button>
)}
<section className="relative py-12 md:py-16 border-b overflow-hidden">
{/* Background Video - Right Side */}
<div className="absolute top-0 right-0 bottom-0 w-1/2 hidden md:block pointer-events-none">
<div className="absolute inset-0 bg-gradient-to-r from-background via-background/80 to-transparent z-10" />
<video
autoPlay
loop
muted
playsInline
className="absolute top-1/2 -translate-y-1/2 right-0 w-full h-auto opacity-30 dark:opacity-15 dark:invert"
>
<source src="/animation.mp4" type="video/mp4" />
</video>
</div>
<div className="container relative z-20">
<div className="max-w-2xl">
<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl lg:text-6xl !text-3xl sm:!text-4xl md:!text-5xl lg:!text-6xl">
{tHomepage("heroTitle")}
<span className="block text-primary">{tHomepage("heroSubtitle")}</span>
</h1>
<p className="mt-6 text-muted-foreground text-xl max-w-xl">
{tHomepage("heroDescription")}
</p>
{/* Feature badges */}
<div className="mt-8 flex flex-wrap gap-4">
<div className="flex items-center gap-2 text-muted-foreground">
<Code className="h-5 w-5 text-primary" />
<span>{tHomepage("heroFeature1")}</span>
</div>
<div className="flex items-center gap-2 text-muted-foreground">
<Lock className="h-5 w-5 text-primary" />
<span>{tHomepage("heroFeature2")}</span>
</div>
<div className="flex items-center gap-2 text-muted-foreground">
<Building2 className="h-5 w-5 text-primary" />
<span>{tHomepage("heroFeature3")}</span>
</div>
</div>
<div className="hidden md:block">
<Image
src="/logo.svg"
alt="Logo"
width={200}
height={200}
className="h-48 w-48 dark:hidden"
/>
<Image
src="/logo-dark.svg"
alt="Logo"
width={200}
height={200}
className="h-48 w-48 hidden dark:block"
/>
<div className="mt-10 flex flex-wrap gap-3">
<Button size="lg" asChild>
<Link href="/prompts">
{tHomepage("browsePrompts")}
<ArrowRight className="ml-1.5 h-4 w-4" />
</Link>
</Button>
<Button variant="outline" size="lg" asChild>
<Link href="https://github.com/f/awesome-chatgpt-prompts" target="_blank" rel="noopener noreferrer">
<Github className="mr-1.5 h-4 w-4" />
{tHomepage("cloneOnGithub")}
</Link>
</Button>
{showRegisterButton && (
<Button variant="outline" size="lg" asChild>
<Link href={isOAuth ? "/login" : "/register"}>
{isOAuth ? tNav("login") : tNav("register")}
</Link>
</Button>
)}
</div>
</div>
</div>
@@ -287,7 +306,18 @@ export default async function HomePage() {
{config.homepage?.sponsors?.enabled && config.homepage.sponsors.items.length > 0 && (
<section className="py-8 border-b">
<div className="container">
<p className="text-center text-xs text-muted-foreground mb-4">{tHomepage("achievements.sponsoredBy")}</p>
<div className="flex items-center justify-center gap-2 mb-4">
<p className="text-center text-xs text-muted-foreground">{tHomepage("achievements.sponsoredBy")}</p>
<Link
href="https://github.com/sponsors/f/sponsorships?sponsor=f&tier_id=558224&preview=false"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1 px-2 py-0.5 text-xs text-muted-foreground bg-muted hover:bg-muted/80 rounded-full transition-colors"
>
<HeartHandshake className="h-3 w-3" />
{tHomepage("achievements.becomeSponsor")}
</Link>
</div>
<div className="flex flex-wrap items-center justify-center gap-8">
{config.homepage.sponsors.items.map((sponsor) => (
<Link
@@ -302,7 +332,7 @@ export default async function HomePage() {
alt={sponsor.name}
width={120}
height={40}
className="h-8 w-auto"
className={`h-9 w-auto ${sponsor.className || ''}`}
/>
</Link>
))}

View File

@@ -304,10 +304,10 @@ export function Header({ authProvider = "credentials", allowRegistration = true
<Button variant="ghost" size="sm" className="h-8 text-xs" asChild>
<Link href="/login">{t("nav.login")}</Link>
</Button>
{showRegisterButton && (
{authProvider === "credentials" && allowRegistration && (
<Button size="sm" className="h-8 text-xs" asChild>
<Link href={isOAuth ? "/login" : "/register"}>
{isOAuth ? t("nav.login") : t("nav.register")}
<Link href="/register">
{t("nav.register")}
</Link>
</Button>
)}

View File

@@ -45,6 +45,7 @@ export interface Sponsor {
name: string;
logo: string;
url: string;
className?: string;
}
export interface HomepageConfig {