Compare commits
10 Commits
5b256d1b4b
...
71d5bc4528
Author | SHA1 | Date | |
---|---|---|---|
71d5bc4528 | |||
7fb539383b | |||
420448117c | |||
db19a0d667 | |||
17a9bbaf7d | |||
becb6abf59 | |||
36b7c04e92 | |||
ebc8fe96e4 | |||
349a1e9e9e | |||
70526f2181 |
@ -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
44
AGENTS.md
Normal 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/third‑party 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.
|
||||
|
@ -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": ""
|
||||
|
@ -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": ""
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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"}>
|
||||
|
@ -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>
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user