Compare commits

..

10 Commits

Author SHA1 Message Date
71d5bc4528 add prompt display 2025-09-07 21:06:00 +08:00
7fb539383b add codex AGENTS.md 2025-09-07 20:59:23 +08:00
420448117c better input in mobile 2025-09-06 01:12:31 +08:00
db19a0d667 juse use user text to nano banana, do not change 2025-09-06 01:06:16 +08:00
17a9bbaf7d add umami 2025-09-06 00:28:43 +08:00
becb6abf59 update sitemap 2025-09-06 00:25:41 +08:00
36b7c04e92 fix prcess 2025-09-06 00:16:49 +08:00
ebc8fe96e4 fix r2 region 2025-09-06 00:15:04 +08:00
349a1e9e9e add friendly link 2025-09-06 00:03:35 +08:00
70526f2181 add .env. add english title 2025-09-05 23:54:16 +08:00
11 changed files with 262 additions and 181 deletions

View File

@ -1,84 +1,86 @@
#--------------------------------------------------------------------------------------------------------
# website URL
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_SITE_URL=
NEXT_PUBLIC_SITE_URL=https://nbs.prmbr.com
#--------------------------------------------------------------------------------------------------------
# website name
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_WEBSITE_NAME=
NEXT_PUBLIC_WEBSITE_NAME="NanoBanana Show"
#--------------------------------------------------------------------------------------------------------
# image alt text
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_IMAGE_ALT_ADDITION_TEXT=
NEXT_PUBLIC_IMAGE_ALT_ADDITION_TEXT="NanoBanana Show"
#--------------------------------------------------------------------------------------------------------
# domain name
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_DOMAIN_NAME=
NEXT_PUBLIC_DOMAIN_NAME="nbs.prmbo.com"
#--------------------------------------------------------------------------------------------------------
# postgres config
#--------------------------------------------------------------------------------------------------------
POSTGRES_URL=
POSTGRES_URL="postgresql://neondb_owner:npg_xSc4VUaeYgm3@ep-calm-wave-a1db9zdd-pooler.ap-southeast-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require"
#--------------------------------------------------------------------------------------------------------
# Google auth config
# 0 代表不检查登录则登录相关的按钮也不展示出来1代表要检查
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_CHECK_GOOGLE_LOGIN=0
NEXT_PUBLIC_GOOGLE_CLIENT_ID=
GOOGLE_SECRET_ID=
NEXT_PUBLIC_CHECK_GOOGLE_LOGIN=1
NEXT_PUBLIC_GOOGLE_CLIENT_ID=1011279317992-kduhuvssdem1p338l186377i3982df79.apps.googleusercontent.com
GOOGLE_SECRET_ID=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
#--------------------------------------------------------------------------------------------------------
# NEXTAUTH config create command: openssl rand -base64 32
#--------------------------------------------------------------------------------------------------------
NEXTAUTH_URL=
NEXTAUTH_SECRET=
NEXTAUTH_URL=https://nbs.prmbo.com
NEXTAUTH_SECRET=rW88FCN+snBc04B+gKtS0+DCc3UIRdcWJNCEGnZtZ6U=
#--------------------------------------------------------------------------------------------------------
# Google gtag id
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_GOOGLE_TAG_ID=
NEXT_PUBLIC_GOOGLE_TAG_ID=G-0RM4KL718Y
#--------------------------------------------------------------------------------------------------------
# Update these with your Stripe credentials from https://dashboard.stripe.com/apikeys
# 0 代表不检查支付则支付页面也不展示出来1代表要检查
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_CHECK_AVAILABLE_TIME=0
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
NEXT_PUBLIC_CHECK_AVAILABLE_TIME=1
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_51Rs4SeL4RcMgUJpOrGbswlk9ESZ5ezDOehA3JYBtFWaCdk5fvGjvq98MVXhdPsdFzVfl69MyWIdQwKvsvsN3NLGo00JXs9sXSE
STRIPE_SECRET_KEY=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
STRIPE_WEBHOOK_SECRET=whsec_clBH2N3tlpVRd7jAyvojb2Wg1MtAeGWw
# 免费生成次数
FREE_TIMES=2
FREE_TIMES=10
#--------------------------------------------------------------------------------------------------------
# replicate config
#--------------------------------------------------------------------------------------------------------
# replicate 生成结束后的回调地址,本地时我才用的 ngrok线上的话就是你的域名
REPLICATE_WEBHOOK=
REPLICATE_WEBHOOK=https://nbs.prmbr.com
# replicate 的 API token需要去你的 replicate 账号里面复制 https://replicate.com/account/api-tokens
REPLICATE_API_TOKEN=
REPLICATE_API_TOKEN=r8_1cBB54Zz4YzoN59zKFq0FJMQTzMG0RA4BEveG
REPLICATE_API_MODEL="google/gemini-2.5-flash-image"
# 生成贴纸的API版本 https://replicate.com/fofr/sticker-maker/versions ,最新的那个版本只生成一张图片了,下方这个版本是还会一次生成两张图片的
REPLICATE_API_VERSION="6443cc831f51eb01333f50b757157411d7cadb6215144cc721e3688b70004ad0"
#--------------------------------------------------------------------------------------------------------
# cloudflare R2 config
#--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_STORAGE_URL=
STORAGE_DOMAIN=
R2_BUCKET=
R2_ACCOUNT_ID=
R2_ENDPOINT=
R2_TOKEN_VALUE=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
NEXT_PUBLIC_STORAGE_URL=https://nbs-image-cdn.prmbr.com
STORAGE_DOMAIN=nbs-image-cdn.prmbr.com
R2_BUCKET=nano-banana-show
R2_ENDPOINT=https://209b775a76842f6f305193e41de86be1.r2.cloudflarestorage.com
R2_TOKEN_VALUE=ZpqP7-OWxezkWTZ0yvr4fvejMEW6F-Z9lT5HxqjE
R2_ACCESS_KEY_ID=a2329772654cf1ac12d2df8d4fe34e16
R2_SECRET_ACCESS_KEY=aad334e0804ac4811012cbcc0cb4960913b1a35ab5f17cef0c10e7673cd29ce1
R2_REGION=apac
#--------------------------------------------------------------------------------------------------------
# openai config
#--------------------------------------------------------------------------------------------------------
OPENAI_API_KEY=
OPENAI_API_KEY=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
OPENAI_API_BASE_URL=https://openrouter.ai/api
OPENAI_API_MODEL="openai/gpt-3.5-turbo"

