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 # website URL
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_SITE_URL= NEXT_PUBLIC_SITE_URL=https://nbs.prmbr.com
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# website name # website name
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_WEBSITE_NAME= NEXT_PUBLIC_WEBSITE_NAME="NanoBanana Show"
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# image alt text # image alt text
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_IMAGE_ALT_ADDITION_TEXT= NEXT_PUBLIC_IMAGE_ALT_ADDITION_TEXT="NanoBanana Show"
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# domain name # domain name
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_DOMAIN_NAME= NEXT_PUBLIC_DOMAIN_NAME="nbs.prmbo.com"
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# postgres config # 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 # Google auth config
# 0 代表不检查登录则登录相关的按钮也不展示出来1代表要检查 # 0 代表不检查登录则登录相关的按钮也不展示出来1代表要检查
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_CHECK_GOOGLE_LOGIN=0 NEXT_PUBLIC_CHECK_GOOGLE_LOGIN=1
NEXT_PUBLIC_GOOGLE_CLIENT_ID= NEXT_PUBLIC_GOOGLE_CLIENT_ID=1011279317992-kduhuvssdem1p338l186377i3982df79.apps.googleusercontent.com
GOOGLE_SECRET_ID= GOOGLE_SECRET_ID=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
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# NEXTAUTH config create command: openssl rand -base64 32 # NEXTAUTH config create command: openssl rand -base64 32
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXTAUTH_URL= NEXTAUTH_URL=https://nbs.prmbo.com
NEXTAUTH_SECRET= NEXTAUTH_SECRET=rW88FCN+snBc04B+gKtS0+DCc3UIRdcWJNCEGnZtZ6U=
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# Google gtag id # 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 # Update these with your Stripe credentials from https://dashboard.stripe.com/apikeys
# 0 代表不检查支付则支付页面也不展示出来1代表要检查 # 0 代表不检查支付则支付页面也不展示出来1代表要检查
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_CHECK_AVAILABLE_TIME=0 NEXT_PUBLIC_CHECK_AVAILABLE_TIME=1
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_51Rs4SeL4RcMgUJpOrGbswlk9ESZ5ezDOehA3JYBtFWaCdk5fvGjvq98MVXhdPsdFzVfl69MyWIdQwKvsvsN3NLGo00JXs9sXSE
STRIPE_SECRET_KEY= STRIPE_SECRET_KEY=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
STRIPE_WEBHOOK_SECRET= STRIPE_WEBHOOK_SECRET=whsec_clBH2N3tlpVRd7jAyvojb2Wg1MtAeGWw
# 免费生成次数 # 免费生成次数
FREE_TIMES=2 FREE_TIMES=10
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# replicate config # replicate config
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# replicate 生成结束后的回调地址,本地时我才用的 ngrok线上的话就是你的域名 # replicate 生成结束后的回调地址,本地时我才用的 ngrok线上的话就是你的域名
REPLICATE_WEBHOOK= REPLICATE_WEBHOOK=https://nbs.prmbr.com
# replicate 的 API token需要去你的 replicate 账号里面复制 https://replicate.com/account/api-tokens # 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 ,最新的那个版本只生成一张图片了,下方这个版本是还会一次生成两张图片的 # 生成贴纸的API版本 https://replicate.com/fofr/sticker-maker/versions ,最新的那个版本只生成一张图片了,下方这个版本是还会一次生成两张图片的
REPLICATE_API_VERSION="6443cc831f51eb01333f50b757157411d7cadb6215144cc721e3688b70004ad0" REPLICATE_API_VERSION="6443cc831f51eb01333f50b757157411d7cadb6215144cc721e3688b70004ad0"
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# cloudflare R2 config # cloudflare R2 config
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
NEXT_PUBLIC_STORAGE_URL= NEXT_PUBLIC_STORAGE_URL=https://nbs-image-cdn.prmbr.com
STORAGE_DOMAIN= STORAGE_DOMAIN=nbs-image-cdn.prmbr.com
R2_BUCKET= R2_BUCKET=nano-banana-show
R2_ACCOUNT_ID= R2_ENDPOINT=https://209b775a76842f6f305193e41de86be1.r2.cloudflarestorage.com
R2_ENDPOINT= R2_TOKEN_VALUE=ZpqP7-OWxezkWTZ0yvr4fvejMEW6F-Z9lT5HxqjE
R2_TOKEN_VALUE= R2_ACCESS_KEY_ID=a2329772654cf1ac12d2df8d4fe34e16
R2_ACCESS_KEY_ID= R2_SECRET_ACCESS_KEY=aad334e0804ac4811012cbcc0cb4960913b1a35ab5f17cef0c10e7673cd29ce1
R2_SECRET_ACCESS_KEY= R2_REGION=apac
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
# openai config # openai config
#-------------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------------
OPENAI_API_KEY= OPENAI_API_KEY=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
OPENAI_API_BASE_URL=https://openrouter.ai/api OPENAI_API_BASE_URL=https://openrouter.ai/api
OPENAI_API_MODEL="openai/gpt-3.5-turbo" 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": "英语" "languageInChineseSimple": "英语"
}, },
"IndexPageText": { "IndexPageText": {
"title": "英文Title", "title": "NanoBanana Show - Free NanoBanana AI Image Generator",
"description": "英文description", "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": "英文首页 H1", "h1Text": "Free NanoBanana AI Image Generator",
"descriptionBelowH1Text": "英文首页 H1下方的文字" "descriptionBelowH1Text": "Create amazing custom images with NanoBanana AI! Get free credits to start, then upgrade for unlimited generation."
}, },
"CommonText": { "CommonText": {
"loadingText": "Loading...", "loadingText": "Loading...",
"generateText": "Generating...", "generateText": "Generating...",
"placeholderText": "Type or paste text here...", "placeholderText": "Type or paste text here...",
"buttonText": "Generate", "buttonText": "Generate",
"footerDescText": "英文footer左下角文字", "footerDescText": "NanoBanana Show - Your free NanoBanana AI image generator with unlimited possibilities",
"timesLeft": "You can generate", "timesLeft": "You can generate",
"timesRight": "times", "timesRight": "times",
"download": "Download", "download": "Download",
"result": "Result", "result": "Result",
"moreWorks": "My Stickers", "moreWorks": "My Images",
"generateNew": "Generate New", "generateNew": "Generate New",
"displayPublic": "display public", "displayPublic": "display public",
"similarText": "similar", "similarText": "similar",
"prompt": "input prompt", "prompt": "input prompt",
"revised": "revised prompt", "revised": "revised prompt",
"exploreMore": "More Stickers", "exploreMore": "More Images",
"keyword": "sticker", "keyword": "image",
"searchButtonText": "Search" "searchButtonText": "Search"
}, },
"MenuText": { "MenuText": {
"header0": "Sticker Generator", "header0": "NanoBanana Generator",
"header1": "My Stickers", "header1": "My Images",
"header2": "Discover Stickers", "header2": "Discover Images",
"header3": "Search Stickers", "header3": "Search Images",
"footerLegal": "Legal", "footerLegal": "Legal",
"footerLegal0": "Privacy Policy", "footerLegal0": "Privacy Policy",
"footerLegal1": "Terms & Conditions", "footerLegal1": "Terms & Conditions",
"footerSupport": "Support", "footerSupport": "Support",
"footerSupport0": "Pricing", "footerSupport0": "Pricing",
"footerSupport1": "Manage Subscribe" "footerSupport1": "Manage Subscribe",
"footerLinks": "Friendly Links"
}, },
"AuthText": { "AuthText": {
"loginText": "Log in", "loginText": "Log in",
@ -52,7 +53,7 @@
}, },
"PricingText": { "PricingText": {
"title": "Pricing", "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", "h1Text": "Get plan for generate",
"basic": "Basic", "basic": "Basic",
"essential": "Essential", "essential": "Essential",
@ -79,48 +80,48 @@
"annuallySaveText": "save 50%" "annuallySaveText": "save 50%"
}, },
"PrivacyPolicyText": { "PrivacyPolicyText": {
"title": "英文隐私政策 title", "title": "Privacy Policy - NanoBanana Show",
"description": "英文隐私政策description", "description": "Learn how NanoBanana Show protects your privacy and handles your data when using our AI sticker generator.",
"h1Text": "英文隐私政策 H1", "h1Text": "Privacy Policy",
"detailText": "英文隐私政策详情 markdown 文本" "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": { "TermsOfServiceText": {
"title": "英文服务条款 title", "title": "Terms of Service - NanoBanana Show",
"description": "英文服务条款description", "description": "Read the terms of service for NanoBanana Show, including usage guidelines for our AI sticker generator platform.",
"h1Text": "英文服务条款 H1", "h1Text": "Terms of Service",
"detailText": "英文服务条款详情 markdown 文本" "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": { "WorksText": {
"title": "英文我的页面 title", "title": "My Images - NanoBanana Show",
"description": "英文我的页面 description", "description": "View and manage all your generated images in one place. Download, share, and organize your NanoBanana Show creations.",
"h1Text": "英文我的页面 H1", "h1Text": "My Images",
"descriptionBelowH1Text": "英文我的页面 H1下方的文字", "descriptionBelowH1Text": "All your generated images in one place. Create, download, and manage your image collection.",
"descText": "Don't have sticker", "descText": "Don't have images",
"toContinue": "to continue." "toContinue": "to continue."
}, },
"ExploreText": { "ExploreText": {
"title": "Discover %countSticker% Free PNG Stickers for Download", "title": "Discover %countSticker% Free PNG Images 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!", "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 Stickers", "h1Text": "Discover Images",
"descriptionBelowH1Text": "Your Go-To Free Online Custom Sticker Maker & Generator!", "descriptionBelowH1Text": "Your Go-To Free Online Custom Image Maker & Generator!",
"pageText": "Page %pageNumber%", "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": { "DetailText": {
"title": "%prompt% Sticker, Download in PNG or SVG", "title": "%prompt% Image, Download in PNG or SVG",
"description": "Discover the %prompt% sticker, Download in PNG or SVG format now!", "description": "Discover the %prompt% image, Download in PNG or SVG format now!",
"h1Text": "%prompt% Sticker", "h1Text": "%prompt% Image",
"descriptionBelowH1Text": "Discover the %prompt% sticker, Download in PNG or SVG format now!", "descriptionBelowH1Text": "Discover the %prompt% image, Download in PNG or SVG format now!",
"numberText": "#%detailId%", "numberText": "#%detailId%",
"h2Text": "%prompt% Stickers Collection" "h2Text": "%prompt% Images Collection"
}, },
"SearchText": { "SearchText": {
"title": "Search %countSticker% Free PNG Stickers for Download", "title": "Search %countSticker% Free PNG Images 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!", "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 Stickers", "h1Text": "Search Images",
"h2Text": "Search Our Collection of %countSticker% Free Stickers in PNG Format for Easy Download", "h2Text": "Search Our Collection of %countSticker% Free Images in PNG Format for Easy Download",
"titleSearch": "Search %countSticker% Free %prompt% Stickers", "titleSearch": "Search %countSticker% Free %prompt% Images",
"h2TextSearch": "Search Our Collection of %countSticker% Free %prompt% Stickers in PNG Format for Easy Download" "h2TextSearch": "Search Our Collection of %countSticker% Free %prompt% Images in PNG Format for Easy Download"
}, },
"QuestionText": { "QuestionText": {
"detailText": "" "detailText": ""

View File

@ -1,46 +1,47 @@
{ {
"FileDesc": { "FileDesc": {
"lang": "en", "lang": "zh",
"language": "简体中文", "language": "简体中文",
"languageInChineseSimple": "简体中文" "languageInChineseSimple": "简体中文"
}, },
"IndexPageText": { "IndexPageText": {
"title": "中文Title", "title": "NanoBanana Show - 免费NanoBanana AI图像生成器",
"description": "中文description", "description": "使用 NanoBanana Show 免费制作个性化图像基于NanoBanana AI技术的图像生成器提供免费额度订阅后享受无限制生成。",
"h1Text": "首页 H1", "h1Text": "免费NanoBanana AI图像生成器",
"descriptionBelowH1Text": "首页 H1下方的文字" "descriptionBelowH1Text": "使用 NanoBanana AI 创作精美的个性化图像!免费开始使用,升级后享受无限制生成。"
}, },
"CommonText": { "CommonText": {
"loadingText": "加载中...", "loadingText": "加载中...",
"generateText": "生成中...", "generateText": "生成中...",
"placeholderText": "在此处输入或粘贴文本...", "placeholderText": "在此处输入或粘贴文本...",
"buttonText": "生成", "buttonText": "生成",
"footerDescText": "footer左下角文字", "footerDescText": "NanoBanana Show - 您的免费NanoBanana AI图像生成器无限可能",
"timesLeft": "您可以生成", "timesLeft": "您可以生成",
"timesRight": "次", "timesRight": "次",
"download": "下载", "download": "下载",
"result": "结果", "result": "结果",
"moreWorks": "我的贴纸", "moreWorks": "我的图像",
"generateNew": "生成新的", "generateNew": "生成新的",
"displayPublic": "公开展示", "displayPublic": "公开展示",
"similarText": "相似", "similarText": "相似",
"prompt": "输入提示", "prompt": "输入提示",
"revised": "修订提示", "revised": "修订提示",
"exploreMore": "更多贴纸", "exploreMore": "更多图像",
"keyword": "贴纸", "keyword": "图像",
"searchButtonText": "搜索" "searchButtonText": "搜索"
}, },
"MenuText": { "MenuText": {
"header0": "贴纸生成器", "header0": "NanoBanana生成器",
"header1": "我的贴纸", "header1": "我的图像",
"header2": "发现贴纸", "header2": "发现图像",
"header3": "搜索贴纸", "header3": "搜索图像",
"footerLegal": "法律信息", "footerLegal": "法律信息",
"footerLegal0": "隐私政策", "footerLegal0": "隐私政策",
"footerLegal1": "条款和条件", "footerLegal1": "条款和条件",
"footerSupport": "支持", "footerSupport": "支持",
"footerSupport0": "定价", "footerSupport0": "定价",
"footerSupport1": "管理订阅" "footerSupport1": "管理订阅",
"footerLinks": "友情链接"
}, },
"AuthText": { "AuthText": {
"loginText": "登录", "loginText": "登录",
@ -52,7 +53,7 @@
}, },
"PricingText": { "PricingText": {
"title": "定价", "title": "定价",
"description": "价格页面description", "description": "选择适合您的 NanoBanana Show 套餐。免费开始使用升级获得无限制NanoBanana AI图像生成和高级功能。",
"h1Text": "获取生成计划", "h1Text": "获取生成计划",
"basic": "基础", "basic": "基础",
"essential": "必要", "essential": "必要",
@ -79,48 +80,48 @@
"annuallySaveText": "节省 50%" "annuallySaveText": "节省 50%"
}, },
"PrivacyPolicyText": { "PrivacyPolicyText": {
"title": "隐私政策 title", "title": "隐私政策 - NanoBanana Show",
"description": "隐私政策description", "description": "了解 NanoBanana Show 如何保护您的隐私以及在使用我们的AI贴纸生成器时如何处理您的数据。",
"h1Text": "隐私政策 H1", "h1Text": "隐私政策",
"detailText": "隐私政策详情 markdown 文本" "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": { "TermsOfServiceText": {
"title": "服务条款 title", "title": "服务条款 - NanoBanana Show",
"description": "服务条款description", "description": "阅读 NanoBanana Show 的服务条款包括我们AI贴纸生成器平台的使用指南。",
"h1Text": "服务条款 H1", "h1Text": "服务条款",
"detailText": "服务条款详情 markdown 文本" "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": { "WorksText": {
"title": "我的页面 title", "title": "我的图像 - NanoBanana Show",
"description": "我的页面 description", "description": "在一个地方查看和管理您生成的所有图像。下载、分享和整理您的 NanoBanana Show 作品。",
"h1Text": "我的页面 H1", "h1Text": "我的图像",
"descriptionBelowH1Text": "我的页面 H1下方的文字", "descriptionBelowH1Text": "您生成的所有图像都在这里。创作、下载和管理您的图像收藏。",
"descText": "没有贴纸", "descText": "没有图像",
"toContinue": "继续。" "toContinue": "继续。"
}, },
"ExploreText": { "ExploreText": {
"title": "发现 %countSticker% 张免费 PNG 贴纸下载", "title": "发现 %countSticker% 张免费 PNG 图像下载",
"description": "为您的创意项目发现超过 %countSticker% 张免费的 PNG 格式贴纸。轻松下载并为社交媒体、网站等增添风采!", "description": "为您的创意项目发现超过 %countSticker% 张免费的 PNG 格式图像。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "发现页面 H1", "h1Text": "发现图像",
"descriptionBelowH1Text": "发现页面 H1下方的文字", "descriptionBelowH1Text": "您的免费在线个性化图像制作器和生成器!",
"pageText": "第 %pageNumber% 页", "pageText": "第 %pageNumber% 页",
"h2Text": "探索我们的贴纸系列,包含 %countSticker% 张免费的 PNG 格式贴纸,便于下载" "h2Text": "探索我们的图像系列,包含 %countSticker% 张免费的 PNG 格式图像,便于下载"
}, },
"DetailText": { "DetailText": {
"title": "%prompt% 贴纸,以 PNG 或 SVG 格式下载", "title": "%prompt% 图像,以 PNG 或 SVG 格式下载",
"description": "发现 %prompt% 贴纸,现在就下载 PNG 或 SVG 格式!", "description": "发现 %prompt% 图像,现在就下载 PNG 或 SVG 格式!",
"h1Text": "%prompt% 贴纸", "h1Text": "%prompt% 图像",
"descriptionBelowH1Text": "发现 %prompt% 贴纸,现在就下载 PNG 或 SVG 格式!", "descriptionBelowH1Text": "发现 %prompt% 图像,现在就下载 PNG 或 SVG 格式!",
"numberText": "#%detailId%", "numberText": "#%detailId%",
"h2Text": "%prompt% 贴纸系列" "h2Text": "%prompt% 图像系列"
}, },
"SearchText": { "SearchText": {
"title": "搜索 %countSticker% 张免费 PNG 贴纸进行下载", "title": "搜索 %countSticker% 张免费 PNG 图像进行下载",
"description": "为您的创意项目搜索超过 %countSticker% 张免费的 %prompt% PNG 格式贴纸。轻松下载并为社交媒体、网站等增添风采!", "description": "为您的创意项目搜索超过 %countSticker% 张免费的 %prompt% PNG 格式图像。轻松下载并为社交媒体、网站等增添风采!",
"h1Text": "搜索贴纸", "h1Text": "搜索图像",
"h2Text": "搜索我们的 %countSticker% 张免费贴纸,支持 PNG 格式,便于下载", "h2Text": "搜索我们的 %countSticker% 张免费图像,支持 PNG 格式,便于下载",
"titleSearch": "搜索 %countSticker% 免费 %prompt% 贴纸", "titleSearch": "搜索 %countSticker% 免费 %prompt% 图像",
"h2TextSearch": "搜索我们的 %countSticker% 张免费 %prompt% 贴纸,支持 PNG 格式,方便下载" "h2TextSearch": "搜索我们的 %countSticker% 张免费 %prompt% 图像,支持 PNG 格式,方便下载"
}, },
"QuestionText": { "QuestionText": {
"detailText": "" "detailText": ""

View File

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

View File

@ -244,12 +244,12 @@ const PageComponent = ({
</div> </div>
</div> </div>
<div className={"max-w-7xl px-9 mx-auto"}> <div className={"w-[100%] mx-auto"}>
<div <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"> <form onSubmit={handleSubmit} className="relative shadow-lg">
<div <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 <textarea
rows={5} rows={5}
name="description" name="description"

View File

@ -39,6 +39,7 @@ export default async function LocaleLayout({
<html lang={locale}> <html lang={locale}>
<head> <head>
<script src="https://accounts.google.com/gsi/client" async defer></script> <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> </head>
<body suppressHydrationWarning={true} className={clsx(inter.className, 'flex flex-col background-div')}> <body suppressHydrationWarning={true} className={clsx(inter.className, 'flex flex-col background-div')}>
<NextAuthProvider> <NextAuthProvider>

View File

@ -210,6 +210,23 @@ const PageComponent = ({
</div> </div>
</div> </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 <h2
className={"w-[80%] mx-auto text-white pt-4 text-xl md:text-4xl flex justify-center items-center"}>{detailText.h2Text}</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"}> <div className={"w-[90%] mx-auto mb-20"}>

View File

@ -70,16 +70,28 @@ export default function Footer({
</ul> </ul>
</div> </div>
<div className="mt-10 md:mt-0"> <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"> <ul role="list" className="mt-6 space-y-4">
<li>
<a <a
className="text-sm leading-6 footer-link text-white" className="text-sm leading-6 text-gray-300 hover:text-[#2d6ae0]"
target={"_blank"} target={"_blank"}
href={"https://sticker.show/"} href={"https://gemini.google.com/"}
title={"Free Online AI Sticker Maker & Generator!"} title={"Gemini AI"}
> >
Source by Sticker.Show Gemini AI
</a> </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> </ul>
</div> </div>
</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 r2Endpoint = process.env.R2_ENDPOINT
export const r2AccessKeyId = process.env.R2_ACCESS_KEY_ID export const r2AccessKeyId = process.env.R2_ACCESS_KEY_ID
export const r2SecretAccessKey = process.env.R2_SECRET_ACCESS_KEY export const r2SecretAccessKey = process.env.R2_SECRET_ACCESS_KEY
export const r2Region = process.env.R2_REGION || 'auto'
export const R2 = new S3({ export const R2 = new S3({
endpoint: r2Endpoint, endpoint: r2Endpoint,
region: r2Region,
credentials: { credentials: {
accessKeyId: r2AccessKeyId, accessKeyId: r2AccessKeyId,
secretAccessKey: r2SecretAccessKey, secretAccessKey: r2SecretAccessKey,

View File

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