├── .gitignore ├── .env.example ├── public └── images │ ├── nano-banana-pro-prompts-cover-en.png │ ├── nano-banana-pro-prompts-cover-zh.png │ ├── nano-banana-pro-prompts-list-en.png │ └── nano-banana-pro-prompts-list-zh.png ├── tsconfig.json ├── package.json ├── .github ├── labels.yml ├── workflows │ ├── update-readme.yml │ ├── sync-approved-to-cms.yml │ ├── auto-close-stale-issues.yml │ └── sync-labels.yml └── ISSUE_TEMPLATE │ ├── bug-report.yml │ └── submit-prompt.yml ├── LICENSE ├── scripts ├── generate-readme.ts ├── utils │ ├── image-uploader.ts │ ├── cms-client.ts │ ├── markdown-generator.ts │ └── i18n.ts └── sync-approved-to-cms.ts ├── docs ├── FAQ.md ├── CONTRIBUTING.md └── LOCAL_DEVELOPMENT.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .env 4 | .DS_Store 5 | *.log 6 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Payload CMS Configuration (Required) 2 | CMS_HOST=https://your-cms-host.com 3 | CMS_API_KEY=your-api-key-here -------------------------------------------------------------------------------- /public/images/nano-banana-pro-prompts-cover-en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/HEAD/public/images/nano-banana-pro-prompts-cover-en.png -------------------------------------------------------------------------------- /public/images/nano-banana-pro-prompts-cover-zh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/HEAD/public/images/nano-banana-pro-prompts-cover-zh.png -------------------------------------------------------------------------------- /public/images/nano-banana-pro-prompts-list-en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/HEAD/public/images/nano-banana-pro-prompts-list-en.png -------------------------------------------------------------------------------- /public/images/nano-banana-pro-prompts-list-zh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/HEAD/public/images/nano-banana-pro-prompts-list-zh.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "ES2022", 5 | "lib": ["ES2022"], 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "resolveJsonModule": true, 12 | "outDir": "./dist", 13 | "rootDir": "./scripts" 14 | }, 15 | "include": ["scripts/**/*"], 16 | "exclude": ["node_modules", "dist"] 17 | } 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "awesome-nano-banana-pro-prompts", 3 | "version": "1.0.0", 4 | "description": "Curated collection of Nano Banana Pro prompts", 5 | "type": "module", 6 | "scripts": { 7 | "generate": "tsx scripts/generate-readme.ts", 8 | "sync": "tsx scripts/sync-approved-to-cms.ts" 9 | }, 10 | "devDependencies": { 11 | "@octokit/rest": "^20.0.2", 12 | "@types/node": "^20.10.0", 13 | "dotenv": "^17.2.3", 14 | "tsx": "^4.7.0", 15 | "typescript": "^5.3.3" 16 | }, 17 | "dependencies": { 18 | "node-fetch": "^3.3.2", 19 | "qs-esm": "^7.0.2" 20 | }, 21 | "packageManager": "pnpm@9.15.9" 22 | } 23 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | - name: approved 2 | color: '#65e00d' 3 | description: 'This prompt has been approved by the official authority.' 4 | 5 | - name: prompt-submission 6 | color: '#3f74ea' 7 | description: 'This is a prompt submission.' 8 | 9 | - name: bug 10 | color: '#d73a4a' 11 | description: "Something isn't working" 12 | 13 | - name: documentation 14 | color: '#0075ca' 15 | description: 'Improvements or additions to documentation' 16 | 17 | - name: duplicate 18 | color: '#cfd3d7' 19 | description: 'This issue or pull request already exists' 20 | 21 | - name: enhancement 22 | color: '#a2eeef' 23 | description: 'New feature or request' 24 | 25 | - name: good first issue 26 | color: '#7057ff' 27 | description: 'Good for newcomers' 28 | 29 | - name: help wanted 30 | color: '#008672' 31 | description: 'Extra attention is needed' 32 | 33 | - name: invalid 34 | color: '#e99695' 35 | description: "This doesn't seem right" 36 | 37 | - name: question 38 | color: '#d876e3' 39 | description: 'Further information is requested' 40 | 41 | - name: wontfix 42 | color: '#ffffff' 43 | description: 'This will not be worked on' 44 | 45 | -------------------------------------------------------------------------------- /.github/workflows/update-readme.yml: -------------------------------------------------------------------------------- 1 | name: Update README 2 | 3 | on: 4 | schedule: 5 | - cron: '0 */4 * * *' # Every 4 hours 6 | workflow_dispatch: 7 | push: 8 | branches: [main] 9 | paths: 10 | - 'scripts/**' 11 | - '.github/workflows/update-readme.yml' 12 | 13 | permissions: 14 | contents: write 15 | 16 | jobs: 17 | update: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | token: ${{ secrets.GITHUB_TOKEN }} 23 | 24 | - uses: pnpm/action-setup@v2 25 | with: 26 | version: 9 27 | 28 | - uses: actions/setup-node@v4 29 | with: 30 | node-version: '20' 31 | cache: 'pnpm' 32 | 33 | - name: Install dependencies 34 | run: pnpm install --frozen-lockfile 35 | 36 | - name: Generate README 37 | env: 38 | CMS_HOST: ${{ secrets.CMS_HOST }} 39 | CMS_API_KEY: ${{ secrets.CMS_API_KEY }} 40 | run: npx tsx scripts/generate-readme.ts 41 | 42 | - name: Commit changes 43 | run: | 44 | git config --global user.name 'github-actions[bot]' 45 | git config --global user.email 'github-actions[bot]@users.noreply.github.com' 46 | git add README*.md 47 | git diff --quiet && git diff --staged --quiet || git commit -m "docs: auto-update README [skip ci]" 48 | git push 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution 4.0 International License (CC BY 4.0) 2 | 3 | Copyright (c) 2025 YouMind OpenLab 4 | 5 | This work is licensed under the Creative Commons Attribution 4.0 International License. 6 | 7 | To view a copy of this license, visit: 8 | https://creativecommons.org/licenses/by/4.0/ 9 | 10 | or send a letter to: 11 | Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. 12 | 13 | --- 14 | 15 | You are free to: 16 | 17 | - Share — copy and redistribute the material in any medium or format 18 | - Adapt — remix, transform, and build upon the material for any purpose, even commercially 19 | 20 | Under the following terms: 21 | 22 | - Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 23 | 24 | No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. 25 | 26 | --- 27 | 28 | Notices: 29 | 30 | You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. 31 | 32 | No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: Report an issue with the repository 3 | title: "[Bug] " 4 | labels: ["bug"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## 🐛 Bug Report 10 | 11 | Thanks for taking the time to report an issue! 12 | 13 | - type: textarea 14 | id: description 15 | attributes: 16 | label: Bug Description 17 | description: A clear description of the bug 18 | placeholder: "Describe the bug..." 19 | validations: 20 | required: true 21 | 22 | - type: textarea 23 | id: steps 24 | attributes: 25 | label: Steps to Reproduce 26 | description: Steps to reproduce the behavior 27 | placeholder: | 28 | 1. Go to... 29 | 2. Click on... 30 | 3. See error... 31 | validations: 32 | required: true 33 | 34 | - type: textarea 35 | id: expected 36 | attributes: 37 | label: Expected Behavior 38 | description: What you expected to happen 39 | placeholder: "What should happen..." 40 | validations: 41 | required: true 42 | 43 | - type: textarea 44 | id: actual 45 | attributes: 46 | label: Actual Behavior 47 | description: What actually happened 48 | placeholder: "What actually happened..." 49 | validations: 50 | required: true 51 | 52 | - type: textarea 53 | id: additional 54 | attributes: 55 | label: Additional Context 56 | description: Any additional information or screenshots 57 | placeholder: "Add screenshots, logs, etc..." 58 | -------------------------------------------------------------------------------- /scripts/generate-readme.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import fs from 'fs'; 3 | import { fetchAllPrompts, sortPrompts, fetchPromptCategories } from './utils/cms-client.js'; 4 | import { generateMarkdown, SUPPORTED_LANGUAGES } from './utils/markdown-generator.js'; 5 | 6 | async function main() { 7 | try { 8 | // Loop through all supported languages 9 | for (const lang of SUPPORTED_LANGUAGES) { 10 | console.log(`\n🌐 Processing language: ${lang.name} (${lang.code})...`); 11 | 12 | console.log(` 📥 Fetching prompts from CMS (locale: ${lang.code})...`); 13 | const { docs: prompts, total } = await fetchAllPrompts(lang.code); 14 | 15 | console.log(` ✅ Fetched ${prompts.length} prompts (total: ${total})`); 16 | 17 | console.log(' 📥 Fetching categories from CMS...'); 18 | const { allCategories } = await fetchPromptCategories(lang.code); 19 | console.log(` ✅ Fetched ${allCategories.length} categories`); 20 | 21 | console.log(' 🔃 Sorting prompts...'); 22 | const sorted = sortPrompts(prompts, total); 23 | 24 | console.log(' 📝 Generating README...'); 25 | const markdown = generateMarkdown({ ...sorted, categories: allCategories }, lang.code); 26 | 27 | console.log(` 💾 Writing ${lang.readmeFileName}...`); 28 | fs.writeFileSync(lang.readmeFileName, markdown, 'utf-8'); 29 | 30 | console.log(` ✅ ${lang.readmeFileName} updated successfully!`); 31 | console.log(` 📊 Stats: ${sorted.stats.total} total, ${sorted.featured.length} featured`); 32 | } 33 | 34 | console.log('\n✨ All languages processed successfully!'); 35 | 36 | } catch (error) { 37 | console.error('❌ Error:', error); 38 | process.exit(1); 39 | } 40 | } 41 | 42 | main(); 43 | -------------------------------------------------------------------------------- /scripts/utils/image-uploader.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import type { Media } from './cms-client.js'; 3 | 4 | const CMS_HOST = process.env.CMS_HOST; 5 | const CMS_API_KEY = process.env.CMS_API_KEY; 6 | 7 | /** 8 | * Upload image to CMS 9 | * @param imageUrl Original image URL 10 | * @returns CMS media object 11 | */ 12 | export async function uploadImageToCMS(imageUrl: string): Promise { 13 | try { 14 | // Download image 15 | const imageResponse = await fetch(imageUrl); 16 | if (!imageResponse.ok) { 17 | throw new Error(`Failed to fetch image: ${imageResponse.statusText}`); 18 | } 19 | 20 | const imageBuffer = await imageResponse.arrayBuffer(); 21 | const contentType = imageResponse.headers.get('content-type') || 'image/jpeg'; 22 | 23 | // Extract filename from URL 24 | const urlParts = imageUrl.split('/'); 25 | const filename = urlParts[urlParts.length - 1].split('?')[0] || 'image.jpg'; 26 | 27 | // Create FormData 28 | const formData = new FormData(); 29 | const blob = new Blob([imageBuffer], { type: contentType }); 30 | formData.append('file', blob, filename); 31 | 32 | // Upload to CMS 33 | const uploadResponse = await fetch(`${CMS_HOST}/api/media`, { 34 | method: 'POST', 35 | headers: { 36 | 'Authorization': `users API-Key ${CMS_API_KEY}`, 37 | }, 38 | body: formData as any, 39 | }); 40 | 41 | if (!uploadResponse.ok) { 42 | const errorText = await uploadResponse.text(); 43 | throw new Error(`Failed to upload image: ${uploadResponse.statusText} - ${errorText}`); 44 | } 45 | 46 | const data = await uploadResponse.json() as { doc: Media }; 47 | const media = data.doc; 48 | 49 | return media; 50 | } catch (error) { 51 | console.error('Error uploading image to CMS:', error); 52 | // If upload fails, throw error instead of returning original URL 53 | // The caller should handle the error 54 | throw error; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /.github/workflows/sync-approved-to-cms.yml: -------------------------------------------------------------------------------- 1 | name: Sync Approved to CMS 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | # Note: 'labeled' event triggers on both open and closed issues 7 | # This allows the workflow to run when 'approved' label is added 8 | # even if the issue was closed after being reopened 9 | 10 | permissions: 11 | issues: write 12 | contents: read 13 | 14 | jobs: 15 | sync: 16 | # Only trigger when 'approved' label is added AND issue has 'prompt-submission' label 17 | # Works for both open and closed issues 18 | # Note: We check both conditions - the added label must be 'approved' 19 | # AND the issue must already have 'prompt-submission' label 20 | if: | 21 | github.event.label.name == 'approved' && 22 | contains(join(github.event.issue.labels.*.name, ' '), 'prompt-submission') 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | 27 | - uses: pnpm/action-setup@v2 28 | with: 29 | version: 9 30 | 31 | - uses: actions/setup-node@v4 32 | with: 33 | node-version: '20' 34 | cache: 'pnpm' 35 | 36 | - name: Install dependencies 37 | run: pnpm install --frozen-lockfile 38 | 39 | - name: Parse issue and submit to CMS 40 | env: 41 | CMS_HOST: ${{ secrets.CMS_HOST }} 42 | CMS_API_KEY: ${{ secrets.CMS_API_KEY }} 43 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 44 | GITHUB_REPOSITORY: ${{ github.repository }} 45 | ISSUE_NUMBER: ${{ github.event.issue.number }} 46 | ISSUE_BODY: ${{ github.event.issue.body }} 47 | run: npx tsx scripts/sync-approved-to-cms.ts 48 | 49 | - name: Comment on issue 50 | uses: actions/github-script@v7 51 | with: 52 | script: | 53 | github.rest.issues.createComment({ 54 | issue_number: context.issue.number, 55 | owner: context.repo.owner, 56 | repo: context.repo.repo, 57 | body: '🎉 Congratulations! Your prompt has been approved and synced to CMS.\n\n✅ It will appear in the README within 4 hours.\n\n🌐 View on: [youmind.com/nano-banana-pro-prompts](https://youmind.com/nano-banana-pro-prompts)\n\nThank you for your contribution! 🙏' 58 | }) 59 | -------------------------------------------------------------------------------- /.github/workflows/auto-close-stale-issues.yml: -------------------------------------------------------------------------------- 1 | name: Auto Close Stale Issues 2 | 3 | on: 4 | schedule: 5 | # 每天 UTC 时间 0:00 运行(可根据需要调整) 6 | - cron: '0 0 * * *' 7 | workflow_dispatch: # 允许手动触发 8 | 9 | permissions: 10 | issues: write 11 | contents: read 12 | 13 | jobs: 14 | close-stale-issues: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | 20 | - name: Close stale issues 21 | uses: actions/github-script@v7 22 | with: 23 | github-token: ${{ secrets.GITHUB_TOKEN }} 24 | script: | 25 | const { data: issues } = await github.rest.issues.listForRepo({ 26 | owner: context.repo.owner, 27 | repo: context.repo.repo, 28 | state: 'open', 29 | per_page: 100 30 | }); 31 | 32 | const DAYS_INACTIVE = 3; // 3天没有活跃 33 | const now = new Date(); 34 | const msPerDay = 24 * 60 * 60 * 1000; 35 | 36 | for (const issue of issues) { 37 | // 跳过 PR(GitHub API 会把 PR 也当作 issue) 38 | if (issue.pull_request) { 39 | continue; 40 | } 41 | 42 | // 获取 issue 的最后更新时间 43 | const lastUpdated = new Date(issue.updated_at); 44 | const daysSinceUpdate = (now - lastUpdated) / msPerDay; 45 | 46 | // 如果超过指定天数没有更新 47 | if (daysSinceUpdate >= DAYS_INACTIVE) { 48 | // 检查是否有标签排除(可选) 49 | const excludeLabels = ['keep-open', 'pinned']; 50 | const hasExcludeLabel = issue.labels.some(label => 51 | excludeLabels.includes(label.name) 52 | ); 53 | 54 | if (!hasExcludeLabel) { 55 | // 添加评论说明关闭原因 56 | await github.rest.issues.createComment({ 57 | owner: context.repo.owner, 58 | repo: context.repo.repo, 59 | issue_number: issue.number, 60 | body: `This issue has been automatically closed due to inactivity for ${DAYS_INACTIVE} days. If you believe this was closed in error, please reopen it.` 61 | }); 62 | 63 | // 关闭 issue 64 | await github.rest.issues.update({ 65 | owner: context.repo.owner, 66 | repo: context.repo.repo, 67 | issue_number: issue.number, 68 | state: 'closed' 69 | }); 70 | 71 | console.log(`Closed issue #${issue.number}: ${issue.title}`); 72 | } 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /docs/FAQ.md: -------------------------------------------------------------------------------- 1 | # ❓ Frequently Asked Questions 2 | 3 | ## General Questions 4 | 5 | ### What is Nano Banana Pro? 6 | 7 | Nano Banana Pro is Google's latest multimodal AI model capable of generating high-quality images from text prompts. It features advanced understanding of composition, lighting, and artistic styles. 8 | 9 | ### What is this repository? 10 | 11 | This is a curated collection of creative prompts for Nano Banana Pro, automatically synced with our CMS and featuring a beautiful web gallery at [youmind.com/nano-banana-pro-prompts](https://youmind.com/nano-banana-pro-prompts). 12 | 13 | ## Contributing 14 | 15 | ### How do I submit a prompt? 16 | 17 | Use our [GitHub Issue template](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=submit-prompt.yml) to submit your prompt. Fill in all required fields and wait for team review. 18 | 19 | ### Can I submit via Pull Request? 20 | 21 | No, we only accept submissions via GitHub Issues to ensure quality control and consistent formatting. 22 | 23 | ### How long does review take? 24 | 25 | We review submissions within 48 hours. If approved, your prompt will automatically appear in the README within 4 hours. 26 | 27 | ### Can I submit prompts in languages other than English? 28 | 29 | Yes! We support multiple languages including Chinese, Japanese, Spanish, French, German, and more. 30 | 31 | ### What image formats are accepted? 32 | 33 | We accept JPEG, PNG, and WebP formats. Images should be at least 512px wide and under 5MB. 34 | 35 | ## Technical 36 | 37 | ### How often is the README updated? 38 | 39 | The README is automatically updated every 4 hours via GitHub Actions. 40 | 41 | ### Where are the images stored? 42 | 43 | Images are uploaded to our CMS and served from there. We don't store large images in the Git repository. 44 | 45 | ### Can I use these prompts commercially? 46 | 47 | All content is licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which allows commercial use with proper attribution. 48 | 49 | ### How is this different from other awesome lists? 50 | 51 | We feature: 52 | - ✅ Automatic updates every 4 hours 53 | - ✅ Beautiful web gallery with search 54 | - ✅ Multi-language support (17 languages) 55 | - ✅ CMS-backed content management 56 | - ✅ Quality-controlled submissions 57 | 58 | ## Troubleshooting 59 | 60 | ### My prompt was rejected. Why? 61 | 62 | Common reasons for rejection: 63 | - Low-quality or blurry images 64 | - Missing required information 65 | - Plagiarized content 66 | - NSFW or harmful content 67 | - Spam or promotional material 68 | 69 | ### I found a bug. How do I report it? 70 | 71 | Use our [Bug Report template](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml). 72 | 73 | ### How do I contact the team? 74 | 75 | - 📧 Email: [contact@youmind.ai](mailto:contact@youmind.ai) 76 | - 💬 [GitHub Discussions](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/discussions) 77 | - 🐛 [GitHub Issues](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues) 78 | 79 | --- 80 | 81 | Don't see your question? Ask in [GitHub Discussions](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/discussions)! 82 | -------------------------------------------------------------------------------- /docs/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 🤝 Contributing to Awesome Nano Banana Pro Prompts 2 | 3 | Thank you for your interest in contributing! This guide will help you submit your prompts. 4 | 5 | 6 | ## 📋 Table of Contents 7 | 8 | - [Ways to Contribute](#ways-to-contribute) 9 | - [Submission Guidelines](#submission-guidelines) 10 | - [Quality Standards](#quality-standards) 11 | - [License Agreement](#license-agreement) 12 | 13 | ## 🚀 How to Contribute 14 | 15 | ### GitHub Issue 16 | 17 | We only accept contributions via GitHub Issues to ensure quality control and consistent formatting. 18 | 19 | 1. Click [**Submit New Prompt**](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=submit-prompt.yml) 20 | 2. Fill in the form with all required information 21 | 3. Submit your issue 22 | 4. Team reviews within 48 hours 23 | 5. If approved (we add `approved` label), it automatically syncs to CMS 24 | 6. Your prompt appears in README within 4 hours 25 | 26 | **Why Issues only?** 27 | - ✅ Consistent formatting 28 | - ✅ Better quality control 29 | - ✅ Automated processing 30 | - ✅ Lower barrier to entry 31 | 32 | ## 📝 Submission Guidelines 33 | 34 | ### Required Information 35 | 36 | - **Title**: Clear, descriptive (max 80 characters) 37 | - **Prompt**: The full prompt text 38 | - **Description**: What it does, when to use it 39 | - **Images**: One or multiple high-quality results (one URL per line) 40 | - **Author**: Original creator's name and link 41 | - **Source**: Link to original post/tweet 42 | - **Language**: Prompt's language (supports 17 languages) 43 | 44 | ### Image Requirements 45 | 46 | - ✅ **Multiple images supported**: Add one URL per line 47 | - ✅ Minimum width: 512px 48 | - ✅ Recommended: 1024px - 2048px 49 | - ✅ Formats: JPEG, PNG, WebP 50 | - ✅ File size: < 5MB per image 51 | - ✅ No watermarks (except original author's) 52 | 53 | ### Supported Languages 54 | 55 | English, Chinese (简体中文), Traditional Chinese (繁體中文), Japanese (日本語), Korean (한국어), Thai (ไทย), Vietnamese (Tiếng Việt), Hindi (हिन्दी), Spanish (Español), Latin American Spanish (Español Latinoamérica), German (Deutsch), French (Français), Italian (Italiano), Brazilian Portuguese (Português do Brasil), European Portuguese (Português), Turkish (Türkçe) 56 | 57 | ### Quality Standards 58 | 59 | We accept prompts that are: 60 | 61 | - ✅ **Original** or properly attributed 62 | - ✅ **High-quality** results 63 | - ✅ **Clear** and reproducible 64 | - ✅ **Creative** and inspiring 65 | - ✅ **Safe for work** 66 | 67 | We reject: 68 | 69 | - ❌ Low-quality or blurry images 70 | - ❌ Plagiarized content 71 | - ❌ NSFW content 72 | - ❌ Harmful or offensive material 73 | - ❌ Spam or promotional content 74 | 75 | ## 📜 License Agreement 76 | 77 | By contributing, you agree to: 78 | 79 | 1. **License**: Your contribution will be licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 80 | 2. **Attribution**: Proper credit will be given to original authors 81 | 3. **Rights**: You confirm you have the right to submit this content 82 | 83 | ## 🔄 Review Process 84 | 85 | 1. **Submission** → User creates GitHub Issue 86 | 2. **Review** → Team checks quality (within 48h) 87 | 3. **Approval** → Team adds `approved` label 88 | 4. **Auto-sync** → Workflow triggers, creates prompt in CMS 89 | 5. **README Update** → Appears in README (next 4h update) 90 | 91 | ## ❓ Questions? 92 | 93 | - 📧 Email: [contact@youmind.ai](mailto:contact@youmind.ai) 94 | - 💬 Discussions: [GitHub Discussions](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/discussions) 95 | - 🐛 Issues: [Report a problem](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues) 96 | 97 | --- 98 | 99 | Thank you for helping make this the best Nano Banana Pro resource! 🙏 100 | -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yml: -------------------------------------------------------------------------------- 1 | name: Sync Labels 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | paths: 9 | - '.github/labels.yml' 10 | 11 | permissions: 12 | issues: write 13 | 14 | jobs: 15 | sync-labels: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Sync labels 22 | uses: actions/github-script@v7 23 | with: 24 | script: | 25 | const fs = require('fs'); 26 | 27 | // Read labels.yml file 28 | const labelsFile = fs.readFileSync('.github/labels.yml', 'utf8'); 29 | 30 | // Simple YAML parsing for array format 31 | const lines = labelsFile.split('\n'); 32 | const labels = []; 33 | let currentLabel = null; 34 | 35 | for (const line of lines) { 36 | const trimmed = line.trim(); 37 | if (trimmed.startsWith('- name:')) { 38 | if (currentLabel) labels.push(currentLabel); 39 | const nameMatch = trimmed.match(/- name:\s*(.+)/); 40 | if (nameMatch) { 41 | currentLabel = { 42 | name: nameMatch[1].trim().replace(/^['"]|['"]$/g, ''), 43 | color: '', 44 | description: '' 45 | }; 46 | } 47 | } else if (trimmed.startsWith('color:')) { 48 | if (currentLabel) { 49 | const colorMatch = trimmed.match(/color:\s*(.+)/); 50 | if (colorMatch) { 51 | currentLabel.color = colorMatch[1].trim().replace(/^['"]|['"]$/g, ''); 52 | } 53 | } 54 | } else if (trimmed.startsWith('description:')) { 55 | if (currentLabel) { 56 | const descMatch = trimmed.match(/description:\s*(.+)/); 57 | if (descMatch) { 58 | currentLabel.description = descMatch[1].trim().replace(/^['"]|['"]$/g, ''); 59 | } 60 | } 61 | } 62 | } 63 | if (currentLabel) labels.push(currentLabel); 64 | 65 | // Get existing labels 66 | const existingLabels = await github.rest.issues.listLabelsForRepo({ 67 | owner: context.repo.owner, 68 | repo: context.repo.repo, 69 | }); 70 | 71 | const existingLabelNames = new Set(existingLabels.data.map(label => label.name)); 72 | 73 | // Sync labels 74 | for (const label of labels) { 75 | const labelName = label.name; 76 | const labelColor = label.color.replace('#', ''); 77 | const labelDescription = label.description || ''; 78 | 79 | try { 80 | if (existingLabelNames.has(labelName)) { 81 | // Update existing label 82 | await github.rest.issues.updateLabel({ 83 | owner: context.repo.owner, 84 | repo: context.repo.repo, 85 | name: labelName, 86 | color: labelColor, 87 | description: labelDescription, 88 | }); 89 | console.log(`Updated label: ${labelName}`); 90 | } else { 91 | // Create new label 92 | await github.rest.issues.createLabel({ 93 | owner: context.repo.owner, 94 | repo: context.repo.repo, 95 | name: labelName, 96 | color: labelColor, 97 | description: labelDescription, 98 | }); 99 | console.log(`Created label: ${labelName}`); 100 | } 101 | } catch (error) { 102 | console.error(`Error syncing label ${labelName}:`, error.message); 103 | } 104 | } 105 | 106 | console.log('Labels sync completed!'); 107 | 108 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/submit-prompt.yml: -------------------------------------------------------------------------------- 1 | name: 🍌 Submit a Prompt 2 | description: Share your creative Nano Banana Pro prompt 3 | title: "[Prompt] " 4 | labels: ["prompt-submission"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## 🎨 Submit Your Prompt 10 | 11 | Thank you for contributing! Please fill in the details below. 12 | 13 | ### ⚠️ Important Notice 14 | 15 | All prompts in this repository are collected from the community and shared for educational purposes. If you believe any content infringes on your copyright or intellectual property rights, please [open an issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) and we will remove it promptly. 16 | 17 | By submitting this prompt, you confirm that: 18 | - You have the right to share this content 19 | - You agree to license it under CC BY 4.0 20 | - You properly attribute the original author 21 | 22 | - type: input 23 | id: title 24 | attributes: 25 | label: Prompt Title 26 | description: A short, descriptive title (max 80 chars) 27 | placeholder: "e.g., Watercolor Bar Chart with Flag-Themed Bars" 28 | validations: 29 | required: true 30 | 31 | - type: textarea 32 | id: prompt 33 | attributes: 34 | label: Prompt 35 | description: The full prompt text 36 | placeholder: "Paste your prompt here..." 37 | validations: 38 | required: true 39 | 40 | - type: textarea 41 | id: description 42 | attributes: 43 | label: Description 44 | description: Explain what this prompt does and when to use it 45 | placeholder: "This prompt generates..." 46 | validations: 47 | required: true 48 | 49 | - type: dropdown 50 | id: need_reference_images 51 | attributes: 52 | label: Need Reference Images 53 | description: Does this prompt require user to input images? 54 | options: 55 | - "false" 56 | - "true" 57 | validations: 58 | required: false 59 | 60 | - type: textarea 61 | id: image_urls 62 | attributes: 63 | label: Generated Image URLs 64 | description: One URL per line (supports multiple images) 65 | placeholder: | 66 | https://example.com/image1.jpg 67 | https://example.com/image2.jpg 68 | https://example.com/image3.jpg 69 | validations: 70 | required: true 71 | 72 | - type: input 73 | id: author_name 74 | attributes: 75 | label: Original Author 76 | description: Author's name or nickname 77 | placeholder: "e.g., Jared Liu" 78 | validations: 79 | required: true 80 | 81 | - type: input 82 | id: author_link 83 | attributes: 84 | label: Author Profile Link 85 | description: Link to author's profile (e.g., Twitter, personal site, etc.) 86 | placeholder: "e.g., https://x.com/username or https://example.com" 87 | 88 | - type: input 89 | id: source_link 90 | attributes: 91 | label: Source Link 92 | description: Original post/tweet URL 93 | placeholder: "https://x.com/username/status/..." 94 | 95 | - type: dropdown 96 | id: language 97 | attributes: 98 | label: Prompt Language 99 | description: What language is the prompt in? 100 | options: 101 | - English 102 | - Chinese (中文) 103 | - Traditional Chinese (繁體中文) 104 | - Japanese (日本語) 105 | - Korean (한국어) 106 | - Thai (ไทย) 107 | - Vietnamese (Tiếng Việt) 108 | - Hindi (हिन्दी) 109 | - Spanish (Español) 110 | - Latin American Spanish (Español Latinoamérica) 111 | - German (Deutsch) 112 | - French (Français) 113 | - Italian (Italiano) 114 | - Brazilian Portuguese (Português do Brasil) 115 | - European Portuguese (Português) 116 | - Turkish (Türkçe) 117 | validations: 118 | required: true 119 | 120 | - type: checkboxes 121 | id: terms 122 | attributes: 123 | label: License Agreement 124 | description: By submitting, you agree to license your contribution under CC BY 4.0 125 | options: 126 | - label: I confirm I have the right to submit this content 127 | required: true 128 | - label: I agree to license it under CC BY 4.0 129 | required: true 130 | -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # 🛠️ Local Development Guide 2 | 3 | ## 📦 Prerequisites 4 | 5 | - Node.js 20+ 6 | - pnpm (recommended) or npm 7 | - Access to Payload CMS instance 8 | 9 | ## 🚀 Quick Start 10 | 11 | ### 1. Install Dependencies 12 | 13 | ```bash 14 | pnpm install 15 | # or 16 | npm install 17 | ``` 18 | 19 | ### 2. Configure Environment Variables 20 | 21 | Copy the example file and fill in your credentials: 22 | 23 | ```bash 24 | cp .env.example .env 25 | ``` 26 | 27 | Edit `.env` and add your CMS credentials: 28 | 29 | ```env 30 | # Required for all scripts 31 | CMS_HOST=https://your-cms-host.com 32 | CMS_API_KEY=your-api-key-here 33 | ``` 34 | 35 | ### 3. Test README Generation 36 | 37 | ```bash 38 | pnpm run generate 39 | # or 40 | npm run generate 41 | ``` 42 | 43 | This will: 44 | - ✅ Load environment variables from `.env` automatically 45 | - ✅ Fetch prompts from your CMS 46 | - ✅ Generate `README.md` in the root directory 47 | 48 | ## 🧪 Testing Issue Sync (Optional) 49 | 50 | If you want to test the Issue-to-CMS sync script locally: 51 | 52 | ### 1. Add GitHub Configuration to `.env` 53 | 54 | ```env 55 | # Optional - only for testing sync script 56 | GITHUB_TOKEN=ghp_your_personal_access_token 57 | GITHUB_REPOSITORY=YouMind-OpenLab/awesome-nano-banana-pro-prompts 58 | ISSUE_NUMBER=123 59 | ISSUE_BODY="### Prompt Title 60 | My Awesome Prompt 61 | 62 | ### Prompt 63 | Create a beautiful sunset... 64 | 65 | ### Description 66 | This prompt generates stunning sunset images... 67 | " 68 | ``` 69 | 70 | ### 2. Get GitHub Personal Access Token 71 | 72 | 1. Go to [GitHub Settings → Tokens](https://github.com/settings/tokens) 73 | 2. Click "Generate new token (classic)" 74 | 3. Select scopes: `repo` (full control) 75 | 4. Copy the token to `.env` 76 | 77 | ### 3. Run Sync Script 78 | 79 | ```bash 80 | pnpm run sync 81 | # or 82 | npm run sync 83 | ``` 84 | 85 | ## 📝 Available Scripts 86 | 87 | | Script | Command | Description | 88 | |--------|---------|-------------| 89 | | Generate README | `pnpm run generate` | Fetch prompts and generate README.md | 90 | | Sync Issue to CMS | `pnpm run sync` | Parse issue and sync to CMS (local testing) | 91 | 92 | ## 🔧 How dotenv Works 93 | 94 | Both scripts now automatically load `.env` via: 95 | 96 | ```typescript 97 | import 'dotenv/config'; 98 | ``` 99 | 100 | This happens **before** any code runs, so `process.env.CMS_HOST` is available immediately. 101 | 102 | ### Environment Variable Priority 103 | 104 | 1. **System environment variables** (highest priority) 105 | 2. **`.env` file** (loaded by dotenv) 106 | 3. **Default values** (in code, if any) 107 | 108 | Example: 109 | ```bash 110 | # This overrides .env for this command only 111 | CMS_HOST=https://staging.cms.com pnpm run generate 112 | ``` 113 | 114 | ## 🔐 Security Best Practices 115 | 116 | ### ✅ DO 117 | - Keep `.env` in `.gitignore` (already configured) 118 | - Use `.env.example` for documentation 119 | - Store production secrets in GitHub Secrets 120 | - Use different API keys for local/production 121 | 122 | ### ❌ DON'T 123 | - Commit `.env` to git 124 | - Share your `.env` file 125 | - Use production credentials locally 126 | - Hardcode credentials in code 127 | 128 | ## 🐛 Troubleshooting 129 | 130 | ### Error: "CMS API error: 401" 131 | - Check `CMS_API_KEY` is correct 132 | - Verify API key has required permissions 133 | - Ensure CMS_HOST doesn't have trailing slash 134 | 135 | ### Error: "ISSUE_NUMBER not provided" 136 | - Only needed for `pnpm run sync` 137 | - Add `ISSUE_NUMBER=123` to `.env` 138 | - Or run: `ISSUE_NUMBER=123 pnpm run sync` 139 | 140 | ### Error: "Failed to fetch image" 141 | - Check image URL is publicly accessible 142 | - Verify CMS media upload endpoint is working 143 | - Try uploading manually to CMS first 144 | 145 | ## 📚 Project Structure 146 | 147 | ``` 148 | . 149 | ├── .env # Your local config (not in git) 150 | ├── .env.example # Template for .env 151 | ├── scripts/ 152 | │ ├── generate-readme.ts # Loads dotenv, generates README 153 | │ ├── sync-approved-to-cms.ts # Loads dotenv, syncs issues 154 | │ └── utils/ # Utility modules 155 | └── README.md # Auto-generated (don't edit) 156 | ``` 157 | 158 | ## 🎯 Workflow 159 | 160 | ### Local Development 161 | ``` 162 | Edit .env → Run script → Test locally 163 | ``` 164 | 165 | ### Production (GitHub Actions) 166 | ``` 167 | Push code → Actions run → Secrets injected → Scripts run 168 | ``` 169 | 170 | ## 💡 Tips 171 | 172 | 1. **Use different CMS instances** 173 | - Local: `CMS_HOST=http://localhost:3000` 174 | - Staging: `CMS_HOST=https://staging.cms.com` 175 | - Production: Set in GitHub Secrets 176 | 177 | 2. **Test with dummy data** 178 | - Create a test prompt in CMS 179 | - Mark it as featured 180 | - Run `pnpm run generate` 181 | - Check README output 182 | 183 | 3. **Debug mode** 184 | - Add console.logs to scripts 185 | - Use TypeScript debugger 186 | - Check CMS API responses 187 | 188 | ## 🆘 Need Help? 189 | 190 | - 📖 Check [README_SETUP.md](../README_SETUP.md) 191 | - 🏗️ Review [PROJECT_OVERVIEW.md](../PROJECT_OVERVIEW.md) 192 | - 🐛 Report issues on GitHub 193 | - 💬 Ask in Discussions 194 | 195 | --- 196 | 197 | Happy coding! 🚀 198 | -------------------------------------------------------------------------------- /scripts/sync-approved-to-cms.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import { Octokit } from '@octokit/rest'; 3 | import { createPrompt, findPromptByGitHubIssue, updatePrompt, type Prompt } from './utils/cms-client.js'; 4 | import { uploadImageToCMS } from './utils/image-uploader.js'; 5 | import type { Media } from './utils/cms-client.js'; 6 | 7 | const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); 8 | 9 | interface IssueFields { 10 | prompt_title?: string; 11 | prompt?: string; 12 | need_reference_images?: string; // Boolean field, value from dropdown is string "true" or "false" 13 | need_reference_images_?: string; // Field name converted from "Need Reference Images" label 14 | description?: string; 15 | image_urls?: string; 16 | generated_image_urls?: string; // Field name converted from "Generated Image URLs" label 17 | author_name?: string; 18 | original_author?: string; // Field name converted from "Original Author" label 19 | author_link?: string; 20 | author_profile_link?: string; // Field name converted from "Author Profile Link" label 21 | source_link?: string; 22 | language?: string; 23 | prompt_language?: string; // Field name converted from "Prompt Language" label 24 | } 25 | 26 | // Field name mapping: maps label-converted field names to actual field IDs 27 | const FIELD_NAME_MAP: Record = { 28 | 'generated_image_urls': 'image_urls', 29 | 'original_author': 'author_name', 30 | 'author_profile_link': 'author_link', 31 | 'prompt_language': 'language', 32 | 'need_reference_images_': 'need_reference_images', // Converted from "Need Reference Images" label 33 | }; 34 | 35 | // Language name to language code mapping 36 | const LANGUAGE_MAP: Record = { 37 | 'English': 'en', 38 | 'Chinese (中文)': 'zh', 39 | 'Traditional Chinese (繁體中文)': 'zh-TW', 40 | 'Japanese (日本語)': 'ja-JP', 41 | 'Korean (한국어)': 'ko-KR', 42 | 'Thai (ไทย)': 'th-TH', 43 | 'Vietnamese (Tiếng Việt)': 'vi-VN', 44 | 'Hindi (हिन्दी)': 'hi-IN', 45 | 'Spanish (Español)': 'es-ES', 46 | 'Latin American Spanish (Español Latinoamérica)': 'es-419', 47 | 'German (Deutsch)': 'de-DE', 48 | 'French (Français)': 'fr-FR', 49 | 'Italian (Italiano)': 'it-IT', 50 | 'Brazilian Portuguese (Português do Brasil)': 'pt-BR', 51 | 'European Portuguese (Português)': 'pt-PT', 52 | 'Turkish (Türkçe)': 'tr-TR', 53 | }; 54 | 55 | function parseLanguage(languageName: string): string { 56 | return LANGUAGE_MAP[languageName] || 'en'; 57 | } 58 | 59 | /** 60 | * Clean field value: remove "_No response_" placeholder, return undefined if field is empty or invalid 61 | */ 62 | function cleanFieldValue(value: string | undefined): string | undefined { 63 | if (!value) return undefined; 64 | const trimmed = value.trim(); 65 | if (trimmed.length === 0 || trimmed === '_No response_') { 66 | return undefined; 67 | } 68 | return trimmed; 69 | } 70 | 71 | async function parseIssue(issueBody: string): Promise { 72 | const fields: Record = {}; 73 | const lines = issueBody.split('\n'); 74 | 75 | let currentField: string | null = null; 76 | let currentValue: string[] = []; 77 | 78 | for (const line of lines) { 79 | if (line.startsWith('### ')) { 80 | if (currentField) { 81 | fields[currentField] = currentValue.join('\n').trim(); 82 | } 83 | currentField = line.replace('### ', '').toLowerCase().replace(/\s+/g, '_'); 84 | currentValue = []; 85 | } else if (currentField) { 86 | currentValue.push(line); 87 | } 88 | } 89 | 90 | if (currentField) { 91 | fields[currentField] = currentValue.join('\n').trim(); 92 | } 93 | 94 | // Apply field name mapping: map label-converted field names to actual field IDs 95 | const mappedFields: IssueFields = {}; 96 | for (const [key, value] of Object.entries(fields)) { 97 | const mappedKey = FIELD_NAME_MAP[key] || key; 98 | // Clean field value: unified handling of "_No response_" and empty values 99 | const cleanedValue = cleanFieldValue(value); 100 | 101 | // If mapped field already exists, merge values (prefer mapped field) 102 | if (mappedFields[mappedKey as keyof IssueFields] && mappedKey !== key) { 103 | mappedFields[mappedKey as keyof IssueFields] = cleanedValue || mappedFields[mappedKey as keyof IssueFields]; 104 | } else { 105 | mappedFields[mappedKey as keyof IssueFields] = cleanedValue; 106 | } 107 | // Also keep original field name (for compatibility) 108 | if (key !== mappedKey) { 109 | mappedFields[key as keyof IssueFields] = cleanedValue; 110 | } 111 | } 112 | 113 | return mappedFields; 114 | } 115 | 116 | async function main() { 117 | try { 118 | const issueNumber = process.env.ISSUE_NUMBER; 119 | const issueBody = process.env.ISSUE_BODY || ''; 120 | 121 | if (!issueNumber) { 122 | throw new Error('ISSUE_NUMBER not provided'); 123 | } 124 | 125 | // Get issue information to check labels 126 | const issue = await octokit.issues.get({ 127 | owner: process.env.GITHUB_REPOSITORY?.split('/')[0] || '', 128 | repo: process.env.GITHUB_REPOSITORY?.split('/')[1] || '', 129 | issue_number: parseInt(issueNumber), 130 | }); 131 | 132 | // Check if issue has prompt-submission label 133 | const hasPromptSubmissionLabel = issue.data.labels.some( 134 | (label) => { 135 | const labelName = typeof label === 'string' ? label : label.name; 136 | return labelName === 'prompt-submission'; 137 | } 138 | ); 139 | 140 | if (!hasPromptSubmissionLabel) { 141 | console.log('⏭️ Skipping: Issue does not have "prompt-submission" label'); 142 | process.exit(0); 143 | } 144 | 145 | console.log(`📋 Processing approved issue #${issueNumber}...`); 146 | 147 | const fields = await parseIssue(issueBody); 148 | 149 | // Debug: print parsed fields 150 | console.log('📝 Parsed fields:', Object.keys(fields)); 151 | console.log('📝 Field values:', JSON.stringify(fields, null, 2)); 152 | 153 | // Parse multiple image URLs (one per line) 154 | const imageUrlsText = fields.image_urls || ''; 155 | const originalImageUrls = imageUrlsText 156 | .split('\n') 157 | .map((url: string) => url.trim()) 158 | .filter((url: string) => url.length > 0 && url.startsWith('http')); 159 | 160 | console.log(`📸 Uploading ${originalImageUrls.length} image(s) to CMS...`); 161 | const uploadedMediaIds: number[] = []; 162 | for (const url of originalImageUrls) { 163 | try { 164 | const media = await uploadImageToCMS(url); 165 | uploadedMediaIds.push(media.id); 166 | } catch (error) { 167 | console.error(`Failed to upload image ${url}:`, error); 168 | // Continue with other images even if one fails 169 | } 170 | } 171 | 172 | // Check if issue record already exists in CMS 173 | const existingPrompt = await findPromptByGitHubIssue(issueNumber); 174 | 175 | // Build author object, only include link if it has a value 176 | const author: { name: string; link?: string } = { 177 | name: fields.author_name || '', 178 | }; 179 | if (fields.author_link) { 180 | author.link = fields.author_link; 181 | } 182 | 183 | // Build promptData, field values have been cleaned in parseIssue 184 | // sourceMedia: original URLs from user input 185 | // media: relation field storing media document IDs 186 | const promptData: Partial = { 187 | model: 'nano-banana-pro', 188 | title: fields.prompt_title || '', 189 | content: fields.prompt || '', 190 | description: fields.description || '', 191 | sourceMedia: originalImageUrls, // Original URLs from user input 192 | author, 193 | language: parseLanguage(fields.language || fields.prompt_language || 'English'), 194 | sourcePublishedAt: issue.data.created_at, 195 | sourceMeta: { 196 | github_issue: issueNumber, 197 | }, 198 | }; 199 | 200 | // Add uploaded media IDs to media field (relation field) 201 | if (uploadedMediaIds.length > 0) { 202 | // CMS expects relation field to be array of IDs 203 | promptData.media = uploadedMediaIds as any; 204 | } 205 | 206 | // Only include source_link if it has a value (already cleaned in parseIssue) 207 | if (fields.source_link) { 208 | promptData.sourceLink = fields.source_link; 209 | } 210 | 211 | // Process need_reference_images field: convert string "true"/"false" to boolean 212 | if (fields.need_reference_images) { 213 | promptData.needReferenceImages = fields.need_reference_images.toLowerCase() === 'true'; 214 | } 215 | 216 | let prompt: Prompt | null; 217 | if (existingPrompt) { 218 | console.log(`🔄 Updating existing prompt in CMS (ID: ${existingPrompt.id})...`); 219 | prompt = await updatePrompt(existingPrompt.id, promptData); 220 | console.log(`✅ Updated prompt in CMS: ${prompt?.id}`); 221 | } else { 222 | console.log('📝 Creating new prompt in CMS (no draft)...'); 223 | prompt = await createPrompt(promptData); 224 | console.log(`✅ Created prompt in CMS: ${prompt?.id}`); 225 | } 226 | 227 | // Close the issue if it's still open 228 | if (issue.data.state === 'open') { 229 | await octokit.issues.update({ 230 | owner: process.env.GITHUB_REPOSITORY?.split('/')[0] || '', 231 | repo: process.env.GITHUB_REPOSITORY?.split('/')[1] || '', 232 | issue_number: parseInt(issueNumber), 233 | state: 'closed', 234 | }); 235 | console.log(`✅ Closed issue #${issueNumber}`); 236 | } else { 237 | console.log(`ℹ️ Issue #${issueNumber} is already closed`); 238 | } 239 | 240 | } catch (error) { 241 | console.error('❌ Error syncing approved issue:', error); 242 | process.exit(1); 243 | } 244 | } 245 | 246 | main(); 247 | -------------------------------------------------------------------------------- /scripts/utils/cms-client.ts: -------------------------------------------------------------------------------- 1 | import fetch from "node-fetch"; 2 | import { stringify } from "qs-esm"; 3 | 4 | const CMS_HOST = process.env.CMS_HOST; 5 | const CMS_API_KEY = process.env.CMS_API_KEY; 6 | 7 | export interface Media { 8 | id: number; 9 | alt?: string | null; 10 | caption?: { 11 | root: { 12 | type: string; 13 | children: { 14 | type: any; 15 | version: number; 16 | [k: string]: unknown; 17 | }[]; 18 | direction: ("ltr" | "rtl") | null; 19 | format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; 20 | indent: number; 21 | version: number; 22 | }; 23 | [k: string]: unknown; 24 | } | null; 25 | updatedAt: string; 26 | createdAt: string; 27 | url?: string | null; 28 | thumbnailURL?: string | null; 29 | filename?: string | null; 30 | mimeType?: string | null; 31 | filesize?: number | null; 32 | width?: number | null; 33 | height?: number | null; 34 | focalX?: number | null; 35 | focalY?: number | null; 36 | sizes?: { 37 | tiny?: { 38 | url?: string | null; 39 | width?: number | null; 40 | height?: number | null; 41 | mimeType?: string | null; 42 | filesize?: number | null; 43 | filename?: string | null; 44 | }; 45 | thumbnail?: { 46 | url?: string | null; 47 | width?: number | null; 48 | height?: number | null; 49 | mimeType?: string | null; 50 | filesize?: number | null; 51 | filename?: string | null; 52 | }; 53 | square?: { 54 | url?: string | null; 55 | width?: number | null; 56 | height?: number | null; 57 | mimeType?: string | null; 58 | filesize?: number | null; 59 | filename?: string | null; 60 | }; 61 | small?: { 62 | url?: string | null; 63 | width?: number | null; 64 | height?: number | null; 65 | mimeType?: string | null; 66 | filesize?: number | null; 67 | filename?: string | null; 68 | }; 69 | medium?: { 70 | url?: string | null; 71 | width?: number | null; 72 | height?: number | null; 73 | mimeType?: string | null; 74 | filesize?: number | null; 75 | filename?: string | null; 76 | }; 77 | large?: { 78 | url?: string | null; 79 | width?: number | null; 80 | height?: number | null; 81 | mimeType?: string | null; 82 | filesize?: number | null; 83 | filename?: string | null; 84 | }; 85 | xlarge?: { 86 | url?: string | null; 87 | width?: number | null; 88 | height?: number | null; 89 | mimeType?: string | null; 90 | filesize?: number | null; 91 | filename?: string | null; 92 | }; 93 | og?: { 94 | url?: string | null; 95 | width?: number | null; 96 | height?: number | null; 97 | mimeType?: string | null; 98 | filesize?: number | null; 99 | filename?: string | null; 100 | }; 101 | }; 102 | } 103 | 104 | export interface Prompt { 105 | id: number; 106 | model?: string; 107 | title: string; 108 | description: string; 109 | content: string; 110 | translatedContent?: string; // Translated content for current locale 111 | sourceLink?: string; // Optional source link 112 | sourcePublishedAt: string; 113 | sourceMedia: string[]; 114 | video?: { 115 | url: string; 116 | thumbnail?: string; 117 | }; 118 | media?: Media[]; 119 | author: { 120 | name: string; 121 | link?: string; 122 | }; 123 | language: string; 124 | featured?: boolean; 125 | sort?: number; 126 | needReferenceImages?: boolean; // Whether this prompt requires user to input images 127 | sourceMeta?: Record; 128 | } 129 | 130 | interface CMSResponse { 131 | docs: Prompt[]; 132 | totalDocs: number; 133 | } 134 | 135 | /** 136 | * 获取 prompts 137 | * @param locale 语言版本,默认 en-US 138 | * @returns { docs: Prompt[], total: number } 139 | */ 140 | export async function fetchAllPrompts( 141 | locale: string = "en-US" 142 | ): Promise<{ docs: Prompt[]; total: number }> { 143 | const query = { 144 | limit: 200, 145 | sort: ['-featured', 'sort', '-sourcePublishedAt'].join(','), 146 | depth: 2, 147 | locale, 148 | where: { 149 | model: { 150 | equals: "nano-banana-pro", 151 | }, 152 | }, 153 | }; 154 | 155 | const stringifiedQuery = stringify(query, { addQueryPrefix: true }); 156 | const url = `${CMS_HOST}/api/prompts${stringifiedQuery}`; 157 | 158 | const response = await fetch(url, { 159 | headers: { 160 | Authorization: `users API-Key ${CMS_API_KEY}`, 161 | "Content-Type": "application/json", 162 | }, 163 | }); 164 | 165 | if (!response.ok) { 166 | throw new Error(`CMS API error: ${response.statusText}`); 167 | } 168 | 169 | const data = (await response.json()) as CMSResponse; 170 | 171 | // 过滤:只要有图片的(不需要检查 _status,因为默认都是发布状态) 172 | const docs = data.docs 173 | .map((item) => { 174 | let images: string[] = []; 175 | if (item.media) { 176 | images = item.media.map((m) => m.url || "").filter(Boolean) as string[]; 177 | } else { 178 | if (item.sourceMedia) { 179 | images = item.sourceMedia; 180 | } 181 | if (item.video?.thumbnail) { 182 | images.push(item.video.thumbnail); 183 | } 184 | } 185 | 186 | return { ...item, sourceMedia: images }; 187 | }) 188 | .filter((p) => p.sourceMedia?.length > 0); 189 | 190 | return { docs, total: data.totalDocs }; 191 | } 192 | 193 | /** 194 | * 排序 prompts 195 | * @param prompts prompts 数组 196 | * @param total 可选的总数(用于显示真实总数,而非当前获取的数量) 197 | */ 198 | export function sortPrompts(prompts: Prompt[], total?: number) { 199 | 200 | const featured = prompts.filter((p) => p.featured); 201 | const regular = prompts.filter((p) => !p.featured); 202 | 203 | return { 204 | all: prompts, 205 | featured, 206 | regular, 207 | stats: { 208 | total: total ?? prompts.length, 209 | featured: featured.length, 210 | }, 211 | }; 212 | } 213 | 214 | /** 215 | * 根据 GitHub issue 编号查找已存在的 prompt 216 | */ 217 | export async function findPromptByGitHubIssue( 218 | issueNumber: string 219 | ): Promise { 220 | const query = { 221 | limit: 1, 222 | depth: 2, 223 | where: { 224 | "sourceMeta.github_issue": { 225 | equals: issueNumber, 226 | }, 227 | model: { 228 | equals: "nano-banana-pro", 229 | }, 230 | }, 231 | }; 232 | 233 | const stringifiedQuery = stringify(query, { addQueryPrefix: true }); 234 | const url = `${CMS_HOST}/api/prompts${stringifiedQuery}`; 235 | 236 | const response = await fetch(url, { 237 | headers: { 238 | Authorization: `users API-Key ${CMS_API_KEY}`, 239 | "Content-Type": "application/json", 240 | }, 241 | }); 242 | 243 | if (!response.ok) { 244 | throw new Error(`CMS API error: ${response.statusText}`); 245 | } 246 | 247 | const data = (await response.json()) as CMSResponse; 248 | return data.docs.length > 0 ? data.docs[0] : null; 249 | } 250 | 251 | /** 252 | * 创建新 prompt(直接发布,无草稿) 253 | */ 254 | export async function createPrompt( 255 | data: Partial 256 | ): Promise { 257 | const url = `${CMS_HOST}/api/prompts`; 258 | 259 | const response = await fetch(url, { 260 | method: "POST", 261 | headers: { 262 | Authorization: `users API-Key ${CMS_API_KEY}`, 263 | "Content-Type": "application/json", 264 | }, 265 | body: JSON.stringify(data), 266 | }); 267 | 268 | if (!response.ok) { 269 | const errorText = await response.text(); 270 | throw new Error( 271 | `Failed to create prompt: ${response.statusText} - ${errorText}` 272 | ); 273 | } 274 | 275 | return response.json() as Promise; 276 | } 277 | 278 | /** 279 | * 更新已存在的 prompt 280 | */ 281 | export async function updatePrompt( 282 | id: number, 283 | data: Partial 284 | ): Promise { 285 | const url = `${CMS_HOST}/api/prompts/${id}`; 286 | 287 | const response = await fetch(url, { 288 | method: "PATCH", 289 | headers: { 290 | Authorization: `users API-Key ${CMS_API_KEY}`, 291 | "Content-Type": "application/json", 292 | }, 293 | body: JSON.stringify(data), 294 | }); 295 | 296 | if (!response.ok) { 297 | const errorText = await response.text(); 298 | throw new Error( 299 | `Failed to update prompt: ${response.statusText} - ${errorText}` 300 | ); 301 | } 302 | 303 | return response.json() as Promise; 304 | } 305 | 306 | /** 307 | * Category from CMS 308 | */ 309 | export interface CMSPromptCategory { 310 | id: number; 311 | title: string; 312 | slug: string; 313 | parent?: CMSPromptCategory | null; 314 | featured?: boolean; 315 | sort?: number; 316 | } 317 | 318 | /** 319 | * Processed category for filtering 320 | */ 321 | export interface FilterCategory { 322 | id: number; 323 | title: string; 324 | slug: string; 325 | parentId?: number | null; 326 | parentSlug?: string | null; 327 | featured?: boolean; 328 | sort?: number | null; 329 | } 330 | 331 | /** 332 | * Category group organized by parent-child structure 333 | */ 334 | export interface CategoryGroup { 335 | parentId: number | null; 336 | parentTitle: string | null; 337 | parentSlug: string | null; 338 | children: FilterCategory[]; 339 | } 340 | 341 | interface CMSCategoryResponse { 342 | docs: CMSPromptCategory[]; 343 | totalDocs: number; 344 | } 345 | 346 | /** 347 | * Fetch prompt categories from CMS 348 | */ 349 | export async function fetchPromptCategories( 350 | locale: string = "en-US" 351 | ): Promise<{ 352 | allCategories: FilterCategory[]; 353 | featuredCategories: FilterCategory[]; 354 | }> { 355 | const query = { 356 | limit: 9999, 357 | sort: "sort", 358 | locale, 359 | where: { 360 | campaign: { 361 | contains: "nano-banana-pro-prompts", 362 | }, 363 | }, 364 | }; 365 | 366 | const stringifiedQuery = stringify(query, { addQueryPrefix: true }); 367 | const url = `${CMS_HOST}/api/prompt-categories${stringifiedQuery}`; 368 | 369 | const response = await fetch(url, { 370 | headers: { 371 | Authorization: `users API-Key ${CMS_API_KEY}`, 372 | "Content-Type": "application/json", 373 | }, 374 | }); 375 | 376 | if (!response.ok) { 377 | throw new Error(`CMS API error: ${response.statusText}`); 378 | } 379 | 380 | const data = (await response.json()) as CMSCategoryResponse; 381 | 382 | // Transform to FilterCategory format 383 | const allCategories: FilterCategory[] = data.docs.map((cat) => { 384 | let parentId: number | null = null; 385 | let parentSlug: string | null = null; 386 | 387 | if (cat.parent) { 388 | if (typeof cat.parent === "number") { 389 | parentId = cat.parent; 390 | } else if (typeof cat.parent === "object" && cat.parent !== null) { 391 | parentId = cat.parent.id; 392 | parentSlug = cat.parent.slug; 393 | } 394 | } 395 | 396 | return { 397 | id: cat.id, 398 | title: cat.title, 399 | slug: cat.slug, 400 | parentId, 401 | parentSlug, 402 | featured: cat.featured ?? false, 403 | sort: cat.sort, 404 | }; 405 | }); 406 | 407 | // Filter featured categories (leaf nodes with featured=true) 408 | const featuredCategories = allCategories.filter((cat) => { 409 | const isParent = allCategories.some((c) => c.parentId === cat.id); 410 | return cat.featured && !isParent; 411 | }); 412 | 413 | return { 414 | allCategories, 415 | featuredCategories, 416 | }; 417 | } 418 | -------------------------------------------------------------------------------- /scripts/utils/markdown-generator.ts: -------------------------------------------------------------------------------- 1 | import { Prompt, FilterCategory } from './cms-client.js'; 2 | import { t } from './i18n.js'; 3 | 4 | interface SortedPrompts { 5 | all: Prompt[]; 6 | featured: Prompt[]; 7 | regular: Prompt[]; 8 | stats: { 9 | total: number; 10 | featured: number; 11 | }; 12 | categories?: FilterCategory[]; 13 | } 14 | 15 | export interface LanguageConfig { 16 | code: string; 17 | name: string; // Display name 18 | readmeFileName: string; 19 | } 20 | 21 | export const SUPPORTED_LANGUAGES: LanguageConfig[] = [ 22 | { code: 'en', name: 'English', readmeFileName: 'README.md' }, 23 | { code: 'zh', name: '简体中文', readmeFileName: 'README_zh.md' }, 24 | { code: 'zh-TW', name: '繁體中文', readmeFileName: 'README_zh-TW.md' }, 25 | { code: 'ja-JP', name: '日本語', readmeFileName: 'README_ja-JP.md' }, 26 | { code: 'ko-KR', name: '한국어', readmeFileName: 'README_ko-KR.md' }, 27 | { code: 'th-TH', name: 'ไทย', readmeFileName: 'README_th-TH.md' }, 28 | { code: 'vi-VN', name: 'Tiếng Việt', readmeFileName: 'README_vi-VN.md' }, 29 | { code: 'hi-IN', name: 'हिन्दी', readmeFileName: 'README_hi-IN.md' }, 30 | { code: 'es-ES', name: 'Español', readmeFileName: 'README_es-ES.md' }, 31 | { code: 'es-419', name: 'Español (Latinoamérica)', readmeFileName: 'README_es-419.md' }, 32 | { code: 'de-DE', name: 'Deutsch', readmeFileName: 'README_de-DE.md' }, 33 | { code: 'fr-FR', name: 'Français', readmeFileName: 'README_fr-FR.md' }, 34 | { code: 'it-IT', name: 'Italiano', readmeFileName: 'README_it-IT.md' }, 35 | { code: 'pt-BR', name: 'Português (Brasil)', readmeFileName: 'README_pt-BR.md' }, 36 | { code: 'pt-PT', name: 'Português', readmeFileName: 'README_pt-PT.md' }, 37 | { code: 'tr-TR', name: 'Türkçe', readmeFileName: 'README_tr-TR.md' }, 38 | ]; 39 | 40 | const MAX_REGULAR_PROMPTS_TO_DISPLAY = 120; 41 | 42 | /** 43 | * Convert locale to URL language prefix 44 | * en -> en-US, zh -> zh-CN, others remain unchanged 45 | */ 46 | function getLocalePrefix(locale: string): string { 47 | if (locale === 'en') { 48 | return 'en-US'; 49 | } 50 | if (locale === 'zh') { 51 | return 'zh-CN'; 52 | } 53 | // Other language codes (e.g., zh-TW, ja-JP) remain unchanged 54 | return locale; 55 | } 56 | 57 | /** 58 | * 清理提示词内容中的代码块标记 59 | * 移除 ``` 或 ```json 等格式的代码块标记 60 | * 61 | * 处理的情况: 62 | * - ``` 提示词 ``` 63 | * - ```json 提示词 ``` 64 | * - ```python 提示词 ``` 等任意语言标识符 65 | * - 多行内容中的代码块标记 66 | */ 67 | function cleanPromptContent(content: string): string { 68 | if (!content) return content; 69 | 70 | let cleaned = content; 71 | 72 | // 匹配代码块标记:``` 或 ```language(如 ```json, ```python 等) 73 | // 语言标识符可能包含字母、数字、连字符等(如 json, python, typescript) 74 | 75 | // 1. 移除开头的代码块标记 76 | // 匹配:``` + 可选语言标识符 + 可选空白字符 + 可选换行 77 | cleaned = cleaned.replace(/^```[\w-]*\s*\n?/im, ''); 78 | 79 | // 2. 移除结尾的代码块标记 80 | // 匹配:可选换行 + ``` + 可选空白字符 81 | cleaned = cleaned.replace(/\n?```\s*$/im, ''); 82 | 83 | // 3. 移除中间可能存在的代码块标记(处理嵌套或错误格式的情况) 84 | // 匹配:换行 + ``` + 可选语言标识符 + 可选空白 + 换行 85 | cleaned = cleaned.replace(/\n```[\w-]*\s*\n/g, '\n'); 86 | 87 | // 4. 清理首尾空白字符(包括换行) 88 | cleaned = cleaned.trim(); 89 | 90 | return cleaned; 91 | } 92 | 93 | export function generateMarkdown(data: SortedPrompts, locale: string = 'en'): string { 94 | const { featured, regular, stats, categories } = data; 95 | 96 | const displayedRegular = regular.slice(0, MAX_REGULAR_PROMPTS_TO_DISPLAY); 97 | const hiddenCount = regular.length - displayedRegular.length; 98 | 99 | let md = generateHeader(locale); 100 | md += generateLanguageNavigation(locale); 101 | md += generateGalleryCTA(categories || [], locale); 102 | md += generateTOC(locale); 103 | md += generateWhatIs(locale); 104 | md += generateStats(stats, locale); 105 | md += generateFeaturedSection(featured, locale); 106 | md += generateAllPromptsSection(displayedRegular, hiddenCount, locale); 107 | md += generateContribute(locale); 108 | md += generateFooter(locale); 109 | 110 | return md; 111 | } 112 | 113 | function generateHeader(locale: string): string { 114 | return `# 🚀 ${t('title', locale)} 115 | 116 | [![Awesome](https://awesome.re/badge.svg)](https://github.com/sindresorhus/awesome) 117 | [![GitHub stars](https://img.shields.io/github/stars/YouMind-OpenLab/awesome-nano-banana-pro-prompts?style=social)](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts) 118 | [![License: CC BY 4.0](https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/) 119 | [![Update README](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/actions/workflows/update-readme.yml/badge.svg)](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/actions) 120 | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](docs/CONTRIBUTING.md) 121 | 122 | > 🎨 ${t('subtitle', locale)} 123 | 124 | > 💡 **Note**: ${t('gemini3Promo', locale)} 125 | 126 | > ⚠️ ${t('copyright', locale)} 127 | 128 | --- 129 | 130 | `; 131 | } 132 | 133 | function generateLanguageNavigation(currentLocale: string): string { 134 | let md = ''; 135 | 136 | // Sort languages so current one is first or en is first? 137 | // Keeping the array order is usually best, but we want a clean list. 138 | 139 | const badges = SUPPORTED_LANGUAGES.map(lang => { 140 | const isCurrent = lang.code === currentLocale || (currentLocale.startsWith(lang.code) && !SUPPORTED_LANGUAGES.some(l => l.code === currentLocale && l.code !== lang.code)); 141 | // Color logic: green for current, blue for others, or grey? 142 | // Using the style from the image: "Click to View" 143 | 144 | const color = isCurrent ? 'brightgreen' : 'lightgrey'; 145 | const text = isCurrent ? 'Current' : 'Click%20to%20View'; 146 | const link = lang.readmeFileName; 147 | 148 | // If current, maybe no link or link to self? 149 | // Using shields.io badge format: label-message-color 150 | // Label = Native Name, Message = Click to View (or Ver Traducción etc) 151 | 152 | const safeName = encodeURIComponent(lang.name); 153 | 154 | return `[![${lang.name}](https://img.shields.io/badge/${safeName}-${text}-${color})](${link})`; 155 | }); 156 | 157 | md += badges.join(' ') + '\n\n---\n\n'; 158 | return md; 159 | } 160 | 161 | function generateGalleryCTA(categories: FilterCategory[], locale: string): string { 162 | // 根据语言选择图片:zh 和 zh-TW 使用 zh,其他使用 en 163 | const imageLang = locale === 'zh' || locale === 'zh-TW' ? 'zh' : 'en'; 164 | const coverImage = `public/images/nano-banana-pro-prompts-cover-${imageLang}.png`; 165 | const listImage = `public/images/nano-banana-pro-prompts-list-${imageLang}.png`; 166 | 167 | let md = `## 🌐 ${t('viewInGallery', locale)} 168 | 169 |
170 | 171 | ![Cover](${coverImage}) 172 | 173 | ![List](${listImage}) 174 | 175 |
176 | 177 | **[${t('browseGallery', locale)}](https://youmind.com/${getLocalePrefix(locale)}/nano-banana-pro-prompts)** 178 | 179 | ${t('galleryFeatures', locale)} 180 | 181 | | Feature | ${t('githubReadme', locale)} | ${t('youmindGallery', locale)} | 182 | |---------|--------------|---------------------| 183 | | 🎨 ${t('visualLayout', locale)} | ${t('linearList', locale)} | ${t('masonryGrid', locale)} | 184 | | 🔍 ${t('search', locale)} | ${t('ctrlFOnly', locale)} | ${t('fullTextSearch', locale)} | 185 | | 🤖 ${t('aiGenerate', locale)} | - | ${t('aiOneClickGen', locale)} | 186 | | 📱 ${t('mobile', locale)} | ${t('basic', locale)} | ${t('fullyResponsive', locale)} | 187 | | 🏷️ ${t('categories', locale)} | - | ${t('categoryBrowsing', locale)} | 188 | 189 | `; 190 | 191 | // Add categories section if available 192 | if (categories.length > 0) { 193 | md += generateCategoriesSection(categories, locale); 194 | } 195 | 196 | md += `--- 197 | 198 | `; 199 | 200 | return md; 201 | } 202 | 203 | function generateCategoriesSection(categories: FilterCategory[], locale: string): string { 204 | // Get parent categories (no parentId) 205 | const parentCategories = categories.filter(c => c.parentId === null); 206 | 207 | let md = `\n### 🏷️ ${t('browseByCategory', locale)}\n\n`; 208 | 209 | for (const parent of parentCategories) { 210 | // Parent category - no link 211 | md += `- **${parent.title}**\n`; 212 | 213 | // Get children of this parent 214 | const children = categories.filter(c => c.parentId === parent.id); 215 | for (const child of children) { 216 | // Child category - with link 217 | const categoryUrl = `https://youmind.com/${getLocalePrefix(locale)}/nano-banana-pro-prompts?categories=${child.slug}`; 218 | md += ` - [${child.title}](${categoryUrl})\n`; 219 | } 220 | } 221 | 222 | md += `\n`; 223 | return md; 224 | } 225 | 226 | function generatePromptSection(prompt: Prompt, index: number, locale: string): string { 227 | const authorLink = prompt.author.link || '#'; 228 | const publishedDate = new Date(prompt.sourcePublishedAt).toLocaleDateString(locale, { 229 | year: 'numeric', 230 | month: 'long', 231 | day: 'numeric', 232 | }); 233 | 234 | // Use translatedContent if available, otherwise fallback to content 235 | // Clean code block markers (``` or ```json etc.) from the content 236 | const rawContent = prompt.translatedContent || prompt.content; 237 | const promptContent = cleanPromptContent(rawContent); 238 | const hasArguments = promptContent.includes('{argument'); 239 | 240 | let md = `### No. ${index + 1}: ${prompt.title}\n\n`; 241 | 242 | // Language badge 243 | md += `![Language-${prompt.language.toUpperCase()}](https://img.shields.io/badge/Language-${prompt.language.toUpperCase()}-blue)\n`; 244 | 245 | if (prompt.featured) { 246 | md += `![Featured](https://img.shields.io/badge/⭐-Featured-gold)\n`; 247 | } 248 | 249 | if (hasArguments) { 250 | md += `![Raycast](https://img.shields.io/badge/🚀-Raycast_Friendly-purple)\n`; 251 | } 252 | 253 | md += `\n#### 📖 ${t('description', locale)}\n\n${prompt.description}\n\n`; 254 | md += `#### 📝 ${t('prompt', locale)}\n\n\`\`\`\n${promptContent}\n\`\`\`\n\n`; 255 | 256 | if (prompt.sourceMedia && prompt.sourceMedia.length > 0) { 257 | md += `#### 🖼️ ${t('generatedImages', locale)}\n\n`; 258 | 259 | prompt.sourceMedia.forEach((imageUrl, imgIndex) => { 260 | md += `##### Image ${imgIndex + 1}\n\n`; 261 | md += `
\n`; 262 | md += `${prompt.title} - Image ${imgIndex + 1}\n`; 263 | md += `
\n\n`; 264 | }); 265 | } 266 | 267 | md += `#### 📌 ${t('details', locale)}\n\n`; 268 | md += `- **${t('author', locale)}:** [${prompt.author.name}](${authorLink})\n`; 269 | md += `- **${t('source', locale)}:** [Twitter Post](${prompt.sourceLink})\n`; 270 | md += `- **${t('published', locale)}:** ${publishedDate}\n`; 271 | md += `- **${t('languages', locale)}:** ${prompt.language}\n\n`; 272 | 273 | md += `**[${t('tryItNow', locale)}](https://youmind.com/${getLocalePrefix(locale)}/nano-banana-pro-prompts?id=${prompt.id})**\n\n`; 274 | 275 | md += `---\n\n`; 276 | 277 | return md; 278 | } 279 | 280 | function generateFeaturedSection(featured: Prompt[], locale: string): string { 281 | if (featured.length === 0) return ''; 282 | 283 | let md = `## 🔥 ${t('featuredPrompts', locale)}\n\n`; 284 | md += `> ⭐ ${t('handPicked', locale)}\n\n`; 285 | 286 | featured.forEach((prompt, index) => { 287 | md += generatePromptSection(prompt, index, locale); 288 | }); 289 | 290 | return md; 291 | } 292 | 293 | function generateAllPromptsSection(regular: Prompt[], hiddenCount: number, locale: string): string { 294 | if (regular.length === 0 && hiddenCount === 0) return ''; 295 | 296 | let md = `## 📋 ${t('allPrompts', locale)}\n\n`; 297 | md += `> 📝 ${t('sortedByDate', locale)}\n\n`; 298 | 299 | regular.forEach((prompt, index) => { 300 | md += generatePromptSection(prompt, index, locale); 301 | }); 302 | 303 | if (hiddenCount > 0) { 304 | md += `---\n\n`; 305 | md += `## 📚 ${t('morePrompts', locale)}\n\n`; 306 | md += `
\n\n`; 307 | md += `### 🎯 ${hiddenCount} ${t('morePromptsDesc', locale)}\n\n`; 308 | md += `Due to GitHub's content length limitations, we can only display the first ${MAX_REGULAR_PROMPTS_TO_DISPLAY} regular prompts in this README.\n\n`; 309 | md += `**[${t('viewAll', locale)}](https://youmind.com/${getLocalePrefix(locale)}/nano-banana-pro-prompts)**\n\n`; 310 | md += `The gallery features:\n\n`; 311 | md += `${t('galleryFeature1', locale)}\n\n`; 312 | md += `${t('galleryFeature2', locale)}\n\n`; 313 | md += `${t('galleryFeature3', locale)}\n\n`; 314 | md += `${t('galleryFeature4', locale)}\n\n`; 315 | md += `
\n\n`; 316 | md += `---\n\n`; 317 | } 318 | 319 | return md; 320 | } 321 | 322 | function generateStats(stats: { total: number; featured: number }, locale: string): string { 323 | const now = new Date().toLocaleString(locale, { 324 | timeZone: 'UTC', 325 | dateStyle: 'full', 326 | timeStyle: 'long', 327 | }); 328 | 329 | return `## 📊 ${t('stats', locale)} 330 | 331 |
332 | 333 | | ${t('metric', locale)} | ${t('count', locale)} | 334 | |--------|-------| 335 | | 📝 ${t('totalPrompts', locale)} | **${stats.total}** | 336 | | ⭐ ${t('featured', locale)} | **${stats.featured}** | 337 | | 🔄 ${t('lastUpdated', locale)} | **${now}** | 338 | 339 |
340 | 341 | --- 342 | 343 | `; 344 | } 345 | 346 | function generateTOC(locale: string): string { 347 | // Generating anchors is tricky with i18n, but GitHub usually slugifies the headers. 348 | // For now we assume English anchors or standard GitHub behavior. 349 | // Ideally we should use the exact translation for the link text, and the slugified translation for the href. 350 | // But simple manual mapping for now. 351 | 352 | return `## 📖 ${t('toc', locale)} 353 | 354 | - [🌐 ${t('viewInGallery', locale)}](#-view-in-web-gallery) 355 | - [🤔 ${t('whatIs', locale)}](#-what-is-nano-banana-pro) 356 | - [📊 ${t('stats', locale)}](#-statistics) 357 | - [🔥 ${t('featuredPrompts', locale)}](#-featured-prompts) 358 | - [📋 ${t('allPrompts', locale)}](#-all-prompts) 359 | - [🤝 ${t('howToContribute', locale)}](#-how-to-contribute) 360 | - [📄 ${t('license', locale)}](#-license) 361 | - [🙏 ${t('acknowledgements', locale)}](#-acknowledgements) 362 | - [⭐ ${t('starHistory', locale)}](#-star-history) 363 | 364 | --- 365 | 366 | `; 367 | } 368 | 369 | function generateWhatIs(locale: string): string { 370 | return `## 🤔 ${t('whatIs', locale)} 371 | 372 | ${t('whatIsIntro', locale)} 373 | 374 | - 🎯 ${t('multimodalUnderstanding', locale)} 375 | - 🎨 ${t('highQualityGeneration', locale)} 376 | - ⚡ ${t('fastIteration', locale)} 377 | - 🌈 ${t('diverseStyles', locale)} 378 | - 🔧 ${t('preciseControl', locale)} 379 | - 📐 ${t('complexScenes', locale)} 380 | 381 | 📚 ${t('learnMore', locale)} 382 | 383 | ### 🚀 ${t('raycastIntegration', locale)} 384 | 385 | ${t('raycastDescription', locale)} 386 | 387 | **${t('example', locale)}** 388 | \`\`\` 389 | ${t('raycastExample', locale)} 390 | \`\`\` 391 | 392 | ${t('raycastUsage', locale)} 393 | 394 | --- 395 | 396 | `; 397 | } 398 | 399 | function generateContribute(locale: string): string { 400 | return `## 🤝 ${t('howToContribute', locale)} 401 | 402 | ${t('welcomeContributions', locale)} 403 | 404 | ### 🐛 ${t('githubIssue', locale)} 405 | 406 | 1. Click [**${t('submitNewPrompt', locale)}**](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=submit-prompt.yml) 407 | 2. ${t('fillForm', locale)} 408 | 3. ${t('submitWait', locale)} 409 | 4. ${t('approvedSync', locale)} 410 | 5. ${t('appearInReadme', locale)} 411 | 412 | **${t('note', locale)}** ${t('noteContent', locale)} 413 | 414 | ${t('seeContributing', locale)} 415 | 416 | --- 417 | 418 | `; 419 | } 420 | 421 | function generateFooter(locale: string): string { 422 | const timestamp = new Date().toISOString(); 423 | 424 | return `## 📄 ${t('license', locale)} 425 | 426 | ${t('licensedUnder', locale)} 427 | 428 | --- 429 | 430 | ## 🙏 ${t('acknowledgements', locale)} 431 | 432 | - [Payload CMS](https://payloadcms.com/) 433 | - [youmind.com](https://youmind.com) 434 | 435 | --- 436 | 437 | ## ⭐ ${t('starHistory', locale)} 438 | 439 | [![Star History Chart](https://api.star-history.com/svg?repos=YouMind-OpenLab/awesome-nano-banana-pro-prompts&type=Date)](https://star-history.com/#YouMind-OpenLab/awesome-nano-banana-pro-prompts&Date) 440 | 441 | --- 442 | 443 |
444 | 445 | **[🌐 ${t('viewInGallery', locale)}](https://youmind.com/${getLocalePrefix(locale)}/nano-banana-pro-prompts)** • 446 | **[📝 ${t('submitPrompt', locale)}](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=submit-prompt.yml)** • 447 | **[⭐ ${t('starRepo', locale)}](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts)** 448 | 449 | 🤖 ${t('autoGenerated', locale)} ${timestamp} 450 | 451 |
452 | `; 453 | } 454 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | node-fetch: 12 | specifier: ^3.3.2 13 | version: 3.3.2 14 | qs-esm: 15 | specifier: ^7.0.2 16 | version: 7.0.2 17 | devDependencies: 18 | '@octokit/rest': 19 | specifier: ^20.0.2 20 | version: 20.1.2 21 | '@types/node': 22 | specifier: ^20.10.0 23 | version: 20.19.25 24 | dotenv: 25 | specifier: ^17.2.3 26 | version: 17.2.3 27 | tsx: 28 | specifier: ^4.7.0 29 | version: 4.20.6 30 | typescript: 31 | specifier: ^5.3.3 32 | version: 5.9.3 33 | 34 | packages: 35 | 36 | '@esbuild/aix-ppc64@0.25.12': 37 | resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 38 | engines: {node: '>=18'} 39 | cpu: [ppc64] 40 | os: [aix] 41 | 42 | '@esbuild/android-arm64@0.25.12': 43 | resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 44 | engines: {node: '>=18'} 45 | cpu: [arm64] 46 | os: [android] 47 | 48 | '@esbuild/android-arm@0.25.12': 49 | resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 50 | engines: {node: '>=18'} 51 | cpu: [arm] 52 | os: [android] 53 | 54 | '@esbuild/android-x64@0.25.12': 55 | resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 56 | engines: {node: '>=18'} 57 | cpu: [x64] 58 | os: [android] 59 | 60 | '@esbuild/darwin-arm64@0.25.12': 61 | resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 62 | engines: {node: '>=18'} 63 | cpu: [arm64] 64 | os: [darwin] 65 | 66 | '@esbuild/darwin-x64@0.25.12': 67 | resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 68 | engines: {node: '>=18'} 69 | cpu: [x64] 70 | os: [darwin] 71 | 72 | '@esbuild/freebsd-arm64@0.25.12': 73 | resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 74 | engines: {node: '>=18'} 75 | cpu: [arm64] 76 | os: [freebsd] 77 | 78 | '@esbuild/freebsd-x64@0.25.12': 79 | resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 80 | engines: {node: '>=18'} 81 | cpu: [x64] 82 | os: [freebsd] 83 | 84 | '@esbuild/linux-arm64@0.25.12': 85 | resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 86 | engines: {node: '>=18'} 87 | cpu: [arm64] 88 | os: [linux] 89 | 90 | '@esbuild/linux-arm@0.25.12': 91 | resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 92 | engines: {node: '>=18'} 93 | cpu: [arm] 94 | os: [linux] 95 | 96 | '@esbuild/linux-ia32@0.25.12': 97 | resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 98 | engines: {node: '>=18'} 99 | cpu: [ia32] 100 | os: [linux] 101 | 102 | '@esbuild/linux-loong64@0.25.12': 103 | resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 104 | engines: {node: '>=18'} 105 | cpu: [loong64] 106 | os: [linux] 107 | 108 | '@esbuild/linux-mips64el@0.25.12': 109 | resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 110 | engines: {node: '>=18'} 111 | cpu: [mips64el] 112 | os: [linux] 113 | 114 | '@esbuild/linux-ppc64@0.25.12': 115 | resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 116 | engines: {node: '>=18'} 117 | cpu: [ppc64] 118 | os: [linux] 119 | 120 | '@esbuild/linux-riscv64@0.25.12': 121 | resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 122 | engines: {node: '>=18'} 123 | cpu: [riscv64] 124 | os: [linux] 125 | 126 | '@esbuild/linux-s390x@0.25.12': 127 | resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 128 | engines: {node: '>=18'} 129 | cpu: [s390x] 130 | os: [linux] 131 | 132 | '@esbuild/linux-x64@0.25.12': 133 | resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 134 | engines: {node: '>=18'} 135 | cpu: [x64] 136 | os: [linux] 137 | 138 | '@esbuild/netbsd-arm64@0.25.12': 139 | resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 140 | engines: {node: '>=18'} 141 | cpu: [arm64] 142 | os: [netbsd] 143 | 144 | '@esbuild/netbsd-x64@0.25.12': 145 | resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 146 | engines: {node: '>=18'} 147 | cpu: [x64] 148 | os: [netbsd] 149 | 150 | '@esbuild/openbsd-arm64@0.25.12': 151 | resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 152 | engines: {node: '>=18'} 153 | cpu: [arm64] 154 | os: [openbsd] 155 | 156 | '@esbuild/openbsd-x64@0.25.12': 157 | resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 158 | engines: {node: '>=18'} 159 | cpu: [x64] 160 | os: [openbsd] 161 | 162 | '@esbuild/openharmony-arm64@0.25.12': 163 | resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 164 | engines: {node: '>=18'} 165 | cpu: [arm64] 166 | os: [openharmony] 167 | 168 | '@esbuild/sunos-x64@0.25.12': 169 | resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 170 | engines: {node: '>=18'} 171 | cpu: [x64] 172 | os: [sunos] 173 | 174 | '@esbuild/win32-arm64@0.25.12': 175 | resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 176 | engines: {node: '>=18'} 177 | cpu: [arm64] 178 | os: [win32] 179 | 180 | '@esbuild/win32-ia32@0.25.12': 181 | resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 182 | engines: {node: '>=18'} 183 | cpu: [ia32] 184 | os: [win32] 185 | 186 | '@esbuild/win32-x64@0.25.12': 187 | resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 188 | engines: {node: '>=18'} 189 | cpu: [x64] 190 | os: [win32] 191 | 192 | '@octokit/auth-token@4.0.0': 193 | resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} 194 | engines: {node: '>= 18'} 195 | 196 | '@octokit/core@5.2.2': 197 | resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} 198 | engines: {node: '>= 18'} 199 | 200 | '@octokit/endpoint@9.0.6': 201 | resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} 202 | engines: {node: '>= 18'} 203 | 204 | '@octokit/graphql@7.1.1': 205 | resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} 206 | engines: {node: '>= 18'} 207 | 208 | '@octokit/openapi-types@24.2.0': 209 | resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} 210 | 211 | '@octokit/plugin-paginate-rest@11.4.4-cjs.2': 212 | resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} 213 | engines: {node: '>= 18'} 214 | peerDependencies: 215 | '@octokit/core': '5' 216 | 217 | '@octokit/plugin-request-log@4.0.1': 218 | resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} 219 | engines: {node: '>= 18'} 220 | peerDependencies: 221 | '@octokit/core': '5' 222 | 223 | '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': 224 | resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} 225 | engines: {node: '>= 18'} 226 | peerDependencies: 227 | '@octokit/core': ^5 228 | 229 | '@octokit/request-error@5.1.1': 230 | resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} 231 | engines: {node: '>= 18'} 232 | 233 | '@octokit/request@8.4.1': 234 | resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} 235 | engines: {node: '>= 18'} 236 | 237 | '@octokit/rest@20.1.2': 238 | resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} 239 | engines: {node: '>= 18'} 240 | 241 | '@octokit/types@13.10.0': 242 | resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} 243 | 244 | '@types/node@20.19.25': 245 | resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} 246 | 247 | before-after-hook@2.2.3: 248 | resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} 249 | 250 | data-uri-to-buffer@4.0.1: 251 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 252 | engines: {node: '>= 12'} 253 | 254 | deprecation@2.3.1: 255 | resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 256 | 257 | dotenv@17.2.3: 258 | resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} 259 | engines: {node: '>=12'} 260 | 261 | esbuild@0.25.12: 262 | resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 263 | engines: {node: '>=18'} 264 | hasBin: true 265 | 266 | fetch-blob@3.2.0: 267 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 268 | engines: {node: ^12.20 || >= 14.13} 269 | 270 | formdata-polyfill@4.0.10: 271 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 272 | engines: {node: '>=12.20.0'} 273 | 274 | fsevents@2.3.3: 275 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 276 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 277 | os: [darwin] 278 | 279 | get-tsconfig@4.13.0: 280 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 281 | 282 | node-domexception@1.0.0: 283 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 284 | engines: {node: '>=10.5.0'} 285 | deprecated: Use your platform's native DOMException instead 286 | 287 | node-fetch@3.3.2: 288 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 289 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 290 | 291 | once@1.4.0: 292 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 293 | 294 | qs-esm@7.0.2: 295 | resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} 296 | engines: {node: '>=18'} 297 | 298 | resolve-pkg-maps@1.0.0: 299 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 300 | 301 | tsx@4.20.6: 302 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 303 | engines: {node: '>=18.0.0'} 304 | hasBin: true 305 | 306 | typescript@5.9.3: 307 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 308 | engines: {node: '>=14.17'} 309 | hasBin: true 310 | 311 | undici-types@6.21.0: 312 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 313 | 314 | universal-user-agent@6.0.1: 315 | resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} 316 | 317 | web-streams-polyfill@3.3.3: 318 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 319 | engines: {node: '>= 8'} 320 | 321 | wrappy@1.0.2: 322 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 323 | 324 | snapshots: 325 | 326 | '@esbuild/aix-ppc64@0.25.12': 327 | optional: true 328 | 329 | '@esbuild/android-arm64@0.25.12': 330 | optional: true 331 | 332 | '@esbuild/android-arm@0.25.12': 333 | optional: true 334 | 335 | '@esbuild/android-x64@0.25.12': 336 | optional: true 337 | 338 | '@esbuild/darwin-arm64@0.25.12': 339 | optional: true 340 | 341 | '@esbuild/darwin-x64@0.25.12': 342 | optional: true 343 | 344 | '@esbuild/freebsd-arm64@0.25.12': 345 | optional: true 346 | 347 | '@esbuild/freebsd-x64@0.25.12': 348 | optional: true 349 | 350 | '@esbuild/linux-arm64@0.25.12': 351 | optional: true 352 | 353 | '@esbuild/linux-arm@0.25.12': 354 | optional: true 355 | 356 | '@esbuild/linux-ia32@0.25.12': 357 | optional: true 358 | 359 | '@esbuild/linux-loong64@0.25.12': 360 | optional: true 361 | 362 | '@esbuild/linux-mips64el@0.25.12': 363 | optional: true 364 | 365 | '@esbuild/linux-ppc64@0.25.12': 366 | optional: true 367 | 368 | '@esbuild/linux-riscv64@0.25.12': 369 | optional: true 370 | 371 | '@esbuild/linux-s390x@0.25.12': 372 | optional: true 373 | 374 | '@esbuild/linux-x64@0.25.12': 375 | optional: true 376 | 377 | '@esbuild/netbsd-arm64@0.25.12': 378 | optional: true 379 | 380 | '@esbuild/netbsd-x64@0.25.12': 381 | optional: true 382 | 383 | '@esbuild/openbsd-arm64@0.25.12': 384 | optional: true 385 | 386 | '@esbuild/openbsd-x64@0.25.12': 387 | optional: true 388 | 389 | '@esbuild/openharmony-arm64@0.25.12': 390 | optional: true 391 | 392 | '@esbuild/sunos-x64@0.25.12': 393 | optional: true 394 | 395 | '@esbuild/win32-arm64@0.25.12': 396 | optional: true 397 | 398 | '@esbuild/win32-ia32@0.25.12': 399 | optional: true 400 | 401 | '@esbuild/win32-x64@0.25.12': 402 | optional: true 403 | 404 | '@octokit/auth-token@4.0.0': {} 405 | 406 | '@octokit/core@5.2.2': 407 | dependencies: 408 | '@octokit/auth-token': 4.0.0 409 | '@octokit/graphql': 7.1.1 410 | '@octokit/request': 8.4.1 411 | '@octokit/request-error': 5.1.1 412 | '@octokit/types': 13.10.0 413 | before-after-hook: 2.2.3 414 | universal-user-agent: 6.0.1 415 | 416 | '@octokit/endpoint@9.0.6': 417 | dependencies: 418 | '@octokit/types': 13.10.0 419 | universal-user-agent: 6.0.1 420 | 421 | '@octokit/graphql@7.1.1': 422 | dependencies: 423 | '@octokit/request': 8.4.1 424 | '@octokit/types': 13.10.0 425 | universal-user-agent: 6.0.1 426 | 427 | '@octokit/openapi-types@24.2.0': {} 428 | 429 | '@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)': 430 | dependencies: 431 | '@octokit/core': 5.2.2 432 | '@octokit/types': 13.10.0 433 | 434 | '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)': 435 | dependencies: 436 | '@octokit/core': 5.2.2 437 | 438 | '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)': 439 | dependencies: 440 | '@octokit/core': 5.2.2 441 | '@octokit/types': 13.10.0 442 | 443 | '@octokit/request-error@5.1.1': 444 | dependencies: 445 | '@octokit/types': 13.10.0 446 | deprecation: 2.3.1 447 | once: 1.4.0 448 | 449 | '@octokit/request@8.4.1': 450 | dependencies: 451 | '@octokit/endpoint': 9.0.6 452 | '@octokit/request-error': 5.1.1 453 | '@octokit/types': 13.10.0 454 | universal-user-agent: 6.0.1 455 | 456 | '@octokit/rest@20.1.2': 457 | dependencies: 458 | '@octokit/core': 5.2.2 459 | '@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.2) 460 | '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.2) 461 | '@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.2) 462 | 463 | '@octokit/types@13.10.0': 464 | dependencies: 465 | '@octokit/openapi-types': 24.2.0 466 | 467 | '@types/node@20.19.25': 468 | dependencies: 469 | undici-types: 6.21.0 470 | 471 | before-after-hook@2.2.3: {} 472 | 473 | data-uri-to-buffer@4.0.1: {} 474 | 475 | deprecation@2.3.1: {} 476 | 477 | dotenv@17.2.3: {} 478 | 479 | esbuild@0.25.12: 480 | optionalDependencies: 481 | '@esbuild/aix-ppc64': 0.25.12 482 | '@esbuild/android-arm': 0.25.12 483 | '@esbuild/android-arm64': 0.25.12 484 | '@esbuild/android-x64': 0.25.12 485 | '@esbuild/darwin-arm64': 0.25.12 486 | '@esbuild/darwin-x64': 0.25.12 487 | '@esbuild/freebsd-arm64': 0.25.12 488 | '@esbuild/freebsd-x64': 0.25.12 489 | '@esbuild/linux-arm': 0.25.12 490 | '@esbuild/linux-arm64': 0.25.12 491 | '@esbuild/linux-ia32': 0.25.12 492 | '@esbuild/linux-loong64': 0.25.12 493 | '@esbuild/linux-mips64el': 0.25.12 494 | '@esbuild/linux-ppc64': 0.25.12 495 | '@esbuild/linux-riscv64': 0.25.12 496 | '@esbuild/linux-s390x': 0.25.12 497 | '@esbuild/linux-x64': 0.25.12 498 | '@esbuild/netbsd-arm64': 0.25.12 499 | '@esbuild/netbsd-x64': 0.25.12 500 | '@esbuild/openbsd-arm64': 0.25.12 501 | '@esbuild/openbsd-x64': 0.25.12 502 | '@esbuild/openharmony-arm64': 0.25.12 503 | '@esbuild/sunos-x64': 0.25.12 504 | '@esbuild/win32-arm64': 0.25.12 505 | '@esbuild/win32-ia32': 0.25.12 506 | '@esbuild/win32-x64': 0.25.12 507 | 508 | fetch-blob@3.2.0: 509 | dependencies: 510 | node-domexception: 1.0.0 511 | web-streams-polyfill: 3.3.3 512 | 513 | formdata-polyfill@4.0.10: 514 | dependencies: 515 | fetch-blob: 3.2.0 516 | 517 | fsevents@2.3.3: 518 | optional: true 519 | 520 | get-tsconfig@4.13.0: 521 | dependencies: 522 | resolve-pkg-maps: 1.0.0 523 | 524 | node-domexception@1.0.0: {} 525 | 526 | node-fetch@3.3.2: 527 | dependencies: 528 | data-uri-to-buffer: 4.0.1 529 | fetch-blob: 3.2.0 530 | formdata-polyfill: 4.0.10 531 | 532 | once@1.4.0: 533 | dependencies: 534 | wrappy: 1.0.2 535 | 536 | qs-esm@7.0.2: {} 537 | 538 | resolve-pkg-maps@1.0.0: {} 539 | 540 | tsx@4.20.6: 541 | dependencies: 542 | esbuild: 0.25.12 543 | get-tsconfig: 4.13.0 544 | optionalDependencies: 545 | fsevents: 2.3.3 546 | 547 | typescript@5.9.3: {} 548 | 549 | undici-types@6.21.0: {} 550 | 551 | universal-user-agent@6.0.1: {} 552 | 553 | web-streams-polyfill@3.3.3: {} 554 | 555 | wrappy@1.0.2: {} 556 | -------------------------------------------------------------------------------- /scripts/utils/i18n.ts: -------------------------------------------------------------------------------- 1 | export interface Translation { 2 | title: string; 3 | gemini3Promo: string; 4 | subtitle: string; 5 | copyright: string; 6 | viewInGallery: string; 7 | browseGallery: string; 8 | galleryFeatures: string; 9 | visualLayout: string; 10 | search: string; 11 | languages: string; 12 | mobile: string; 13 | aiGenerate: string; // AI one-click generation 14 | toc: string; 15 | whatIs: string; 16 | stats: string; 17 | featuredPrompts: string; 18 | allPrompts: string; 19 | howToContribute: string; 20 | license: string; 21 | acknowledgements: string; 22 | starHistory: string; 23 | totalPrompts: string; 24 | lastUpdated: string; 25 | metric: string; 26 | count: string; 27 | description: string; 28 | prompt: string; 29 | generatedImages: string; 30 | details: string; 31 | author: string; 32 | source: string; 33 | published: string; 34 | tryItNow: string; 35 | morePrompts: string; 36 | morePromptsDesc: string; 37 | viewAll: string; 38 | featured: string; // Used in stats table 39 | // What is section 40 | whatIsIntro: string; 41 | multimodalUnderstanding: string; 42 | highQualityGeneration: string; 43 | fastIteration: string; 44 | diverseStyles: string; 45 | preciseControl: string; 46 | complexScenes: string; 47 | learnMore: string; 48 | raycastIntegration: string; 49 | raycastDescription: string; 50 | example: string; 51 | raycastExample: string; 52 | raycastUsage: string; 53 | // Gallery features 54 | galleryFeature1: string; 55 | galleryFeature2: string; 56 | galleryFeature3: string; 57 | galleryFeature4: string; 58 | // Contribute section 59 | welcomeContributions: string; 60 | githubIssue: string; 61 | submitNewPrompt: string; 62 | fillForm: string; 63 | submitWait: string; 64 | approvedSync: string; 65 | appearInReadme: string; 66 | note: string; 67 | noteContent: string; 68 | seeContributing: string; 69 | // Footer 70 | licensedUnder: string; 71 | autoGenerated: string; 72 | submitPrompt: string; 73 | starRepo: string; 74 | // Other 75 | sortedByDate: string; 76 | handPicked: string; 77 | githubReadme: string; 78 | youmindGallery: string; 79 | linearList: string; 80 | masonryGrid: string; 81 | ctrlFOnly: string; 82 | fullTextSearch: string; 83 | basic: string; 84 | fullyResponsive: string; 85 | aiOneClickGen: string; 86 | categories: string; 87 | categoryBrowsing: string; 88 | browseByCategory: string; 89 | } 90 | 91 | const en: Translation = { 92 | title: 'Awesome Nano Banana Pro Prompts', 93 | gemini3Promo: 'If you\'re interested in Gemini 3 prompts, feel free to check out our other repository with 50+ curated prompts: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 94 | subtitle: "A curated collection of creative prompts for Google's Nano Banana Pro", 95 | copyright: "**Copyright Notice**: All prompts are collected from the community for educational purposes. If you believe any content infringes on your rights, please [open an issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) and we will remove it promptly.", 96 | viewInGallery: 'View in Web Gallery', 97 | browseGallery: '👉 Browse on YouMind Nano Banana Pro Prompts Gallery', 98 | galleryFeatures: 'Why use our gallery?', 99 | visualLayout: 'Visual Layout', 100 | search: 'Search', 101 | languages: 'Languages', 102 | mobile: 'Mobile', 103 | aiGenerate: 'AI One-Click Generation', 104 | toc: 'Table of Contents', 105 | whatIs: 'What is Nano Banana Pro?', 106 | stats: 'Statistics', 107 | featuredPrompts: 'Featured Prompts', 108 | allPrompts: 'All Prompts', 109 | howToContribute: 'How to Contribute', 110 | license: 'License', 111 | acknowledgements: 'Acknowledgements', 112 | starHistory: 'Star History', 113 | totalPrompts: 'Total Prompts', 114 | lastUpdated: 'Last Updated', 115 | metric: 'Metric', 116 | count: 'Count', 117 | description: 'Description', 118 | prompt: 'Prompt', 119 | generatedImages: 'Generated Images', 120 | details: 'Details', 121 | author: 'Author', 122 | source: 'Source', 123 | published: 'Published', 124 | tryItNow: '👉 Try it now →', 125 | morePrompts: 'More Prompts Available', 126 | morePromptsDesc: 'more prompts not shown here', 127 | viewAll: '👉 View all prompts in our Web Gallery', 128 | featured: 'Featured', 129 | whatIsIntro: "**Nano Banana Pro** is Google's latest multimodal AI model featuring:", 130 | multimodalUnderstanding: '**Multimodal Understanding** - Process text, images, and video', 131 | highQualityGeneration: '**High-Quality Generation** - Photorealistic to artistic styles', 132 | fastIteration: '**Fast Iteration** - Quick edits and variations', 133 | diverseStyles: '**Diverse Styles** - From pixel art to oil paintings', 134 | preciseControl: '**Precise Control** - Detailed composition and lighting', 135 | complexScenes: '**Complex Scenes** - Multi-object, multi-character rendering', 136 | learnMore: '**Learn More:** [Nano Banana Pro: 10 Real Cases](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 137 | raycastIntegration: 'Raycast Integration', 138 | raycastDescription: 'Some prompts support **dynamic arguments** using [Raycast Snippets](https://raycast.com/help/snippets) syntax. Look for the 🚀 Raycast Friendly badge!', 139 | example: 'Example:', 140 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 141 | raycastUsage: 'When used in Raycast, you can dynamically replace the arguments for quick iterations!', 142 | galleryFeature1: '✨ Beautiful masonry grid layout', 143 | galleryFeature2: '🔍 Full-text search and filters', 144 | galleryFeature3: '🌍 17 languages support', 145 | galleryFeature4: '📱 Mobile-optimized experience', 146 | welcomeContributions: 'We welcome contributions! You can submit prompts via:', 147 | githubIssue: 'GitHub Issue', 148 | submitNewPrompt: 'Submit New Prompt', 149 | fillForm: 'Fill in the form with prompt details and image', 150 | submitWait: 'Submit and wait for team review', 151 | approvedSync: "If approved (we'll add `approved` label), it will automatically sync to CMS", 152 | appearInReadme: 'Your prompt will appear in README within 4 hours', 153 | note: 'Note:', 154 | noteContent: 'We only accept submissions via GitHub Issues to ensure quality control.', 155 | seeContributing: 'See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for detailed guidelines.', 156 | licensedUnder: 'Licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 157 | autoGenerated: 'This README is automatically generated. Last updated:', 158 | submitPrompt: 'Submit a Prompt', 159 | starRepo: 'Star this repo', 160 | sortedByDate: 'Sorted by publish date (newest first)', 161 | handPicked: 'Hand-picked by our team for exceptional quality and creativity', 162 | githubReadme: 'GitHub README', 163 | youmindGallery: 'youmind.com Gallery', 164 | linearList: 'Linear list', 165 | masonryGrid: 'Beautiful Masonry Grid', 166 | ctrlFOnly: 'Ctrl+F only', 167 | fullTextSearch: 'Full-text search with filters', 168 | basic: 'Basic', 169 | fullyResponsive: 'Fully responsive', 170 | aiOneClickGen: 'AI one-click generation', 171 | categories: 'Categories', 172 | categoryBrowsing: 'Category browsing', 173 | browseByCategory: 'Browse by Category', 174 | }; 175 | 176 | const zh: Translation = { 177 | title: 'Nano Banana Pro 提示词大全', 178 | gemini3Promo: '如果您对 Gemini 3 提示词感兴趣,欢迎查看我们的另一个仓库,包含 50+ 精选提示词:https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 179 | subtitle: "Google Nano Banana Pro 创意提示词精选集合", 180 | copyright: "**版权声明**:所有提示词均收集自社区,仅供教育目的使用。如果您认为任何内容侵犯了您的权利,请[提交 issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml),我们将立即移除。", 181 | viewInGallery: '在网页图库中查看', 182 | browseGallery: '👉 浏览 YouMind Nano Banana Pro 提示词图库', 183 | galleryFeatures: '为什么使用图库?', 184 | visualLayout: '可视化布局', 185 | search: '搜索', 186 | languages: '多语言', 187 | mobile: '移动端', 188 | aiGenerate: 'AI 一键生图', 189 | toc: '目录', 190 | whatIs: '什么是 Nano Banana Pro?', 191 | stats: '统计数据', 192 | featuredPrompts: '精选提示词', 193 | allPrompts: '所有提示词', 194 | howToContribute: '如何贡献', 195 | license: '许可证', 196 | acknowledgements: '致谢', 197 | starHistory: 'Star 历史', 198 | totalPrompts: '提示词总数', 199 | lastUpdated: '最后更新', 200 | metric: '指标', 201 | count: '数量', 202 | description: '描述', 203 | prompt: '提示词', 204 | generatedImages: '生成图片', 205 | details: '详情', 206 | author: '作者', 207 | source: '来源', 208 | published: '发布时间', 209 | tryItNow: '👉 立即尝试 →', 210 | morePrompts: '更多提示词', 211 | morePromptsDesc: '更多提示词未在此显示', 212 | viewAll: '👉 在网页图库中查看所有提示词', 213 | featured: '精选', 214 | whatIsIntro: '**Nano Banana Pro** 是 Google 最新的多模态 AI 模型,具有以下特点:', 215 | multimodalUnderstanding: '**多模态理解** - 处理文本、图像和视频', 216 | highQualityGeneration: '**高质量生成** - 从照片级真实感到艺术风格', 217 | fastIteration: '**快速迭代** - 快速编辑和变化', 218 | diverseStyles: '**多样风格** - 从像素艺术到油画', 219 | preciseControl: '**精确控制** - 详细的构图和光照', 220 | complexScenes: '**复杂场景** - 多对象、多角色渲染', 221 | learnMore: '**了解更多**:[Nano Banana Pro: 10 个真实案例](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 222 | raycastIntegration: 'Raycast 集成', 223 | raycastDescription: '部分提示词支持使用 [Raycast Snippets](https://raycast.com/help/snippets) 语法的**动态参数**。寻找 🚀 Raycast Friendly 徽章!', 224 | example: '示例:', 225 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 226 | raycastUsage: '在 Raycast 中使用时,您可以动态替换参数以快速迭代!', 227 | galleryFeature1: '✨ 精美的瀑布流网格布局', 228 | galleryFeature2: '🔍 全文搜索和筛选', 229 | galleryFeature3: '🌍 支持 17 种语言', 230 | galleryFeature4: '📱 移动端优化体验', 231 | welcomeContributions: '我们欢迎贡献!您可以通过以下方式提交提示词:', 232 | githubIssue: 'GitHub Issue', 233 | submitNewPrompt: '提交新提示词', 234 | fillForm: '填写表单,包含提示词详情和图片', 235 | submitWait: '提交并等待团队审核', 236 | approvedSync: '如果通过审核(我们会添加 `approved` 标签),它将自动同步到 CMS', 237 | appearInReadme: '您的提示词将在 4 小时内出现在 README 中', 238 | note: '注意:', 239 | noteContent: '我们仅接受通过 GitHub Issues 提交的内容,以确保质量控制。', 240 | seeContributing: '查看 [CONTRIBUTING.md](docs/CONTRIBUTING.md) 了解详细指南。', 241 | licensedUnder: '根据 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 许可。', 242 | autoGenerated: '此 README 自动生成。最后更新:', 243 | submitPrompt: '提交提示词', 244 | starRepo: '给仓库点星', 245 | sortedByDate: '按发布日期排序(最新优先)', 246 | handPicked: '由我们的团队精心挑选,具有卓越的质量和创造力', 247 | githubReadme: 'GitHub README', 248 | youmindGallery: 'youmind.com 图库', 249 | linearList: '线性列表', 250 | masonryGrid: '精美的瀑布流网格', 251 | ctrlFOnly: '仅 Ctrl+F', 252 | fullTextSearch: '全文搜索和筛选', 253 | basic: '基础', 254 | fullyResponsive: '完全响应式', 255 | aiOneClickGen: 'AI 一键生图', 256 | categories: '分类', 257 | categoryBrowsing: '分类浏览', 258 | browseByCategory: '按分类浏览', 259 | }; 260 | 261 | const zhTW: Translation = { 262 | ...zh, 263 | title: 'Nano Banana Pro 提示詞大全', 264 | gemini3Promo: '如果您對 Gemini 3 提示詞感興趣,歡迎查看我們的另一個倉庫,包含 50+ 精選提示詞:https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 265 | subtitle: "Google Nano Banana Pro 創意提示詞精選集合", 266 | copyright: "**版權聲明**:所有提示詞均收集自社區,僅供教育目的使用。如果您認為任何內容侵犯了您的權利,請[提交 issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml),我們將立即移除。", 267 | viewInGallery: '在網頁圖庫中查看', 268 | browseGallery: '👉 瀏覽 YouMind Nano Banana Pro 提示詞圖庫', 269 | galleryFeatures: '為什麼使用圖庫?', 270 | visualLayout: '可視化佈局', 271 | search: '搜索', 272 | languages: '多語言', 273 | mobile: '移動端', 274 | aiGenerate: 'AI 一鍵生圖', 275 | toc: '目錄', 276 | whatIs: '什麼是 Nano Banana Pro?', 277 | stats: '統計數據', 278 | featuredPrompts: '精選提示詞', 279 | allPrompts: '所有提示詞', 280 | howToContribute: '如何貢獻', 281 | license: '許可證', 282 | acknowledgements: '致謝', 283 | starHistory: 'Star 歷史', 284 | totalPrompts: '提示詞總數', 285 | lastUpdated: '最後更新', 286 | metric: '指標', 287 | count: '數量', 288 | description: '描述', 289 | prompt: '提示詞', 290 | generatedImages: '生成圖片', 291 | details: '詳情', 292 | author: '作者', 293 | source: '來源', 294 | published: '發布時間', 295 | tryItNow: '👉 立即嘗試 →', 296 | morePrompts: '更多提示詞', 297 | morePromptsDesc: '更多提示詞未在此顯示', 298 | viewAll: '👉 在網頁圖庫中查看所有提示詞', 299 | featured: '精選', 300 | whatIsIntro: '**Nano Banana Pro** 是 Google 最新的多模態 AI 模型,具有以下特點:', 301 | multimodalUnderstanding: '**多模態理解** - 處理文本、圖像和視頻', 302 | highQualityGeneration: '**高質量生成** - 從照片級真實感到藝術風格', 303 | fastIteration: '**快速迭代** - 快速編輯和變化', 304 | diverseStyles: '**多樣風格** - 從像素藝術到油畫', 305 | preciseControl: '**精確控制** - 詳細的構圖和光照', 306 | complexScenes: '**複雜場景** - 多對象、多角色渲染', 307 | learnMore: '**了解更多**:[Nano Banana Pro: 10 個真實案例](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 308 | raycastIntegration: 'Raycast 集成', 309 | raycastDescription: '部分提示詞支持使用 [Raycast Snippets](https://raycast.com/help/snippets) 語法的**動態參數**。尋找 🚀 Raycast Friendly 徽章!', 310 | example: '示例:', 311 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 312 | raycastUsage: '在 Raycast 中使用時,您可以動態替換參數以快速迭代!', 313 | galleryFeature1: '✨ 精美的瀑布流網格佈局', 314 | galleryFeature2: '🔍 全文搜索和篩選', 315 | galleryFeature3: '🌍 支持 17 種語言', 316 | galleryFeature4: '📱 移動端優化體驗', 317 | welcomeContributions: '我們歡迎貢獻!您可以通過以下方式提交提示詞:', 318 | githubIssue: 'GitHub Issue', 319 | submitNewPrompt: '提交新提示詞', 320 | fillForm: '填寫表單,包含提示詞詳情和圖片', 321 | submitWait: '提交並等待團隊審核', 322 | approvedSync: '如果通過審核(我們會添加 `approved` 標籤),它將自動同步到 CMS', 323 | appearInReadme: '您的提示詞將在 4 小時內出現在 README 中', 324 | note: '注意:', 325 | noteContent: '我們僅接受通過 GitHub Issues 提交的內容,以確保質量控制。', 326 | seeContributing: '查看 [CONTRIBUTING.md](docs/CONTRIBUTING.md) 了解詳細指南。', 327 | licensedUnder: '根據 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 許可。', 328 | autoGenerated: '此 README 自動生成。最後更新:', 329 | submitPrompt: '提交提示詞', 330 | starRepo: '給倉庫點星', 331 | sortedByDate: '按發布日期排序(最新優先)', 332 | handPicked: '由我們的團隊精心挑選,具有卓越的質量和創造力', 333 | githubReadme: 'GitHub README', 334 | youmindGallery: 'youmind.com 圖庫', 335 | linearList: '線性列表', 336 | masonryGrid: '精美的瀑布流網格', 337 | ctrlFOnly: '僅 Ctrl+F', 338 | fullTextSearch: '全文搜索和篩選', 339 | basic: '基礎', 340 | fullyResponsive: '完全響應式', 341 | aiOneClickGen: 'AI 一鍵生圖', 342 | categories: '分類', 343 | categoryBrowsing: '分類瀏覽', 344 | browseByCategory: '按分類瀏覽', 345 | }; 346 | 347 | const ja: Translation = { 348 | ...en, 349 | title: 'Nano Banana Pro プロンプト集', 350 | gemini3Promo: 'Gemini 3 プロンプトに興味がある場合は、50以上の厳選されたプロンプトを含む別のリポジトリをご覧ください:https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 351 | subtitle: "Google Nano Banana Pro のクリエイティブなプロンプトコレクション", 352 | copyright: "**著作権に関する通知**: すべてのプロンプトは教育目的でコミュニティから収集されています。権利を侵害していると思われるコンテンツがある場合は、[issue を作成](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml)してください。速やかに削除いたします。", 353 | viewInGallery: 'Web ギャラリーで見る', 354 | browseGallery: '👉 YouMind Nano Banana Pro プロンプトギャラリーを見る', 355 | galleryFeatures: 'ギャラリーを使用する理由', 356 | visualLayout: 'ビジュアルレイアウト', 357 | search: '検索', 358 | languages: '言語', 359 | mobile: 'モバイル', 360 | aiGenerate: 'AI ワンクリック生成', 361 | toc: '目次', 362 | whatIs: 'Nano Banana Pro とは?', 363 | stats: '統計', 364 | featuredPrompts: 'おすすめプロンプト', 365 | allPrompts: 'すべてのプロンプト', 366 | howToContribute: '貢献方法', 367 | license: 'ライセンス', 368 | acknowledgements: '謝辞', 369 | starHistory: 'スター履歴', 370 | totalPrompts: 'プロンプト総数', 371 | lastUpdated: '最終更新', 372 | metric: '指標', 373 | count: '数', 374 | description: '説明', 375 | prompt: 'プロンプト', 376 | generatedImages: '生成画像', 377 | details: '詳細', 378 | author: '作者', 379 | source: 'ソース', 380 | published: '公開日', 381 | tryItNow: '👉 今すぐ試す →', 382 | morePrompts: 'その他のプロンプト', 383 | morePromptsDesc: 'さらに多くのプロンプトがあります', 384 | viewAll: '👉 Web ギャラリーですべてのプロンプトを見る', 385 | featured: 'おすすめ', 386 | whatIsIntro: '**Nano Banana Pro** は、Google の最新のマルチモーダル AI モデルで、以下の特徴があります:', 387 | multimodalUnderstanding: '**マルチモーダル理解** - テキスト、画像、動画を処理', 388 | highQualityGeneration: '**高品質生成** - 写真のようなリアルさから芸術的なスタイルまで', 389 | fastIteration: '**高速反復** - 迅速な編集とバリエーション', 390 | diverseStyles: '**多様なスタイル** - ピクセルアートから油絵まで', 391 | preciseControl: '**精密制御** - 詳細な構図と照明', 392 | complexScenes: '**複雑なシーン** - 複数オブジェクト、複数キャラクターのレンダリング', 393 | learnMore: '**詳細はこちら**:[Nano Banana Pro: 10 の実例](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 394 | raycastIntegration: 'Raycast 統合', 395 | raycastDescription: '一部のプロンプトは [Raycast Snippets](https://raycast.com/help/snippets) 構文を使用した**動的引数**をサポートしています。🚀 Raycast Friendly バッジを探してください!', 396 | example: '例:', 397 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 398 | raycastUsage: 'Raycast で使用すると、引数を動的に置き換えて迅速に反復できます!', 399 | galleryFeature1: '✨ 美しいメイソンリグリッドレイアウト', 400 | galleryFeature2: '🔍 全文検索とフィルター', 401 | galleryFeature3: '🌍 17 言語サポート', 402 | galleryFeature4: '📱 モバイル最適化体験', 403 | welcomeContributions: '貢献を歓迎します!以下の方法でプロンプトを提出できます:', 404 | githubIssue: 'GitHub Issue', 405 | submitNewPrompt: '新しいプロンプトを提出', 406 | fillForm: 'フォームにプロンプトの詳細と画像を記入', 407 | submitWait: '提出してチームのレビューを待つ', 408 | approvedSync: '承認された場合(`approved` ラベルを追加します)、CMS に自動的に同期されます', 409 | appearInReadme: 'プロンプトは 4 時間以内に README に表示されます', 410 | note: '注意:', 411 | noteContent: '品質管理のため、GitHub Issues 経由の提出のみ受け付けています。', 412 | seeContributing: '詳細なガイドラインについては [CONTRIBUTING.md](docs/CONTRIBUTING.md) を参照してください。', 413 | licensedUnder: '[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) の下でライセンスされています。', 414 | autoGenerated: 'この README は自動生成されています。最終更新:', 415 | submitPrompt: 'プロンプトを提出', 416 | starRepo: 'このリポジトリにスターを付ける', 417 | sortedByDate: '公開日でソート(新しい順)', 418 | handPicked: '優れた品質と創造性のためにチームが厳選', 419 | githubReadme: 'GitHub README', 420 | youmindGallery: 'youmind.com ギャラリー', 421 | linearList: '線形リスト', 422 | masonryGrid: '美しいメイソンリグリッド', 423 | ctrlFOnly: 'Ctrl+F のみ', 424 | fullTextSearch: '全文検索とフィルター', 425 | basic: '基本', 426 | fullyResponsive: '完全レスポンシブ', 427 | aiOneClickGen: 'AI ワンクリック生成', 428 | categories: 'カテゴリー', 429 | categoryBrowsing: 'カテゴリー閲覧', 430 | browseByCategory: 'カテゴリーで閲覧', 431 | }; 432 | 433 | const ko: Translation = { 434 | ...en, 435 | title: 'Nano Banana Pro 프롬프트 모음', 436 | gemini3Promo: 'Gemini 3 프롬프트에 관심이 있으시다면, 50개 이상의 엄선된 프롬프트가 포함된 다른 저장소를 확인해보세요:https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 437 | subtitle: "Google Nano Banana Pro를 위한 창의적인 프롬프트 컬렉션", 438 | copyright: "**저작권 고지**: 모든 프롬프트는 교육 목적으로 커뮤니티에서 수집되었습니다. 귀하의 권리를 침해하는 콘텐츠가 있다고 생각되면 [이슈를 열어주세요](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml). 즉시 삭제하겠습니다.", 439 | viewInGallery: '웹 갤러리에서 보기', 440 | browseGallery: '👉 YouMind Nano Banana Pro 프롬프트 갤러리 둘러보기', 441 | galleryFeatures: '갤러리를 사용하는 이유는 무엇인가요?', 442 | visualLayout: '비주얼 레이아웃', 443 | search: '검색', 444 | languages: '언어', 445 | mobile: '모바일', 446 | aiGenerate: 'AI 원클릭 생성', 447 | toc: '목차', 448 | whatIs: 'Nano Banana Pro란 무엇인가요?', 449 | stats: '통계', 450 | featuredPrompts: '추천 프롬프트', 451 | allPrompts: '모든 프롬프트', 452 | howToContribute: '기여하는 방법', 453 | license: '라이선스', 454 | acknowledgements: '감사의 말', 455 | starHistory: '스타 히스토리', 456 | totalPrompts: '총 프롬프트 수', 457 | lastUpdated: '마지막 업데이트', 458 | metric: '지표', 459 | count: '수', 460 | description: '설명', 461 | prompt: '프롬프트', 462 | generatedImages: '생성된 이미지', 463 | details: '상세 정보', 464 | author: '작성자', 465 | source: '출처', 466 | published: '게시일', 467 | tryItNow: '👉 지금 시도하기 →', 468 | morePrompts: '더 많은 프롬프트', 469 | morePromptsDesc: '여기에 표시되지 않은 더 많은 프롬프트가 있습니다', 470 | viewAll: '👉 웹 갤러리에서 모든 프롬프트 보기', 471 | featured: '추천', 472 | whatIsIntro: '**Nano Banana Pro**는 Google의 최신 멀티모달 AI 모델로 다음 기능을 제공합니다:', 473 | multimodalUnderstanding: '**멀티모달 이해** - 텍스트, 이미지, 비디오 처리', 474 | highQualityGeneration: '**고품질 생성** - 사진처럼 사실적인 스타일부터 예술적 스타일까지', 475 | fastIteration: '**빠른 반복** - 빠른 편집 및 변형', 476 | diverseStyles: '**다양한 스타일** - 픽셀 아트부터 유화까지', 477 | preciseControl: '**정밀 제어** - 상세한 구성 및 조명', 478 | complexScenes: '**복잡한 장면** - 다중 객체, 다중 캐릭터 렌더링', 479 | learnMore: '**자세히 알아보기**: [Nano Banana Pro: 10가지 실제 사례](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 480 | raycastIntegration: 'Raycast 통합', 481 | raycastDescription: '일부 프롬프트는 [Raycast Snippets](https://raycast.com/help/snippets) 구문을 사용한 **동적 인수**를 지원합니다. 🚀 Raycast Friendly 배지를 찾아보세요!', 482 | example: '예:', 483 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 484 | raycastUsage: 'Raycast에서 사용하면 인수를 동적으로 교체하여 빠르게 반복할 수 있습니다!', 485 | galleryFeature1: '✨ 아름다운 메이슨리 그리드 레이아웃', 486 | galleryFeature2: '🔍 전체 텍스트 검색 및 필터', 487 | galleryFeature3: '🌍 17개 언어 지원', 488 | galleryFeature4: '📱 모바일 최적화 경험', 489 | welcomeContributions: '기여를 환영합니다! 다음 방법으로 프롬프트를 제출할 수 있습니다:', 490 | githubIssue: 'GitHub Issue', 491 | submitNewPrompt: '새 프롬프트 제출', 492 | fillForm: '프롬프트 세부 정보와 이미지로 양식 작성', 493 | submitWait: '제출하고 팀 검토 대기', 494 | approvedSync: '승인되면 (`approved` 레이블 추가) CMS에 자동으로 동기화됩니다', 495 | appearInReadme: '프롬프트는 4시간 이내에 README에 나타납니다', 496 | note: '참고:', 497 | noteContent: '품질 관리를 위해 GitHub Issues를 통한 제출만 허용합니다.', 498 | seeContributing: '자세한 지침은 [CONTRIBUTING.md](docs/CONTRIBUTING.md)를 참조하세요.', 499 | licensedUnder: '[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)에 따라 라이선스됩니다.', 500 | autoGenerated: '이 README는 자동으로 생성됩니다. 마지막 업데이트:', 501 | submitPrompt: '프롬프트 제출', 502 | starRepo: '이 저장소에 스타 추가', 503 | sortedByDate: '게시일 기준 정렬(최신순)', 504 | handPicked: '팀이 뛰어난 품질과 창의성을 위해 엄선', 505 | githubReadme: 'GitHub README', 506 | youmindGallery: 'youmind.com 갤러리', 507 | linearList: '선형 목록', 508 | masonryGrid: '아름다운 메이슨리 그리드', 509 | ctrlFOnly: 'Ctrl+F만', 510 | fullTextSearch: '전체 텍스트 검색 및 필터', 511 | basic: '기본', 512 | fullyResponsive: '완전 반응형', 513 | aiOneClickGen: 'AI 원클릭 생성', 514 | categories: '카테고리', 515 | categoryBrowsing: '카테고리 탐색', 516 | browseByCategory: '카테고리별 탐색', 517 | }; 518 | 519 | const de: Translation = { 520 | ...en, 521 | title: 'Tolle Nano Banana Pro Prompts', 522 | gemini3Promo: 'Wenn Sie an Gemini 3 Prompts interessiert sind, schauen Sie sich gerne unser anderes Repository mit 50+ kuratierten Prompts an: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 523 | subtitle: "Eine kuratierte Sammlung kreativer Prompts für Google's Nano Banana Pro", 524 | copyright: "**Urheberrechtshinweis**: Alle Prompts werden zu Bildungszwecken aus der Community gesammelt. Wenn Sie glauben, dass Inhalte Ihre Rechte verletzen, öffnen Sie bitte ein [Issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) und wir werden es umgehend entfernen.", 525 | viewInGallery: 'In Web-Galerie ansehen', 526 | browseGallery: '👉 Auf YouMind Nano Banana Pro Prompt-Galerie stöbern', 527 | galleryFeatures: 'Warum unsere Galerie nutzen?', 528 | visualLayout: 'Visuelles Layout', 529 | search: 'Suche', 530 | languages: 'Sprachen', 531 | mobile: 'Mobil', 532 | aiGenerate: 'KI Ein-Klick-Generierung', 533 | toc: 'Inhaltsverzeichnis', 534 | whatIs: 'Was ist Nano Banana Pro?', 535 | stats: 'Statistiken', 536 | featuredPrompts: 'Ausgewählte Prompts', 537 | allPrompts: 'Alle Prompts', 538 | howToContribute: 'Wie man beiträgt', 539 | license: 'Lizenz', 540 | acknowledgements: 'Danksagung', 541 | starHistory: 'Star-Verlauf', 542 | totalPrompts: 'Gesamtanzahl Prompts', 543 | lastUpdated: 'Zuletzt aktualisiert', 544 | metric: 'Metrik', 545 | count: 'Anzahl', 546 | description: 'Beschreibung', 547 | prompt: 'Prompt', 548 | generatedImages: 'Generierte Bilder', 549 | details: 'Details', 550 | author: 'Autor', 551 | source: 'Quelle', 552 | published: 'Veröffentlicht', 553 | tryItNow: '👉 Jetzt ausprobieren →', 554 | morePrompts: 'Weitere Prompts verfügbar', 555 | morePromptsDesc: 'weitere Prompts hier nicht angezeigt', 556 | viewAll: '👉 Alle Prompts in unserer Web-Galerie ansehen', 557 | featured: 'Ausgewählt', 558 | whatIsIntro: '**Nano Banana Pro** ist Googles neuestes multimodales KI-Modell mit folgenden Funktionen:', 559 | multimodalUnderstanding: '**Multimodales Verständnis** - Verarbeitung von Text, Bildern und Videos', 560 | highQualityGeneration: '**Hochwertige Generierung** - Von fotorealistisch bis künstlerisch', 561 | fastIteration: '**Schnelle Iteration** - Schnelle Bearbeitungen und Variationen', 562 | diverseStyles: '**Vielfältige Stile** - Von Pixel-Art bis Ölgemälde', 563 | preciseControl: '**Präzise Kontrolle** - Detaillierte Komposition und Beleuchtung', 564 | complexScenes: '**Komplexe Szenen** - Multi-Objekt-, Multi-Charakter-Rendering', 565 | learnMore: '**Mehr erfahren**: [Nano Banana Pro: 10 echte Fälle](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 566 | raycastIntegration: 'Raycast-Integration', 567 | raycastDescription: 'Einige Prompts unterstützen **dynamische Argumente** mit [Raycast Snippets](https://raycast.com/help/snippets)-Syntax. Suchen Sie nach dem 🚀 Raycast Friendly Badge!', 568 | example: 'Beispiel:', 569 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 570 | raycastUsage: 'Bei Verwendung in Raycast können Sie die Argumente dynamisch ersetzen, um schnell zu iterieren!', 571 | galleryFeature1: '✨ Schönes Masonry-Grid-Layout', 572 | galleryFeature2: '🔍 Volltextsuche und Filter', 573 | galleryFeature3: '🌍 Unterstützung für 17 Sprachen', 574 | galleryFeature4: '📱 Mobile-optimierte Erfahrung', 575 | welcomeContributions: 'Wir freuen uns über Beiträge! Sie können Prompts über folgende Wege einreichen:', 576 | githubIssue: 'GitHub Issue', 577 | submitNewPrompt: 'Neuen Prompt einreichen', 578 | fillForm: 'Formular mit Prompt-Details und Bild ausfüllen', 579 | submitWait: 'Einreichen und auf Team-Review warten', 580 | approvedSync: 'Wenn genehmigt (wir fügen das `approved` Label hinzu), wird es automatisch mit dem CMS synchronisiert', 581 | appearInReadme: 'Ihr Prompt erscheint innerhalb von 4 Stunden im README', 582 | note: 'Hinweis:', 583 | noteContent: 'Wir akzeptieren nur Einreichungen über GitHub Issues, um die Qualitätskontrolle sicherzustellen.', 584 | seeContributing: 'Siehe [CONTRIBUTING.md](docs/CONTRIBUTING.md) für detaillierte Richtlinien.', 585 | licensedUnder: 'Lizenziert unter [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 586 | autoGenerated: 'Dieses README wird automatisch generiert. Zuletzt aktualisiert:', 587 | submitPrompt: 'Prompt einreichen', 588 | starRepo: 'Dieses Repository mit Stern markieren', 589 | sortedByDate: 'Sortiert nach Veröffentlichungsdatum (neueste zuerst)', 590 | handPicked: 'Von unserem Team handverlesen für außergewöhnliche Qualität und Kreativität', 591 | githubReadme: 'GitHub README', 592 | youmindGallery: 'youmind.com Galerie', 593 | linearList: 'Lineare Liste', 594 | masonryGrid: 'Schönes Masonry-Grid', 595 | ctrlFOnly: 'Nur Ctrl+F', 596 | fullTextSearch: 'Volltextsuche mit Filtern', 597 | basic: 'Basis', 598 | fullyResponsive: 'Vollständig responsiv', 599 | aiOneClickGen: 'KI Ein-Klick-Generierung', 600 | categories: 'Kategorien', 601 | categoryBrowsing: 'Kategorie-Browsing', 602 | browseByCategory: 'Nach Kategorie durchsuchen', 603 | }; 604 | 605 | const fr: Translation = { 606 | ...en, 607 | title: 'Prompts Nano Banana Pro Géniaux', 608 | gemini3Promo: 'Si vous êtes intéressé par les prompts Gemini 3, n\'hésitez pas à consulter notre autre dépôt avec plus de 50 prompts sélectionnés : https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 609 | subtitle: "Une collection de prompts créatifs pour Nano Banana Pro de Google", 610 | copyright: "**Avis de droit d'auteur**: Tous les prompts sont collectés auprès de la communauté à des fins éducatives. Si vous pensez qu'un contenu enfreint vos droits, veuillez [ouvrir un problème](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) et nous le supprimerons rapidement.", 611 | viewInGallery: 'Voir dans la galerie Web', 612 | browseGallery: '👉 Parcourir la galerie de prompts YouMind Nano Banana Pro', 613 | galleryFeatures: 'Pourquoi utiliser notre galerie ?', 614 | visualLayout: 'Mise en page visuelle', 615 | search: 'Rechercher', 616 | languages: 'Langues', 617 | mobile: 'Mobile', 618 | aiGenerate: 'Génération IA en un clic', 619 | toc: 'Table des matières', 620 | whatIs: "Qu'est-ce que Nano Banana Pro ?", 621 | stats: 'Statistiques', 622 | featuredPrompts: 'Prompts en vedette', 623 | allPrompts: 'Tous les prompts', 624 | howToContribute: 'Comment contribuer', 625 | license: 'Licence', 626 | acknowledgements: 'Remerciements', 627 | starHistory: 'Historique des étoiles', 628 | totalPrompts: 'Total des prompts', 629 | lastUpdated: 'Dernière mise à jour', 630 | metric: 'Métrique', 631 | count: 'Nombre', 632 | description: 'Description', 633 | prompt: 'Prompt', 634 | generatedImages: 'Images générées', 635 | details: 'Détails', 636 | author: 'Auteur', 637 | source: 'Source', 638 | published: 'Publié', 639 | tryItNow: '👉 Essayer maintenant →', 640 | morePrompts: 'Plus de prompts disponibles', 641 | morePromptsDesc: 'prompts supplémentaires non affichés ici', 642 | viewAll: '👉 Voir tous les prompts dans notre galerie Web', 643 | featured: 'En vedette', 644 | whatIsIntro: '**Nano Banana Pro** est le dernier modèle IA multimodal de Google avec les fonctionnalités suivantes :', 645 | multimodalUnderstanding: '**Compréhension multimodale** - Traitement du texte, des images et de la vidéo', 646 | highQualityGeneration: '**Génération de haute qualité** - Du photoréalisme aux styles artistiques', 647 | fastIteration: '**Itération rapide** - Modifications et variations rapides', 648 | diverseStyles: '**Styles divers** - De l\'art pixel à la peinture à l\'huile', 649 | preciseControl: '**Contrôle précis** - Composition et éclairage détaillés', 650 | complexScenes: '**Scènes complexes** - Rendu multi-objets, multi-personnages', 651 | learnMore: '**En savoir plus** : [Nano Banana Pro : 10 cas réels](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 652 | raycastIntegration: 'Intégration Raycast', 653 | raycastDescription: 'Certains prompts prennent en charge les **arguments dynamiques** en utilisant la syntaxe [Raycast Snippets](https://raycast.com/help/snippets). Cherchez le badge 🚀 Raycast Friendly !', 654 | example: 'Exemple :', 655 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 656 | raycastUsage: 'Lors de l\'utilisation dans Raycast, vous pouvez remplacer dynamiquement les arguments pour des itérations rapides !', 657 | galleryFeature1: '✨ Mise en page en grille Masonry magnifique', 658 | galleryFeature2: '🔍 Recherche en texte intégral et filtres', 659 | galleryFeature3: '🌍 Support de 17 langues', 660 | galleryFeature4: '📱 Expérience optimisée pour mobile', 661 | welcomeContributions: 'Nous accueillons les contributions ! Vous pouvez soumettre des prompts via :', 662 | githubIssue: 'GitHub Issue', 663 | submitNewPrompt: 'Soumettre un nouveau prompt', 664 | fillForm: 'Remplir le formulaire avec les détails du prompt et l\'image', 665 | submitWait: 'Soumettre et attendre l\'examen de l\'équipe', 666 | approvedSync: 'Si approuvé (nous ajouterons le label `approved`), il sera automatiquement synchronisé avec le CMS', 667 | appearInReadme: 'Votre prompt apparaîtra dans le README dans les 4 heures', 668 | note: 'Note :', 669 | noteContent: 'Nous n\'acceptons que les soumissions via GitHub Issues pour assurer le contrôle qualité.', 670 | seeContributing: 'Voir [CONTRIBUTING.md](docs/CONTRIBUTING.md) pour les directives détaillées.', 671 | licensedUnder: 'Sous licence [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 672 | autoGenerated: 'Ce README est généré automatiquement. Dernière mise à jour :', 673 | submitPrompt: 'Soumettre un prompt', 674 | starRepo: 'Mettre une étoile à ce dépôt', 675 | sortedByDate: 'Trié par date de publication (plus récent en premier)', 676 | handPicked: 'Sélectionnés à la main par notre équipe pour leur qualité et créativité exceptionnelles', 677 | githubReadme: 'GitHub README', 678 | youmindGallery: 'Galerie youmind.com', 679 | linearList: 'Liste linéaire', 680 | masonryGrid: 'Magnifique grille Masonry', 681 | ctrlFOnly: 'Ctrl+F uniquement', 682 | fullTextSearch: 'Recherche en texte intégral avec filtres', 683 | basic: 'Basique', 684 | fullyResponsive: 'Entièrement responsive', 685 | aiOneClickGen: 'Génération IA en un clic', 686 | categories: 'Catégories', 687 | categoryBrowsing: 'Navigation par catégorie', 688 | browseByCategory: 'Parcourir par catégorie', 689 | }; 690 | 691 | const es: Translation = { 692 | ...en, 693 | title: 'Prompts Increíbles de Nano Banana Pro', 694 | gemini3Promo: 'Si estás interesado en los prompts de Gemini 3, no dudes en consultar nuestro otro repositorio con más de 50 prompts seleccionados: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 695 | subtitle: "Una colección curada de prompts creativos para Nano Banana Pro de Google", 696 | copyright: "**Aviso de derechos de autor**: Todos los prompts se recopilan de la comunidad con fines educativos. Si cree que algún contenido infringe sus derechos, por favor [abra un problema](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) y lo eliminaremos de inmediato.", 697 | viewInGallery: 'Ver en la galería web', 698 | browseGallery: '👉 Explorar en la galería de prompts de YouMind', 699 | galleryFeatures: '¿Por qué usar nuestra galería?', 700 | visualLayout: 'Diseño visual', 701 | search: 'Buscar', 702 | languages: 'Idiomas', 703 | mobile: 'Móvil', 704 | aiGenerate: 'Generación IA con un clic', 705 | toc: 'Tabla de contenidos', 706 | whatIs: '¿Qué es Nano Banana Pro?', 707 | stats: 'Estadísticas', 708 | featuredPrompts: 'Prompts destacados', 709 | allPrompts: 'Todos los prompts', 710 | howToContribute: 'Cómo contribuir', 711 | license: 'Licencia', 712 | acknowledgements: 'Agradecimientos', 713 | starHistory: 'Historial de estrellas', 714 | totalPrompts: 'Total de prompts', 715 | lastUpdated: 'Última actualización', 716 | metric: 'Métrica', 717 | count: 'Cantidad', 718 | description: 'Descripción', 719 | prompt: 'Prompt', 720 | generatedImages: 'Imágenes generadas', 721 | details: 'Detalles', 722 | author: 'Autor', 723 | source: 'Fuente', 724 | published: 'Publicado', 725 | tryItNow: '👉 Pruébalo ahora →', 726 | morePrompts: 'Más prompts disponibles', 727 | morePromptsDesc: 'prompts más no mostrados aquí', 728 | viewAll: '👉 Ver todos los prompts en nuestra galería web', 729 | featured: 'Destacado', 730 | whatIsIntro: '**Nano Banana Pro** es el último modelo de IA multimodal de Google con las siguientes características:', 731 | multimodalUnderstanding: '**Comprensión multimodal** - Procesa texto, imágenes y video', 732 | highQualityGeneration: '**Generación de alta calidad** - Desde estilos fotorrealistas hasta artísticos', 733 | fastIteration: '**Iteración rápida** - Ediciones y variaciones rápidas', 734 | diverseStyles: '**Estilos diversos** - Desde arte pixel hasta pinturas al óleo', 735 | preciseControl: '**Control preciso** - Composición e iluminación detalladas', 736 | complexScenes: '**Escenas complejas** - Renderizado multiobjeto, multijugador', 737 | learnMore: '**Más información**: [Nano Banana Pro: 10 casos reales](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 738 | raycastIntegration: 'Integración con Raycast', 739 | raycastDescription: 'Algunos prompts admiten **argumentos dinámicos** usando la sintaxis de [Raycast Snippets](https://raycast.com/help/snippets). ¡Busca la insignia 🚀 Raycast Friendly!', 740 | example: 'Ejemplo:', 741 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 742 | raycastUsage: '¡Cuando se usa en Raycast, puedes reemplazar dinámicamente los argumentos para iteraciones rápidas!', 743 | galleryFeature1: '✨ Diseño de cuadrícula Masonry hermoso', 744 | galleryFeature2: '🔍 Búsqueda de texto completo y filtros', 745 | galleryFeature3: '🌍 Soporte para 17 idiomas', 746 | galleryFeature4: '📱 Experiencia optimizada para móviles', 747 | welcomeContributions: '¡Damos la bienvenida a las contribuciones! Puedes enviar prompts a través de:', 748 | githubIssue: 'GitHub Issue', 749 | submitNewPrompt: 'Enviar nuevo prompt', 750 | fillForm: 'Completa el formulario con los detalles del prompt y la imagen', 751 | submitWait: 'Envía y espera la revisión del equipo', 752 | approvedSync: 'Si se aprueba (agregaremos la etiqueta `approved`), se sincronizará automáticamente con el CMS', 753 | appearInReadme: 'Tu prompt aparecerá en el README en 4 horas', 754 | note: 'Nota:', 755 | noteContent: 'Solo aceptamos envíos a través de GitHub Issues para garantizar el control de calidad.', 756 | seeContributing: 'Consulta [CONTRIBUTING.md](docs/CONTRIBUTING.md) para obtener pautas detalladas.', 757 | licensedUnder: 'Licenciado bajo [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 758 | autoGenerated: 'Este README se genera automáticamente. Última actualización:', 759 | submitPrompt: 'Enviar un prompt', 760 | starRepo: 'Dar estrella a este repositorio', 761 | sortedByDate: 'Ordenado por fecha de publicación (más reciente primero)', 762 | handPicked: 'Seleccionados a mano por nuestro equipo por su calidad y creatividad excepcionales', 763 | githubReadme: 'GitHub README', 764 | youmindGallery: 'Galería youmind.com', 765 | linearList: 'Lista lineal', 766 | masonryGrid: 'Hermosa cuadrícula Masonry', 767 | ctrlFOnly: 'Solo Ctrl+F', 768 | fullTextSearch: 'Búsqueda de texto completo con filtros', 769 | basic: 'Básico', 770 | fullyResponsive: 'Totalmente responsive', 771 | aiOneClickGen: 'Generación IA con un clic', 772 | categories: 'Categorías', 773 | categoryBrowsing: 'Navegación por categoría', 774 | browseByCategory: 'Explorar por categoría', 775 | }; 776 | 777 | const it: Translation = { 778 | ...en, 779 | title: 'Fantastici Prompt Nano Banana Pro', 780 | gemini3Promo: 'Se sei interessato ai prompt di Gemini 3, sentiti libero di controllare il nostro altro repository con più di 50 prompt selezionati: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 781 | subtitle: "Una raccolta curata di prompt creativi per Nano Banana Pro di Google", 782 | copyright: "**Avviso sul copyright**: Tutti i prompt sono raccolti dalla comunità per scopi educativi. Se ritieni che un contenuto violi i tuoi diritti, [apri una segnalazione](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) e lo rimuoveremo prontamente.", 783 | viewInGallery: 'Vedi nella galleria web', 784 | browseGallery: '👉 Sfoglia la galleria YouMind Nano Banana Pro', 785 | galleryFeatures: 'Perché usare la nostra galleria?', 786 | visualLayout: 'Layout visivo', 787 | search: 'Cerca', 788 | languages: 'Lingue', 789 | mobile: 'Mobile', 790 | aiGenerate: 'Generazione IA con un clic', 791 | toc: 'Indice', 792 | whatIs: "Cos'è Nano Banana Pro?", 793 | stats: 'Statistiche', 794 | featuredPrompts: 'Prompt in evidenza', 795 | allPrompts: 'Tutti i prompt', 796 | howToContribute: 'Come contribuire', 797 | license: 'Licenza', 798 | acknowledgements: 'Riconoscimenti', 799 | starHistory: 'Cronologia stelle', 800 | totalPrompts: 'Totale prompt', 801 | lastUpdated: 'Ultimo aggiornamento', 802 | metric: 'Metrica', 803 | count: 'Conteggio', 804 | description: 'Descrizione', 805 | prompt: 'Prompt', 806 | generatedImages: 'Immagini generate', 807 | details: 'Dettagli', 808 | author: 'Autore', 809 | source: 'Fonte', 810 | published: 'Pubblicato', 811 | tryItNow: '👉 Provalo ora →', 812 | morePrompts: 'Altri prompt disponibili', 813 | morePromptsDesc: 'altri prompt non mostrati qui', 814 | viewAll: '👉 Vedi tutti i prompt nella nostra galleria web', 815 | featured: 'In evidenza', 816 | whatIsIntro: '**Nano Banana Pro** è l\'ultimo modello di IA multimodale di Google con le seguenti caratteristiche:', 817 | multimodalUnderstanding: '**Comprensione multimodale** - Elabora testo, immagini e video', 818 | highQualityGeneration: '**Generazione di alta qualità** - Da stili fotorealistici ad artistici', 819 | fastIteration: '**Iterazione rapida** - Modifiche e variazioni rapide', 820 | diverseStyles: '**Stili diversificati** - Dall\'arte pixel ai dipinti ad olio', 821 | preciseControl: '**Controllo preciso** - Composizione e illuminazione dettagliate', 822 | complexScenes: '**Scene complesse** - Rendering multi-oggetto, multi-personaggio', 823 | learnMore: '**Scopri di più**: [Nano Banana Pro: 10 casi reali](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 824 | raycastIntegration: 'Integrazione Raycast', 825 | raycastDescription: 'Alcuni prompt supportano **argomenti dinamici** utilizzando la sintassi [Raycast Snippets](https://raycast.com/help/snippets). Cerca il badge 🚀 Raycast Friendly!', 826 | example: 'Esempio:', 827 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 828 | raycastUsage: 'Quando usato in Raycast, puoi sostituire dinamicamente gli argomenti per iterazioni rapide!', 829 | galleryFeature1: '✨ Layout a griglia Masonry bellissimo', 830 | galleryFeature2: '🔍 Ricerca full-text e filtri', 831 | galleryFeature3: '🌍 Supporto per 17 lingue', 832 | galleryFeature4: '📱 Esperienza ottimizzata per mobile', 833 | welcomeContributions: 'Accogliamo i contributi! Puoi inviare prompt tramite:', 834 | githubIssue: 'GitHub Issue', 835 | submitNewPrompt: 'Invia nuovo prompt', 836 | fillForm: 'Compila il modulo con i dettagli del prompt e l\'immagine', 837 | submitWait: 'Invia e attendi la revisione del team', 838 | approvedSync: 'Se approvato (aggiungeremo l\'etichetta `approved`), verrà sincronizzato automaticamente con il CMS', 839 | appearInReadme: 'Il tuo prompt apparirà nel README entro 4 ore', 840 | note: 'Nota:', 841 | noteContent: 'Accettiamo solo invii tramite GitHub Issues per garantire il controllo qualità.', 842 | seeContributing: 'Vedi [CONTRIBUTING.md](docs/CONTRIBUTING.md) per le linee guida dettagliate.', 843 | licensedUnder: 'Concesso in licenza sotto [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 844 | autoGenerated: 'Questo README è generato automaticamente. Ultimo aggiornamento:', 845 | submitPrompt: 'Invia un prompt', 846 | starRepo: 'Metti una stella a questo repository', 847 | sortedByDate: 'Ordinato per data di pubblicazione (più recente prima)', 848 | handPicked: 'Selezionati a mano dal nostro team per qualità e creatività eccezionali', 849 | githubReadme: 'GitHub README', 850 | youmindGallery: 'Galleria youmind.com', 851 | linearList: 'Lista lineare', 852 | masonryGrid: 'Bella griglia Masonry', 853 | ctrlFOnly: 'Solo Ctrl+F', 854 | fullTextSearch: 'Ricerca full-text con filtri', 855 | basic: 'Base', 856 | fullyResponsive: 'Completamente responsive', 857 | aiOneClickGen: 'Generazione IA con un clic', 858 | categories: 'Categorie', 859 | categoryBrowsing: 'Navigazione per categoria', 860 | browseByCategory: 'Sfoglia per categoria', 861 | }; 862 | 863 | const pt: Translation = { 864 | ...en, 865 | title: 'Prompts Incríveis do Nano Banana Pro', 866 | gemini3Promo: 'Se você está interessado em prompts do Gemini 3, sinta-se à vontade para conferir nosso outro repositório com mais de 50 prompts selecionados: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 867 | subtitle: "Uma coleção curada de prompts criativos para o Nano Banana Pro do Google", 868 | copyright: "**Aviso de Direitos Autorais**: Todos os prompts são coletados da comunidade para fins educacionais. Se você acredita que algum conteúdo infringe seus direitos, por favor [abra uma issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) e nós o removeremos prontamente.", 869 | viewInGallery: 'Ver na galeria web', 870 | browseGallery: '👉 Navegar na galeria YouMind Nano Banana Pro', 871 | galleryFeatures: 'Por que usar nossa galeria?', 872 | visualLayout: 'Layout visual', 873 | search: 'Buscar', 874 | languages: 'Idiomas', 875 | mobile: 'Móvel', 876 | aiGenerate: 'Geração IA com um clique', 877 | toc: 'Índice', 878 | whatIs: 'O que é Nano Banana Pro?', 879 | stats: 'Estatísticas', 880 | featuredPrompts: 'Prompts em destaque', 881 | allPrompts: 'Todos os prompts', 882 | howToContribute: 'Como contribuir', 883 | license: 'Licença', 884 | acknowledgements: 'Agradecimentos', 885 | starHistory: 'Histórico de estrelas', 886 | totalPrompts: 'Total de prompts', 887 | lastUpdated: 'Última atualização', 888 | metric: 'Métrica', 889 | count: 'Contagem', 890 | description: 'Descrição', 891 | prompt: 'Prompt', 892 | generatedImages: 'Imagens geradas', 893 | details: 'Detalhes', 894 | author: 'Autor', 895 | source: 'Fonte', 896 | published: 'Publicado', 897 | tryItNow: '👉 Experimente agora →', 898 | morePrompts: 'Mais prompts disponíveis', 899 | morePromptsDesc: 'mais prompts não mostrados aqui', 900 | viewAll: '👉 Ver todos os prompts na nossa galeria web', 901 | featured: 'Destaque', 902 | whatIsIntro: '**Nano Banana Pro** é o mais recente modelo de IA multimodal do Google com os seguintes recursos:', 903 | multimodalUnderstanding: '**Compreensão multimodal** - Processa texto, imagens e vídeo', 904 | highQualityGeneration: '**Geração de alta qualidade** - De estilos fotorrealistas a artísticos', 905 | fastIteration: '**Iteração rápida** - Edições e variações rápidas', 906 | diverseStyles: '**Estilos diversos** - De arte pixel a pinturas a óleo', 907 | preciseControl: '**Controle preciso** - Composição e iluminação detalhadas', 908 | complexScenes: '**Cenas complexas** - Renderização multiobjeto, multipersonagem', 909 | learnMore: '**Saiba mais**: [Nano Banana Pro: 10 casos reais](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 910 | raycastIntegration: 'Integração com Raycast', 911 | raycastDescription: 'Alguns prompts suportam **argumentos dinâmicos** usando a sintaxe [Raycast Snippets](https://raycast.com/help/snippets). Procure o emblema 🚀 Raycast Friendly!', 912 | example: 'Exemplo:', 913 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 914 | raycastUsage: 'Quando usado no Raycast, você pode substituir dinamicamente os argumentos para iterações rápidas!', 915 | galleryFeature1: '✨ Layout de grade Masonry bonito', 916 | galleryFeature2: '🔍 Busca de texto completo e filtros', 917 | galleryFeature3: '🌍 Suporte para 17 idiomas', 918 | galleryFeature4: '📱 Experiência otimizada para mobile', 919 | welcomeContributions: 'Acolhemos contribuições! Você pode enviar prompts através de:', 920 | githubIssue: 'GitHub Issue', 921 | submitNewPrompt: 'Enviar novo prompt', 922 | fillForm: 'Preencha o formulário com os detalhes do prompt e a imagem', 923 | submitWait: 'Envie e aguarde a revisão da equipe', 924 | approvedSync: 'Se aprovado (adicionaremos o rótulo `approved`), será sincronizado automaticamente com o CMS', 925 | appearInReadme: 'Seu prompt aparecerá no README em 4 horas', 926 | note: 'Nota:', 927 | noteContent: 'Aceitamos apenas envios via GitHub Issues para garantir o controle de qualidade.', 928 | seeContributing: 'Veja [CONTRIBUTING.md](docs/CONTRIBUTING.md) para diretrizes detalhadas.', 929 | licensedUnder: 'Licenciado sob [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 930 | autoGenerated: 'Este README é gerado automaticamente. Última atualização:', 931 | submitPrompt: 'Enviar um prompt', 932 | starRepo: 'Dar estrela a este repositório', 933 | sortedByDate: 'Ordenado por data de publicação (mais recente primeiro)', 934 | handPicked: 'Selecionados à mão pela nossa equipe por qualidade e criatividade excepcionais', 935 | githubReadme: 'GitHub README', 936 | youmindGallery: 'Galeria youmind.com', 937 | linearList: 'Lista linear', 938 | masonryGrid: 'Bela grade Masonry', 939 | ctrlFOnly: 'Apenas Ctrl+F', 940 | fullTextSearch: 'Busca de texto completo com filtros', 941 | basic: 'Básico', 942 | fullyResponsive: 'Totalmente responsivo', 943 | aiOneClickGen: 'Geração IA com um clique', 944 | categories: 'Categorias', 945 | categoryBrowsing: 'Navegação por categoria', 946 | browseByCategory: 'Explorar por categoria', 947 | }; 948 | 949 | const tr: Translation = { 950 | ...en, 951 | title: 'Harika Nano Banana Pro İstemleri', 952 | gemini3Promo: 'Gemini 3 istemleriyle ilgileniyorsanız, 50+ seçilmiş istem içeren diğer depomuzu kontrol etmekten çekinmeyin: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 953 | subtitle: "Google'ın Nano Banana Pro'su için yaratıcı istemler koleksiyonu", 954 | copyright: "**Telif Hakkı Bildirimi**: Tüm istemler eğitim amaçlı olarak topluluktan toplanmıştır. Herhangi bir içeriğin haklarınızı ihlal ettiğini düşünüyorsanız, lütfen [bir sorun açın](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) ve derhal kaldıralım.", 955 | viewInGallery: 'Web galerisinde görüntüle', 956 | browseGallery: '👉 YouMind Nano Banana Pro Galerisine Göz Atın', 957 | galleryFeatures: 'Neden galerimizi kullanmalısınız?', 958 | visualLayout: 'Görsel Düzen', 959 | search: 'Ara', 960 | languages: 'Diller', 961 | mobile: 'Mobil', 962 | aiGenerate: 'AI Tek Tıkla Üretim', 963 | toc: 'İçindekiler', 964 | whatIs: 'Nano Banana Pro nedir?', 965 | stats: 'İstatistikler', 966 | featuredPrompts: 'Öne Çıkan İstemler', 967 | allPrompts: 'Tüm İstemler', 968 | howToContribute: 'Nasıl Katkıda Bulunulur', 969 | license: 'Lisans', 970 | acknowledgements: 'Teşekkürler', 971 | starHistory: 'Yıldız Geçmişi', 972 | totalPrompts: 'Toplam İstem', 973 | lastUpdated: 'Son Güncelleme', 974 | metric: 'Metrik', 975 | count: 'Sayı', 976 | description: 'Açıklama', 977 | prompt: 'İstem', 978 | generatedImages: 'Oluşturulan Görseller', 979 | details: 'Detaylar', 980 | author: 'Yazar', 981 | source: 'Kaynak', 982 | published: 'Yayınlandı', 983 | tryItNow: '👉 Şimdi dene →', 984 | morePrompts: 'Daha fazla istem mevcut', 985 | morePromptsDesc: 'burada gösterilmeyen daha fazla istem', 986 | viewAll: '👉 Tüm istemleri web galerimizde görüntüleyin', 987 | featured: 'Öne Çıkan', 988 | whatIsIntro: '**Nano Banana Pro**, Google\'ın en yeni çok modlu AI modelidir ve şu özelliklere sahiptir:', 989 | multimodalUnderstanding: '**Çok Modlu Anlama** - Metin, görüntü ve video işleme', 990 | highQualityGeneration: '**Yüksek Kaliteli Üretim** - Fotoğraf gerçekçiliğinden sanatsal stillere', 991 | fastIteration: '**Hızlı Yineleme** - Hızlı düzenlemeler ve varyasyonlar', 992 | diverseStyles: '**Çeşitli Stiller** - Piksel sanatından yağlı boya tablolara', 993 | preciseControl: '**Hassas Kontrol** - Detaylı kompozisyon ve aydınlatma', 994 | complexScenes: '**Karmaşık Sahneler** - Çoklu nesne, çoklu karakter renderlama', 995 | learnMore: '**Daha Fazla Bilgi**: [Nano Banana Pro: 10 Gerçek Vaka](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 996 | raycastIntegration: 'Raycast Entegrasyonu', 997 | raycastDescription: 'Bazı istemler [Raycast Snippets](https://raycast.com/help/snippets) sözdizimini kullanarak **dinamik argümanlar** destekler. 🚀 Raycast Friendly rozetini arayın!', 998 | example: 'Örnek:', 999 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 1000 | raycastUsage: 'Raycast\'te kullanıldığında, hızlı yinelemeler için argümanları dinamik olarak değiştirebilirsiniz!', 1001 | galleryFeature1: '✨ Güzel Masonry grid düzeni', 1002 | galleryFeature2: '🔍 Tam metin arama ve filtreler', 1003 | galleryFeature3: '🌍 17 dil desteği', 1004 | galleryFeature4: '📱 Mobil optimize deneyim', 1005 | welcomeContributions: 'Katkıları memnuniyetle karşılıyoruz! İstemleri şu yollarla gönderebilirsiniz:', 1006 | githubIssue: 'GitHub Issue', 1007 | submitNewPrompt: 'Yeni İstem Gönder', 1008 | fillForm: 'Formu istem detayları ve görsel ile doldurun', 1009 | submitWait: 'Gönderin ve ekip incelemesini bekleyin', 1010 | approvedSync: 'Onaylanırsa (`approved` etiketi ekleyeceğiz), otomatik olarak CMS\'e senkronize edilecektir', 1011 | appearInReadme: 'İsteminiz 4 saat içinde README\'de görünecektir', 1012 | note: 'Not:', 1013 | noteContent: 'Kalite kontrolünü sağlamak için yalnızca GitHub Issues aracılığıyla gönderimleri kabul ediyoruz.', 1014 | seeContributing: 'Detaylı yönergeler için [CONTRIBUTING.md](docs/CONTRIBUTING.md) dosyasına bakın.', 1015 | licensedUnder: '[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) altında lisanslanmıştır.', 1016 | autoGenerated: 'Bu README otomatik olarak oluşturulmuştur. Son güncelleme:', 1017 | submitPrompt: 'Bir İstem Gönder', 1018 | starRepo: 'Bu depoya yıldız verin', 1019 | sortedByDate: 'Yayın tarihine göre sıralandı (en yeni önce)', 1020 | handPicked: 'Ekibimiz tarafından olağanüstü kalite ve yaratıcılık için özenle seçildi', 1021 | githubReadme: 'GitHub README', 1022 | youmindGallery: 'youmind.com Galerisi', 1023 | linearList: 'Doğrusal liste', 1024 | masonryGrid: 'Güzel Masonry Grid', 1025 | ctrlFOnly: 'Sadece Ctrl+F', 1026 | fullTextSearch: 'Filtrelerle tam metin arama', 1027 | basic: 'Temel', 1028 | fullyResponsive: 'Tamamen duyarlı', 1029 | aiOneClickGen: 'AI Tek Tıkla Üretim', 1030 | categories: 'Kategoriler', 1031 | categoryBrowsing: 'Kategori gezinmesi', 1032 | browseByCategory: 'Kategoriye göre gözat', 1033 | }; 1034 | 1035 | const vi: Translation = { 1036 | ...en, 1037 | title: 'Tuyển tập Nano Banana Pro Prompts', 1038 | gemini3Promo: 'Nếu bạn quan tâm đến các câu lệnh Gemini 3, vui lòng xem kho lưu trữ khác của chúng tôi với hơn 50 câu lệnh được tuyển chọn: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 1039 | subtitle: "Bộ sưu tập các câu lệnh sáng tạo cho Google Nano Banana Pro", 1040 | copyright: "**Thông báo bản quyền**: Tất cả các câu lệnh được thu thập từ cộng đồng cho mục đích giáo dục. Nếu bạn tin rằng bất kỳ nội dung nào vi phạm quyền của bạn, vui lòng [mở một issue](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) và chúng tôi sẽ xóa nó ngay lập tức.", 1041 | viewInGallery: 'Xem trong Thư viện Web', 1042 | browseGallery: '👉 Duyệt trên Thư viện YouMind Nano Banana Pro', 1043 | galleryFeatures: 'Tại sao nên sử dụng thư viện của chúng tôi?', 1044 | visualLayout: 'Bố cục trực quan', 1045 | search: 'Tìm kiếm', 1046 | languages: 'Ngôn ngữ', 1047 | mobile: 'Di động', 1048 | aiGenerate: 'Tạo bằng AI một cú nhấp', 1049 | toc: 'Mục lục', 1050 | whatIs: 'Nano Banana Pro là gì?', 1051 | stats: 'Thống kê', 1052 | featuredPrompts: 'Câu lệnh nổi bật', 1053 | allPrompts: 'Tất cả câu lệnh', 1054 | howToContribute: 'Cách đóng góp', 1055 | license: 'Giấy phép', 1056 | acknowledgements: 'Lời cảm ơn', 1057 | starHistory: 'Lịch sử sao', 1058 | totalPrompts: 'Tổng số câu lệnh', 1059 | lastUpdated: 'Cập nhật lần cuối', 1060 | metric: 'Chỉ số', 1061 | count: 'Số lượng', 1062 | description: 'Mô tả', 1063 | prompt: 'Câu lệnh', 1064 | generatedImages: 'Hình ảnh được tạo', 1065 | details: 'Chi tiết', 1066 | author: 'Tác giả', 1067 | source: 'Nguồn', 1068 | published: 'Đã xuất bản', 1069 | tryItNow: '👉 Thử ngay →', 1070 | morePrompts: 'Thêm câu lệnh có sẵn', 1071 | morePromptsDesc: 'câu lệnh khác không hiển thị ở đây', 1072 | viewAll: '👉 Xem tất cả câu lệnh trong thư viện web của chúng tôi', 1073 | featured: 'Nổi bật', 1074 | whatIsIntro: '**Nano Banana Pro** là mô hình AI đa phương thức mới nhất của Google với các tính năng sau:', 1075 | multimodalUnderstanding: '**Hiểu đa phương thức** - Xử lý văn bản, hình ảnh và video', 1076 | highQualityGeneration: '**Tạo chất lượng cao** - Từ phong cách chân thực đến nghệ thuật', 1077 | fastIteration: '**Lặp lại nhanh** - Chỉnh sửa và biến thể nhanh chóng', 1078 | diverseStyles: '**Phong cách đa dạng** - Từ nghệ thuật pixel đến tranh sơn dầu', 1079 | preciseControl: '**Kiểm soát chính xác** - Bố cục và ánh sáng chi tiết', 1080 | complexScenes: '**Cảnh phức tạp** - Kết xuất đa đối tượng, đa nhân vật', 1081 | learnMore: '**Tìm hiểu thêm**: [Nano Banana Pro: 10 trường hợp thực tế](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 1082 | raycastIntegration: 'Tích hợp Raycast', 1083 | raycastDescription: 'Một số câu lệnh hỗ trợ **đối số động** sử dụng cú pháp [Raycast Snippets](https://raycast.com/help/snippets). Tìm huy hiệu 🚀 Raycast Friendly!', 1084 | example: 'Ví dụ:', 1085 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 1086 | raycastUsage: 'Khi sử dụng trong Raycast, bạn có thể thay thế động các đối số để lặp lại nhanh chóng!', 1087 | galleryFeature1: '✨ Bố cục lưới Masonry đẹp mắt', 1088 | galleryFeature2: '🔍 Tìm kiếm toàn văn và bộ lọc', 1089 | galleryFeature3: '🌍 Hỗ trợ 17 ngôn ngữ', 1090 | galleryFeature4: '📱 Trải nghiệm tối ưu cho di động', 1091 | welcomeContributions: 'Chúng tôi hoan nghênh đóng góp! Bạn có thể gửi câu lệnh qua:', 1092 | githubIssue: 'GitHub Issue', 1093 | submitNewPrompt: 'Gửi câu lệnh mới', 1094 | fillForm: 'Điền vào biểu mẫu với chi tiết câu lệnh và hình ảnh', 1095 | submitWait: 'Gửi và chờ đánh giá của nhóm', 1096 | approvedSync: 'Nếu được phê duyệt (chúng tôi sẽ thêm nhãn `approved`), nó sẽ tự động đồng bộ với CMS', 1097 | appearInReadme: 'Câu lệnh của bạn sẽ xuất hiện trong README trong vòng 4 giờ', 1098 | note: 'Lưu ý:', 1099 | noteContent: 'Chúng tôi chỉ chấp nhận gửi qua GitHub Issues để đảm bảo kiểm soát chất lượng.', 1100 | seeContributing: 'Xem [CONTRIBUTING.md](docs/CONTRIBUTING.md) để biết hướng dẫn chi tiết.', 1101 | licensedUnder: 'Được cấp phép theo [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).', 1102 | autoGenerated: 'README này được tạo tự động. Cập nhật lần cuối:', 1103 | submitPrompt: 'Gửi một câu lệnh', 1104 | starRepo: 'Đánh dấu sao cho kho lưu trữ này', 1105 | sortedByDate: 'Sắp xếp theo ngày xuất bản (mới nhất trước)', 1106 | handPicked: 'Được nhóm của chúng tôi chọn lọc thủ công vì chất lượng và sáng tạo xuất sắc', 1107 | githubReadme: 'GitHub README', 1108 | youmindGallery: 'Thư viện youmind.com', 1109 | linearList: 'Danh sách tuyến tính', 1110 | masonryGrid: 'Lưới Masonry đẹp mắt', 1111 | ctrlFOnly: 'Chỉ Ctrl+F', 1112 | fullTextSearch: 'Tìm kiếm toàn văn với bộ lọc', 1113 | basic: 'Cơ bản', 1114 | fullyResponsive: 'Hoàn toàn phản hồi', 1115 | aiOneClickGen: 'Tạo bằng AI một cú nhấp', 1116 | categories: 'Danh mục', 1117 | categoryBrowsing: 'Duyệt theo danh mục', 1118 | browseByCategory: 'Duyệt theo danh mục', 1119 | }; 1120 | 1121 | const th: Translation = { 1122 | ...en, 1123 | title: 'สุดยอด Nano Banana Pro Prompts', 1124 | gemini3Promo: 'หากคุณสนใจคำสั่ง Gemini 3 โปรดดูที่เก็บอื่นของเราที่มีคำสั่งที่คัดเลือกมากกว่า 50 รายการ: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 1125 | subtitle: "คอลเลกชันคำสั่งสร้างสรรค์สำหรับ Google Nano Banana Pro", 1126 | copyright: "**ประกาศลิขสิทธิ์**: คำสั่งทั้งหมดรวบรวมจากชุมชนเพื่อการศึกษา หากคุณเชื่อว่าเนื้อหาใดละเมิดสิทธิ์ของคุณ โปรด [เปิดปัญหา](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) และเราจะลบออกทันที", 1127 | viewInGallery: 'ดูในแกลเลอรีเว็บ', 1128 | browseGallery: '👉 เรียกดูใน YouMind Nano Banana Pro Gallery', 1129 | galleryFeatures: 'ทำไมต้องใช้แกลเลอรีของเรา?', 1130 | visualLayout: 'รูปแบบภาพ', 1131 | search: 'ค้นหา', 1132 | languages: 'ภาษา', 1133 | mobile: 'มือถือ', 1134 | aiGenerate: 'สร้างด้วย AI คลิกเดียว', 1135 | toc: 'สารบัญ', 1136 | whatIs: 'Nano Banana Pro คืออะไร?', 1137 | stats: 'สถิติ', 1138 | featuredPrompts: 'คำสั่งแนะนำ', 1139 | allPrompts: 'คำสั่งทั้งหมด', 1140 | howToContribute: 'วิธีการมีส่วนร่วม', 1141 | license: 'ใบอนุญาต', 1142 | acknowledgements: 'กิตติกรรมประกาศ', 1143 | starHistory: 'ประวัติดาว', 1144 | totalPrompts: 'คำสั่งทั้งหมด', 1145 | lastUpdated: 'อัปเดตล่าสุด', 1146 | metric: 'เมตริก', 1147 | count: 'จำนวน', 1148 | description: 'คำอธิบาย', 1149 | prompt: 'คำสั่ง', 1150 | generatedImages: 'รูปภาพที่สร้าง', 1151 | details: 'รายละเอียด', 1152 | author: 'ผู้เขียน', 1153 | source: 'แหล่งที่มา', 1154 | published: 'เผยแพร่เมื่อ', 1155 | tryItNow: '👉 ลองเลย →', 1156 | morePrompts: 'มีคำสั่งเพิ่มเติม', 1157 | morePromptsDesc: 'คำสั่งเพิ่มเติมที่ไม่ได้แสดงที่นี่', 1158 | viewAll: '👉 ดูคำสั่งทั้งหมดในแกลเลอรีเว็บของเรา', 1159 | featured: 'แนะนำ', 1160 | whatIsIntro: '**Nano Banana Pro** เป็นโมเดล AI แบบหลายรูปแบบล่าสุดของ Google ที่มีคุณสมบัติดังนี้:', 1161 | multimodalUnderstanding: '**ความเข้าใจแบบหลายรูปแบบ** - ประมวลผลข้อความ รูปภาพ และวิดีโอ', 1162 | highQualityGeneration: '**การสร้างคุณภาพสูง** - จากสไตล์เหมือนจริงไปจนถึงศิลปะ', 1163 | fastIteration: '**การทำซ้ำอย่างรวดเร็ว** - การแก้ไขและการเปลี่ยนแปลงอย่างรวดเร็ว', 1164 | diverseStyles: '**สไตล์ที่หลากหลาย** - จากศิลปะพิกเซลไปจนถึงภาพวาดสีน้ำมัน', 1165 | preciseControl: '**การควบคุมที่แม่นยำ** - องค์ประกอบและแสงที่ละเอียด', 1166 | complexScenes: '**ฉากที่ซับซ้อน** - การเรนเดอร์หลายวัตถุ หลายตัวละคร', 1167 | learnMore: '**เรียนรู้เพิ่มเติม**: [Nano Banana Pro: 10 กรณีจริง](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 1168 | raycastIntegration: 'การรวม Raycast', 1169 | raycastDescription: 'คำสั่งบางคำสั่งรองรับ **อาร์กิวเมนต์แบบไดนามิก** โดยใช้ไวยากรณ์ [Raycast Snippets](https://raycast.com/help/snippets) ค้นหาเครื่องหมาย 🚀 Raycast Friendly!', 1170 | example: 'ตัวอย่าง:', 1171 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 1172 | raycastUsage: 'เมื่อใช้ใน Raycast คุณสามารถแทนที่อาร์กิวเมนต์แบบไดนามิกเพื่อทำซ้ำอย่างรวดเร็ว!', 1173 | galleryFeature1: '✨ เลย์เอาต์กริด Masonry ที่สวยงาม', 1174 | galleryFeature2: '🔍 การค้นหาข้อความเต็มและตัวกรอง', 1175 | galleryFeature3: '🌍 รองรับ 17 ภาษา', 1176 | galleryFeature4: '📱 ประสบการณ์ที่เหมาะสำหรับมือถือ', 1177 | welcomeContributions: 'เรายินดีต้อนรับการมีส่วนร่วม! คุณสามารถส่งคำสั่งผ่าน:', 1178 | githubIssue: 'GitHub Issue', 1179 | submitNewPrompt: 'ส่งคำสั่งใหม่', 1180 | fillForm: 'กรอกแบบฟอร์มพร้อมรายละเอียดคำสั่งและรูปภาพ', 1181 | submitWait: 'ส่งและรอการตรวจสอบจากทีม', 1182 | approvedSync: 'หากได้รับการอนุมัติ (เราจะเพิ่มป้ายกำกับ `approved`) มันจะซิงค์กับ CMS โดยอัตโนมัติ', 1183 | appearInReadme: 'คำสั่งของคุณจะปรากฏใน README ภายใน 4 ชั่วโมง', 1184 | note: 'หมายเหตุ:', 1185 | noteContent: 'เรารับเฉพาะการส่งผ่าน GitHub Issues เพื่อให้แน่ใจว่ามีการควบคุมคุณภาพ', 1186 | seeContributing: 'ดู [CONTRIBUTING.md](docs/CONTRIBUTING.md) สำหรับแนวทางโดยละเอียด', 1187 | licensedUnder: 'ได้รับอนุญาตภายใต้ [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)', 1188 | autoGenerated: 'README นี้ถูกสร้างขึ้นโดยอัตโนมัติ อัปเดตล่าสุด:', 1189 | submitPrompt: 'ส่งคำสั่ง', 1190 | starRepo: 'ให้ดาวกับที่เก็บนี้', 1191 | sortedByDate: 'เรียงตามวันที่เผยแพร่ (ใหม่ล่าสุดก่อน)', 1192 | handPicked: 'คัดเลือกโดยทีมของเราสำหรับคุณภาพและความคิดสร้างสรรค์ที่ยอดเยี่ยม', 1193 | githubReadme: 'GitHub README', 1194 | youmindGallery: 'แกลเลอรี youmind.com', 1195 | linearList: 'รายการเชิงเส้น', 1196 | masonryGrid: 'กริด Masonry ที่สวยงาม', 1197 | ctrlFOnly: 'Ctrl+F เท่านั้น', 1198 | fullTextSearch: 'การค้นหาข้อความเต็มพร้อมตัวกรอง', 1199 | basic: 'พื้นฐาน', 1200 | fullyResponsive: 'ตอบสนองอย่างเต็มที่', 1201 | aiOneClickGen: 'สร้างด้วย AI คลิกเดียว', 1202 | categories: 'หมวดหมู่', 1203 | categoryBrowsing: 'เรียกดูตามหมวดหมู่', 1204 | browseByCategory: 'เรียกดูตามหมวดหมู่', 1205 | }; 1206 | 1207 | const hi: Translation = { 1208 | ...en, 1209 | title: 'शानदार Nano Banana Pro प्रॉम्पट्स', 1210 | gemini3Promo: 'यदि आप Gemini 3 प्रॉम्पट्स में रुचि रखते हैं, तो कृपया 50+ चयनित प्रॉम्पट्स के साथ हमारे अन्य रिपॉजिटरी को देखें: https://github.com/YouMind-OpenLab/awesome-gemini-3-prompts', 1211 | subtitle: "Google Nano Banana Pro के लिए रचनात्मक प्रॉम्पट्स का संग्रह", 1212 | copyright: "**कॉपीराइट सूचना**: सभी प्रॉम्पट्स शैक्षिक उद्देश्यों के लिए समुदाय से एकत्र किए गए हैं। यदि आपको लगता है कि कोई सामग्री आपके अधिकारों का उल्लंघन करती है, तो कृपया [एक समस्या खोलें](https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts/issues/new?template=bug-report.yml) और हम इसे तुरंत हटा देंगे।", 1213 | viewInGallery: 'वेब गैलरी में देखें', 1214 | browseGallery: '👉 YouMind Nano Banana Pro गैलरी ब्राउज़ करें', 1215 | galleryFeatures: 'हमारी गैलरी का उपयोग क्यों करें?', 1216 | visualLayout: 'दृश्य लेआउट', 1217 | search: 'खोजें', 1218 | languages: 'भाषाएं', 1219 | mobile: 'मोबाइल', 1220 | aiGenerate: 'AI एक-क्लिक जनरेशन', 1221 | toc: 'विषय सूची', 1222 | whatIs: 'Nano Banana Pro क्या है?', 1223 | stats: 'आंकड़े', 1224 | featuredPrompts: 'विशेष प्रॉम्पट्स', 1225 | allPrompts: 'सभी प्रॉम्पट्स', 1226 | howToContribute: 'योगदान कैसे करें', 1227 | license: 'लाइसेंस', 1228 | acknowledgements: 'आभार', 1229 | starHistory: 'स्टार इतिहास', 1230 | totalPrompts: 'कुल प्रॉम्पट्स', 1231 | lastUpdated: 'अंतिम अपडेट', 1232 | metric: 'मीट्रिक', 1233 | count: 'गिनती', 1234 | description: 'विवरण', 1235 | prompt: 'प्रॉम्पट', 1236 | generatedImages: 'उत्पन्न चित्र', 1237 | details: 'विवरण', 1238 | author: 'लेखक', 1239 | source: 'स्रोत', 1240 | published: 'प्रकाशित', 1241 | tryItNow: '👉 अभी आज़माएं →', 1242 | morePrompts: 'अधिक प्रॉम्पट्स उपलब्ध', 1243 | morePromptsDesc: 'और प्रॉम्पट्स यहां नहीं दिखाए गए हैं', 1244 | viewAll: '👉 हमारी वेब गैलरी में सभी प्रॉम्पट्स देखें', 1245 | featured: 'विशेष', 1246 | whatIsIntro: '**Nano Banana Pro** Google का नवीनतम मल्टीमॉडल AI मॉडल है जिसमें निम्नलिखित विशेषताएं हैं:', 1247 | multimodalUnderstanding: '**मल्टीमॉडल समझ** - टेक्स्ट, छवियों और वीडियो को प्रोसेस करें', 1248 | highQualityGeneration: '**उच्च गुणवत्ता जनरेशन** - फोटोरियलिस्टिक से कलात्मक शैलियों तक', 1249 | fastIteration: '**तेज़ पुनरावृत्ति** - त्वरित संपादन और विविधताएं', 1250 | diverseStyles: '**विविध शैलियां** - पिक्सेल आर्ट से तेल चित्रों तक', 1251 | preciseControl: '**सटीक नियंत्रण** - विस्तृत रचना और प्रकाश व्यवस्था', 1252 | complexScenes: '**जटिल दृश्य** - मल्टी-ऑब्जेक्ट, मल्टी-कैरेक्टर रेंडरिंग', 1253 | learnMore: '**अधिक जानें**: [Nano Banana Pro: 10 वास्तविक मामले](https://youmind.com/blog/nano-banana-pro-10-real-cases)', 1254 | raycastIntegration: 'Raycast एकीकरण', 1255 | raycastDescription: 'कुछ प्रॉम्पट्स [Raycast Snippets](https://raycast.com/help/snippets) सिंटैक्स का उपयोग करके **गतिशील तर्क** का समर्थन करते हैं। 🚀 Raycast Friendly बैज देखें!', 1256 | example: 'उदाहरण:', 1257 | raycastExample: 'A quote card with "{argument name="quote" default="Stay hungry, stay foolish"}"\nby {argument name="author" default="Steve Jobs"}', 1258 | raycastUsage: 'Raycast में उपयोग करते समय, आप त्वरित पुनरावृत्ति के लिए तर्कों को गतिशील रूप से प्रतिस्थापित कर सकते हैं!', 1259 | galleryFeature1: '✨ सुंदर Masonry ग्रिड लेआउट', 1260 | galleryFeature2: '🔍 पूर्ण-पाठ खोज और फ़िल्टर', 1261 | galleryFeature3: '🌍 17 भाषाओं का समर्थन', 1262 | galleryFeature4: '📱 मोबाइल-अनुकूलित अनुभव', 1263 | welcomeContributions: 'हम योगदान का स्वागत करते हैं! आप निम्नलिखित तरीकों से प्रॉम्पट्स जमा कर सकते हैं:', 1264 | githubIssue: 'GitHub Issue', 1265 | submitNewPrompt: 'नया प्रॉम्पट जमा करें', 1266 | fillForm: 'प्रॉम्पट विवरण और छवि के साथ फॉर्म भरें', 1267 | submitWait: 'जमा करें और टीम समीक्षा की प्रतीक्षा करें', 1268 | approvedSync: 'यदि अनुमोदित (हम `approved` लेबल जोड़ेंगे), तो यह स्वचालित रूप से CMS के साथ सिंक हो जाएगा', 1269 | appearInReadme: 'आपका प्रॉम्पट 4 घंटे के भीतर README में दिखाई देगा', 1270 | note: 'नोट:', 1271 | noteContent: 'गुणवत्ता नियंत्रण सुनिश्चित करने के लिए हम केवल GitHub Issues के माध्यम से जमा स्वीकार करते हैं।', 1272 | seeContributing: 'विस्तृत दिशानिर्देशों के लिए [CONTRIBUTING.md](docs/CONTRIBUTING.md) देखें।', 1273 | licensedUnder: '[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस प्राप्त।', 1274 | autoGenerated: 'यह README स्वचालित रूप से जेनरेट किया गया है। अंतिम अपडेट:', 1275 | submitPrompt: 'एक प्रॉम्पट जमा करें', 1276 | starRepo: 'इस रिपॉजिटरी को स्टार करें', 1277 | sortedByDate: 'प्रकाशन तिथि के अनुसार क्रमबद्ध (नवीनतम पहले)', 1278 | handPicked: 'असाधारण गुणवत्ता और रचनात्मकता के लिए हमारी टीम द्वारा हाथ से चुना गया', 1279 | githubReadme: 'GitHub README', 1280 | youmindGallery: 'youmind.com गैलरी', 1281 | linearList: 'रैखिक सूची', 1282 | masonryGrid: 'सुंदर Masonry ग्रिड', 1283 | ctrlFOnly: 'केवल Ctrl+F', 1284 | fullTextSearch: 'फ़िल्टर के साथ पूर्ण-पाठ खोज', 1285 | basic: 'बुनियादी', 1286 | fullyResponsive: 'पूरी तरह से उत्तरदायी', 1287 | aiOneClickGen: 'AI एक-क्लिक जनरेशन', 1288 | categories: 'श्रेणियाँ', 1289 | categoryBrowsing: 'श्रेणी ब्राउज़िंग', 1290 | browseByCategory: 'श्रेणी के अनुसार ब्राउज़ करें', 1291 | }; 1292 | 1293 | const I18N: Record = { 1294 | 'en': en, 1295 | 'zh': zh, 1296 | 'zh-TW': zhTW, 1297 | 'ja-JP': ja, 1298 | 'ko-KR': ko, 1299 | 'th-TH': th, 1300 | 'vi-VN': vi, 1301 | 'hi-IN': hi, 1302 | 'es-ES': es, 1303 | 'es-419': es, // Fallback to es for now 1304 | 'de-DE': de, 1305 | 'fr-FR': fr, 1306 | 'it-IT': it, 1307 | 'pt-BR': pt, 1308 | 'pt-PT': pt, // Fallback to pt-BR or similar if not distinct enough yet 1309 | 'tr-TR': tr, 1310 | }; 1311 | 1312 | export function t(key: keyof Translation, locale: string): string { 1313 | // Try specific locale match first 1314 | if (I18N[locale] && I18N[locale][key]) { 1315 | return I18N[locale][key]; 1316 | } 1317 | 1318 | // Fallback logic 1319 | if (locale === 'es-419') return I18N['es-ES'][key] || en[key]; 1320 | if (locale === 'pt-PT') return I18N['pt-BR'][key] || en[key]; 1321 | 1322 | // Default fallback to English 1323 | return en[key] || key; 1324 | } 1325 | 1326 | --------------------------------------------------------------------------------