44
AGENTS.md Normal file
View File

@ -0,0 +1,44 @@
# Repository Guidelines
This document summarizes how to work effectively in this repo.
## Project Structure & Module Organization
- `src/app`: Next.js App Router (Next 14). Localized routes under `src/app/[locale]`. Global styles in `src/app/globals.css`.
- `src/components`: Reusable UI in PascalCase (e.g., `Header.tsx`).
- `src/servers`: Server-side data and actions (DB, search, works APIs).
- `src/libs`: Integrations and utilities (Stripe, Replicate, R2, DB helpers).
- `src/configs`: App/thirdparty config (e.g., `stripeConfig.ts`, `openaiConfig.ts`).
- `src/i18n`, `src/context`: Localization and React context.
- `public`: Static assets. `sql/tables`: PostgreSQL DDL.
- Path alias: import app modules via `~/*` (see `tsconfig.json`).
## Build, Test, and Development Commands
- `npm run dev` / `yarn dev`: Start local dev server on port 3000.
- `npm run build`: Production build (`.next`).
- `npm start`: Serve the built app.
- `npx next lint`: Run ESLint checks.
Environment: copy `.env.example``.env.local` and fill required keys (Stripe, Replicate webhook URL, Google OAuth, R2, Postgres). For first run, create tables from `sql/tables/*` in your database.
## Coding Style & Naming Conventions
- TypeScript, React, Next.js App Router.
- Indentation: 2 spaces; prefer explicit types for public APIs.
- Components: PascalCase (`MyComponent.tsx`). Hooks: `useX.ts`.
- Modules/utilities: camelCase (`helpers.ts`), server modules under `src/servers`.
- Imports: prefer `~/...` alias for internal paths.
- Linting: ESLint (`extends: next/core-web-vitals`); run `npx next lint --fix` before pushing.
- Styles: TailwindCSS in components; keep class lists readable and deduplicated.
## Testing Guidelines
- No formal test framework is configured yet. Perform manual QA for:
- Auth flows, payment (Stripe test mode), image generation webhooks (use ngrok for local Replicate webhook), and locale pages.
- If adding automated tests, prefer Playwright for E2E and React Testing Library for components; place tests adjacent to sources.
## Commit & Pull Request Guidelines
- Commits: short, imperative subject (e.g., "fix r2 region", "add stripe config"). Group related changes.
- PRs: clear description, linked issue, steps to validate (commands, URLs), and screenshots for UI changes.
- Keep changes scoped; update README and configs when behavior or env vars change. Never commit secrets.
## Security & Configuration Tips
- Store secrets only in `.env.*`. Rotate keys used for local testing. Verify webhook and cron/automation settings if deploying to Vercel.

View File

@ -5,42 +5,43 @@
"languageInChineseSimple": "英语"
},
"IndexPageText": {
"title": "英文Title",
"description": "英文description",
"h1Text": "英文首页 H1",
"descriptionBelowH1Text": "英文首页 H1下方的文字"
"title": "NanoBanana Show - Free NanoBanana AI Image Generator",
"description": "Create custom images for free with NanoBanana Show! Generate unlimited images with our NanoBanana AI image generator. Free credits included, unlimited access with subscription.",
"h1Text": "Free NanoBanana AI Image Generator",
"descriptionBelowH1Text": "Create amazing custom images with NanoBanana AI! Get free credits to start, then upgrade for unlimited generation."
},
"CommonText": {
"loadingText": "Loading...",
"generateText": "Generating...",
"placeholderText": "Type or paste text here...",
"buttonText": "Generate",
"footerDescText": "英文footer左下角文字",
"footerDescText": "NanoBanana Show - Your free NanoBanana AI image generator with unlimited possibilities",
"timesLeft": "You can generate",
"timesRight": "times",
"download": "Download",
"result": "Result",
"moreWorks": "My Stickers",
"moreWorks": "My Images",
"generateNew": "Generate New",
"displayPublic": "display public",
"similarText": "similar",
"prompt": "input prompt",
"revised": "revised prompt",
"exploreMore": "More Stickers",
"keyword": "sticker",
"exploreMore": "More Images",
"keyword": "image",
"searchButtonText": "Search"
},
"MenuText": {
"header0": "Sticker Generator",
"header1": "My Stickers",
"header2": "Discover Stickers",
"header3": "Search Stickers",
"header0": "NanoBanana Generator",
"header1": "My Images",
"header2": "Discover Images",
"header3": "Search Images",
"footerLegal": "Legal",
"footerLegal0": "Privacy Policy",
"footerLegal1": "Terms & Conditions",
"footerSupport": "Support",
"footerSupport0": "Pricing",
"footerSupport1": "Manage Subscribe"
"footerSupport1": "Manage Subscribe",
"footerLinks": "Friendly Links"
},
"AuthText": {
"loginText": "Log in",
@ -52,7 +53,7 @@
},
"PricingText": {
"title": "Pricing",
"description": "价格页面description",
"description": "Choose your plan for NanoBanana Show. Start free and upgrade for unlimited NanoBanana AI image generation with premium features.",
"h1Text": "Get plan for generate",
"basic": "Basic",
"essential": "Essential",
@ -79,48 +80,48 @@
"annuallySaveText": "save 50%"
},
"PrivacyPolicyText": {
"title": "英文隐私政策 title",
"description": "英文隐私政策description",
"h1Text": "英文隐私政策 H1",
"detailText": "英文隐私政策详情 markdown 文本"
"title": "Privacy Policy - NanoBanana Show",
"description": "Learn how NanoBanana Show protects your privacy and handles your data when using our AI sticker generator.",
"h1Text": "Privacy Policy",
"detailText": "# Privacy Policy\n\nYour privacy is important to us at NanoBanana Show. This policy explains how we collect, use, and protect your information when you use our NanoBanana AI image generator service.\n\n## Information We Collect\n\n- Account information when you sign up\n- Usage data to improve our service\n- Generated image content (stored securely)\n\n## How We Use Your Information\n\n- To provide and improve our NanoBanana AI image generation service\n- To process payments and subscriptions\n- To communicate with you about your account\n\n## Data Protection\n\nWe implement industry-standard security measures to protect your personal information and generated content.\n\nFor questions about this policy, please contact our support team."
},
"TermsOfServiceText": {
"title": "英文服务条款 title",
"description": "英文服务条款description",
"h1Text": "英文服务条款 H1",
"detailText": "英文服务条款详情 markdown 文本"
"title": "Terms of Service - NanoBanana Show",
"description": "Read the terms of service for NanoBanana Show, including usage guidelines for our AI sticker generator platform.",
"h1Text": "Terms of Service",
"detailText": "# Terms of Service\n\nWelcome to NanoBanana Show! By using our NanoBanana AI image generator service, you agree to these terms.\n\n## Service Description\n\nNanoBanana Show provides a NanoBanana AI-powered platform for generating custom images. We offer free credits to new users and subscription plans for unlimited access.\n\n## User Responsibilities\n\n- Use the service responsibly and legally\n- Do not generate inappropriate or harmful content\n- Respect intellectual property rights\n\n## Subscription Terms\n\n- Subscriptions provide unlimited NanoBanana AI image generation\n- Billing occurs monthly or annually as selected\n- Cancel anytime through your account settings\n\n## Content Rights\n\n- You retain rights to images you generate\n- We may display public images in our gallery\n- Do not use copyrighted material without permission\n\nFor questions about these terms, please contact our support team."
},
"WorksText": {
"title": "英文我的页面 title",
"description": "英文我的页面 description",
"h1Text": "英文我的页面 H1",
"descriptionBelowH1Text": "英文我的页面 H1下方的文字",
"descText": "Don't have sticker",
"title": "My Images - NanoBanana Show",
"description": "View and manage all your generated images in one place. Download, share, and organize your NanoBanana Show creations.",
"h1Text": "My Images",
"descriptionBelowH1Text": "All your generated images in one place. Create, download, and manage your image collection.",
"descText": "Don't have images",
"toContinue": "to continue."
},
"ExploreText": {
"title": "Discover %countSticker% Free PNG Stickers for Download",
"description": "Discover over %countSticker% free stickers in PNG format for your creative projects. Easily download and add flair to social media, websites, and more!",
"h1Text": "Discover Stickers",
"descriptionBelowH1Text": "Your Go-To Free Online Custom Sticker Maker & Generator!",
"title": "Discover %countSticker% Free PNG Images for Download",
"description": "Discover over %countSticker% free images in PNG format for your creative projects. Easily download and add flair to social media, websites, and more!",
"h1Text": "Discover Images",
"descriptionBelowH1Text": "Your Go-To Free Online Custom Image Maker & Generator!",
"pageText": "Page %pageNumber%",
"h2Text": "Discover Our Collection of %countSticker% Free Stickers in PNG Format for Easy Download"
"h2Text": "Discover Our Collection of %countSticker% Free Images in PNG Format for Easy Download"
},
"DetailText": {
"title": "%prompt% Sticker, Download in PNG or SVG",
"description": "Discover the %prompt% sticker, Download in PNG or SVG format now!",
"h1Text": "%prompt% Sticker",
"descriptionBelowH1Text": "Discover the %prompt% sticker, Download in PNG or SVG format now!",
"title": "%prompt% Image, Download in PNG or SVG",
"description": "Discover the %prompt% image, Download in PNG or SVG format now!",
"h1Text": "%prompt% Image",
"descriptionBelowH1Text": "Discover the %prompt% image, Download in PNG or SVG format now!",
"numberText": "#%detailId%",
"h2Text": "%prompt% Stickers Collection"
"h2Text": "%prompt% Images Collection"
},
"SearchText": {
"title": "Search %countSticker% Free PNG Stickers for Download",
"description": "Search over %countStickerAll% free stickers in PNG format for your creative projects. Easily download and add flair to social media, websites, and more!",
"h1Text": "Search Stickers",
"h2Text": "Search Our Collection of %countSticker% Free Stickers in PNG Format for Easy Download",
"titleSearch": "Search %countSticker% Free %prompt% Stickers",
"h2TextSearch": "Search Our Collection of %countSticker% Free %prompt% Stickers in PNG Format for Easy Download"
"title": "Search %countSticker% Free PNG Images for Download",
"description": "Search over %countStickerAll% free images in PNG format for your creative projects. Easily download and add flair to social media, websites, and more!",
"h1Text": "Search Images",
"h2Text": "Search Our Collection of %countSticker% Free Images in PNG Format for Easy Download",
"titleSearch": "Search %countSticker% Free %prompt% Images",
"h2TextSearch": "Search Our Collection of %countSticker% Free %prompt% Images in PNG Format for Easy Download"
},
"QuestionText": {
"detailText": ""

View File

@ -1,46 +1,47 @@
{
"FileDesc": {
"lang": "en",
"lang": "zh",
"language": "简体中文",
"languageInChineseSimple": "简体中文"
},
"IndexPageText": {
"title": "中文Title",
"description": "中文description",
"h1Text": "首页 H1",
"descriptionBelowH1Text": "首页 H1下方的文字"
"title": "NanoBanana Show - 免费NanoBanana AI图像生成器",
"description": "使用 NanoBanana Show 免费制作个性化图像基于NanoBanana AI技术的图像生成器提供免费额度订阅后享受无限制生成。",
"h1Text": "免费NanoBanana AI图像生成器",
"descriptionBelowH1Text": "使用 NanoBanana AI 创作精美的个性化图像!免费开始使用,升级后享受无限制生成。"
},
"CommonText": {
"loadingText": "加载中...",
"generateText": "生成中...",
"placeholderText": "在此处输入或粘贴文本...",
"buttonText": "生成",
"footerDescText": "footer左下角文字",
"footerDescText": "NanoBanana Show - 您的免费NanoBanana AI图像生成器无限可能",
"timesLeft": "您可以生成",
"timesRight": "次",
"download": "下载",
"result": "结果",
"moreWorks": "我的贴纸",
"moreWorks": "我的图像",
"generateNew": "生成新的",
"displayPublic": "公开展示",
"similarText": "相似",
"prompt": "输入提示",
"revised": "修订提示",
"exploreMore": "更多贴纸",
"keyword": "贴纸",
"exploreMore": "更多图像",
"keyword": "图像",
"searchButtonText": "搜索"
},
"MenuText": {
"header0": "贴纸生成器",
"header1": "我的贴纸",
"header2": "发现贴纸",
"header3": "搜索贴纸",
"header0": "NanoBanana生成器",
"header1": "我的图像",
"header2": "发现图像",
"header3": "搜索图像",
"footerLegal": "法律信息",
"footerLegal0": "隐私政策",
"footerLegal1": "条款和条件",
"footerSupport": "支持",
"footerSupport0": "定价",
"footerSupport1": "管理订阅"
"footerSupport1": "管理订阅",
"footerLinks": "友情链接"
},
"AuthText": {
"loginText": "登录",
@ -52,7 +53,7 @@
},
"PricingText": {
"title": "定价",
"description": "价格页面description",
"description": "选择适合您的 NanoBanana Show 套餐。免费开始使用升级获得无限制NanoBanana AI图像生成和高级功能。",
"h1Text": "获取生成计划",
"basic": "基础",
"essential": "必要",
@ -79,48 +80,48 @@
"annuallySaveText": "节省 50%"
},
"PrivacyPolicyText": {
"title": "隐私政策 title",
"description": "隐私政策description",
"h1Text": "隐私政策 H1",
"detailText": "隐私政策详情 markdown 文本"
"title": "隐私政策 - NanoBanana Show",
"description": "了解 NanoBanana Show 如何保护您的隐私以及在使用我们的AI贴纸生成器时如何处理您的数据。",
"h1Text": "隐私政策",
"detailText": "# 隐私政策\n\n您的隐私对我们 NanoBanana Show 非常重要。本政策说明我们在您使用我们的NanoBanana AI图像生成器服务时如何收集、使用和保护您的信息。\n\n## 我们收集的信息\n\n- 您注册时的账户信息\n- 用于改善服务的使用数据\n- 生成的图像内容(安全存储)\n\n## 我们如何使用您的信息\n\n- 提供和改善我们的NanoBanana AI图像生成服务\n- 处理付款和订阅\n- 就您的账户与您沟通\n\n## 数据保护\n\n我们实施行业标准的安全措施来保护您的个人信息和生成的内容。\n\n如对本政策有疑问请联系我们的支持团队。"
},
"TermsOfServiceText": {
"title": "服务条款 title",
"description": "服务条款description",
"h1Text": "服务条款 H1",
"detailText": "服务条款详情 markdown 文本"
"title": "服务条款 - NanoBanana Show",
"description": "阅读 NanoBanana Show 的服务条款包括我们AI贴纸生成器平台的使用指南。",
"h1Text": "服务条款",
"detailText": "# 服务条款\n\n欢迎使用 NanoBanana Show通过使用我们的NanoBanana AI图像生成器服务您同意这些条款。\n\n## 服务描述\n\nNanoBanana Show 提供基于NanoBanana AI的平台用于生成个性化图像。我们为新用户提供免费额度并提供订阅计划以获得无限制访问。\n\n## 用户责任\n\n- 负责任且合法地使用服务\n- 不得生成不当或有害内容\n- 尊重知识产权\n\n## 订阅条款\n\n- 订阅提供无限制的NanoBanana AI图像生成\n- 根据所选方式按月或按年计费\n- 可随时通过账户设置取消\n\n## 内容权利\n\n- 您保留生成图像的权利\n- 我们可能在画廊中展示公开图像\n- 未经许可不得使用受版权保护的材料\n\n如对这些条款有疑问请联系我们的支持团队。"
},
"WorksText": {
"title": "我的页面 title",
"description": "我的页面 description",
"h1Text": "我的页面 H1",
"descriptionBelowH1Text": "我的页面 H1下方的文字",
"descText": "没有贴纸",
"title": "我的图像 - NanoBanana Show",
"description": "在一个地方查看和管理您生成的所有图像。下载、分享和整理您的 NanoBanana Show 作品。",
"h1Text": "我的图像",
"descriptionBelowH1Text": "您生成的所有图像都在这里。创作、下载和管理您的图像收藏。",
"descText": "没有图像",
"toContinue": "继续。"
},
"ExploreText": {
"title": "发现 %countSticker% 张免费 PNG 贴纸下载",
"description": "为您的创意项目发现超过 %countSticker% 张免费的 PNG 格式贴纸。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "发现页面 H1",
"descriptionBelowH1Text": "发现页面 H1下方的文字",
"title": "发现 %countSticker% 张免费 PNG 图像下载",
"description": "为您的创意项目发现超过 %countSticker% 张免费的 PNG 格式图像。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "发现图像",
"descriptionBelowH1Text": "您的免费在线个性化图像制作器和生成器!",
"pageText": "第 %pageNumber% 页",
"h2Text": "探索我们的贴纸系列,包含 %countSticker% 张免费的 PNG 格式贴纸,便于下载"
"h2Text": "探索我们的图像系列,包含 %countSticker% 张免费的 PNG 格式图像,便于下载"
},
"DetailText": {
"title": "%prompt% 贴纸,以 PNG 或 SVG 格式下载",
"description": "发现 %prompt% 贴纸,现在就下载 PNG 或 SVG 格式!",
"h1Text": "%prompt% 贴纸",
"descriptionBelowH1Text": "发现 %prompt% 贴纸,现在就下载 PNG 或 SVG 格式!",
"title": "%prompt% 图像,以 PNG 或 SVG 格式下载",
"description": "发现 %prompt% 图像,现在就下载 PNG 或 SVG 格式!",
"h1Text": "%prompt% 图像",
"descriptionBelowH1Text": "发现 %prompt% 图像,现在就下载 PNG 或 SVG 格式!",
"numberText": "#%detailId%",
"h2Text": "%prompt% 贴纸系列"
"h2Text": "%prompt% 图像系列"
},
"SearchText": {
"title": "搜索 %countSticker% 张免费 PNG 贴纸进行下载",
"description": "为您的创意项目搜索超过 %countSticker% 张免费的 %prompt% PNG 格式贴纸。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "搜索贴纸",
"h2Text": "搜索我们的 %countSticker% 张免费贴纸,支持 PNG 格式,便于下载",
"titleSearch": "搜索 %countSticker% 免费 %prompt% 贴纸",
"h2TextSearch": "搜索我们的 %countSticker% 张免费 %prompt% 贴纸,支持 PNG 格式,方便下载"
"title": "搜索 %countSticker% 张免费 PNG 图像进行下载",
"description": "为您的创意项目搜索超过 %countSticker% 张免费的 %prompt% PNG 格式图像。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "搜索图像",
"h2Text": "搜索我们的 %countSticker% 张免费图像,支持 PNG 格式,便于下载",
"titleSearch": "搜索 %countSticker% 免费 %prompt% 图像",
"h2TextSearch": "搜索我们的 %countSticker% 张免费 %prompt% 图像,支持 PNG 格式,方便下载"
},
"QuestionText": {
"detailText": ""

View File

@ -1,122 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://sticker.show/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://sticker.show/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://sticker.show/de/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/de/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/de/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/de/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/es/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/es/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/es/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/es/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/fr/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/fr/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/fr/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/fr/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/ja/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/ja/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/ja/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/ja/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/ko/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/ko/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/ko/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/ko/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/pt/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/pt/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/pt/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/pt/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/tw/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/tw/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/tw/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/tw/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/vi/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/vi/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/vi/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/vi/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/zh/</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/zh/</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://sticker.show/zh/stickers</loc>
<lastmod>2024-03-18</lastmod>
<loc>https://nbs.prmbr.com/zh/stickers</loc>
<lastmod>2025-09-06</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>

View File

@ -244,12 +244,12 @@ const PageComponent = ({
</div>
</div>
<div className={"max-w-7xl px-9 mx-auto"}>
<div className={"w-[100%] mx-auto"}>
<div
className={"mx-auto rounded-tl-[30px] rounded-tr-[30px] border-[12px] border-[#ffffff1f] object-fill"}>
className={"mx-auto rounded-tl-[20px] md:rounded-tl-[30px] rounded-tr-[20px] md:rounded-tr-[30px] border-[6px] md:border-[12px] border-[#ffffff1f] object-fill"}>
<form onSubmit={handleSubmit} className="relative shadow-lg">
<div
className="overflow-hidden rounded-tl-[20px] rounded-tr-[20px]">
className="overflow-hidden rounded-tl-[14px] md:rounded-tl-[20px] rounded-tr-[14px] md:rounded-tr-[20px]">
<textarea
rows={5}
name="description"

View File

@ -39,6 +39,7 @@ export default async function LocaleLayout({
<html lang={locale}>
<head>
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script defer src="https://umami.frytea.com/script.js" data-website-id="12ba3476-cae6-484e-b93d-7d3fb30fd4a7"></script>
</head>
<body suppressHydrationWarning={true} className={clsx(inter.className, 'flex flex-col background-div')}>
<NextAuthProvider>

View File

@ -210,6 +210,23 @@ const PageComponent = ({
</div>
</div>
</div>
{/* Prompt display panel */}
<div className={"w-[90%] mx-auto mt-2 mb-6"}>
<div className="bg-[#ffffff0d] border border-[#ffffff1f] rounded-lg p-4 text-white">
<div>
<div className="text-sm text-[#7c8aaa] mb-1">{commonText.prompt}</div>
<p className="whitespace-pre-wrap break-words text-base leading-relaxed">{workDetail.input_text}</p>
</div>
{
workDetail?.revised_text && workDetail.revised_text !== workDetail.input_text ? (
<div className="mt-4">
<div className="text-sm text-[#7c8aaa] mb-1">{commonText.revised}</div>
<p className="whitespace-pre-wrap break-words text-base leading-relaxed">{workDetail.revised_text}</p>
</div>
) : null
}
</div>
</div>
<h2
className={"w-[80%] mx-auto text-white pt-4 text-xl md:text-4xl flex justify-center items-center"}>{detailText.h2Text}</h2>
<div className={"w-[90%] mx-auto mb-20"}>

View File

@ -70,16 +70,28 @@ export default function Footer({
</ul>
</div>
<div className="mt-10 md:mt-0">
<div className="text-sm font-semibold leading-6 text-white"></div>
<div className="text-sm font-semibold leading-6 text-white">{menuText.footerLinks}</div>
<ul role="list" className="mt-6 space-y-4">
<a
className="text-sm leading-6 footer-link text-white"
target={"_blank"}
href={"https://sticker.show/"}
title={"Free Online AI Sticker Maker & Generator!"}
>
Source by Sticker.Show
</a>
<li>
<a
className="text-sm leading-6 text-gray-300 hover:text-[#2d6ae0]"
target={"_blank"}
href={"https://gemini.google.com/"}
title={"Gemini AI"}
>
Gemini AI
</a>
</li>
<li>
<a
className="text-sm leading-6 text-gray-300 hover:text-[#2d6ae0]"
target={"_blank"}
href={"https://aistudio.google.com/"}
title={"AI Studio"}
>
AI Studio
</a>
</li>
</ul>
</div>
</div>

View File

@ -7,10 +7,12 @@ export const r2AccountId = process.env.R2_ACCOUNT_ID
export const r2Endpoint = process.env.R2_ENDPOINT
export const r2AccessKeyId = process.env.R2_ACCESS_KEY_ID
export const r2SecretAccessKey = process.env.R2_SECRET_ACCESS_KEY
export const r2Region = process.env.R2_REGION || 'auto'
export const R2 = new S3({
endpoint: r2Endpoint,
region: r2Region,
credentials: {
accessKeyId: r2AccessKeyId,
secretAccessKey: r2SecretAccessKey,

View File

@ -1,25 +1,26 @@
import {translateContent} from "~/servers/translate";
// import {translateContent} from "~/servers/translate";
export const getInput = async (textStr, checkSubscribeStatus) => {
// 翻译成英语后返回
const revised_text = await translateContent(textStr, 'en');
// 注释掉翻译功能,直接使用用户输入
// const revised_text = await translateContent(textStr, 'en');
// 为 Gemini 2.5 Flash Image 构建更详细的提示词
let enhancedPrompt = `Create a high-quality sticker image: ${revised_text}.
Style: Clean, vibrant, cartoon-like sticker design with clear outlines.
Requirements: Suitable for all ages, no inappropriate content, professional quality.`;
// 注释掉所有提示词增强逻辑,直接返回用户输入
// // 为 Gemini 2.5 Flash Image 构建更详细的提示词
// let enhancedPrompt = `Create a high-quality sticker image: ${revised_text}.
// Style: Clean, vibrant, cartoon-like sticker design with clear outlines.
// Requirements: Suitable for all ages, no inappropriate content, professional quality.`;
// 如果是订阅用户,可以添加更高质量的描述
if (checkSubscribeStatus) {
enhancedPrompt = `Create a premium high-quality sticker image: ${revised_text}.
Style: Professional cartoon/anime style with vibrant colors, detailed artwork, clean vector-like appearance.
Quality: High resolution, crisp lines, suitable for printing and digital use.
Requirements: Family-friendly content, no inappropriate material, premium design quality.`;
}
// // 如果是订阅用户,可以添加更高质量的描述
// if (checkSubscribeStatus) {
// enhancedPrompt = `Create a premium high-quality sticker image: ${revised_text}.
// Style: Professional cartoon/anime style with vibrant colors, detailed artwork, clean vector-like appearance.
// Quality: High resolution, crisp lines, suitable for printing and digital use.
// Requirements: Family-friendly content, no inappropriate material, premium design quality.`;
// }
return {
prompt: enhancedPrompt,
prompt: textStr, // 直接返回用户的原始输入,不做任何处理
output_format: "png" // PNG format for better quality with transparency support
}
}