Spaces:
Running
Running
Commit
·
c6993bf
1
Parent(s):
d2964e5
init
Browse files- .DS_Store +0 -0
- .gitattributes +4 -0
- .gitignore +5 -0
- README.md +75 -14
- app.py +1169 -0
- datas/cat01.webp +3 -0
- datas/panda01.jpeg +3 -0
- datas/panda01m.jpeg +3 -0
- i18n/ar.json +102 -0
- i18n/da.json +100 -0
- i18n/de.json +102 -0
- i18n/en.json +102 -0
- i18n/es.json +102 -0
- i18n/fi.json +102 -0
- i18n/fr.json +102 -0
- i18n/he.json +102 -0
- i18n/id.json +102 -0
- i18n/it.json +102 -0
- i18n/ja.json +102 -0
- i18n/nl.json +102 -0
- i18n/no.json +102 -0
- i18n/pt.json +102 -0
- i18n/ru.json +102 -0
- i18n/sv.json +102 -0
- i18n/tr.json +102 -0
- i18n/uk.json +102 -0
- i18n/vi.json +102 -0
- i18n/zh.json +102 -0
- labels.json +4 -0
- nfsw.py +262 -0
- push.sh +13 -0
- requirements.txt +10 -0
- tmp/1.txt +14 -0
- util.py +880 -0
.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
.gitattributes
CHANGED
|
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
*.webp filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
*.jpg filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.jpg
|
| 2 |
+
*.png
|
| 3 |
+
hf_cache/
|
| 4 |
+
models/
|
| 5 |
+
__pycache__/
|
README.md
CHANGED
|
@@ -1,14 +1,75 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# AI Text to Image Generator
|
| 2 |
+
|
| 3 |
+
A powerful AI-powered text-to-image generation application that creates stunning images from text descriptions.
|
| 4 |
+
|
| 5 |
+
## Features
|
| 6 |
+
|
| 7 |
+
- **Text-to-Image Generation**: Simply enter a text prompt and generate high-quality images
|
| 8 |
+
- **Multiple Aspect Ratios**: Choose from 5 different aspect ratios:
|
| 9 |
+
- 16:9 (1364x768) - Landscape
|
| 10 |
+
- 4:3 (1182x887) - Traditional
|
| 11 |
+
- 1:1 (1024x1024) - Square
|
| 12 |
+
- 3:4 (887x1182) - Portrait
|
| 13 |
+
- 9:16 (768x1364) - Mobile
|
| 14 |
+
- **Rate Limiting**: Built-in rate limiting to manage free tier usage
|
| 15 |
+
- **NSFW Detection**: Automatic content filtering for safe usage
|
| 16 |
+
- **Progress Tracking**: Real-time progress updates during generation
|
| 17 |
+
- **Queue Management**: Smart queue system with priority support
|
| 18 |
+
|
| 19 |
+
## How to Use
|
| 20 |
+
|
| 21 |
+
1. Enter a detailed text prompt describing the image you want to generate
|
| 22 |
+
2. Select your desired aspect ratio
|
| 23 |
+
3. Click "Generate Image"
|
| 24 |
+
4. Wait for the AI to process your request
|
| 25 |
+
5. Download or view your generated image
|
| 26 |
+
|
| 27 |
+
## Installation
|
| 28 |
+
|
| 29 |
+
```bash
|
| 30 |
+
pip install -r requirements.txt
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
## Environment Variables
|
| 34 |
+
|
| 35 |
+
Set up the following environment variable:
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
export OneKey="TOKEN#APIKEY#UKAPIURL#LLMKEY#R2_ACCESS_KEY#R2_SECRET_KEY#R2_ENDPOINT#GoodWebsiteUrl"
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
## Running the Application
|
| 42 |
+
|
| 43 |
+
```bash
|
| 44 |
+
python app.py
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
The application will start on `http://0.0.0.0:7860`
|
| 48 |
+
|
| 49 |
+
## Tips for Best Results
|
| 50 |
+
|
| 51 |
+
- **Be Specific**: Use detailed, descriptive prompts
|
| 52 |
+
- **Style Keywords**: Include style keywords like "photorealistic", "oil painting", "anime", etc.
|
| 53 |
+
- **Aspect Ratio**: Choose the right aspect ratio for your use case
|
| 54 |
+
- **Details Matter**: Add details about mood, lighting, camera angle, etc.
|
| 55 |
+
|
| 56 |
+
## Use Cases
|
| 57 |
+
|
| 58 |
+
- Digital Art & Illustrations
|
| 59 |
+
- Character Design
|
| 60 |
+
- Concept Art
|
| 61 |
+
- Social Media Content
|
| 62 |
+
- Marketing Materials
|
| 63 |
+
- Product Visualization
|
| 64 |
+
- Creative Exploration
|
| 65 |
+
|
| 66 |
+
## Technology
|
| 67 |
+
|
| 68 |
+
- Built with Gradio for the web interface
|
| 69 |
+
- Uses advanced AI models for image generation
|
| 70 |
+
- Cloudflare R2 for image storage
|
| 71 |
+
- Real-time progress tracking and queue management
|
| 72 |
+
|
| 73 |
+
## License
|
| 74 |
+
|
| 75 |
+
See LICENSE file for details.
|
app.py
ADDED
|
@@ -0,0 +1,1169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import threading
|
| 3 |
+
import os
|
| 4 |
+
import shutil
|
| 5 |
+
import tempfile
|
| 6 |
+
import time
|
| 7 |
+
import json
|
| 8 |
+
from util import process_text_to_image, download_and_check_result_nsfw, GoodWebsiteUrl
|
| 9 |
+
from nfsw import NSFWDetector
|
| 10 |
+
|
| 11 |
+
# Simplified i18n - English only
|
| 12 |
+
translations = {
|
| 13 |
+
"en": {
|
| 14 |
+
"header_title": "🎨 AI Text to Image Generator",
|
| 15 |
+
"prompt_input_label": "Enter your prompt",
|
| 16 |
+
"prompt_input_placeholder": "Describe the image you want to generate...",
|
| 17 |
+
"aspect_ratio_label": "Aspect Ratio",
|
| 18 |
+
"generate_button": "🚀 Generate Image",
|
| 19 |
+
"output_image_label": "Generated Image",
|
| 20 |
+
"status_output_label": "Status",
|
| 21 |
+
"prompt_examples_header": "### 💡 Prompt Examples",
|
| 22 |
+
"error_enter_prompt": "Please enter a prompt",
|
| 23 |
+
"error_prompt_too_short": "❌ Prompt must be more than 3 characters",
|
| 24 |
+
"error_request_processing": "❌ Request processing error",
|
| 25 |
+
"error_free_limit_reached": "❌ You have reached the free generation limit. Please visit https://omnicreator.net/text-to-image for unlimited generation",
|
| 26 |
+
"error_free_limit_wait": "❌ Please wait {wait_minutes_int} minutes before generating again, or visit https://omnicreator.net/text-to-image for unlimited generation",
|
| 27 |
+
"status_completed_message": "✅ {message}",
|
| 28 |
+
"status_processing_completed": "Processing completed",
|
| 29 |
+
"error_processing_failed": "❌ {message}",
|
| 30 |
+
"error_processing_exception": "❌ Error occurred: {error}",
|
| 31 |
+
"warning_content_filter": "⚠️ Content filter applied. For unlimited creative freedom, visit https://omnicreator.net/text-to-image",
|
| 32 |
+
"status_checking_result": "Checking result...",
|
| 33 |
+
"status_applying_filter": "Applying filter...",
|
| 34 |
+
}
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
def t(key, lang="en"):
|
| 38 |
+
return translations.get(lang, {}).get(key, key)
|
| 39 |
+
|
| 40 |
+
# Configuration parameters
|
| 41 |
+
|
| 42 |
+
TIP_TRY_N = 4 # Show like button tip after 12 tries
|
| 43 |
+
FREE_TRY_N = 8 # Free phase: first 15 tries without restrictions
|
| 44 |
+
SLOW_TRY_N = 12 # Slow phase start: 25 tries
|
| 45 |
+
SLOW2_TRY_N = 18 # Slow phase start: 32 tries
|
| 46 |
+
RATE_LIMIT_60 = 25 # Full restriction: blocked after 40 tries
|
| 47 |
+
|
| 48 |
+
# Time window configuration (minutes)
|
| 49 |
+
PHASE_1_WINDOW = 3 # 15-25 tries: 5 minutes
|
| 50 |
+
PHASE_2_WINDOW = 10 # 25-32 tries: 10 minutes
|
| 51 |
+
PHASE_3_WINDOW = 20 # 32-40 tries: 20 minutes
|
| 52 |
+
MAX_IMAGES_PER_WINDOW = 2 # Max images per time window
|
| 53 |
+
high_priority_n = 2 # 每个ip开头几个任务是高优先级的
|
| 54 |
+
|
| 55 |
+
IP_Dict = {}
|
| 56 |
+
# IP generation statistics and time window tracking
|
| 57 |
+
IP_Generation_Count = {} # Record total generation count for each IP
|
| 58 |
+
IP_Rate_Limit_Track = {} # Record generation count and timestamp in current time window for each IP
|
| 59 |
+
IP_Country_Cache = {} # Cache IP country information to avoid repeated queries
|
| 60 |
+
|
| 61 |
+
# Country usage statistics
|
| 62 |
+
Country_Usage_Stats = {} # Track usage count by country
|
| 63 |
+
Total_Request_Count = 0 # Total request counter for periodic printing
|
| 64 |
+
PRINT_STATS_INTERVAL = 10 # Print stats every N requests
|
| 65 |
+
|
| 66 |
+
# Async IP query tracking
|
| 67 |
+
IP_Query_Results = {} # Track async query results
|
| 68 |
+
|
| 69 |
+
# Restricted countries list (these countries have lower usage limits)
|
| 70 |
+
RESTRICTED_COUNTRIES = ["印度", "巴基斯坦"]
|
| 71 |
+
RESTRICTED_COUNTRY_LIMIT = 2 # Max usage for restricted countries
|
| 72 |
+
|
| 73 |
+
country_dict = {
|
| 74 |
+
"zh": ["中国", "香港"],
|
| 75 |
+
"fi": ["芬兰"],
|
| 76 |
+
"en": ["美国", "澳大利亚", "英国", "加拿大", "新西兰", "爱尔兰"],
|
| 77 |
+
"es": ["西班牙", "墨西哥", "阿根廷", "哥伦比亚", "智利", "秘鲁"],
|
| 78 |
+
"pt": ["葡萄牙", "巴西"],
|
| 79 |
+
"fr": ["法国", "摩纳哥"],
|
| 80 |
+
"de": ["德国", "奥地利", ],
|
| 81 |
+
"it": ["意大利", "圣马力诺", "梵蒂冈"],
|
| 82 |
+
"ja": ["日本"],
|
| 83 |
+
"ru": ["俄罗斯"],
|
| 84 |
+
"uk": ["乌克兰"],
|
| 85 |
+
"ar": ["沙特阿拉伯", "埃及", "阿拉伯联合酋长国", "摩洛哥"],
|
| 86 |
+
"nl":["荷兰"],
|
| 87 |
+
"no":["挪威"],
|
| 88 |
+
"sv":["瑞典"],
|
| 89 |
+
"id":["印度尼西亚"],
|
| 90 |
+
"vi": ["越南"],
|
| 91 |
+
"he": ["以色列"],
|
| 92 |
+
"tr": ["土耳其"],
|
| 93 |
+
"da": ["丹麦"],
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
def query_ip_country(client_ip):
|
| 97 |
+
"""
|
| 98 |
+
Query IP address geo information with robust error handling
|
| 99 |
+
|
| 100 |
+
Features:
|
| 101 |
+
- 3 second timeout limit
|
| 102 |
+
- Comprehensive error handling
|
| 103 |
+
- Automatic fallback to default values
|
| 104 |
+
- Cache mechanism to avoid repeated queries
|
| 105 |
+
|
| 106 |
+
Returns:
|
| 107 |
+
dict: {"country": str, "region": str, "city": str}
|
| 108 |
+
"""
|
| 109 |
+
# Check cache first - no API call for subsequent visits
|
| 110 |
+
if client_ip in IP_Country_Cache:
|
| 111 |
+
print(f"Using cached IP data for {client_ip}")
|
| 112 |
+
return IP_Country_Cache[client_ip]
|
| 113 |
+
|
| 114 |
+
# Validate IP address
|
| 115 |
+
if not client_ip or client_ip in ["127.0.0.1", "localhost", "::1"]:
|
| 116 |
+
print(f"Invalid or local IP address: {client_ip}, using default")
|
| 117 |
+
default_geo = {"country": "Unknown", "region": "Unknown", "city": "Unknown"}
|
| 118 |
+
IP_Country_Cache[client_ip] = default_geo
|
| 119 |
+
return default_geo
|
| 120 |
+
|
| 121 |
+
# First time visit - query API with robust error handling
|
| 122 |
+
print(f"Querying IP geolocation for {client_ip}...")
|
| 123 |
+
|
| 124 |
+
try:
|
| 125 |
+
import requests
|
| 126 |
+
from requests.exceptions import Timeout, ConnectionError, RequestException
|
| 127 |
+
|
| 128 |
+
api_url = f"https://api.vore.top/api/IPdata?ip={client_ip}"
|
| 129 |
+
|
| 130 |
+
# Make request with 3 second timeout
|
| 131 |
+
response = requests.get(api_url, timeout=3)
|
| 132 |
+
|
| 133 |
+
if response.status_code == 200:
|
| 134 |
+
data = response.json()
|
| 135 |
+
if data.get("code") == 200 and "ipdata" in data:
|
| 136 |
+
ipdata = data["ipdata"]
|
| 137 |
+
geo_info = {
|
| 138 |
+
"country": ipdata.get("info1", "Unknown"),
|
| 139 |
+
"region": ipdata.get("info2", "Unknown"),
|
| 140 |
+
"city": ipdata.get("info3", "Unknown")
|
| 141 |
+
}
|
| 142 |
+
IP_Country_Cache[client_ip] = geo_info
|
| 143 |
+
print(f"Successfully detected location for {client_ip}: {geo_info['country']}")
|
| 144 |
+
return geo_info
|
| 145 |
+
else:
|
| 146 |
+
print(f"API returned invalid data for {client_ip}: {data}")
|
| 147 |
+
else:
|
| 148 |
+
print(f"API request failed with status {response.status_code} for {client_ip}")
|
| 149 |
+
|
| 150 |
+
except Timeout:
|
| 151 |
+
print(f"Timeout (>3s) querying IP location for {client_ip}, using default")
|
| 152 |
+
except ConnectionError:
|
| 153 |
+
print(f"Network connection error for IP {client_ip}, using default")
|
| 154 |
+
except RequestException as e:
|
| 155 |
+
print(f"Request error for IP {client_ip}: {e}, using default")
|
| 156 |
+
except Exception as e:
|
| 157 |
+
print(f"Unexpected error querying IP {client_ip}: {e}, using default")
|
| 158 |
+
|
| 159 |
+
# All failures lead here - cache default and return
|
| 160 |
+
default_geo = {"country": "Unknown", "region": "Unknown", "city": "Unknown"}
|
| 161 |
+
IP_Country_Cache[client_ip] = default_geo
|
| 162 |
+
print(f"Cached default location for {client_ip}")
|
| 163 |
+
return default_geo
|
| 164 |
+
|
| 165 |
+
def query_ip_country_async(client_ip):
|
| 166 |
+
"""
|
| 167 |
+
Async version that returns immediately with default, then updates cache in background
|
| 168 |
+
|
| 169 |
+
Returns:
|
| 170 |
+
tuple: (immediate_lang, geo_info_or_none)
|
| 171 |
+
"""
|
| 172 |
+
# If already cached, return immediately
|
| 173 |
+
if client_ip in IP_Country_Cache:
|
| 174 |
+
geo_info = IP_Country_Cache[client_ip]
|
| 175 |
+
lang = get_lang_from_country(geo_info["country"])
|
| 176 |
+
return lang, geo_info
|
| 177 |
+
|
| 178 |
+
# Return default immediately, query in background
|
| 179 |
+
return "en", None
|
| 180 |
+
|
| 181 |
+
def get_lang_from_country(country):
|
| 182 |
+
"""
|
| 183 |
+
Map country name to language code with comprehensive validation
|
| 184 |
+
|
| 185 |
+
Features:
|
| 186 |
+
- Handles invalid/empty input
|
| 187 |
+
- Case-insensitive matching
|
| 188 |
+
- Detailed logging
|
| 189 |
+
- Always returns valid language code
|
| 190 |
+
|
| 191 |
+
Args:
|
| 192 |
+
country (str): Country name
|
| 193 |
+
|
| 194 |
+
Returns:
|
| 195 |
+
str: Language code (always valid, defaults to "en")
|
| 196 |
+
"""
|
| 197 |
+
# Input validation
|
| 198 |
+
if not country or not isinstance(country, str) or country.strip() == "":
|
| 199 |
+
print(f"Invalid country provided: '{country}', defaulting to English")
|
| 200 |
+
return "en"
|
| 201 |
+
|
| 202 |
+
# Normalize country name
|
| 203 |
+
country = country.strip()
|
| 204 |
+
if country.lower() == "unknown":
|
| 205 |
+
print(f"Unknown country, defaulting to English")
|
| 206 |
+
return "en"
|
| 207 |
+
|
| 208 |
+
try:
|
| 209 |
+
# Search in country dictionary with case-sensitive match first
|
| 210 |
+
for lang, countries in country_dict.items():
|
| 211 |
+
if country in countries:
|
| 212 |
+
print(f"Matched country '{country}' to language '{lang}'")
|
| 213 |
+
return lang
|
| 214 |
+
|
| 215 |
+
# If no exact match, try case-insensitive match
|
| 216 |
+
country_lower = country.lower()
|
| 217 |
+
for lang, countries in country_dict.items():
|
| 218 |
+
for country_variant in countries:
|
| 219 |
+
if country_variant.lower() == country_lower:
|
| 220 |
+
print(f"Case-insensitive match: country '{country}' to language '{lang}'")
|
| 221 |
+
return lang
|
| 222 |
+
|
| 223 |
+
# No match found
|
| 224 |
+
print(f"Country '{country}' not found in country_dict, defaulting to English")
|
| 225 |
+
return "en"
|
| 226 |
+
|
| 227 |
+
except Exception as e:
|
| 228 |
+
print(f"Error matching country '{country}': {e}, defaulting to English")
|
| 229 |
+
return "en"
|
| 230 |
+
|
| 231 |
+
def get_lang_from_ip(client_ip):
|
| 232 |
+
"""
|
| 233 |
+
Get language based on IP geolocation with comprehensive error handling
|
| 234 |
+
|
| 235 |
+
Features:
|
| 236 |
+
- Validates input IP address
|
| 237 |
+
- Handles all possible exceptions
|
| 238 |
+
- Always returns a valid language code
|
| 239 |
+
- Defaults to English on any failure
|
| 240 |
+
- Includes detailed logging
|
| 241 |
+
|
| 242 |
+
Args:
|
| 243 |
+
client_ip (str): Client IP address
|
| 244 |
+
|
| 245 |
+
Returns:
|
| 246 |
+
str: Language code (always valid, defaults to "en")
|
| 247 |
+
"""
|
| 248 |
+
# Input validation
|
| 249 |
+
if not client_ip or not isinstance(client_ip, str):
|
| 250 |
+
print(f"Invalid IP address provided: {client_ip}, defaulting to English")
|
| 251 |
+
return "en"
|
| 252 |
+
|
| 253 |
+
try:
|
| 254 |
+
# Query geolocation info (has its own error handling and 3s timeout)
|
| 255 |
+
geo_info = query_ip_country(client_ip)
|
| 256 |
+
|
| 257 |
+
if not geo_info or not isinstance(geo_info, dict):
|
| 258 |
+
print(f"No geolocation data for {client_ip}, defaulting to English")
|
| 259 |
+
return "en"
|
| 260 |
+
|
| 261 |
+
# Extract country with fallback
|
| 262 |
+
country = geo_info.get("country", "Unknown")
|
| 263 |
+
if not country or country == "Unknown":
|
| 264 |
+
print(f"Unknown country for IP {client_ip}, defaulting to English")
|
| 265 |
+
return "en"
|
| 266 |
+
|
| 267 |
+
# Map country to language
|
| 268 |
+
detected_lang = get_lang_from_country(country)
|
| 269 |
+
|
| 270 |
+
# Validate language code
|
| 271 |
+
if not detected_lang or not isinstance(detected_lang, str) or len(detected_lang) != 2:
|
| 272 |
+
print(f"Invalid language code '{detected_lang}' for {client_ip}, defaulting to English")
|
| 273 |
+
return "en"
|
| 274 |
+
|
| 275 |
+
print(f"IP {client_ip} -> Country: {country} -> Language: {detected_lang}")
|
| 276 |
+
return detected_lang
|
| 277 |
+
|
| 278 |
+
except Exception as e:
|
| 279 |
+
print(f"Unexpected error getting language from IP {client_ip}: {e}, defaulting to English")
|
| 280 |
+
return "en" # Always return a valid language code
|
| 281 |
+
|
| 282 |
+
def is_restricted_country_ip(client_ip):
|
| 283 |
+
"""
|
| 284 |
+
Check if IP is from a restricted country
|
| 285 |
+
|
| 286 |
+
Returns:
|
| 287 |
+
bool: True if from restricted country
|
| 288 |
+
"""
|
| 289 |
+
geo_info = query_ip_country(client_ip)
|
| 290 |
+
country = geo_info["country"]
|
| 291 |
+
return country in RESTRICTED_COUNTRIES
|
| 292 |
+
|
| 293 |
+
def get_ip_max_limit(client_ip):
|
| 294 |
+
"""
|
| 295 |
+
Get max usage limit for IP based on country
|
| 296 |
+
|
| 297 |
+
Returns:
|
| 298 |
+
int: Max usage limit
|
| 299 |
+
"""
|
| 300 |
+
if is_restricted_country_ip(client_ip):
|
| 301 |
+
return RESTRICTED_COUNTRY_LIMIT
|
| 302 |
+
else:
|
| 303 |
+
return RATE_LIMIT_60
|
| 304 |
+
|
| 305 |
+
def get_ip_generation_count(client_ip):
|
| 306 |
+
"""
|
| 307 |
+
Get IP generation count
|
| 308 |
+
"""
|
| 309 |
+
if client_ip not in IP_Generation_Count:
|
| 310 |
+
IP_Generation_Count[client_ip] = 0
|
| 311 |
+
return IP_Generation_Count[client_ip]
|
| 312 |
+
|
| 313 |
+
def increment_ip_generation_count(client_ip):
|
| 314 |
+
"""
|
| 315 |
+
Increment IP generation count
|
| 316 |
+
"""
|
| 317 |
+
if client_ip not in IP_Generation_Count:
|
| 318 |
+
IP_Generation_Count[client_ip] = 0
|
| 319 |
+
IP_Generation_Count[client_ip] += 1
|
| 320 |
+
return IP_Generation_Count[client_ip]
|
| 321 |
+
|
| 322 |
+
def get_ip_phase(client_ip):
|
| 323 |
+
"""
|
| 324 |
+
Get current phase for IP
|
| 325 |
+
|
| 326 |
+
Returns:
|
| 327 |
+
str: 'free', 'rate_limit_1', 'rate_limit_2', 'rate_limit_3', 'blocked'
|
| 328 |
+
"""
|
| 329 |
+
count = get_ip_generation_count(client_ip)
|
| 330 |
+
max_limit = get_ip_max_limit(client_ip)
|
| 331 |
+
|
| 332 |
+
# For restricted countries, check if they've reached their limit
|
| 333 |
+
if is_restricted_country_ip(client_ip):
|
| 334 |
+
if count >= max_limit:
|
| 335 |
+
return 'blocked'
|
| 336 |
+
elif count >= max_limit - 2: # Last 2 attempts
|
| 337 |
+
return 'rate_limit_3'
|
| 338 |
+
elif count >= max_limit - 3: # 3rd attempt from end
|
| 339 |
+
return 'rate_limit_2'
|
| 340 |
+
elif count >= max_limit - 4: # 4th attempt from end
|
| 341 |
+
return 'rate_limit_1'
|
| 342 |
+
else:
|
| 343 |
+
return 'free'
|
| 344 |
+
|
| 345 |
+
# For normal countries, use standard limits
|
| 346 |
+
if count < FREE_TRY_N:
|
| 347 |
+
return 'free'
|
| 348 |
+
elif count < SLOW_TRY_N:
|
| 349 |
+
return 'rate_limit_1' # NSFW blur + 5 minutes 2 images
|
| 350 |
+
elif count < SLOW2_TRY_N:
|
| 351 |
+
return 'rate_limit_2' # NSFW blur + 10 minutes 2 images
|
| 352 |
+
elif count < max_limit:
|
| 353 |
+
return 'rate_limit_3' # NSFW blur + 20 minutes 2 images
|
| 354 |
+
else:
|
| 355 |
+
return 'blocked' # Generation blocked
|
| 356 |
+
|
| 357 |
+
def check_rate_limit_for_phase(client_ip, phase):
|
| 358 |
+
"""
|
| 359 |
+
Check rate limit for specific phase
|
| 360 |
+
|
| 361 |
+
Returns:
|
| 362 |
+
tuple: (is_limited, wait_time_minutes, current_count)
|
| 363 |
+
"""
|
| 364 |
+
if phase not in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']:
|
| 365 |
+
return False, 0, 0
|
| 366 |
+
|
| 367 |
+
# Determine time window
|
| 368 |
+
if phase == 'rate_limit_1':
|
| 369 |
+
window_minutes = PHASE_1_WINDOW
|
| 370 |
+
elif phase == 'rate_limit_2':
|
| 371 |
+
window_minutes = PHASE_2_WINDOW
|
| 372 |
+
else: # rate_limit_3
|
| 373 |
+
window_minutes = PHASE_3_WINDOW
|
| 374 |
+
|
| 375 |
+
current_time = time.time()
|
| 376 |
+
window_key = f"{client_ip}_{phase}"
|
| 377 |
+
|
| 378 |
+
# Clean expired records
|
| 379 |
+
if window_key in IP_Rate_Limit_Track:
|
| 380 |
+
track_data = IP_Rate_Limit_Track[window_key]
|
| 381 |
+
# Check if within current time window
|
| 382 |
+
if current_time - track_data['start_time'] > window_minutes * 60:
|
| 383 |
+
# Time window expired, reset
|
| 384 |
+
IP_Rate_Limit_Track[window_key] = {
|
| 385 |
+
'count': 0,
|
| 386 |
+
'start_time': current_time,
|
| 387 |
+
'last_generation': current_time
|
| 388 |
+
}
|
| 389 |
+
else:
|
| 390 |
+
# Initialize
|
| 391 |
+
IP_Rate_Limit_Track[window_key] = {
|
| 392 |
+
'count': 0,
|
| 393 |
+
'start_time': current_time,
|
| 394 |
+
'last_generation': current_time
|
| 395 |
+
}
|
| 396 |
+
|
| 397 |
+
track_data = IP_Rate_Limit_Track[window_key]
|
| 398 |
+
|
| 399 |
+
# Check if exceeded limit
|
| 400 |
+
if track_data['count'] >= MAX_IMAGES_PER_WINDOW:
|
| 401 |
+
# Calculate remaining wait time
|
| 402 |
+
elapsed = current_time - track_data['start_time']
|
| 403 |
+
wait_time = (window_minutes * 60) - elapsed
|
| 404 |
+
wait_minutes = max(0, wait_time / 60)
|
| 405 |
+
return True, wait_minutes, track_data['count']
|
| 406 |
+
|
| 407 |
+
return False, 0, track_data['count']
|
| 408 |
+
|
| 409 |
+
def update_country_stats(client_ip):
|
| 410 |
+
"""
|
| 411 |
+
Update country usage statistics and print periodically
|
| 412 |
+
"""
|
| 413 |
+
global Total_Request_Count, Country_Usage_Stats
|
| 414 |
+
|
| 415 |
+
# Get country info
|
| 416 |
+
geo_info = IP_Country_Cache.get(client_ip, {"country": "Unknown", "region": "Unknown", "city": "Unknown"})
|
| 417 |
+
country = geo_info["country"]
|
| 418 |
+
|
| 419 |
+
# Update country stats
|
| 420 |
+
if country not in Country_Usage_Stats:
|
| 421 |
+
Country_Usage_Stats[country] = 0
|
| 422 |
+
Country_Usage_Stats[country] += 1
|
| 423 |
+
|
| 424 |
+
# Increment total request counter
|
| 425 |
+
Total_Request_Count += 1
|
| 426 |
+
|
| 427 |
+
# Print stats every N requests
|
| 428 |
+
if Total_Request_Count % PRINT_STATS_INTERVAL == 0:
|
| 429 |
+
print("\n" + "="*60)
|
| 430 |
+
print(f"📊 国家使用统计 (总请求数: {Total_Request_Count})")
|
| 431 |
+
print("="*60)
|
| 432 |
+
|
| 433 |
+
# Sort by usage count (descending)
|
| 434 |
+
sorted_stats = sorted(Country_Usage_Stats.items(), key=lambda x: x[1], reverse=True)
|
| 435 |
+
|
| 436 |
+
for country_name, count in sorted_stats:
|
| 437 |
+
percentage = (count / Total_Request_Count) * 100
|
| 438 |
+
print(f" {country_name}: {count} 次 ({percentage:.1f}%)")
|
| 439 |
+
|
| 440 |
+
print("="*60 + "\n")
|
| 441 |
+
|
| 442 |
+
def record_generation_attempt(client_ip, phase):
|
| 443 |
+
"""
|
| 444 |
+
Record generation attempt
|
| 445 |
+
"""
|
| 446 |
+
# Increment total count
|
| 447 |
+
increment_ip_generation_count(client_ip)
|
| 448 |
+
|
| 449 |
+
# Update country statistics
|
| 450 |
+
update_country_stats(client_ip)
|
| 451 |
+
|
| 452 |
+
# Record time window count
|
| 453 |
+
if phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']:
|
| 454 |
+
window_key = f"{client_ip}_{phase}"
|
| 455 |
+
current_time = time.time()
|
| 456 |
+
|
| 457 |
+
if window_key in IP_Rate_Limit_Track:
|
| 458 |
+
IP_Rate_Limit_Track[window_key]['count'] += 1
|
| 459 |
+
IP_Rate_Limit_Track[window_key]['last_generation'] = current_time
|
| 460 |
+
else:
|
| 461 |
+
IP_Rate_Limit_Track[window_key] = {
|
| 462 |
+
'count': 1,
|
| 463 |
+
'start_time': current_time,
|
| 464 |
+
'last_generation': current_time
|
| 465 |
+
}
|
| 466 |
+
|
| 467 |
+
def apply_gaussian_blur_to_image_url(image_url, blur_strength=50):
|
| 468 |
+
"""
|
| 469 |
+
Apply Gaussian blur to image URL
|
| 470 |
+
|
| 471 |
+
Args:
|
| 472 |
+
image_url (str): Original image URL
|
| 473 |
+
blur_strength (int): Blur strength, default 50 (heavy blur)
|
| 474 |
+
|
| 475 |
+
Returns:
|
| 476 |
+
PIL.Image: Blurred PIL Image object
|
| 477 |
+
"""
|
| 478 |
+
try:
|
| 479 |
+
import requests
|
| 480 |
+
from PIL import Image, ImageFilter
|
| 481 |
+
import io
|
| 482 |
+
|
| 483 |
+
# Download image
|
| 484 |
+
response = requests.get(image_url, timeout=30)
|
| 485 |
+
if response.status_code != 200:
|
| 486 |
+
return None
|
| 487 |
+
|
| 488 |
+
# Convert to PIL Image
|
| 489 |
+
image_data = io.BytesIO(response.content)
|
| 490 |
+
image = Image.open(image_data)
|
| 491 |
+
|
| 492 |
+
# Apply heavy Gaussian blur
|
| 493 |
+
blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_strength))
|
| 494 |
+
|
| 495 |
+
return blurred_image
|
| 496 |
+
|
| 497 |
+
except Exception as e:
|
| 498 |
+
print(f"⚠️ Failed to apply Gaussian blur: {e}")
|
| 499 |
+
return None
|
| 500 |
+
|
| 501 |
+
# Initialize NSFW detector (download from Hugging Face)
|
| 502 |
+
try:
|
| 503 |
+
nsfw_detector = NSFWDetector() # Auto download falconsai_yolov9_nsfw_model_quantized.pt from Hugging Face
|
| 504 |
+
print("✅ NSFW detector initialized successfully")
|
| 505 |
+
except Exception as e:
|
| 506 |
+
print(f"❌ NSFW detector initialization failed: {e}")
|
| 507 |
+
nsfw_detector = None
|
| 508 |
+
|
| 509 |
+
def generate_image_interface(prompt, aspect_ratio, lang, request: gr.Request, progress=gr.Progress()):
|
| 510 |
+
"""
|
| 511 |
+
Interface function for text-to-image generation with phase-based limitations
|
| 512 |
+
"""
|
| 513 |
+
try:
|
| 514 |
+
# Extract user IP
|
| 515 |
+
client_ip = request.client.host
|
| 516 |
+
x_forwarded_for = dict(request.headers).get('x-forwarded-for')
|
| 517 |
+
if x_forwarded_for:
|
| 518 |
+
client_ip = x_forwarded_for
|
| 519 |
+
if client_ip not in IP_Dict:
|
| 520 |
+
IP_Dict[client_ip] = 0
|
| 521 |
+
IP_Dict[client_ip] += 1
|
| 522 |
+
|
| 523 |
+
if not prompt or prompt.strip() == "":
|
| 524 |
+
return None, t("error_enter_prompt", lang), gr.update(visible=False)
|
| 525 |
+
|
| 526 |
+
# Check if prompt length is greater than 3 characters
|
| 527 |
+
if len(prompt.strip()) <= 3:
|
| 528 |
+
return None, t("error_prompt_too_short", lang), gr.update(visible=False)
|
| 529 |
+
|
| 530 |
+
# Parse aspect ratio to get width and height
|
| 531 |
+
aspect_ratios = {
|
| 532 |
+
"16:9": (1364, 768),
|
| 533 |
+
"4:3": (1182, 887),
|
| 534 |
+
"1:1": (1024, 1024),
|
| 535 |
+
"3:4": (887, 1182),
|
| 536 |
+
"9:16": (768, 1364)
|
| 537 |
+
}
|
| 538 |
+
width, height = aspect_ratios.get(aspect_ratio, (1024, 1024))
|
| 539 |
+
except Exception as e:
|
| 540 |
+
print(f"⚠️ Request preprocessing error: {e}")
|
| 541 |
+
return None, t("error_request_processing", lang), gr.update(visible=False)
|
| 542 |
+
|
| 543 |
+
# Get user current phase
|
| 544 |
+
current_phase = get_ip_phase(client_ip)
|
| 545 |
+
current_count = get_ip_generation_count(client_ip)
|
| 546 |
+
geo_info = IP_Country_Cache.get(client_ip, {"country": "Unknown", "region": "Unknown", "city": "Unknown"})
|
| 547 |
+
is_restricted = is_restricted_country_ip(client_ip)
|
| 548 |
+
|
| 549 |
+
print(f"📊 User phase info - IP: {client_ip}, Location: {geo_info['country']}/{geo_info['region']}/{geo_info['city']}, Phase: {current_phase}, Count: {current_count}, Restricted: {is_restricted}")
|
| 550 |
+
|
| 551 |
+
# Check if user reached the like button tip threshold
|
| 552 |
+
# For restricted countries, show like tip from the first attempt
|
| 553 |
+
show_like_tip = (current_count >= 1) if is_restricted else (current_count >= TIP_TRY_N)
|
| 554 |
+
|
| 555 |
+
# Check if completely blocked
|
| 556 |
+
if current_phase == 'blocked':
|
| 557 |
+
# Generate blocked limit button with different URL for restricted countries
|
| 558 |
+
if is_restricted:
|
| 559 |
+
blocked_url = GoodWebsiteUrl
|
| 560 |
+
else:
|
| 561 |
+
blocked_url = 'https://omnicreator.net/text-to-image'
|
| 562 |
+
|
| 563 |
+
blocked_button_html = f"""
|
| 564 |
+
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 565 |
+
<a href='{blocked_url}' target='_blank' style='
|
| 566 |
+
display: inline-flex;
|
| 567 |
+
align-items: center;
|
| 568 |
+
justify-content: center;
|
| 569 |
+
padding: 16px 32px;
|
| 570 |
+
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
|
| 571 |
+
color: white;
|
| 572 |
+
text-decoration: none;
|
| 573 |
+
border-radius: 12px;
|
| 574 |
+
font-weight: 600;
|
| 575 |
+
font-size: 16px;
|
| 576 |
+
text-align: center;
|
| 577 |
+
min-width: 200px;
|
| 578 |
+
box-shadow: 0 4px 15px rgba(231, 76, 60, 0.4);
|
| 579 |
+
transition: all 0.3s ease;
|
| 580 |
+
border: none;
|
| 581 |
+
'>🚀 Unlimited Generation</a>
|
| 582 |
+
</div>
|
| 583 |
+
"""
|
| 584 |
+
|
| 585 |
+
# Use same message for all users to avoid discrimination perception
|
| 586 |
+
blocked_message = t("error_free_limit_reached", lang)
|
| 587 |
+
|
| 588 |
+
return None, blocked_message, gr.update(value=blocked_button_html, visible=True)
|
| 589 |
+
|
| 590 |
+
# Check rate limit (applies to rate_limit phases)
|
| 591 |
+
if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']:
|
| 592 |
+
is_limited, wait_minutes, window_count = check_rate_limit_for_phase(client_ip, current_phase)
|
| 593 |
+
if is_limited:
|
| 594 |
+
wait_minutes_int = int(wait_minutes) + 1
|
| 595 |
+
# Generate rate limit button with different URL for restricted countries
|
| 596 |
+
if is_restricted:
|
| 597 |
+
rate_limit_url = GoodWebsiteUrl
|
| 598 |
+
else:
|
| 599 |
+
rate_limit_url = 'https://omnicreator.net/text-to-image'
|
| 600 |
+
|
| 601 |
+
rate_limit_button_html = f"""
|
| 602 |
+
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 603 |
+
<a href='{rate_limit_url}' target='_blank' style='
|
| 604 |
+
display: inline-flex;
|
| 605 |
+
align-items: center;
|
| 606 |
+
justify-content: center;
|
| 607 |
+
padding: 16px 32px;
|
| 608 |
+
background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%);
|
| 609 |
+
color: white;
|
| 610 |
+
text-decoration: none;
|
| 611 |
+
border-radius: 12px;
|
| 612 |
+
font-weight: 600;
|
| 613 |
+
font-size: 16px;
|
| 614 |
+
text-align: center;
|
| 615 |
+
min-width: 200px;
|
| 616 |
+
box-shadow: 0 4px 15px rgba(243, 156, 18, 0.4);
|
| 617 |
+
transition: all 0.3s ease;
|
| 618 |
+
border: none;
|
| 619 |
+
'>⏰ Skip Wait - Unlimited Generation</a>
|
| 620 |
+
</div>
|
| 621 |
+
"""
|
| 622 |
+
return None, t("error_free_limit_wait", lang).format(wait_minutes_int=wait_minutes_int), gr.update(value=rate_limit_button_html, visible=True)
|
| 623 |
+
|
| 624 |
+
# Handle NSFW detection based on phase
|
| 625 |
+
is_nsfw_task = False # Track if this task involves NSFW content
|
| 626 |
+
|
| 627 |
+
result_url = None
|
| 628 |
+
status_message = ""
|
| 629 |
+
|
| 630 |
+
def progress_callback(message):
|
| 631 |
+
try:
|
| 632 |
+
nonlocal status_message
|
| 633 |
+
status_message = message
|
| 634 |
+
# Add error handling to prevent progress update failure
|
| 635 |
+
if progress is not None:
|
| 636 |
+
# Enhanced progress display with better formatting
|
| 637 |
+
if "Queue:" in message or "tasks ahead" in message:
|
| 638 |
+
# Queue status - show with different progress value to indicate waiting
|
| 639 |
+
progress(0.1, desc=message)
|
| 640 |
+
elif "Processing" in message or "AI is processing" in message:
|
| 641 |
+
# Processing status
|
| 642 |
+
progress(0.7, desc=message)
|
| 643 |
+
elif "Generating" in message or "Almost done" in message:
|
| 644 |
+
# Generation status
|
| 645 |
+
progress(0.9, desc=message)
|
| 646 |
+
else:
|
| 647 |
+
# Default status
|
| 648 |
+
progress(0.5, desc=message)
|
| 649 |
+
except Exception as e:
|
| 650 |
+
print(f"⚠️ Progress update failed: {e}")
|
| 651 |
+
|
| 652 |
+
try:
|
| 653 |
+
# Determine priority before recording generation attempt
|
| 654 |
+
# First high_priority_n tasks for each IP get priority=1
|
| 655 |
+
task_priority = 1 if current_count < high_priority_n else 0
|
| 656 |
+
|
| 657 |
+
# Record generation attempt (before actual generation to ensure correct count)
|
| 658 |
+
record_generation_attempt(client_ip, current_phase)
|
| 659 |
+
updated_count = get_ip_generation_count(client_ip)
|
| 660 |
+
|
| 661 |
+
print(f"✅ Processing started - IP: {client_ip}, phase: {current_phase}, total count: {updated_count}, priority: {task_priority}, prompt: {prompt.strip()}, width: {width}, height: {height}", flush=True)
|
| 662 |
+
|
| 663 |
+
# Call text-to-image processing function with priority
|
| 664 |
+
result_url, message, task_uuid = process_text_to_image(prompt.strip(), width, height, progress_callback, priority=task_priority)
|
| 665 |
+
|
| 666 |
+
if result_url:
|
| 667 |
+
print(f"✅ Generation completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True)
|
| 668 |
+
|
| 669 |
+
# Detect result image NSFW content (only in rate limit phases)
|
| 670 |
+
if nsfw_detector is not None and current_phase != 'free':
|
| 671 |
+
try:
|
| 672 |
+
if progress is not None:
|
| 673 |
+
progress(0.9, desc=t("status_checking_result", lang))
|
| 674 |
+
|
| 675 |
+
is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector)
|
| 676 |
+
|
| 677 |
+
if nsfw_error:
|
| 678 |
+
print(f"⚠️ Result image NSFW detection error - IP: {client_ip}, error: {nsfw_error}")
|
| 679 |
+
elif is_nsfw:
|
| 680 |
+
is_nsfw_task = True # Mark task as NSFW
|
| 681 |
+
print(f"🔍 Result image NSFW detected in {current_phase} phase: ❌❌❌ - IP: {client_ip} (will blur result)")
|
| 682 |
+
else:
|
| 683 |
+
print(f"🔍 Result image NSFW check passed: ✅✅✅ - IP: {client_ip}")
|
| 684 |
+
|
| 685 |
+
except Exception as e:
|
| 686 |
+
print(f"⚠️ Result image NSFW detection exception - IP: {client_ip}, error: {str(e)}")
|
| 687 |
+
|
| 688 |
+
# Apply blur if this is an NSFW task in rate limit phases
|
| 689 |
+
should_blur = False
|
| 690 |
+
|
| 691 |
+
if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3'] and is_nsfw_task:
|
| 692 |
+
should_blur = True
|
| 693 |
+
|
| 694 |
+
# Apply blur processing
|
| 695 |
+
if should_blur:
|
| 696 |
+
if progress is not None:
|
| 697 |
+
progress(0.95, desc=t("status_applying_filter", lang))
|
| 698 |
+
|
| 699 |
+
blurred_image = apply_gaussian_blur_to_image_url(result_url)
|
| 700 |
+
if blurred_image is not None:
|
| 701 |
+
final_result = blurred_image # Return PIL Image object
|
| 702 |
+
final_message = t("warning_content_filter", lang)
|
| 703 |
+
print(f"🔒 Applied Gaussian blur for NSFW content - IP: {client_ip}")
|
| 704 |
+
else:
|
| 705 |
+
# Blur failed, return original URL with warning
|
| 706 |
+
final_result = result_url
|
| 707 |
+
final_message = t("warning_content_review", lang)
|
| 708 |
+
|
| 709 |
+
# Generate NSFW button for blurred content with different URL for restricted countries
|
| 710 |
+
if is_restricted:
|
| 711 |
+
nsfw_url = GoodWebsiteUrl
|
| 712 |
+
else:
|
| 713 |
+
nsfw_url = 'https://omnicreator.net/text-to-image'
|
| 714 |
+
|
| 715 |
+
nsfw_action_buttons_html = f"""
|
| 716 |
+
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 717 |
+
<a href='{nsfw_url}' target='_blank' style='
|
| 718 |
+
display: inline-flex;
|
| 719 |
+
align-items: center;
|
| 720 |
+
justify-content: center;
|
| 721 |
+
padding: 16px 32px;
|
| 722 |
+
background: linear-gradient(135deg, #ff6b6b 0%, #feca57 100%);
|
| 723 |
+
color: white;
|
| 724 |
+
text-decoration: none;
|
| 725 |
+
border-radius: 12px;
|
| 726 |
+
font-weight: 600;
|
| 727 |
+
font-size: 16px;
|
| 728 |
+
text-align: center;
|
| 729 |
+
min-width: 200px;
|
| 730 |
+
box-shadow: 0 4px 15px rgba(255, 107, 107, 0.4);
|
| 731 |
+
transition: all 0.3s ease;
|
| 732 |
+
border: none;
|
| 733 |
+
'>🔥 Unlimited Creative Generation</a>
|
| 734 |
+
</div>
|
| 735 |
+
"""
|
| 736 |
+
return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True)
|
| 737 |
+
else:
|
| 738 |
+
final_result = result_url
|
| 739 |
+
final_message = t("status_completed_message", lang).format(message=message)
|
| 740 |
+
|
| 741 |
+
try:
|
| 742 |
+
if progress is not None:
|
| 743 |
+
progress(1.0, desc=t("status_processing_completed", lang))
|
| 744 |
+
except Exception as e:
|
| 745 |
+
print(f"⚠️ Final progress update failed: {e}")
|
| 746 |
+
|
| 747 |
+
# Generate action buttons HTML
|
| 748 |
+
action_buttons_html = ""
|
| 749 |
+
|
| 750 |
+
# For restricted countries, only show like tip (no action buttons)
|
| 751 |
+
if is_restricted:
|
| 752 |
+
if show_like_tip:
|
| 753 |
+
action_buttons_html = """
|
| 754 |
+
<div style='display: flex; justify-content: center; margin: 15px 0 5px 0; padding: 0px;'>
|
| 755 |
+
<div style='
|
| 756 |
+
display: inline-flex;
|
| 757 |
+
align-items: center;
|
| 758 |
+
justify-content: center;
|
| 759 |
+
padding: 12px 24px;
|
| 760 |
+
background: linear-gradient(135deg, #ff6b6b 0%, #feca57 100%);
|
| 761 |
+
color: white;
|
| 762 |
+
border-radius: 10px;
|
| 763 |
+
font-weight: 600;
|
| 764 |
+
font-size: 14px;
|
| 765 |
+
text-align: center;
|
| 766 |
+
max-width: 400px;
|
| 767 |
+
box-shadow: 0 3px 12px rgba(255, 107, 107, 0.3);
|
| 768 |
+
border: none;
|
| 769 |
+
'>👉 Click the ❤️ Like button to unlock more free trial attempts!</div>
|
| 770 |
+
</div>
|
| 771 |
+
"""
|
| 772 |
+
else:
|
| 773 |
+
# For non-restricted countries, show normal buttons
|
| 774 |
+
if task_uuid:
|
| 775 |
+
# Create task detail URL for downloading HD image
|
| 776 |
+
task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}"
|
| 777 |
+
action_buttons_html = f"""
|
| 778 |
+
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 779 |
+
<a href='https://omnicreator.net/text-to-image' target='_blank' style='
|
| 780 |
+
display: inline-flex;
|
| 781 |
+
align-items: center;
|
| 782 |
+
justify-content: center;
|
| 783 |
+
padding: 16px 32px;
|
| 784 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 785 |
+
color: white;
|
| 786 |
+
text-decoration: none;
|
| 787 |
+
border-radius: 12px;
|
| 788 |
+
font-weight: 600;
|
| 789 |
+
font-size: 16px;
|
| 790 |
+
text-align: center;
|
| 791 |
+
min-width: 160px;
|
| 792 |
+
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
|
| 793 |
+
transition: all 0.3s ease;
|
| 794 |
+
border: none;
|
| 795 |
+
'>🚀 Unlimited Generation</a>
|
| 796 |
+
<a href='{task_detail_url}' target='_blank' style='
|
| 797 |
+
display: inline-flex;
|
| 798 |
+
align-items: center;
|
| 799 |
+
justify-content: center;
|
| 800 |
+
padding: 16px 32px;
|
| 801 |
+
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
|
| 802 |
+
color: white;
|
| 803 |
+
text-decoration: none;
|
| 804 |
+
border-radius: 12px;
|
| 805 |
+
font-weight: 600;
|
| 806 |
+
font-size: 16px;
|
| 807 |
+
text-align: center;
|
| 808 |
+
min-width: 160px;
|
| 809 |
+
box-shadow: 0 4px 15px rgba(17, 153, 142, 0.4);
|
| 810 |
+
transition: all 0.3s ease;
|
| 811 |
+
border: none;
|
| 812 |
+
'>💾 Download HD Image</a>
|
| 813 |
+
</div>
|
| 814 |
+
"""
|
| 815 |
+
|
| 816 |
+
# Add popup script if needed (using different approach)
|
| 817 |
+
if show_like_tip:
|
| 818 |
+
action_buttons_html += """
|
| 819 |
+
<div style='display: flex; justify-content: center; margin: 15px 0 5px 0; padding: 0px;'>
|
| 820 |
+
<div style='
|
| 821 |
+
display: inline-flex;
|
| 822 |
+
align-items: center;
|
| 823 |
+
justify-content: center;
|
| 824 |
+
padding: 12px 24px;
|
| 825 |
+
background: linear-gradient(135deg, #ff6b6b 0%, #feca57 100%);
|
| 826 |
+
color: white;
|
| 827 |
+
border-radius: 10px;
|
| 828 |
+
font-weight: 600;
|
| 829 |
+
font-size: 14px;
|
| 830 |
+
text-align: center;
|
| 831 |
+
max-width: 400px;
|
| 832 |
+
box-shadow: 0 3px 12px rgba(255, 107, 107, 0.3);
|
| 833 |
+
border: none;
|
| 834 |
+
'>👉 Click the ❤️ Like button to unlock more free trial attempts!</div>
|
| 835 |
+
</div>
|
| 836 |
+
"""
|
| 837 |
+
|
| 838 |
+
return final_result, final_message, gr.update(value=action_buttons_html, visible=True)
|
| 839 |
+
else:
|
| 840 |
+
print(f"❌ Processing failed - IP: {client_ip}, error: {message}", flush=True)
|
| 841 |
+
return None, t("error_processing_failed", lang).format(message=message), gr.update(visible=False)
|
| 842 |
+
|
| 843 |
+
except Exception as e:
|
| 844 |
+
print(f"❌ Processing exception - IP: {client_ip}, error: {str(e)}")
|
| 845 |
+
return None, t("error_processing_exception", lang).format(error=str(e)), gr.update(visible=False)
|
| 846 |
+
|
| 847 |
+
# Create Gradio interface
|
| 848 |
+
def create_app():
|
| 849 |
+
with gr.Blocks(
|
| 850 |
+
title="AI Text to Image Generator",
|
| 851 |
+
theme=gr.themes.Soft(),
|
| 852 |
+
css="""
|
| 853 |
+
.main-container {
|
| 854 |
+
max-width: 1200px;
|
| 855 |
+
margin: 0 auto;
|
| 856 |
+
}
|
| 857 |
+
.result-area {
|
| 858 |
+
margin-top: 20px;
|
| 859 |
+
padding: 20px;
|
| 860 |
+
border-radius: 10px;
|
| 861 |
+
background-color: #f8f9fa;
|
| 862 |
+
}
|
| 863 |
+
""",
|
| 864 |
+
# Improve concurrency performance configuration
|
| 865 |
+
head="""
|
| 866 |
+
<script>
|
| 867 |
+
// Reduce client-side state update frequency, avoid excessive SSE connections
|
| 868 |
+
if (window.gradio) {
|
| 869 |
+
window.gradio.update_frequency = 2000; // Update every 2 seconds
|
| 870 |
+
}
|
| 871 |
+
</script>
|
| 872 |
+
"""
|
| 873 |
+
) as app:
|
| 874 |
+
|
| 875 |
+
lang_state = gr.State("en")
|
| 876 |
+
|
| 877 |
+
# Main title - centered
|
| 878 |
+
header_title = gr.HTML(f"""
|
| 879 |
+
<div style="text-align: center; margin: 20px auto 10px auto; max-width: 800px;">
|
| 880 |
+
<h1 style="color: #2c3e50; margin: 0; font-size: 3.5em; font-weight: 800; letter-spacing: 3px; text-shadow: 2px 2px 4px rgba(0,0,0,0.1);">
|
| 881 |
+
{t('header_title', 'en')}
|
| 882 |
+
</h1>
|
| 883 |
+
</div>
|
| 884 |
+
""")
|
| 885 |
+
|
| 886 |
+
with gr.Row():
|
| 887 |
+
with gr.Column(scale=1):
|
| 888 |
+
prompt_input = gr.Textbox(
|
| 889 |
+
label=t("prompt_input_label", "en"),
|
| 890 |
+
placeholder=t("prompt_input_placeholder", "en"),
|
| 891 |
+
lines=3,
|
| 892 |
+
max_lines=5
|
| 893 |
+
)
|
| 894 |
+
|
| 895 |
+
aspect_ratio_dropdown = gr.Dropdown(
|
| 896 |
+
choices=[
|
| 897 |
+
("16:9 (1364x768)", "16:9"),
|
| 898 |
+
("4:3 (1182x887)", "4:3"),
|
| 899 |
+
("1:1 (1024x1024)", "1:1"),
|
| 900 |
+
("3:4 (887x1182)", "3:4"),
|
| 901 |
+
("9:16 (768x1364)", "9:16")
|
| 902 |
+
],
|
| 903 |
+
value="1:1",
|
| 904 |
+
label=t("aspect_ratio_label", "en"),
|
| 905 |
+
interactive=True
|
| 906 |
+
)
|
| 907 |
+
|
| 908 |
+
generate_button = gr.Button(
|
| 909 |
+
t("generate_button", "en"),
|
| 910 |
+
variant="primary",
|
| 911 |
+
size="lg"
|
| 912 |
+
)
|
| 913 |
+
|
| 914 |
+
with gr.Column(scale=1):
|
| 915 |
+
output_image = gr.Image(
|
| 916 |
+
label=t("output_image_label", "en"),
|
| 917 |
+
height=512,
|
| 918 |
+
elem_classes=["result-area"]
|
| 919 |
+
)
|
| 920 |
+
|
| 921 |
+
status_output = gr.Textbox(
|
| 922 |
+
label=t("status_output_label", "en"),
|
| 923 |
+
lines=2,
|
| 924 |
+
max_lines=3,
|
| 925 |
+
interactive=False
|
| 926 |
+
)
|
| 927 |
+
|
| 928 |
+
action_buttons = gr.HTML(visible=False)
|
| 929 |
+
|
| 930 |
+
prompt_examples_header = gr.Markdown(t("prompt_examples_header", "en"))
|
| 931 |
+
with gr.Row():
|
| 932 |
+
example_prompts = [
|
| 933 |
+
"A beautiful sunset over mountains",
|
| 934 |
+
"A cute cat sitting on a windowsill",
|
| 935 |
+
"A futuristic city with flying cars",
|
| 936 |
+
"A cozy coffee shop in autumn",
|
| 937 |
+
"A magical forest with glowing mushrooms"
|
| 938 |
+
]
|
| 939 |
+
|
| 940 |
+
for prompt in example_prompts:
|
| 941 |
+
gr.Button(
|
| 942 |
+
prompt,
|
| 943 |
+
size="sm"
|
| 944 |
+
).click(
|
| 945 |
+
lambda p=prompt: p,
|
| 946 |
+
outputs=prompt_input
|
| 947 |
+
)
|
| 948 |
+
|
| 949 |
+
generate_button.click(
|
| 950 |
+
fn=generate_image_interface,
|
| 951 |
+
inputs=[prompt_input, aspect_ratio_dropdown, lang_state],
|
| 952 |
+
outputs=[output_image, status_output, action_buttons],
|
| 953 |
+
show_progress=True,
|
| 954 |
+
concurrency_limit=20
|
| 955 |
+
)
|
| 956 |
+
|
| 957 |
+
# SEO Content Section
|
| 958 |
+
seo_html = gr.HTML()
|
| 959 |
+
|
| 960 |
+
def get_seo_html(lang):
|
| 961 |
+
return f"""
|
| 962 |
+
<div style="width: 100%; margin: 50px 0; padding: 0 20px;">
|
| 963 |
+
|
| 964 |
+
<div style="text-align: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px; border-radius: 20px; margin: 40px 0;">
|
| 965 |
+
<h2 style="margin: 0 0 20px 0; font-size: 2.2em; font-weight: 700;">
|
| 966 |
+
🎨 Unlimited AI Text-to-Image Generation
|
| 967 |
+
</h2>
|
| 968 |
+
<p style="margin: 0 0 25px 0; font-size: 1.2em; opacity: 0.95; line-height: 1.6;">
|
| 969 |
+
Experience the ultimate freedom in AI image creation! Generate unlimited images from text without restrictions, with complete creative freedom and no limits on your imagination.
|
| 970 |
+
</p>
|
| 971 |
+
|
| 972 |
+
<div style="display: flex; justify-content: center; gap: 25px; flex-wrap: wrap; margin: 30px 0;">
|
| 973 |
+
<a href="https://omnicreator.net/text-to-image" target="_blank" style="
|
| 974 |
+
display: inline-flex;
|
| 975 |
+
align-items: center;
|
| 976 |
+
justify-content: center;
|
| 977 |
+
padding: 20px 40px;
|
| 978 |
+
background: linear-gradient(135deg, #ff6b6b 0%, #feca57 100%);
|
| 979 |
+
color: white;
|
| 980 |
+
text-decoration: none;
|
| 981 |
+
border-radius: 15px;
|
| 982 |
+
font-weight: 700;
|
| 983 |
+
font-size: 18px;
|
| 984 |
+
text-align: center;
|
| 985 |
+
min-width: 250px;
|
| 986 |
+
box-shadow: 0 8px 25px rgba(255, 107, 107, 0.4);
|
| 987 |
+
transition: all 0.3s ease;
|
| 988 |
+
border: none;
|
| 989 |
+
transform: scale(1);
|
| 990 |
+
" onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'">
|
| 991 |
+
🚀 Get Unlimited Access Now
|
| 992 |
+
</a>
|
| 993 |
+
|
| 994 |
+
</div>
|
| 995 |
+
|
| 996 |
+
<p style="color: rgba(255,255,255,0.9); font-size: 1em; margin: 20px 0 0 0;">
|
| 997 |
+
Join thousands of creators who trust Omni Creator for unrestricted AI image generation!
|
| 998 |
+
</p>
|
| 999 |
+
</div>
|
| 1000 |
+
|
| 1001 |
+
<div style="text-align: center; margin: 25px auto; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); padding: 35px; border-radius: 20px; box-shadow: 0 10px 30px rgba(0,0,0,0.1);">
|
| 1002 |
+
<h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.9em; font-weight: 700;">
|
| 1003 |
+
⭐ Professional AI Text-to-Image Generator
|
| 1004 |
+
</h2>
|
| 1005 |
+
<p style="color: #555; font-size: 1.1em; line-height: 1.6; margin: 0 0 20px 0; padding: 0 20px;">
|
| 1006 |
+
Transform your ideas into stunning visuals with our advanced AI text-to-image platform. Whether you're creating art, designing content, or exploring creative possibilities - our powerful AI brings your words to life.
|
| 1007 |
+
</p>
|
| 1008 |
+
</div>
|
| 1009 |
+
|
| 1010 |
+
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 25px; margin: 40px 0;">
|
| 1011 |
+
|
| 1012 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #e74c3c;">
|
| 1013 |
+
<h3 style="color: #e74c3c; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1014 |
+
🎯 Unlimited Generation
|
| 1015 |
+
</h3>
|
| 1016 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1017 |
+
Premium users enjoy unlimited image generation without daily limits, rate restrictions, or content barriers. Create as many images as you need, whenever you need them.
|
| 1018 |
+
</p>
|
| 1019 |
+
</div>
|
| 1020 |
+
|
| 1021 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #3498db;">
|
| 1022 |
+
<h3 style="color: #3498db; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1023 |
+
🔓 Creative Freedom
|
| 1024 |
+
</h3>
|
| 1025 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1026 |
+
Generate any type of content with complete creative freedom. Unlimited possibilities for artists, designers, and content creators.
|
| 1027 |
+
</p>
|
| 1028 |
+
</div>
|
| 1029 |
+
|
| 1030 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #27ae60;">
|
| 1031 |
+
<h3 style="color: #27ae60; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1032 |
+
⚡ Lightning Fast
|
| 1033 |
+
</h3>
|
| 1034 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1035 |
+
Advanced AI infrastructure delivers high-quality results in seconds. No waiting in queues, no processing delays - just instant image generation.
|
| 1036 |
+
</p>
|
| 1037 |
+
</div>
|
| 1038 |
+
|
| 1039 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #9b59b6;">
|
| 1040 |
+
<h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1041 |
+
🎨 Multiple Aspect Ratios
|
| 1042 |
+
</h3>
|
| 1043 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1044 |
+
Generate images in various aspect ratios - from square 1:1 to landscape 16:9 and portrait 9:16. Perfect for any platform or use case.
|
| 1045 |
+
</p>
|
| 1046 |
+
</div>
|
| 1047 |
+
|
| 1048 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #f39c12;">
|
| 1049 |
+
<h3 style="color: #f39c12; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1050 |
+
💎 Premium Quality
|
| 1051 |
+
</h3>
|
| 1052 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1053 |
+
State-of-the-art AI models deliver exceptional quality and realism. Professional results suitable for commercial use and high-end projects.
|
| 1054 |
+
</p>
|
| 1055 |
+
</div>
|
| 1056 |
+
|
| 1057 |
+
<div style="background: white; padding: 30px; border-radius: 15px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); border-left: 5px solid #34495e;">
|
| 1058 |
+
<h3 style="color: #34495e; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
|
| 1059 |
+
🌍 Simple Interface
|
| 1060 |
+
</h3>
|
| 1061 |
+
<p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
|
| 1062 |
+
Easy-to-use interface - just enter your prompt and choose an aspect ratio. No complex settings or technical knowledge required.
|
| 1063 |
+
</p>
|
| 1064 |
+
</div>
|
| 1065 |
+
|
| 1066 |
+
</div>
|
| 1067 |
+
|
| 1068 |
+
<div style="background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 50%, #fecfef 100%); padding: 30px; border-radius: 15px; margin: 40px 0;">
|
| 1069 |
+
<h3 style="color: #8b5cf6; text-align: center; margin: 0 0 25px 0; font-size: 1.5em; font-weight: 700;">
|
| 1070 |
+
💡 Pro Tips for Best Results
|
| 1071 |
+
</h3>
|
| 1072 |
+
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 18px;">
|
| 1073 |
+
|
| 1074 |
+
<div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
|
| 1075 |
+
<strong style="color: #8b5cf6; font-size: 1.1em;">📝 Clear Descriptions</strong>
|
| 1076 |
+
<p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">Use detailed, specific prompts for better results. Describe colors, styles, lighting, and composition clearly.</p>
|
| 1077 |
+
</div>
|
| 1078 |
+
|
| 1079 |
+
<div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
|
| 1080 |
+
<strong style="color: #8b5cf6; font-size: 1.1em;">🎨 Style Keywords</strong>
|
| 1081 |
+
<p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">Include style keywords like "photorealistic", "oil painting", "anime", "3D render" to guide the aesthetic.</p>
|
| 1082 |
+
</div>
|
| 1083 |
+
|
| 1084 |
+
<div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
|
| 1085 |
+
<strong style="color: #8b5cf6; font-size: 1.1em;">⚡ Right Aspect Ratio</strong>
|
| 1086 |
+
<p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">Choose the aspect ratio that fits your use case - 1:1 for social media, 16:9 for presentations, 9:16 for mobile.</p>
|
| 1087 |
+
</div>
|
| 1088 |
+
|
| 1089 |
+
<div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
|
| 1090 |
+
<strong style="color: #8b5cf6; font-size: 1.1em;">🎯 Specific Details</strong>
|
| 1091 |
+
<p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">Add specific details about mood, time of day, camera angle, and other elements for more control.</p>
|
| 1092 |
+
</div>
|
| 1093 |
+
|
| 1094 |
+
</div>
|
| 1095 |
+
</div>
|
| 1096 |
+
|
| 1097 |
+
<div style="text-align: center; margin: 25px auto; background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%); padding: 35px; border-radius: 20px; box-shadow: 0 10px 30px rgba(0,0,0,0.1);">
|
| 1098 |
+
<h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.8em; font-weight: 700;">
|
| 1099 |
+
🚀 Perfect For Every Creative Need
|
| 1100 |
+
</h2>
|
| 1101 |
+
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin: 25px 0; text-align: left;">
|
| 1102 |
+
|
| 1103 |
+
<div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
|
| 1104 |
+
<h4 style="color: #e74c3c; margin: 0 0 10px 0;">🎨 Digital Art</h4>
|
| 1105 |
+
<ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
|
| 1106 |
+
<li>Character design</li>
|
| 1107 |
+
<li>Concept art</li>
|
| 1108 |
+
<li>Illustrations</li>
|
| 1109 |
+
<li>Fantasy scenes</li>
|
| 1110 |
+
</ul>
|
| 1111 |
+
</div>
|
| 1112 |
+
|
| 1113 |
+
<div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
|
| 1114 |
+
<h4 style="color: #3498db; margin: 0 0 10px 0;">📸 Photography</h4>
|
| 1115 |
+
<ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
|
| 1116 |
+
<li>Portrait photos</li>
|
| 1117 |
+
<li>Landscape images</li>
|
| 1118 |
+
<li>Product shots</li>
|
| 1119 |
+
<li>Stock photography</li>
|
| 1120 |
+
</ul>
|
| 1121 |
+
</div>
|
| 1122 |
+
|
| 1123 |
+
<div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
|
| 1124 |
+
<h4 style="color: #27ae60; margin: 0 0 10px 0;">🎬 Content Creation</h4>
|
| 1125 |
+
<ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
|
| 1126 |
+
<li>Video thumbnails</li>
|
| 1127 |
+
<li>Blog graphics</li>
|
| 1128 |
+
<li>Presentation slides</li>
|
| 1129 |
+
<li>Marketing materials</li>
|
| 1130 |
+
</ul>
|
| 1131 |
+
</div>
|
| 1132 |
+
|
| 1133 |
+
<div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
|
| 1134 |
+
<h4 style="color: #9b59b6; margin: 0 0 10px 0;">📱 Social Media</h4>
|
| 1135 |
+
<ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
|
| 1136 |
+
<li>Instagram posts</li>
|
| 1137 |
+
<li>Twitter headers</li>
|
| 1138 |
+
<li>Facebook covers</li>
|
| 1139 |
+
<li>Profile pictures</li>
|
| 1140 |
+
</ul>
|
| 1141 |
+
</div>
|
| 1142 |
+
|
| 1143 |
+
</div>
|
| 1144 |
+
</div>
|
| 1145 |
+
|
| 1146 |
+
</div>
|
| 1147 |
+
"""
|
| 1148 |
+
|
| 1149 |
+
# Simplified - no language switching needed since English only
|
| 1150 |
+
seo_html.value = get_seo_html("en")
|
| 1151 |
+
|
| 1152 |
+
return app
|
| 1153 |
+
|
| 1154 |
+
if __name__ == "__main__":
|
| 1155 |
+
app = create_app()
|
| 1156 |
+
# Improve queue configuration to handle high concurrency and prevent SSE connection issues
|
| 1157 |
+
app.queue(
|
| 1158 |
+
default_concurrency_limit=20, # Default concurrency limit
|
| 1159 |
+
max_size=50, # Maximum queue size
|
| 1160 |
+
api_open=False # Close API access to reduce resource consumption
|
| 1161 |
+
)
|
| 1162 |
+
app.launch(
|
| 1163 |
+
server_name="0.0.0.0",
|
| 1164 |
+
show_error=True, # Show detailed error information
|
| 1165 |
+
quiet=False, # Keep log output
|
| 1166 |
+
max_threads=40, # Increase thread pool size
|
| 1167 |
+
height=800,
|
| 1168 |
+
favicon_path=None # Reduce resource loading
|
| 1169 |
+
)
|
datas/cat01.webp
ADDED
|
Git LFS Details
|
datas/panda01.jpeg
ADDED
|
Git LFS Details
|
datas/panda01m.jpeg
ADDED
|
Git LFS Details
|
i18n/ar.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "محرر الصور بالذكاء الاصطناعي",
|
| 3 |
+
"header_title": "🎨 محرر الصور بالذكاء الاصطناعي",
|
| 4 |
+
"news_banner_prefix": "🚀 أخبار: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image متاح الآن — أفضل توليد بشري على الإطلاق!",
|
| 6 |
+
"global_editor_tab": "🌍 تحرير شامل",
|
| 7 |
+
"upload_image_header": "### 📸 رفع صورة",
|
| 8 |
+
"upload_image_label": "اختر صورة لتحريرها",
|
| 9 |
+
"editing_instructions_header": "### ✍️ تعليمات التحرير",
|
| 10 |
+
"prompt_input_label": "أدخل وصف التحرير",
|
| 11 |
+
"prompt_input_placeholder": "مثال: تغيير الخلفية إلى شاطئ، إضافة قوس قزح، إزالة الخلفية، إلخ...",
|
| 12 |
+
"start_editing_button": "🚀 ابدأ التحرير",
|
| 13 |
+
"editing_result_header": "### 🎯 نتيجة التحرير",
|
| 14 |
+
"output_image_label": "الصورة المعدلة",
|
| 15 |
+
"use_as_input_button": "🔄 استخدام كمدخل",
|
| 16 |
+
"status_output_label": "حالة المعالجة",
|
| 17 |
+
"prompt_examples_header": "### 💡 أمثلة على الأوصاف",
|
| 18 |
+
"local_inpaint_tab": "🖌️ تعديل موضعي",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 رفع صورة ورسم قناع",
|
| 20 |
+
"upload_and_draw_mask_label": "ارفع صورة وارسم قناعًا",
|
| 21 |
+
"reference_image_header": "### 🖼️ صورة مرجعية (اختياري)",
|
| 22 |
+
"reference_image_label": "رفع صورة مرجعية (اختياري)",
|
| 23 |
+
"local_prompt_input_label": "أدخل وصف التحرير الموضعي",
|
| 24 |
+
"local_prompt_input_placeholder": "مثال: تغيير لون الشعر في المنطقة المحددة إلى الأشقر، إضافة نمط للكائن المحدد، تغيير لون المنطقة المحددة، إلخ...",
|
| 25 |
+
"start_local_editing_button": "🎯 بدء التحرير الموضعي",
|
| 26 |
+
"local_output_image_label": "الصورة المعدلة موضعيًا",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 مثال على التعديل الموضعي",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 مثال: تحويل الباندا إلى قطة",
|
| 29 |
+
"main_image_label": "الصورة الرئيسية",
|
| 30 |
+
"mask_label": "القناع",
|
| 31 |
+
"reference_label": "صورة مرجعية",
|
| 32 |
+
"panda_example_note": "**الوصف**: let the cat ride on the panda\n**ملاحظة**: سيتم تطبيق القناع تلقائيًا عند إرسال هذا المثال",
|
| 33 |
+
"load_panda_example_button": "🎨 تحميل مثال الباندا",
|
| 34 |
+
"refresh_editor_button": "🔄 تحديث محرر الصور",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "يرجى رفع صورة أولاً",
|
| 37 |
+
"error_enter_prompt": "يرجى إدخال وصف للتحرير",
|
| 38 |
+
"error_prompt_too_short": "❌ يجب أن يكون وصف التحرير أطول من 3 أحرف",
|
| 39 |
+
"error_request_processing": "❌ خطأ في معالجة الطلب",
|
| 40 |
+
"error_free_limit_reached": "❌ لقد وصلت إلى الحد الأقصى من التوليد المجاني على Hugging Face. يرجى زيارة https://omnicreator.net/#generator للتوليد غير المحدود",
|
| 41 |
+
"error_free_limit_wait": "❌ لقد وصلت إلى الحد الأقصى من التوليد المجاني على Hugging Face. يرجى زيارة https://omnicreator.net/#generator للتوليد غير المحدود، أو الانتظار {wait_minutes_int} دقائق والمحاولة مرة أخرى",
|
| 42 |
+
"status_checking_result": "جاري فحص الصورة الناتجة...",
|
| 43 |
+
"status_applying_filter": "جاري تطبيق فلتر المحتوى...",
|
| 44 |
+
"warning_content_filter": "⚠️ تم تطبيق فلتر المحتوى وفقًا لإرشادات مجتمع Hugging Face. للحصول على حرية إبداعية غير محدودة، يرجى زيارة موقعنا الرسمي https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ مطلوب مراجعة المحتوى. يرجى زيارة https://omnicreator.net/#generator لتجربة أفضل",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "اكتملت المعالجة",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ حدث خطأ أثناء المعالجة: {error}",
|
| 50 |
+
"error_upload_and_draw": "يرجى رفع صورة وتحديد المنطقة المراد تحريرها",
|
| 51 |
+
"error_draw_on_image": "يرجى الرسم على الصورة لتحديد المنطقة التي تريد تحريرها",
|
| 52 |
+
"error_no_image_found": "❌ لم يتم العثور على صورة. يرجى رفع صورة أولاً.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "توليد وتحرير صور غير محدود بالذكاء الاصطناعي",
|
| 55 |
+
"seo_unlimited_desc": "جرب الحرية المطلقة في إنشاء الصور بالذكاء الاصطناعي! قم بتوليد وتحرير الصور بلا حدود أو قيود، وأطلق العنان لخيالك من خلال منصتنا المتقدمة لتحرير الصور بالذكاء الاصطناعي.",
|
| 56 |
+
"seo_unlimited_button": "احصل على وصول غير محدود الآن",
|
| 57 |
+
"seo_unlimited_footer": "انضم إلى آلاف المبدعين الذين يثقون في Omni Creator لتوليد صور غير محدود بالذكاء الاصطناعي!",
|
| 58 |
+
"seo_professional_title": "محرر صور احترافي بالذكاء الاصطناعي - غير محدود",
|
| 59 |
+
"seo_professional_desc": "حوّل رؤيتك الإبداعية إلى حقيقة مع منصتنا المتقدمة لتحرير الصور بالذكاء الاصطناعي. سواء كنت تنشئ فنًا أو تحرر صورًا أو تصمم محتوى أو تعمل مع أي نوع من الصور - فإن ذكاءنا الاصطناعي القوي يزيل كل الحدود ليمنحك حرية إبداعية كاملة.",
|
| 60 |
+
"seo_feature1_title": "توليد غير محدود",
|
| 61 |
+
"seo_feature1_desc": "يتمتع المستخدمون المميزون بتوليد صور غير محدود، بدون حدود يومية أو قيود على المعدل أو المحتوى. أنشئ العديد من الصور كما تريد، في أي وقت وفي أي مكان.",
|
| 62 |
+
"seo_feature2_title": "حرية إبداعية",
|
| 63 |
+
"seo_feature2_desc": "قم بتوليد وتحرير أي نوع من المحتوى بحرية إبداعية كاملة وبلا حدود لخيالك. إمكانيات لا حصر لها للفنانين والمصممين ومنشئي المحتوى.",
|
| 64 |
+
"seo_feature3_title": "معالجة فائقة السرعة",
|
| 65 |
+
"seo_feature3_desc": "توفر البنية التحتية المتقدمة للذكاء الاصطناعي نتائج عالية الجودة في ثوانٍ. لا قوائم انتظار، لا تأخير في المعالجة - فقط تحرير فوري للصور على المستوى الاحترافي.",
|
| 66 |
+
"seo_feature4_title": "أدوات تحرير متقدمة",
|
| 67 |
+
"seo_feature4_desc": "تحويلات شاملة، تعديلات موضعية دقيقة، نقل الأسلوب، إزالة الكائنات، استبدال الخلفية، وعشرات من ميزات التحرير الاحترافية الأخرى.",
|
| 68 |
+
"seo_feature5_title": "جودة استثنائية",
|
| 69 |
+
"seo_feature5_desc": "تقدم نماذج الذكاء الاصطناعي الحديثة المدربة على ملايين الصور جودة وواقعية استثنائية. نتائج احترافية مناسبة للاستخدام التجاري والمشاريع الراقية.",
|
| 70 |
+
"seo_feature6_title": "دعم متعدد الوسائط",
|
| 71 |
+
"seo_feature6_desc": "دعم لجميع تنسيقات الصور والأنماط وحالات الاستخدام. من الصور الشخصية الواقعية إلى الإبداعات الفنية، ومن تصوير المنتجات إلى الفن الرقمي - نحن نتعامل مع كل شيء.",
|
| 72 |
+
"seo_protips_title": "نصائح احترافية للحصول على أفضل النتائج",
|
| 73 |
+
"seo_protip1_title": "أوصاف واضحة:",
|
| 74 |
+
"seo_protip1_desc": "استخدم أوصافًا مفصلة ومحددة للحصول على نتائج أفضل. صف الألوان والأسلوب والإضاءة والتكوين بوضوح.",
|
| 75 |
+
"seo_protip2_title": "التحرير الموضعي:",
|
| 76 |
+
"seo_protip2_desc": "استخدم ضربات فرشاة دقيقة لتحديد المناطق المراد تحريرها موضعيًا. غالبًا ما تؤدي التعديلات الأصغر والأكثر تركيزًا إلى نتائج أفضل.",
|
| 77 |
+
"seo_protip3_title": "عملية تكرارية:",
|
| 78 |
+
"seo_protip3_desc": "استخدم ميزة 'استخدام كمدخل' لتحسين النتائج. يمكن أن تؤدي التكرارات المتعددة إلى تحويلات معقدة.",
|
| 79 |
+
"seo_protip4_title": "جودة الصورة:",
|
| 80 |
+
"seo_protip4_desc": "عادةً ما تؤدي الصور المدخلة ذات الدقة الأعلى (حتى 10 ميجابايت) إلى تعديلات أفضل وتفاصيل أدق.",
|
| 81 |
+
"seo_needs_title": "لكل حاجة إبداعية",
|
| 82 |
+
"seo_needs_art_title": "الفن الرقمي",
|
| 83 |
+
"seo_needs_art_item1": "تصميم الشخصيات",
|
| 84 |
+
"seo_needs_art_item2": "فن المفاهيم",
|
| 85 |
+
"seo_needs_art_item3": "نقل الأسلوب",
|
| 86 |
+
"seo_needs_art_item4": "تأثيرات فنية",
|
| 87 |
+
"seo_needs_photo_title": "التصوير الفوتوغرافي",
|
| 88 |
+
"seo_needs_photo_item1": "استبدال الخلفية",
|
| 89 |
+
"seo_needs_photo_item2": "إزالة الكائنات",
|
| 90 |
+
"seo_needs_photo_item3": "تعديل الإضاءة",
|
| 91 |
+
"seo_needs_photo_item4": "تحسين الصور الشخصية",
|
| 92 |
+
"seo_needs_ecom_title": "التجارة الإلكترونية",
|
| 93 |
+
"seo_needs_ecom_item1": "تصوير المنتجات",
|
| 94 |
+
"seo_needs_ecom_item2": "صور نمط الحياة",
|
| 95 |
+
"seo_needs_ecom_item3": "تغييرات الألوان",
|
| 96 |
+
"seo_needs_ecom_item4": "استبدال المشهد",
|
| 97 |
+
"seo_needs_social_title": "وسائل التواصل الاجتماعي",
|
| 98 |
+
"seo_needs_social_item1": "إنشاء المحتوى",
|
| 99 |
+
"seo_needs_social_item2": "إنشاء الميمز",
|
| 100 |
+
"seo_needs_social_item3": "الهوية البصرية للعلامة التجارية",
|
| 101 |
+
"seo_needs_social_item4": "المحتوى الفيروسي"
|
| 102 |
+
}
|
i18n/da.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI Billededitor",
|
| 3 |
+
"header_title": "🎨 AI Billededitor",
|
| 4 |
+
"news_banner_prefix": "🚀 Nyheder: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image er live — Den bedste menneskelige generering nogensinde!",
|
| 6 |
+
"global_editor_tab": "🌍 Global Redigering",
|
| 7 |
+
"upload_image_header": "### 📸 Upload Billede",
|
| 8 |
+
"upload_image_label": "Vælg et billede at redigere",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Redigeringsinstruktioner",
|
| 10 |
+
"prompt_input_label": "Indtast redigeringsprompt",
|
| 11 |
+
"prompt_input_placeholder": "F.eks.: skift baggrunden til en strand, tilføj en regnbue, fjern baggrunden osv...",
|
| 12 |
+
"start_editing_button": "🚀 Start Redigering",
|
| 13 |
+
"editing_result_header": "### 🎯 Redigeringsresultat",
|
| 14 |
+
"output_image_label": "Redigeret billede",
|
| 15 |
+
"use_as_input_button": "🔄 Brug som input",
|
| 16 |
+
"status_output_label": "Behandlingsstatus",
|
| 17 |
+
"prompt_examples_header": "### 💡 Eksempler på Prompts",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Lokal Inpainting",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Upload billede og tegn maske",
|
| 20 |
+
"upload_and_draw_mask_label": "Upload billede og tegn maske",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referencebillede (valgfrit)",
|
| 22 |
+
"reference_image_label": "Upload referencebillede (valgfrit)",
|
| 23 |
+
"local_prompt_input_label": "Indtast lokal redigeringsprompt",
|
| 24 |
+
"local_prompt_input_placeholder": "F.eks.: gør håret i det valgte område blondt, tilføj et mønster til det valgte objekt, skift farven på det valgte område osv...",
|
| 25 |
+
"start_local_editing_button": "🎯 Start Lokal Redigering",
|
| 26 |
+
"local_output_image_label": "Lokalt redigeret billede",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Eksempler på Lokal Inpainting",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Eksempel: Panda til Kat",
|
| 29 |
+
"main_image_label": "Hovedbillede",
|
| 30 |
+
"mask_label": "Maske",
|
| 31 |
+
"reference_label": "Reference",
|
| 32 |
+
"panda_example_note": "**Prompt**: lad katten ride på pandaen\n**Bemærk**: Masken vil blive anvendt automatisk, når dette eksempel indsendes",
|
| 33 |
+
"load_panda_example_button": "🎨 Indlæs Panda Eksempel",
|
| 34 |
+
"refresh_editor_button": "🔄 Genopfrisk Billededitor",
|
| 35 |
+
"error_upload_first": "Upload venligst et billede først",
|
| 36 |
+
"error_enter_prompt": "Indtast venligst en redigeringsprompt",
|
| 37 |
+
"error_prompt_too_short": "❌ Redigeringsprompten skal være længere end 3 tegn",
|
| 38 |
+
"error_request_processing": "❌ Fejl under behandling af anmodning",
|
| 39 |
+
"error_free_limit_reached": "❌ Du har nået din gratis generationsgrænse på Hugging Face. Besøg https://omnicreator.net/#generator for ubegrænset generation",
|
| 40 |
+
"error_free_limit_wait": "❌ Du har nået din gratis generationsgrænse på Hugging Face. Besøg https://omnicreator.net/#generator for ubegrænset generation, eller vent {wait_minutes_int} minutter og prøv igen",
|
| 41 |
+
"status_checking_result": "Tjekker resultatbillede...",
|
| 42 |
+
"status_applying_filter": "Anvender indholdsfilter...",
|
| 43 |
+
"warning_content_filter": "⚠️ Indholdsfilter er blevet anvendt i henhold til Hugging Face's fællesskabsretningslinjer. For ubegrænset kreativ frihed, besøg venligst vores officielle hjemmeside på https://omnicreator.net/#generator",
|
| 44 |
+
"warning_content_review": "⚠️ Indholdsgennemgang påkrævet. Besøg venligst https://omnicreator.net/#generator for en bedre oplevelse",
|
| 45 |
+
"status_completed_message": "✅ {message}",
|
| 46 |
+
"status_processing_completed": "Behandling fuldført",
|
| 47 |
+
"error_processing_failed": "❌ {message}",
|
| 48 |
+
"error_processing_exception": "❌ Der opstod en fejl under behandlingen: {error}",
|
| 49 |
+
"error_upload_and_draw": "Upload venligst et billede og tegn det område, du vil redigere",
|
| 50 |
+
"error_draw_on_image": "Tegn venligst det område, du vil redigere, på billedet",
|
| 51 |
+
"error_no_image_found": "❌ Intet billede fundet. Upload venligst et billede først.",
|
| 52 |
+
"seo_unlimited_title": "Ubegrænset AI Billedgenerering og Redigering",
|
| 53 |
+
"seo_unlimited_desc": "Oplev den ultimative frihed inden for AI-billedskabelse! Generer og rediger billeder uden grænser, uden begrænsninger, og slip din fantasi helt løs med vores avancerede AI-billedredigeringsplatform.",
|
| 54 |
+
"seo_unlimited_button": "Få Ubegrænset Adgang Nu",
|
| 55 |
+
"seo_unlimited_footer": "Slut dig til tusindvis af skabere, der stoler på Omni Creator for ubegrænset AI-billedgenerering!",
|
| 56 |
+
"seo_professional_title": "Professionel AI Billededitor - Ubegrænset",
|
| 57 |
+
"seo_professional_desc": "Gør dine kreative visioner til virkelighed med vores avancerede AI-billedredigeringsplatform. Uanset om du skaber kunst, redigerer fotos, designer indhold eller arbejder med enhver form for billede – vores kraftfulde AI fjerner alle begrænsninger og giver dig fuld kreativ frihed.",
|
| 58 |
+
"seo_feature1_title": "Ubegrænset Generation",
|
| 59 |
+
"seo_feature1_desc": "Premium-brugere nyder ubegrænset billedgenerering uden daglige grænser, hastighedsbegrænsninger eller indholdsbarrierer. Skab så mange billeder, du vil, når du vil.",
|
| 60 |
+
"seo_feature2_title": "Kreativ Frihed",
|
| 61 |
+
"seo_feature2_desc": "Generer og rediger enhver form for indhold med fuld kreativ frihed og ingen begrænsninger for din fantasi. Uendelige muligheder for kunstnere, designere og indholdsskabere.",
|
| 62 |
+
"seo_feature3_title": "Lynhurtig Behandling",
|
| 63 |
+
"seo_feature3_desc": "Avanceret AI-infrastruktur leverer resultater i høj kvalitet på få sekunder. Ingen køer, ingen behandlingsforsinkelser – kun øjeblikkelig, professionel billedredigering.",
|
| 64 |
+
"seo_feature4_title": "Avancerede Redigeringsværktøjer",
|
| 65 |
+
"seo_feature4_desc": "Globale transformationer, præcise lokale redigeringer, stiloverførsel, fjernelse af objekter, udskiftning af baggrund og snesevis af andre professionelle redigeringsfunktioner.",
|
| 66 |
+
"seo_feature5_title": "Enestående Kvalitet",
|
| 67 |
+
"seo_feature5_desc": "Topmoderne AI-modeller trænet på millioner af billeder leverer enestående kvalitet og fotorealisme. Professionelle resultater, der er egnede til kommerciel brug og avancerede projekter.",
|
| 68 |
+
"seo_feature6_title": "Multimodal Understøttelse",
|
| 69 |
+
"seo_feature6_desc": "Understøtter alle billedformater, stilarter og anvendelsestilfælde. Fra fotorealistiske portrætter til kunstneriske kreationer, fra produktfotografering til digital kunst – vi klarer det hele.",
|
| 70 |
+
"seo_protips_title": "Pro-Tips til de Bedste Resultater",
|
| 71 |
+
"seo_protip1_title": "Klare Beskrivelser:",
|
| 72 |
+
"seo_protip1_desc": "Brug detaljerede, specifikke prompts for bedre resultater. Vær klar omkring farver, stilarter, belysning og komposition.",
|
| 73 |
+
"seo_protip2_title": "Lokal Redigering:",
|
| 74 |
+
"seo_protip2_desc": "Vælg områder til lokal redigering med præcise penselstrøg. Mindre, mere fokuserede redigeringer giver ofte bedre resultater.",
|
| 75 |
+
"seo_protip3_title": "Iterativ Proces:",
|
| 76 |
+
"seo_protip3_desc": "Brug funktionen 'Brug som input' til at forfine dine resultater. Flere iterationer kan føre til komplekse transformationer.",
|
| 77 |
+
"seo_protip4_title": "Billedkvalitet:",
|
| 78 |
+
"seo_protip4_desc": "Inputbilleder med højere opløsning (op til 10MB) giver generelt bedre redigeringer og finere detaljer.",
|
| 79 |
+
"seo_needs_title": "Til Alle Kreative Behov",
|
| 80 |
+
"seo_needs_art_title": "Digital Kunst",
|
| 81 |
+
"seo_needs_art_item1": "Karakterdesign",
|
| 82 |
+
"seo_needs_art_item2": "Konceptkunst",
|
| 83 |
+
"seo_needs_art_item3": "Stiloverførsel",
|
| 84 |
+
"seo_needs_art_item4": "Kunstneriske Effekter",
|
| 85 |
+
"seo_needs_photo_title": "Fotografi",
|
| 86 |
+
"seo_needs_photo_item1": "Baggrundsudskiftning",
|
| 87 |
+
"seo_needs_photo_item2": "Fjernelse af Objekter",
|
| 88 |
+
"seo_needs_photo_item3": "Belysningsjusteringer",
|
| 89 |
+
"seo_needs_photo_item4": "Portrætforbedring",
|
| 90 |
+
"seo_needs_ecom_title": "E-handel",
|
| 91 |
+
"seo_needs_ecom_item1": "Produktfotografering",
|
| 92 |
+
"seo_needs_ecom_item2": "Livsstilsbilleder",
|
| 93 |
+
"seo_needs_ecom_item3": "Farvevariationer",
|
| 94 |
+
"seo_needs_ecom_item4": "Scenekomposition",
|
| 95 |
+
"seo_needs_social_title": "Sociale Medier",
|
| 96 |
+
"seo_needs_social_item1": "Indholdsskabelse",
|
| 97 |
+
"seo_needs_social_item2": "Meme-generering",
|
| 98 |
+
"seo_needs_social_item3": "Brandede Visuelle elementer",
|
| 99 |
+
"seo_needs_social_item4": "Viralt Indhold"
|
| 100 |
+
}
|
i18n/de.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "KI-Bildeditor",
|
| 3 |
+
"header_title": "🎨 KI-Bildeditor",
|
| 4 |
+
"news_banner_prefix": "🚀 Neuigkeiten: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image ist live — Die beste menschliche Generierung aller Zeiten!",
|
| 6 |
+
"global_editor_tab": "🌍 Globale Bearbeitung",
|
| 7 |
+
"upload_image_header": "### 📸 Bild hochladen",
|
| 8 |
+
"upload_image_label": "Wählen Sie ein Bild zur Bearbeitung aus",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Bearbeitungsanweisungen",
|
| 10 |
+
"prompt_input_label": "Bearbeitungsaufforderung eingeben",
|
| 11 |
+
"prompt_input_placeholder": "Z.B.: Hintergrund zu einem Strand ändern, einen Regenbogen hinzufügen, Hintergrund entfernen, etc...",
|
| 12 |
+
"start_editing_button": "🚀 Bearbeitung starten",
|
| 13 |
+
"editing_result_header": "### 🎯 Bearbeitungsergebnis",
|
| 14 |
+
"output_image_label": "Bearbeitetes Bild",
|
| 15 |
+
"use_as_input_button": "🔄 Als Eingabe verwenden",
|
| 16 |
+
"status_output_label": "Verarbeitungsstatus",
|
| 17 |
+
"prompt_examples_header": "### 💡 Beispiel-Prompts",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Lokales Inpainting",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Bild hochladen & Maske zeichnen",
|
| 20 |
+
"upload_and_draw_mask_label": "Laden Sie ein Bild hoch und zeichnen Sie eine Maske",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referenzbild (Optional)",
|
| 22 |
+
"reference_image_label": "Referenzbild hochladen (optional)",
|
| 23 |
+
"local_prompt_input_label": "Lokale Bearbeitungsaufforderung eingeben",
|
| 24 |
+
"local_prompt_input_placeholder": "Z.B.: Haare im ausgewählten Bereich blond färben, dem ausgewählten Objekt ein Muster hinzufügen, Farbe des ausgewählten Bereichs ändern, etc...",
|
| 25 |
+
"start_local_editing_button": "🎯 Lokale Bearbeitung starten",
|
| 26 |
+
"local_output_image_label": "Lokal bearbeitetes Bild",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Beispiel für lokales Inpainting",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Beispiel: Panda in Katze verwandeln",
|
| 29 |
+
"main_image_label": "Hauptbild",
|
| 30 |
+
"mask_label": "Maske",
|
| 31 |
+
"reference_label": "Referenzbild",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Hinweis**: Die Maske wird beim Absenden dieses Beispiels automatisch angewendet",
|
| 33 |
+
"load_panda_example_button": "🎨 Panda-Beispiel laden",
|
| 34 |
+
"refresh_editor_button": "🔄 Bildeditor aktualisieren",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Bitte laden Sie zuerst ein Bild hoch",
|
| 37 |
+
"error_enter_prompt": "Bitte geben Sie eine Bearbeitungsaufforderung ein",
|
| 38 |
+
"error_prompt_too_short": "❌ Die Bearbeitungsaufforderung muss mehr als 3 Zeichen enthalten",
|
| 39 |
+
"error_request_processing": "❌ Fehler bei der Verarbeitung der Anfrage",
|
| 40 |
+
"error_free_limit_reached": "❌ Sie haben Ihr Limit für kostenlose Generierungen auf Hugging Face erreicht. Besuchen Sie https://omnicreator.net/#generator für unbegrenzte Generierungen",
|
| 41 |
+
"error_free_limit_wait": "❌ Sie haben Ihr Limit für kostenlose Generierungen auf Hugging Face erreicht. Besuchen Sie https://omnicreator.net/#generator für unbegrenzte Generierungen oder warten Sie {wait_minutes_int} Minuten und versuchen Sie es erneut",
|
| 42 |
+
"status_checking_result": "Überprüfe Ergebnisbild...",
|
| 43 |
+
"status_applying_filter": "Inhaltsfilter wird angewendet...",
|
| 44 |
+
"warning_content_filter": "⚠️ Ein Inhaltsfilter wurde gemäß den Community-Richtlinien von Hugging Face angewendet. Für unbegrenzte kreative Freiheit besuchen Sie unsere offizielle Website https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Inhaltsüberprüfung erforderlich. Besuchen Sie https://omnicreator.net/#generator für eine bessere Erfahrung",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Verarbeitung abgeschlossen",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Fehler bei der Verarbeitung: {error}",
|
| 50 |
+
"error_upload_and_draw": "Bitte laden Sie ein Bild hoch und zeichnen Sie den zu bearbeitenden Bereich",
|
| 51 |
+
"error_draw_on_image": "Bitte zeichnen Sie auf dem Bild den Bereich, den Sie bearbeiten möchten",
|
| 52 |
+
"error_no_image_found": "❌ Kein Bild gefunden. Bitte laden Sie zuerst ein Bild hoch.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Unbegrenzte KI-Bilderzeugung & -bearbeitung",
|
| 55 |
+
"seo_unlimited_desc": "Erleben Sie die ultimative Freiheit bei der KI-Bilderstellung! Generieren und bearbeiten Sie Bilder ohne Limits oder Einschränkungen und entfesseln Sie Ihre Fantasie mit unserer fortschrittlichen KI-Bildbearbeitungsplattform.",
|
| 56 |
+
"seo_unlimited_button": "Jetzt unbegrenzten Zugang erhalten",
|
| 57 |
+
"seo_unlimited_footer": "Schließen Sie sich Tausenden von Kreativen an, die Omni Creator für unbegrenzte KI-Bilderzeugung vertrauen!",
|
| 58 |
+
"seo_professional_title": "Professioneller KI-Bildeditor - Unbegrenzt",
|
| 59 |
+
"seo_professional_desc": "Verwandeln Sie Ihre kreativen Visionen mit unserer fortschrittlichen KI-Bildbearbeitungsplattform in die Realität. Ob Sie Kunst schaffen, Fotos bearbeiten, Inhalte gestalten oder mit jeder Art von Bild arbeiten – unsere leistungsstarke KI beseitigt alle Grenzen und gibt Ihnen völlige kreative Freiheit.",
|
| 60 |
+
"seo_feature1_title": "Unbegrenzte Generierungen",
|
| 61 |
+
"seo_feature1_desc": "Premium-Benutzer genießen unbegrenzte Bildgenerierungen ohne tägliche Limits, Ratenbegrenzungen oder Inhaltsbarrieren. Erstellen Sie so viele Bilder, wie Sie möchten, wann und wo immer Sie wollen.",
|
| 62 |
+
"seo_feature2_title": "Kreative Freiheit",
|
| 63 |
+
"seo_feature2_desc": "Generieren und bearbeiten Sie jede Art von Inhalt mit vollständiger kreativer Freiheit und ohne Grenzen für Ihre Vorstellungskraft. Unendliche Möglichkeiten für Künstler, Designer und Content-Ersteller.",
|
| 64 |
+
"seo_feature3_title": "Blitzschnelle Verarbeitung",
|
| 65 |
+
"seo_feature3_desc": "Eine fortschrittliche KI-Infrastruktur liefert in Sekundenschnelle hochwertige Ergebnisse. Keine Warteschlangen, keine Verarbeitungsverzögerungen – nur sofortige Bildbearbeitung auf Profi-Niveau.",
|
| 66 |
+
"seo_feature4_title": "Fortgeschrittene Bearbeitungswerkzeuge",
|
| 67 |
+
"seo_feature4_desc": "Globale Transformationen, präzise lokale Bearbeitungen, Stilübertragung, Objektentfernung, Hintergrundersetzung und Dutzende anderer professioneller Bearbeitungsfunktionen.",
|
| 68 |
+
"seo_feature5_title": "Außergewöhnliche Qualität",
|
| 69 |
+
"seo_feature5_desc": "Modernste KI-Modelle, die auf Millionen von Bildern trainiert wurden, liefern außergewöhnliche Qualität und Realismus. Ergebnisse auf Profi-Niveau, die für kommerzielle Nutzung und High-End-Projekte geeignet sind.",
|
| 70 |
+
"seo_feature6_title": "Multimodale Unterstützung",
|
| 71 |
+
"seo_feature6_desc": "Unterstützung für alle Bildformate, Stile und Anwendungsfälle. Von fotorealistischen Porträts bis hin zu künstlerischen Kreationen, von Produktfotografie bis hin zu digitaler Kunst – wir kümmern uns um alles.",
|
| 72 |
+
"seo_protips_title": "Pro-Tipps für die besten Ergebnisse",
|
| 73 |
+
"seo_protip1_title": "Klare Beschreibungen:",
|
| 74 |
+
"seo_protip1_desc": "Verwenden Sie detaillierte und spezifische Prompts für bessere Ergebnisse. Beschreiben Sie Farben, Stil, Beleuchtung und Komposition klar.",
|
| 75 |
+
"seo_protip2_title": "Lokale Bearbeitung:",
|
| 76 |
+
"seo_protip2_desc": "Verwenden Sie präzise Pinselstriche, um Bereiche für lokale Bearbeitungen auszuwählen. Kleinere, fokussiertere Bearbeitungen führen oft zu besseren Ergebnissen.",
|
| 77 |
+
"seo_protip3_title": "Iterativer Prozess:",
|
| 78 |
+
"seo_protip3_desc": "Verwenden Sie die Funktion 'Als Eingabe verwenden', um Ergebnisse zu verfeinern. Mehrere Iterationen können zu komplexen Transformationen führen.",
|
| 79 |
+
"seo_protip4_title": "Bildqualität:",
|
| 80 |
+
"seo_protip4_desc": "Höher aufgelöste Eingabebilder (bis zu 10 MB) führen in der Regel zu besseren Bearbeitungen und feineren Details.",
|
| 81 |
+
"seo_needs_title": "Für jeden kreativen Bedarf",
|
| 82 |
+
"seo_needs_art_title": "Digitale Kunst",
|
| 83 |
+
"seo_needs_art_item1": "Charakterdesign",
|
| 84 |
+
"seo_needs_art_item2": "Konzeptkunst",
|
| 85 |
+
"seo_needs_art_item3": "Stilübertragung",
|
| 86 |
+
"seo_needs_art_item4": "Künstlerische Effekte",
|
| 87 |
+
"seo_needs_photo_title": "Fotografie",
|
| 88 |
+
"seo_needs_photo_item1": "Hintergrundersetzung",
|
| 89 |
+
"seo_needs_photo_item2": "Objektentfernung",
|
| 90 |
+
"seo_needs_photo_item3": "Beleuchtungsanpassung",
|
| 91 |
+
"seo_needs_photo_item4": "Porträtverbesserung",
|
| 92 |
+
"seo_needs_ecom_title": "E-Commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Produktfotografie",
|
| 94 |
+
"seo_needs_ecom_item2": "Lifestyle-Aufnahmen",
|
| 95 |
+
"seo_needs_ecom_item3": "Farbvarianten",
|
| 96 |
+
"seo_needs_ecom_item4": "Szenenersetzung",
|
| 97 |
+
"seo_needs_social_title": "Soziale Medien",
|
| 98 |
+
"seo_needs_social_item1": "Inhaltserstellung",
|
| 99 |
+
"seo_needs_social_item2": "Meme-Generierung",
|
| 100 |
+
"seo_needs_social_item3": "Markenvisuals",
|
| 101 |
+
"seo_needs_social_item4": "Virale Inhalte"
|
| 102 |
+
}
|
i18n/en.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI Image Editor",
|
| 3 |
+
"header_title": "🎨 AI Image Editor",
|
| 4 |
+
"news_banner_prefix": "🚀 NEWS: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image Is Live — The Best Human Generation Yet!",
|
| 6 |
+
"global_editor_tab": "🌍 Global Editor",
|
| 7 |
+
"upload_image_header": "### 📸 Upload Image",
|
| 8 |
+
"upload_image_label": "Select image to edit",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Editing Instructions",
|
| 10 |
+
"prompt_input_label": "Enter editing prompt",
|
| 11 |
+
"prompt_input_placeholder": "For example: change background to beach, add rainbow, remove background, etc...",
|
| 12 |
+
"start_editing_button": "🚀 Start Editing",
|
| 13 |
+
"editing_result_header": "### 🎯 Editing Result",
|
| 14 |
+
"output_image_label": "Edited image",
|
| 15 |
+
"use_as_input_button": "🔄 Use as Input",
|
| 16 |
+
"status_output_label": "Processing status",
|
| 17 |
+
"prompt_examples_header": "### 💡 Prompt Examples",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Local Inpaint",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Upload Image and Draw Mask",
|
| 20 |
+
"upload_and_draw_mask_label": "Upload image and draw mask",
|
| 21 |
+
"reference_image_header": "### 🖼️ Reference Image(Optional)",
|
| 22 |
+
"reference_image_label": "Upload reference image (optional)",
|
| 23 |
+
"local_prompt_input_label": "Enter local editing prompt",
|
| 24 |
+
"local_prompt_input_placeholder": "For example: change selected area hair to golden, add patterns to selected object, change selected area color, etc...",
|
| 25 |
+
"start_local_editing_button": "🎯 Start Local Editing",
|
| 26 |
+
"local_output_image_label": "Local edited image",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Local Inpaint Example",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Example: Panda to Cat Transformation",
|
| 29 |
+
"main_image_label": "Main Image",
|
| 30 |
+
"mask_label": "Mask",
|
| 31 |
+
"reference_label": "Reference",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda \n**Note**: Mask will be automatically applied when you submit this example",
|
| 33 |
+
"load_panda_example_button": "🎨 Load Panda Example",
|
| 34 |
+
"refresh_editor_button": "🔄 Refresh Image Editor",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Please upload an image first",
|
| 37 |
+
"error_enter_prompt": "Please enter editing prompt",
|
| 38 |
+
"error_prompt_too_short": "❌ Editing prompt must be more than 3 characters",
|
| 39 |
+
"error_request_processing": "❌ Request processing error",
|
| 40 |
+
"error_free_limit_reached": "❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/#generator for unlimited generation",
|
| 41 |
+
"error_free_limit_wait": "❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/#generator for unlimited generation, or wait {wait_minutes_int} minutes before generating again",
|
| 42 |
+
"status_checking_result": "Checking result image...",
|
| 43 |
+
"status_applying_filter": "Applying content filter...",
|
| 44 |
+
"warning_content_filter": "⚠️ Content filter applied due to Hugging Face community guidelines. For unlimited creative freedom, visit our official website https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Content review required. Please visit https://omnicreator.net/#generator for better experience",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Processing completed",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Error occurred during processing: {error}",
|
| 50 |
+
"error_upload_and_draw": "Please upload an image and draw the area to edit",
|
| 51 |
+
"error_draw_on_image": "Please draw the area to edit on the image",
|
| 52 |
+
"error_no_image_found": "❌ No image found. Please upload an image first.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Unlimited AI Image Generation & Editing",
|
| 55 |
+
"seo_unlimited_desc": "Experience the ultimate freedom in AI image creation! Generate and edit unlimited images without restrictions, with complete creative freedom and no limits on your imagination with our premium AI image editing platform.",
|
| 56 |
+
"seo_unlimited_button": "Get Unlimited Access Now",
|
| 57 |
+
"seo_unlimited_footer": "Join thousands of creators who trust Omni Creator for unrestricted AI image generation!",
|
| 58 |
+
"seo_professional_title": "Professional AI Image Editor - No Restrictions",
|
| 59 |
+
"seo_professional_desc": "Transform your creative vision into reality with our advanced AI image editing platform. Whether you're creating art, editing photos, designing content, or working with any type of imagery - our powerful AI removes all limitations and gives you complete creative freedom.",
|
| 60 |
+
"seo_feature1_title": "Unlimited Generation",
|
| 61 |
+
"seo_feature1_desc": "Premium users enjoy unlimited image generation without daily limits, rate restrictions, or content barriers. Create as many images as you need, whenever you need them.",
|
| 62 |
+
"seo_feature2_title": "Creative Freedom",
|
| 63 |
+
"seo_feature2_desc": "Generate and edit any type of content with complete creative freedom and no limits on your imagination. Unlimited possibilities for artists, designers, and content creators.",
|
| 64 |
+
"seo_feature3_title": "Lightning Fast Processing",
|
| 65 |
+
"seo_feature3_desc": "Advanced AI infrastructure delivers high-quality results in seconds. No waiting in queues, no processing delays - just instant, professional-grade image editing.",
|
| 66 |
+
"seo_feature4_title": "Advanced Editing Tools",
|
| 67 |
+
"seo_feature4_desc": "Global transformations, precision local editing, style transfer, object removal, background replacement, and dozens of other professional editing capabilities.",
|
| 68 |
+
"seo_feature5_title": "Premium Quality",
|
| 69 |
+
"seo_feature5_desc": "State-of-the-art AI models trained on millions of images deliver exceptional quality and realism. Professional results suitable for commercial use and high-end projects.",
|
| 70 |
+
"seo_feature6_title": "Multi-Modal Support",
|
| 71 |
+
"seo_feature6_desc": "Support for all image formats, styles, and use cases. From photorealistic portraits to artistic creations, product photography to digital art - we handle everything.",
|
| 72 |
+
"seo_protips_title": "Pro Tips for Best Results",
|
| 73 |
+
"seo_protip1_title": "Clear Descriptions:",
|
| 74 |
+
"seo_protip1_desc": "Use detailed, specific prompts for better results. Describe colors, styles, lighting, and composition clearly.",
|
| 75 |
+
"seo_protip2_title": "Local Editing:",
|
| 76 |
+
"seo_protip2_desc": "Use precise brush strokes to select areas for local editing. Smaller, focused edits often yield better results.",
|
| 77 |
+
"seo_protip3_title": "Iterative Process:",
|
| 78 |
+
"seo_protip3_desc": "Use \"Use as Input\" feature to refine results. Multiple iterations can achieve complex transformations.",
|
| 79 |
+
"seo_protip4_title": "Image Quality:",
|
| 80 |
+
"seo_protip4_desc": "Higher resolution input images (up to 10MB) generally produce better editing results and finer details.",
|
| 81 |
+
"seo_needs_title": "Perfect For Every Creative Need",
|
| 82 |
+
"seo_needs_art_title": "Digital Art",
|
| 83 |
+
"seo_needs_art_item1": "Character design",
|
| 84 |
+
"seo_needs_art_item2": "Concept art",
|
| 85 |
+
"seo_needs_art_item3": "Style transfer",
|
| 86 |
+
"seo_needs_art_item4": "Artistic effects",
|
| 87 |
+
"seo_needs_photo_title": "Photography",
|
| 88 |
+
"seo_needs_photo_item1": "Background replacement",
|
| 89 |
+
"seo_needs_photo_item2": "Object removal",
|
| 90 |
+
"seo_needs_photo_item3": "Lighting adjustment",
|
| 91 |
+
"seo_needs_photo_item4": "Portrait enhancement",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Product photography",
|
| 94 |
+
"seo_needs_ecom_item2": "Lifestyle shots",
|
| 95 |
+
"seo_needs_ecom_item3": "Color variations",
|
| 96 |
+
"seo_needs_ecom_item4": "Context placement",
|
| 97 |
+
"seo_needs_social_title": "Social Media",
|
| 98 |
+
"seo_needs_social_item1": "Content creation",
|
| 99 |
+
"seo_needs_social_item2": "Meme generation",
|
| 100 |
+
"seo_needs_social_item3": "Brand visuals",
|
| 101 |
+
"seo_needs_social_item4": "Viral content"
|
| 102 |
+
}
|
i18n/es.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Editor de Imágenes con IA",
|
| 3 |
+
"header_title": "🎨 Editor de Imágenes con IA",
|
| 4 |
+
"news_banner_prefix": "🚀 Noticias: ",
|
| 5 |
+
"news_banner_link": "¡Text-to-Image ya está disponible — la mejor generación humana hasta ahora!",
|
| 6 |
+
"global_editor_tab": "🌍 Edición Global",
|
| 7 |
+
"upload_image_header": "### 📸 Subir Imagen",
|
| 8 |
+
"upload_image_label": "Selecciona una imagen para editar",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Instrucciones de Edición",
|
| 10 |
+
"prompt_input_label": "Introduce la instrucción de edición",
|
| 11 |
+
"prompt_input_placeholder": "Ej: cambiar el fondo a una playa, añadir un arcoíris, eliminar el fondo, etc.",
|
| 12 |
+
"start_editing_button": "🚀 Empezar a Editar",
|
| 13 |
+
"editing_result_header": "### 🎯 Resultado de la Edición",
|
| 14 |
+
"output_image_label": "Imagen editada",
|
| 15 |
+
"use_as_input_button": "🔄 Usar como Entrada",
|
| 16 |
+
"status_output_label": "Estado del Procesamiento",
|
| 17 |
+
"prompt_examples_header": "### 💡 Ejemplos de Instrucciones",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Inpainting Local",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Subir Imagen y Dibujar Máscara",
|
| 20 |
+
"upload_and_draw_mask_label": "Sube una imagen y dibuja una máscara",
|
| 21 |
+
"reference_image_header": "### 🖼️ Imagen de Referencia (Opcional)",
|
| 22 |
+
"reference_image_label": "Subir imagen de referencia (opcional)",
|
| 23 |
+
"local_prompt_input_label": "Introduce la instrucción de edición local",
|
| 24 |
+
"local_prompt_input_placeholder": "Ej: cambiar el pelo del área seleccionada a rubio, añadir un patrón al objeto seleccionado, cambiar el color del área seleccionada, etc.",
|
| 25 |
+
"start_local_editing_button": "🎯 Empezar Edición Local",
|
| 26 |
+
"local_output_image_label": "Imagen editada localmente",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Ejemplo de Inpainting Local",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Ejemplo: Transformar Panda en Gato",
|
| 29 |
+
"main_image_label": "Imagen Principal",
|
| 30 |
+
"mask_label": "Máscara",
|
| 31 |
+
"reference_label": "Imagen de Referencia",
|
| 32 |
+
"panda_example_note": "**Instrucción**: let the cat ride on the panda\n**Nota**: La máscara se aplicará automáticamente al enviar este ejemplo",
|
| 33 |
+
"load_panda_example_button": "🎨 Cargar Ejemplo de Panda",
|
| 34 |
+
"refresh_editor_button": "🔄 Actualizar Editor de Imágenes",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Por favor, sube una imagen primero",
|
| 37 |
+
"error_enter_prompt": "Por favor, introduce una instrucción de edición",
|
| 38 |
+
"error_prompt_too_short": "❌ La instrucción de edición debe tener más de 3 caracteres",
|
| 39 |
+
"error_request_processing": "❌ Error al procesar la solicitud",
|
| 40 |
+
"error_free_limit_reached": "❌ Has alcanzado tu límite de generaciones gratuitas en Hugging Face. Visita https://omnicreator.net/#generator para generaciones ilimitadas",
|
| 41 |
+
"error_free_limit_wait": "❌ Has alcanzado tu límite de generaciones gratuitas en Hugging Face. Visita https://omnicreator.net/#generator para generaciones ilimitadas, o espera {wait_minutes_int} minutos y vuelve a intentarlo",
|
| 42 |
+
"status_checking_result": "Comprobando la imagen resultante...",
|
| 43 |
+
"status_applying_filter": "Aplicando filtro de contenido...",
|
| 44 |
+
"warning_content_filter": "⚠️ Se ha aplicado un filtro de contenido según las directrices de la comunidad de Hugging Face. Para una libertad creativa ilimitada, visita nuestro sitio web oficial https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Se requiere revisión de contenido. Visita https://omnicreator.net/#generator para una mejor experiencia",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Procesamiento completado",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Error durante el procesamiento: {error}",
|
| 50 |
+
"error_upload_and_draw": "Por favor, sube una imagen y dibuja el área a editar",
|
| 51 |
+
"error_draw_on_image": "Por favor, dibuja en la imagen el área que quieres editar",
|
| 52 |
+
"error_no_image_found": "❌ No se encontró ninguna imagen. Por favor, sube una imagen primero.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Generación y Edición de Imágenes con IA Ilimitadas",
|
| 55 |
+
"seo_unlimited_desc": "¡Experimenta la máxima libertad en la creación de imágenes con IA! Genera y edita imágenes sin límites ni restricciones, y da rienda suelta a tu imaginación con nuestra avanzada plataforma de edición de imágenes con IA.",
|
| 56 |
+
"seo_unlimited_button": "Obtén Acceso Ilimitado Ahora",
|
| 57 |
+
"seo_unlimited_footer": "¡Únete a miles de creadores que confían en Omni Creator para la generación ilimitada de imágenes con IA!",
|
| 58 |
+
"seo_professional_title": "Editor Profesional de Imágenes con IA - Ilimitado",
|
| 59 |
+
"seo_professional_desc": "Convierte tus visiones creativas en realidad con nuestra avanzada plataforma de edición de imágenes con IA. Ya sea que estés creando arte, editando fotos, diseñando contenido o trabajando con cualquier tipo de imagen, nuestra potente IA elimina todos los límites para darte total libertad creativa.",
|
| 60 |
+
"seo_feature1_title": "Generaciones Ilimitadas",
|
| 61 |
+
"seo_feature1_desc": "Los usuarios Premium disfrutan de generaciones de imágenes ilimitadas, sin límites diarios, de velocidad o de contenido. Crea tantas imágenes como quieras, cuando y donde quieras.",
|
| 62 |
+
"seo_feature2_title": "Libertad Creativa",
|
| 63 |
+
"seo_feature2_desc": "Genera y edita cualquier tipo de contenido con total libertad creativa y sin límites para tu imaginación. Infinitas posibilidades para artistas, diseñadores y creadores de contenido.",
|
| 64 |
+
"seo_feature3_title": "Procesamiento Ultrarrápido",
|
| 65 |
+
"seo_feature3_desc": "Una infraestructura de IA avanzada ofrece resultados de alta calidad en segundos. Sin colas, sin retrasos de procesamiento: solo edición de imágenes instantánea y de nivel profesional.",
|
| 66 |
+
"seo_feature4_title": "Herramientas de Edición Avanzadas",
|
| 67 |
+
"seo_feature4_desc": "Transformaciones globales, ediciones locales precisas, transferencia de estilo, eliminación de objetos, reemplazo de fondo y docenas de otras funciones de edición profesionales.",
|
| 68 |
+
"seo_feature5_title": "Calidad Excepcional",
|
| 69 |
+
"seo_feature5_desc": "Modelos de IA de vanguardia entrenados en millones de imágenes ofrecen una calidad y un realismo excepcionales. Resultados de nivel profesional adecuados para uso comercial y proyectos de alta gama.",
|
| 70 |
+
"seo_feature6_title": "Soporte Multimodal",
|
| 71 |
+
"seo_feature6_desc": "Soporte para todos los formatos de imagen, estilos y casos de uso. Desde retratos fotorrealistas hasta creaciones artísticas, desde fotografía de productos hasta arte digital, lo manejamos todo.",
|
| 72 |
+
"seo_protips_title": "Consejos Profesionales para los Mejores Resultados",
|
| 73 |
+
"seo_protip1_title": "Descripciones Claras:",
|
| 74 |
+
"seo_protip1_desc": "Usa instrucciones detalladas y específicas para obtener mejores resultados. Describe claramente los colores, el estilo, la iluminación y la composición.",
|
| 75 |
+
"seo_protip2_title": "Edición Local:",
|
| 76 |
+
"seo_protip2_desc": "Usa pinceladas precisas para seleccionar áreas para ediciones locales. Las ediciones más pequeñas y enfocadas suelen producir mejores resultados.",
|
| 77 |
+
"seo_protip3_title": "Proceso Iterativo:",
|
| 78 |
+
"seo_protip3_desc": "Usa la función 'Usar como Entrada' para refinar los resultados. Múltiples iteraciones pueden llevar a transformaciones complejas.",
|
| 79 |
+
"seo_protip4_title": "Calidad de la Imagen:",
|
| 80 |
+
"seo_protip4_desc": "Las imágenes de entrada de mayor resolución (hasta 10 MB) suelen producir mejores ediciones y detalles más finos.",
|
| 81 |
+
"seo_needs_title": "Para Cada Necesidad Creativa",
|
| 82 |
+
"seo_needs_art_title": "Arte Digital",
|
| 83 |
+
"seo_needs_art_item1": "Diseño de Personajes",
|
| 84 |
+
"seo_needs_art_item2": "Arte Conceptual",
|
| 85 |
+
"seo_needs_art_item3": "Transferencia de Estilo",
|
| 86 |
+
"seo_needs_art_item4": "Efectos Artísticos",
|
| 87 |
+
"seo_needs_photo_title": "Fotografía",
|
| 88 |
+
"seo_needs_photo_item1": "Reemplazo de Fondo",
|
| 89 |
+
"seo_needs_photo_item2": "Eliminación de Objetos",
|
| 90 |
+
"seo_needs_photo_item3": "Ajuste de Iluminación",
|
| 91 |
+
"seo_needs_photo_item4": "Mejora de Retratos",
|
| 92 |
+
"seo_needs_ecom_title": "Comercio Electrónico",
|
| 93 |
+
"seo_needs_ecom_item1": "Fotografía de Producto",
|
| 94 |
+
"seo_needs_ecom_item2": "Fotos de Estilo de Vida",
|
| 95 |
+
"seo_needs_ecom_item3": "Variaciones de Color",
|
| 96 |
+
"seo_needs_ecom_item4": "Reemplazo de Escena",
|
| 97 |
+
"seo_needs_social_title": "Redes Sociales",
|
| 98 |
+
"seo_needs_social_item1": "Creación de Contenido",
|
| 99 |
+
"seo_needs_social_item2": "Generación de Memes",
|
| 100 |
+
"seo_needs_social_item3": "Visuales de Marca",
|
| 101 |
+
"seo_needs_social_item4": "Contenido Viral"
|
| 102 |
+
}
|
i18n/fi.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI-kuvaeditori",
|
| 3 |
+
"header_title": "🎨 AI-kuvaeditori",
|
| 4 |
+
"news_banner_prefix": "🚀 Uutisia: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image on nyt julkaistu — paras ihmismallimme koskaan!",
|
| 6 |
+
"global_editor_tab": "🌍 Globaali muokkaus",
|
| 7 |
+
"upload_image_header": "### 📸 Lataa kuva",
|
| 8 |
+
"upload_image_label": "Valitse muokattava kuva",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Muokkausohjeet",
|
| 10 |
+
"prompt_input_label": "Syötä muokkauskehotteesi",
|
| 11 |
+
"prompt_input_placeholder": "Esim: Vaihda tausta rannaksi, lisää sateenkaari, poista tausta jne...",
|
| 12 |
+
"start_editing_button": "🚀 Aloita muokkaus",
|
| 13 |
+
"editing_result_header": "### 🎯 Muokkauksen tulos",
|
| 14 |
+
"output_image_label": "Muokattu kuva",
|
| 15 |
+
"use_as_input_button": "🔄 Käytä syötteenä",
|
| 16 |
+
"status_output_label": "Käsittelyn tila",
|
| 17 |
+
"prompt_examples_header": "### 💡 Kehote-esimerkkejä",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Paikallinen korjaus",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Lataa kuva ja piirrä maski",
|
| 20 |
+
"upload_and_draw_mask_label": "Lataa kuva ja piirrä maski",
|
| 21 |
+
"reference_image_header": "### 🖼️ Viitekuva (valinnainen)",
|
| 22 |
+
"reference_image_label": "Lataa viitekuva (valinnainen)",
|
| 23 |
+
"local_prompt_input_label": "Syötä paikallinen muokkauskehote",
|
| 24 |
+
"local_prompt_input_placeholder": "Esim: Muuta valitun alueen hiukset kultaisiksi, lisää kuvio valittuun kohteeseen, muuta valitun alueen väriä jne...",
|
| 25 |
+
"start_local_editing_button": "🎯 Aloita paikallinen muokkaus",
|
| 26 |
+
"local_output_image_label": "Paikallisesti muokattu kuva",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Paikallisen korjauksen esimerkkejä",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Esimerkki: Panda kissaksi",
|
| 29 |
+
"main_image_label": "Pääkuva",
|
| 30 |
+
"mask_label": "Maski",
|
| 31 |
+
"reference_label": "Viitekuva",
|
| 32 |
+
"panda_example_note": "**Kehote**: let the cat ride on the panda\n**Huomautus**: Maski otetaan automaattisesti käyttöön, kun lähetät tämän esimerkin",
|
| 33 |
+
"load_panda_example_button": "🎨 Lataa panda-esimerkki",
|
| 34 |
+
"refresh_editor_button": "🔄 Päivitä kuvaeditori",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Lataa kuva ensin",
|
| 37 |
+
"error_enter_prompt": "Syötä muokkauskehote",
|
| 38 |
+
"error_prompt_too_short": "❌ Muokkauskehotteen on oltava yli 3 merkkiä pitkä",
|
| 39 |
+
"error_request_processing": "❌ Virhe pyynnön käsittelyssä",
|
| 40 |
+
"error_free_limit_reached": "❌ Olet saavuttanut Hugging Facen ilmaisen generointirajan. Käy osoitteessa https://omnicreator.net/#generator saadaksesi rajoittamattoman generoinnin",
|
| 41 |
+
"error_free_limit_wait": "❌ Olet saavuttanut Hugging Facen ilmaisen generointirajan. Käy osoitteessa https://omnicreator.net/#generator saadaksesi rajoittamattoman generoinnin tai yritä uudelleen {wait_minutes_int} minuutin kuluttua",
|
| 42 |
+
"status_checking_result": "Tarkistetaan tuloskuvaa...",
|
| 43 |
+
"status_applying_filter": "Sovelletaan sisältösuodatinta...",
|
| 44 |
+
"warning_content_filter": "⚠️ Sisältösuodatin on otettu käyttöön Hugging Facen yhteisön ohjeiden mukaisesti. Rajoittamattoman luovan vapauden saamiseksi vieraile virallisella verkkosivustollamme https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Sisällön tarkistus vaaditaan. Käy osoitteessa https://omnicreator.net/#generator saadaksesi paremman käyttökokemuksen",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Käsittely valmis",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Virhe käsittelyn aikana: {error}",
|
| 50 |
+
"error_upload_and_draw": "Lataa kuva ja piirrä muokattava alue",
|
| 51 |
+
"error_draw_on_image": "Piirrä muokattava alue kuvaan",
|
| 52 |
+
"error_no_image_found": "❌ Kuvaa ei löytynyt. Lataa kuva ensin.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Rajoittamaton AI-kuvien generointi ja muokkaus",
|
| 55 |
+
"seo_unlimited_desc": "Koe AI-kuvanluonnin äärimmäinen vapaus! Generoi ja muokkaa kuvia ilman rajoituksia ja päästä mielikuvituksesi valloilleen edistyneellä AI-kuvaeditorialustallamme.",
|
| 56 |
+
"seo_unlimited_button": "Hanki rajoittamaton pääsy nyt",
|
| 57 |
+
"seo_unlimited_footer": "Liity tuhansien luojien joukkoon, jotka luottavat Omni Creatoriin rajoittamattomassa AI-kuvien generoinnissa!",
|
| 58 |
+
"seo_professional_title": "Ammattimainen AI-kuvaeditori - Rajoittamaton",
|
| 59 |
+
"seo_professional_desc": "Toteuta luovat visiosi edistyneellä AI-kuvaeditorialustallamme. Olitpa sitten luomassa taidetta, muokkaamassa valokuvia, suunnittelemassa sisältöä tai työskentelemässä minkä tahansa kuvan kanssa - tehokas tekoälymme poistaa kaikki rajoitukset ja antaa sinulle täydellisen luovan vapauden.",
|
| 60 |
+
"seo_feature1_title": "Rajoittamaton generointi",
|
| 61 |
+
"seo_feature1_desc": "Edistyneet käyttäjät nauttivat rajattomasta kuvien generoinnista ilman päivittäisiä rajoituksia, nopeusrajoituksia tai sisältöesteitä. Luo niin monta kuvaa kuin haluat, milloin haluat.",
|
| 62 |
+
"seo_feature2_title": "Luova vapaus",
|
| 63 |
+
"seo_feature2_desc": "Generoi ja muokkaa minkä tahansa tyyppistä sisältöä täydellisellä luovalla vapaudella ilman mielikuvituksesi rajoituksia. Äärettömät mahdollisuudet taiteilijoille, suunnittelijoille ja sisällöntuottajille.",
|
| 64 |
+
"seo_feature3_title": "Salamannopea käsittely",
|
| 65 |
+
"seo_feature3_desc": "Edistynyt AI-infrastruktuuri tuottaa korkealaatuisia tuloksia sekunneissa. Ei jonotusta, ei käsittelyviiveitä - vain välitöntä, ammattitason kuvankäsittelyä.",
|
| 66 |
+
"seo_feature4_title": "Edistyneet muokkaustyökalut",
|
| 67 |
+
"seo_feature4_desc": "Globaalit muutokset, tarkka paikallinen muokkaus, tyylinsiirto, kohteiden poisto, taustan vaihto ja kymmeniä muita ammattimaisia muokkausominaisuuksia.",
|
| 68 |
+
"seo_feature5_title": "Erinomainen laatu",
|
| 69 |
+
"seo_feature5_desc": "Huippuluokan AI-mallit, jotka on koulutettu miljoonilla kuvilla, tarjoavat poikkeuksellista laatua ja realismia. Ammattitason tulokset kaupalliseen käyttöön ja korkean tason projekteihin.",
|
| 70 |
+
"seo_feature6_title": "Monitilojen tuki",
|
| 71 |
+
"seo_feature6_desc": "Tukee kaikkia kuvamuotoja, tyylejä ja käyttötapauksia. Fotorealistisista muotokuvista taiteellisiin luomuksiin, tuotekuvauksesta digitaaliseen taiteeseen - me hoidamme kaiken.",
|
| 72 |
+
"seo_protips_title": "Ammattilaisvinkkejä parhaiden tulosten saavuttamiseksi",
|
| 73 |
+
"seo_protip1_title": "Selkeät kuvaukset:",
|
| 74 |
+
"seo_protip1_desc": "Käytä yksityiskohtaisia, tarkkoja kehotteita saadaksesi parempia tuloksia. Kuvaile värit, tyyli, valaistus ja sommittelu selkeästi.",
|
| 75 |
+
"seo_protip2_title": "Paikallinen muokkaus:",
|
| 76 |
+
"seo_protip2_desc": "Valitse paikallisesti muokattavat alueet tarkoilla siveltimenvedoilla. Pienemmät, kohdennetummat muokkaukset tuottavat usein parempia tuloksia.",
|
| 77 |
+
"seo_protip3_title": "Iteratiivinen prosessi:",
|
| 78 |
+
"seo_protip3_desc": "Käytä 'Käytä syötteenä' -toimintoa tulosten hiomiseen. Useat iteraatiot voivat saavuttaa monimutkaisia muutoksia.",
|
| 79 |
+
"seo_protip4_title": "Kuvanlaatu:",
|
| 80 |
+
"seo_protip4_desc": "Korkeamman resoluution syötekuvat (enintään 10 Mt) tuottavat yleensä parempia muokkauksia ja hienompia yksityiskohtia.",
|
| 81 |
+
"seo_needs_title": "Täyttää kaikki luovat tarpeet",
|
| 82 |
+
"seo_needs_art_title": "Digitaalinen taide",
|
| 83 |
+
"seo_needs_art_item1": "Hahmosuunnittelu",
|
| 84 |
+
"seo_needs_art_item2": "Konseptitaide",
|
| 85 |
+
"seo_needs_art_item3": "Tyylinsiirto",
|
| 86 |
+
"seo_needs_art_item4": "Taiteelliset tehosteet",
|
| 87 |
+
"seo_needs_photo_title": "Valokuvaus",
|
| 88 |
+
"seo_needs_photo_item1": "Taustan vaihto",
|
| 89 |
+
"seo_needs_photo_item2": "Kohteiden poisto",
|
| 90 |
+
"seo_needs_photo_item3": "Valaistuksen säädöt",
|
| 91 |
+
"seo_needs_photo_item4": "Muotokuvien parantelu",
|
| 92 |
+
"seo_needs_ecom_title": "Verkkokauppa",
|
| 93 |
+
"seo_needs_ecom_item1": "Tuotekuvaus",
|
| 94 |
+
"seo_needs_ecom_item2": "Lifestyle-kuvat",
|
| 95 |
+
"seo_needs_ecom_item3": "Värimuunnelmat",
|
| 96 |
+
"seo_needs_ecom_item4": "Näkymän sijoittelu",
|
| 97 |
+
"seo_needs_social_title": "Sosiaalinen media",
|
| 98 |
+
"seo_needs_social_item1": "Sisällöntuotanto",
|
| 99 |
+
"seo_needs_social_item2": "Meemien generointi",
|
| 100 |
+
"seo_needs_social_item3": "Brändin visuaalit",
|
| 101 |
+
"seo_needs_social_item4": "Viraalisisältö"
|
| 102 |
+
}
|
i18n/fr.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Éditeur d'Images IA",
|
| 3 |
+
"header_title": "🎨 Éditeur d'Images IA",
|
| 4 |
+
"news_banner_prefix": "🚀 Actualités : ",
|
| 5 |
+
"news_banner_link": "Text-to-Image est disponible — La meilleure génération humaine à ce jour !",
|
| 6 |
+
"global_editor_tab": "🌍 Édition Globale",
|
| 7 |
+
"upload_image_header": "### 📸 Télécharger une image",
|
| 8 |
+
"upload_image_label": "Sélectionnez une image à modifier",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Instructions de modification",
|
| 10 |
+
"prompt_input_label": "Saisissez votre instruction de modification",
|
| 11 |
+
"prompt_input_placeholder": "Ex : changer l'arrière-plan en plage, ajouter un arc-en-ciel, supprimer l'arrière-plan, etc.",
|
| 12 |
+
"start_editing_button": "🚀 Commencer la modification",
|
| 13 |
+
"editing_result_header": "### 🎯 Résultat de la modification",
|
| 14 |
+
"output_image_label": "Image modifiée",
|
| 15 |
+
"use_as_input_button": "🔄 Utiliser comme entrée",
|
| 16 |
+
"status_output_label": "Statut du traitement",
|
| 17 |
+
"prompt_examples_header": "### 💡 Exemples d'instructions",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Remplissage Localisé",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Télécharger une image et dessiner un masque",
|
| 20 |
+
"upload_and_draw_mask_label": "Téléchargez une image et dessinez un masque",
|
| 21 |
+
"reference_image_header": "### 🖼️ Image de référence (Optionnel)",
|
| 22 |
+
"reference_image_label": "Télécharger une image de référence (optionnel)",
|
| 23 |
+
"local_prompt_input_label": "Saisissez l'instruction de modification locale",
|
| 24 |
+
"local_prompt_input_placeholder": "Ex : changer les cheveux dans la zone sélectionnée en blonds, ajouter un motif à l'objet sélectionné, changer la couleur de la zone sélectionnée, etc.",
|
| 25 |
+
"start_local_editing_button": "🎯 Commencer la modification locale",
|
| 26 |
+
"local_output_image_label": "Image modifiée localement",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Exemple de remplissage localisé",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Exemple : Transformer un panda en chat",
|
| 29 |
+
"main_image_label": "Image principale",
|
| 30 |
+
"mask_label": "Masque",
|
| 31 |
+
"reference_label": "Image de référence",
|
| 32 |
+
"panda_example_note": "**Instruction** : let the cat ride on the panda\n**Note** : Le masque sera appliqué automatiquement en soumettant cet exemple",
|
| 33 |
+
"load_panda_example_button": "🎨 Charger l'exemple du panda",
|
| 34 |
+
"refresh_editor_button": "🔄 Actualiser l'éditeur d'images",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Veuillez d'abord télécharger une image",
|
| 37 |
+
"error_enter_prompt": "Veuillez saisir une instruction de modification",
|
| 38 |
+
"error_prompt_too_short": "❌ L'instruction de modification doit comporter plus de 3 caractères",
|
| 39 |
+
"error_request_processing": "❌ Erreur lors du traitement de la requête",
|
| 40 |
+
"error_free_limit_reached": "❌ Vous avez atteint votre limite de générations gratuites sur Hugging Face. Visitez https://omnicreator.net/#generator pour des générations illimitées",
|
| 41 |
+
"error_free_limit_wait": "❌ Vous avez atteint votre limite de générations gratuites sur Hugging Face. Visitez https://omnicreator.net/#generator pour des générations illimitées, ou attendez {wait_minutes_int} minutes et réessayez",
|
| 42 |
+
"status_checking_result": "Vérification de l'image résultante...",
|
| 43 |
+
"status_applying_filter": "Application du filtre de contenu...",
|
| 44 |
+
"warning_content_filter": "⚠️ Un filtre de contenu a été appliqué conformément aux directives de la communauté Hugging Face. Pour une liberté de création illimitée, visitez notre site officiel https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Un examen du contenu est requis. Visitez https://omnicreator.net/#generator pour une meilleure expérience",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Traitement terminé",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Une erreur s'est produite lors du traitement : {error}",
|
| 50 |
+
"error_upload_and_draw": "Veuillez télécharger une image et dessiner la zone à modifier",
|
| 51 |
+
"error_draw_on_image": "Veuillez dessiner sur l'image la zone que vous souhaitez modifier",
|
| 52 |
+
"error_no_image_found": "❌ Aucune image trouvée. Veuillez d'abord télécharger une image.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Génération et Retouche d'Images IA Illimitées",
|
| 55 |
+
"seo_unlimited_desc": "Découvrez la liberté ultime de la création d'images par IA ! Générez et retouchez des images sans limites ni restrictions, et libérez votre imagination avec notre plateforme avancée de retouche d'images par IA.",
|
| 56 |
+
"seo_unlimited_button": "Obtenez un Accès Illimité Maintenant",
|
| 57 |
+
"seo_unlimited_footer": "Rejoignez des milliers de créateurs qui font confiance à Omni Creator pour une génération d'images IA illimitée !",
|
| 58 |
+
"seo_professional_title": "Éditeur d'Images IA Professionnel - Illimité",
|
| 59 |
+
"seo_professional_desc": "Transformez vos visions créatives en réalité avec notre plateforme avancée de retouche d'images par IA. Que vous créiez de l'art, retouchiez des photos, conceviez du contenu ou travailliez avec n'importe quel type d'image, notre IA puissante supprime toutes les limites pour vous offrir une liberté de création totale.",
|
| 60 |
+
"seo_feature1_title": "Générations Illimitées",
|
| 61 |
+
"seo_feature1_desc": "Les utilisateurs Premium bénéficient de générations d'images illimitées, sans limites quotidiennes, sans limitation de débit et sans barrières de contenu. Créez autant d'images que vous le souhaitez, quand vous le voulez, où vous le voulez.",
|
| 62 |
+
"seo_feature2_title": "Liberté de Création",
|
| 63 |
+
"seo_feature2_desc": "Générez et retouchez tout type de contenu avec une liberté de création totale et sans aucune limite à votre imagination. Des possibilités infinies pour les artistes, les designers et les créateurs de contenu.",
|
| 64 |
+
"seo_feature3_title": "Traitement Ultra-Rapide",
|
| 65 |
+
"seo_feature3_desc": "Une infrastructure IA avancée fournit des résultats de haute qualité en quelques secondes. Pas de files d'attente, pas de délais de traitement - juste une retouche d'image instantanée de niveau professionnel.",
|
| 66 |
+
"seo_feature4_title": "Outils de Retouche Avancés",
|
| 67 |
+
"seo_feature4_desc": "Transformations globales, modifications locales précises, transfert de style, suppression d'objets, remplacement d'arrière-plan et des dizaines d'autres fonctionnalités de retouche professionnelles.",
|
| 68 |
+
"seo_feature5_title": "Qualité Exceptionnelle",
|
| 69 |
+
"seo_feature5_desc": "Des modèles d'IA de pointe entraînés sur des millions d'images offrent une qualité et un réalisme exceptionnels. Des résultats de niveau professionnel adaptés à un usage commercial et à des projets haut de gamme.",
|
| 70 |
+
"seo_feature6_title": "Support Multimodal",
|
| 71 |
+
"seo_feature6_desc": "Prise en charge de tous les formats d'image, styles et cas d'utilisation. Des portraits photoréalistes aux créations artistiques, de la photographie de produits à l'art numérique - nous gérons tout.",
|
| 72 |
+
"seo_protips_title": "Conseils de Pro pour les Meilleurs Résultats",
|
| 73 |
+
"seo_protip1_title": "Descriptions Claires :",
|
| 74 |
+
"seo_protip1_desc": "Utilisez des instructions détaillées et spécifiques pour de meilleurs résultats. Décrivez clairement les couleurs, le style, l'éclairage et la composition.",
|
| 75 |
+
"seo_protip2_title": "Modification Locale :",
|
| 76 |
+
"seo_protip2_desc": "Utilisez des coups de pinceau précis pour sélectionner les zones à modifier localement. Des modifications plus petites et plus ciblées donnent souvent de meilleurs résultats.",
|
| 77 |
+
"seo_protip3_title": "Processus Itératif :",
|
| 78 |
+
"seo_protip3_desc": "Utilisez la fonction 'Utiliser comme entrée' pour affiner les résultats. Plusieurs itérations peuvent aboutir à des transformations complexes.",
|
| 79 |
+
"seo_protip4_title": "Qualité de l'Image :",
|
| 80 |
+
"seo_protip4_desc": "Des images d'entrée à plus haute résolution (jusqu'à 10 Mo) produisent généralement de meilleures modifications et des détails plus fins.",
|
| 81 |
+
"seo_needs_title": "Pour Tous les Besoins Créatifs",
|
| 82 |
+
"seo_needs_art_title": "Art Numérique",
|
| 83 |
+
"seo_needs_art_item1": "Création de Personnages",
|
| 84 |
+
"seo_needs_art_item2": "Art Conceptuel",
|
| 85 |
+
"seo_needs_art_item3": "Transfert de Style",
|
| 86 |
+
"seo_needs_art_item4": "Effets Artistiques",
|
| 87 |
+
"seo_needs_photo_title": "Photographie",
|
| 88 |
+
"seo_needs_photo_item1": "Remplacement d'Arrière-plan",
|
| 89 |
+
"seo_needs_photo_item2": "Suppression d'Objets",
|
| 90 |
+
"seo_needs_photo_item3": "Ajustement de l'Éclairage",
|
| 91 |
+
"seo_needs_photo_item4": "Amélioration de Portrait",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Photographie de Produit",
|
| 94 |
+
"seo_needs_ecom_item2": "Photos de Style de Vie",
|
| 95 |
+
"seo_needs_ecom_item3": "Variations de Couleur",
|
| 96 |
+
"seo_needs_ecom_item4": "Remplacement de Scène",
|
| 97 |
+
"seo_needs_social_title": "Réseaux Sociaux",
|
| 98 |
+
"seo_needs_social_item1": "Création de Contenu",
|
| 99 |
+
"seo_needs_social_item2": "Génération de Mèmes",
|
| 100 |
+
"seo_needs_social_item3": "Visuels de Marque",
|
| 101 |
+
"seo_needs_social_item4": "Contenu Viral"
|
| 102 |
+
}
|
i18n/he.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "עורך תמונות AI",
|
| 3 |
+
"header_title": "🎨 עורך תמונות AI",
|
| 4 |
+
"news_banner_prefix": "🚀 חדשות: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image זמין עכשיו — הדור האנושי הטוב ביותר אי פעם!",
|
| 6 |
+
"global_editor_tab": "🌍 עריכה גלובלית",
|
| 7 |
+
"upload_image_header": "### 📸 העלאת תמונה",
|
| 8 |
+
"upload_image_label": "בחר תמונה לעריכה",
|
| 9 |
+
"editing_instructions_header": "### ✍️ הוראות עריכה",
|
| 10 |
+
"prompt_input_label": "הזן הנחיית עריכה",
|
| 11 |
+
"prompt_input_placeholder": "לדוגמה: שנה את הרקע לחוף ים, הוסף קשת בענן, הסר את הרקע וכו'...",
|
| 12 |
+
"start_editing_button": "🚀 התחל עריכה",
|
| 13 |
+
"editing_result_header": "### 🎯 תוצאת העריכה",
|
| 14 |
+
"output_image_label": "תמונה ערוכה",
|
| 15 |
+
"use_as_input_button": "🔄 השתמש כקלט",
|
| 16 |
+
"status_output_label": "מצב עיבוד",
|
| 17 |
+
"prompt_examples_header": "### 💡 דוגמאות להנחיות",
|
| 18 |
+
"local_inpaint_tab": "🖌️ תיקון מקומי (Inpainting)",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 העלאת תמונה וציור מסכה",
|
| 20 |
+
"upload_and_draw_mask_label": "העלה תמונה וצייר מסכה",
|
| 21 |
+
"reference_image_header": "### 🖼️ תמונת ייחוס (אופציונלי)",
|
| 22 |
+
"reference_image_label": "העלה תמונת ייחוס (אופציונלי)",
|
| 23 |
+
"local_prompt_input_label": "הזן הנחיית עריכה מקומית",
|
| 24 |
+
"local_prompt_input_placeholder": "לדוגמה: שנה את צבע השיער באזור הנבחר לבלונדיני, הוסף דוגמה לאובייקט הנבחר, שנה את צבע האזור הנבחר וכו'...",
|
| 25 |
+
"start_local_editing_button": "🎯 התחל עריכה מקומית",
|
| 26 |
+
"local_output_image_label": "תמונה שעברה עריכה מקומית",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 דוגמה לתיקון מקומי",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 דוגמה: הפוך פנדה לחתול",
|
| 29 |
+
"main_image_label": "תמונה ראשית",
|
| 30 |
+
"mask_label": "מסכה",
|
| 31 |
+
"reference_label": "תמונת ייחוס",
|
| 32 |
+
"panda_example_note": "**הנחיה**: let the cat ride on the panda\n**הערה**: המסכה תוחל אוטומטית בעת שליחת דוגמה זו",
|
| 33 |
+
"load_panda_example_button": "🎨 טען דוגמת פנדה",
|
| 34 |
+
"refresh_editor_button": "🔄 רענן את עורך התמונות",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "אנא העלה תמונה תחילה",
|
| 37 |
+
"error_enter_prompt": "אנא הזן הנחיית עריכה",
|
| 38 |
+
"error_prompt_too_short": "❌ הנחיית העריכה חייבת להכיל יותר מ-3 תווים",
|
| 39 |
+
"error_request_processing": "❌ שגיאה בעיבוד הבקשה",
|
| 40 |
+
"error_free_limit_reached": "❌ הגעת למגבלת היצירות החינמיות שלך ב-Hugging Face. בקר בכתובת https://omnicreator.net/#generator ליצירות ללא הגבלה",
|
| 41 |
+
"error_free_limit_wait": "❌ הגעת למגבלת היצירות החינמיות שלך ב-Hugging Face. בקר בכתובת https://omnicreator.net/#generator ליצירות ללא הגבלה, או המתן {wait_minutes_int} דקות ונסה שוב",
|
| 42 |
+
"status_checking_result": "בודק את תמונת התוצאה...",
|
| 43 |
+
"status_applying_filter": "מחיל מסנן תוכן...",
|
| 44 |
+
"warning_content_filter": "⚠️ הוחל מסנן תוכן בהתאם להנחיות הקהילה של Hugging Face. לחופש יצירתי בלתי מוגבל, בקר באתר הרשמי שלנו https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ נדרשת בקרת תוכן. בקר בכתובת https://omnicreator.net/#generator לחוויה טובה יותר",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "העיבוד הושלם",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ אירעה שגיאה במהלך העיבוד: {error}",
|
| 50 |
+
"error_upload_and_draw": "אנא העלה תמונה וצייר את האזור לעריכה",
|
| 51 |
+
"error_draw_on_image": "אנא צייר על התמונה את האזור שברצונך לערוך",
|
| 52 |
+
"error_no_image_found": "❌ לא נמצאה תמונה. אנא העלה תמונה תחילה.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "יצירה ועריכה של תמונות AI ללא הגבלה",
|
| 55 |
+
"seo_unlimited_desc": "חווה את החופש האולטימטיבי ביצירת תמונות AI! צור וערוך תמונות ללא גבולות או הגבלות, ושחרר את דמיונך עם פלטפורמת עריכת התמונות המתקדמת שלנו המבוססת על AI.",
|
| 56 |
+
"seo_unlimited_button": "קבל גישה בלתי מוגבלת עכשיו",
|
| 57 |
+
"seo_unlimited_footer": "הצטרף לאלפי יוצרים שסומכים על Omni Creator ליצירת תמונות AI ללא הגבלה!",
|
| 58 |
+
"seo_professional_title": "עורך תמונות AI מקצועי - ללא הגבלה",
|
| 59 |
+
"seo_professional_desc": "הפוך את החזונות היצירתיים שלך למציאות עם פלטפורמת עריכת התמונות המתקדמת שלנו המבוססת על AI. בין אם אתה יוצר אמנות, עורך תמונות, מעצב תוכן או עובד עם כל סוג של תמונה - ה-AI העוצמתי שלנו מסיר את כל המגבלות כדי להעניק לך חופש יצירתי מוחלט.",
|
| 60 |
+
"seo_feature1_title": "יצירות ללא הגבלה",
|
| 61 |
+
"seo_feature1_desc": "משתמשי פרימיום נהנים מיצירת תמונות ללא הגבלה, ללא מגבלות יומיות, מגבלות קצב או חסמי תוכן. צור כמה תמונות שתרצה, מתי ואיפה שתרצה.",
|
| 62 |
+
"seo_feature2_title": "חופש יצירתי",
|
| 63 |
+
"seo_feature2_desc": "צור וערוך כל סוג של תוכן בחופש יצירתי מלא וללא גבולות לדמיונך. אפשרויות אינסופיות לאמנים, מעצבים ויוצרי תוכן.",
|
| 64 |
+
"seo_feature3_title": "עיבוד במהירות הבזק",
|
| 65 |
+
"seo_feature3_desc": "תשתית AI מתקדמת מספקת תוצאות באיכות גבוהה תוך שניות. אין תורים, אין עיכובים בעיבוד - רק עריכת תמונות מיידית ברמה מקצועית.",
|
| 66 |
+
"seo_feature4_title": "כלי עריכה מתקדמים",
|
| 67 |
+
"seo_feature4_desc": "שינויים גלובליים, עריכות מקומיות מדויקות, העברת סגנון, הסרת אובייקטים, החלפת רקע ועשרות תכונות עריכה מקצועיות אחרות.",
|
| 68 |
+
"seo_feature5_title": "איכות יוצאת דופן",
|
| 69 |
+
"seo_feature5_desc": "מודלי AI חדישים שאומנו על מיליוני תמונות מספקים איכות וריאליזם יוצאי דופן. תוצאות ברמה מקצועית המתאימות לשימוש מסחרי ולפרויקטים יוקרתיים.",
|
| 70 |
+
"seo_feature6_title": "תמיכה רב-מודאלית",
|
| 71 |
+
"seo_feature6_desc": "תמיכה בכל פורמטי התמונות, הסגנונות ומקרי השימוש. מדיוקנאות פוטוריאליסטיות ועד ליצירות אמנותיות, מצילום מוצרים ועד לאמנות דיגיטלית - אנחנו מטפלים בהכל.",
|
| 72 |
+
"seo_protips_title": "טיפים מקצועיים לתוצאות הטובות ביותר",
|
| 73 |
+
"seo_protip1_title": "תיאורים ברורים:",
|
| 74 |
+
"seo_protip1_desc": "השתמש בהנחיות מפורטות וספציפיות לקבלת תוצאות טובות יותר. תאר בבירור צבעים, סגנון, תאורה וקומפוזיציה.",
|
| 75 |
+
"seo_protip2_title": "עריכה מקומית:",
|
| 76 |
+
"seo_protip2_desc": "השתמש במשיכות מכחול מדויקות כדי לבחור אזורים לעריכות מקומיות. עריכות קטנות וממוקדות יותר מניבות לעתים קרובות תוצאות טובות יותר.",
|
| 77 |
+
"seo_protip3_title": "תהליך איטרטיבי:",
|
| 78 |
+
"seo_protip3_desc": "השתמש בתכונה 'השתמש כקלט' כדי לשפר את התוצאות. מספר איטרציות יכולות להוביל לשינויים מורכבים.",
|
| 79 |
+
"seo_protip4_title": "איכות תמונה:",
|
| 80 |
+
"seo_protip4_desc": "תמונות קלט ברזולוציה גבוהה יותר (עד 10MB) בדרך כלל מניבות עריכות טובות יותר ופרטים עדינים יותר.",
|
| 81 |
+
"seo_needs_title": "לכל צורך יצירתי",
|
| 82 |
+
"seo_needs_art_title": "אמנות דיגיטלית",
|
| 83 |
+
"seo_needs_art_item1": "עיצוב דמויות",
|
| 84 |
+
"seo_needs_art_item2": "אמנות קונספט",
|
| 85 |
+
"seo_needs_art_item3": "העברת סגנון",
|
| 86 |
+
"seo_needs_art_item4": "אפקטים אמנותיים",
|
| 87 |
+
"seo_needs_photo_title": "צילום",
|
| 88 |
+
"seo_needs_photo_item1": "החלפת רקע",
|
| 89 |
+
"seo_needs_photo_item2": "הסרת אובייקטים",
|
| 90 |
+
"seo_needs_photo_item3": "התאמת תאורה",
|
| 91 |
+
"seo_needs_photo_item4": "שיפור פורטרטים",
|
| 92 |
+
"seo_needs_ecom_title": "מסחר אלקטרוני",
|
| 93 |
+
"seo_needs_ecom_item1": "צילום מוצרים",
|
| 94 |
+
"seo_needs_ecom_item2": "צילומי לייף סטייל",
|
| 95 |
+
"seo_needs_ecom_item3": "וריאציות צבע",
|
| 96 |
+
"seo_needs_ecom_item4": "החלפת סצנה",
|
| 97 |
+
"seo_needs_social_title": "מדיה חברתית",
|
| 98 |
+
"seo_needs_social_item1": "יצירת תוכן",
|
| 99 |
+
"seo_needs_social_item2": "יצירת ממים",
|
| 100 |
+
"seo_needs_social_item3": "חזותי מותג",
|
| 101 |
+
"seo_needs_social_item4": "תוכן ויראלי"
|
| 102 |
+
}
|
i18n/id.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Editor Gambar AI",
|
| 3 |
+
"header_title": "🎨 Editor Gambar AI",
|
| 4 |
+
"news_banner_prefix": "🚀 Berita: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image sudah tersedia — Generasi manusia terbaik yang pernah ada!",
|
| 6 |
+
"global_editor_tab": "🌍 Pengeditan Global",
|
| 7 |
+
"upload_image_header": "### 📸 Unggah Gambar",
|
| 8 |
+
"upload_image_label": "Pilih gambar untuk diedit",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Instruksi Pengeditan",
|
| 10 |
+
"prompt_input_label": "Masukkan prompt pengeditan",
|
| 11 |
+
"prompt_input_placeholder": "Contoh: ubah latar belakang menjadi pantai, tambahkan pelangi, hapus latar belakang, dll...",
|
| 12 |
+
"start_editing_button": "🚀 Mulai Mengedit",
|
| 13 |
+
"editing_result_header": "### 🎯 Hasil Editan",
|
| 14 |
+
"output_image_label": "Gambar yang telah diedit",
|
| 15 |
+
"use_as_input_button": "🔄 Gunakan sebagai Input",
|
| 16 |
+
"status_output_label": "Status Pemrosesan",
|
| 17 |
+
"prompt_examples_header": "### 💡 Contoh Prompt",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Inpainting Lokal",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Unggah Gambar & Gambar Masker",
|
| 20 |
+
"upload_and_draw_mask_label": "Unggah gambar dan gambar masker",
|
| 21 |
+
"reference_image_header": "### 🖼️ Gambar Referensi (Opsional)",
|
| 22 |
+
"reference_image_label": "Unggah gambar referensi (opsional)",
|
| 23 |
+
"local_prompt_input_label": "Masukkan prompt pengeditan lokal",
|
| 24 |
+
"local_prompt_input_placeholder": "Contoh: ubah rambut di area yang dipilih menjadi pirang, tambahkan pola ke objek yang dipilih, ubah warna area yang dipilih, dll...",
|
| 25 |
+
"start_local_editing_button": "🎯 Mulai Pengeditan Lokal",
|
| 26 |
+
"local_output_image_label": "Gambar yang diedit secara lokal",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Contoh Inpainting Lokal",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Contoh: Ubah Panda menjadi Kucing",
|
| 29 |
+
"main_image_label": "Gambar Utama",
|
| 30 |
+
"mask_label": "Masker",
|
| 31 |
+
"reference_label": "Gambar Referensi",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Catatan**: Masker akan diterapkan secara otomatis saat mengirimkan contoh ini",
|
| 33 |
+
"load_panda_example_button": "🎨 Muat Contoh Panda",
|
| 34 |
+
"refresh_editor_button": "🔄 Segarkan Editor Gambar",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Silakan unggah gambar terlebih dahulu",
|
| 37 |
+
"error_enter_prompt": "Silakan masukkan prompt pengeditan",
|
| 38 |
+
"error_prompt_too_short": "❌ Prompt pengeditan harus lebih dari 3 karakter",
|
| 39 |
+
"error_request_processing": "❌ Kesalahan saat memproses permintaan",
|
| 40 |
+
"error_free_limit_reached": "❌ Anda telah mencapai batas generasi gratis di Hugging Face. Kunjungi https://omnicreator.net/#generator untuk generasi tanpa batas",
|
| 41 |
+
"error_free_limit_wait": "❌ Anda telah mencapai batas generasi gratis di Hugging Face. Kunjungi https://omnicreator.net/#generator untuk generasi tanpa batas, atau tunggu {wait_minutes_int} menit dan coba lagi",
|
| 42 |
+
"status_checking_result": "Memeriksa gambar hasil...",
|
| 43 |
+
"status_applying_filter": "Menerapkan filter konten...",
|
| 44 |
+
"warning_content_filter": "⚠️ Filter konten telah diterapkan sesuai dengan pedoman komunitas Hugging Face. Untuk kebebasan berkreasi tanpa batas, kunjungi situs web resmi kami https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Diperlukan tinjauan konten. Kunjungi https://omnicreator.net/#generator untuk pengalaman yang lebih baik",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Pemrosesan selesai",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Terjadi kesalahan saat pemrosesan: {error}",
|
| 50 |
+
"error_upload_and_draw": "Silakan unggah gambar dan gambar area yang akan diedit",
|
| 51 |
+
"error_draw_on_image": "Silakan gambar area yang ingin Anda edit pada gambar",
|
| 52 |
+
"error_no_image_found": "❌ Tidak ada gambar yang ditemukan. Silakan unggah gambar terlebih dahulu.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Pembuatan & Pengeditan Gambar AI Tanpa Batas",
|
| 55 |
+
"seo_unlimited_desc": "Rasakan kebebasan tertinggi dalam kreasi gambar AI! Hasilkan dan edit gambar tanpa batas atau batasan, dan bebaskan imajinasi Anda dengan platform pengeditan gambar AI canggih kami.",
|
| 56 |
+
"seo_unlimited_button": "Dapatkan Akses Tanpa Batas Sekarang",
|
| 57 |
+
"seo_unlimited_footer": "Bergabunglah dengan ribuan kreator yang memercayai Omni Creator untuk pembuatan gambar AI tanpa batas!",
|
| 58 |
+
"seo_professional_title": "Editor Gambar AI Profesional - Tanpa Batas",
|
| 59 |
+
"seo_professional_desc": "Wujudkan visi kreatif Anda menjadi kenyataan dengan platform pengeditan gambar AI canggih kami. Baik Anda membuat seni, mengedit foto, merancang konten, atau bekerja dengan jenis gambar apa pun - AI kami yang kuat menghilangkan semua batasan untuk memberi Anda kebebasan berkreasi total.",
|
| 60 |
+
"seo_feature1_title": "Generasi Tanpa Batas",
|
| 61 |
+
"seo_feature1_desc": "Pengguna premium menikmati generasi gambar tanpa batas, tanpa batasan harian, batasan kecepatan, atau penghalang konten. Buat gambar sebanyak yang Anda inginkan, kapan pun dan di mana pun Anda mau.",
|
| 62 |
+
"seo_feature2_title": "Kebebasan Berkreasi",
|
| 63 |
+
"seo_feature2_desc": "Hasilkan dan edit semua jenis konten dengan kebebasan berkreasi penuh dan tanpa batas pada imajinasi Anda. Kemungkinan tak terbatas untuk seniman, desainer, dan pembuat konten.",
|
| 64 |
+
"seo_feature3_title": "Pemrosesan Secepat Kilat",
|
| 65 |
+
"seo_feature3_desc": "Infrastruktur AI canggih memberikan hasil berkualitas tinggi dalam hitungan detik. Tanpa antrian, tanpa penundaan pemrosesan - hanya pengeditan gambar instan tingkat profesional.",
|
| 66 |
+
"seo_feature4_title": "Alat Pengeditan Canggih",
|
| 67 |
+
"seo_feature4_desc": "Transformasi global, pengeditan lokal yang presisi, transfer gaya, penghapusan objek, penggantian latar belakang, dan puluhan fitur pengeditan profesional lainnya.",
|
| 68 |
+
"seo_feature5_title": "Kualitas Luar Biasa",
|
| 69 |
+
"seo_feature5_desc": "Model AI canggih yang dilatih pada jutaan gambar memberikan kualitas dan realisme yang luar biasa. Hasil tingkat profesional yang cocok untuk penggunaan komersial dan proyek kelas atas.",
|
| 70 |
+
"seo_feature6_title": "Dukungan Multimodal",
|
| 71 |
+
"seo_feature6_desc": "Dukungan untuk semua format gambar, gaya, dan kasus penggunaan. Dari potret fotorealistik hingga kreasi artistik, dari fotografi produk hingga seni digital - kami menangani semuanya.",
|
| 72 |
+
"seo_protips_title": "Kiat Pro untuk Hasil Terbaik",
|
| 73 |
+
"seo_protip1_title": "Deskripsi yang Jelas:",
|
| 74 |
+
"seo_protip1_desc": "Gunakan prompt yang detail dan spesifik untuk hasil yang lebih baik. Jelaskan warna, gaya, pencahayaan, dan komposisi dengan jelas.",
|
| 75 |
+
"seo_protip2_title": "Pengeditan Lokal:",
|
| 76 |
+
"seo_protip2_desc": "Gunakan sapuan kuas yang presisi untuk memilih area untuk pengeditan lokal. Pengeditan yang lebih kecil dan lebih terfokus seringkali menghasilkan hasil yang lebih baik.",
|
| 77 |
+
"seo_protip3_title": "Proses Iteratif:",
|
| 78 |
+
"seo_protip3_desc": "Gunakan fitur 'Gunakan sebagai Input' untuk menyempurnakan hasil. Beberapa iterasi dapat mengarah pada transformasi yang kompleks.",
|
| 79 |
+
"seo_protip4_title": "Kualitas Gambar:",
|
| 80 |
+
"seo_protip4_desc": "Gambar input beresolusi lebih tinggi (hingga 10MB) biasanya menghasilkan editan yang lebih baik dan detail yang lebih halus.",
|
| 81 |
+
"seo_needs_title": "Untuk Setiap Kebutuhan Kreatif",
|
| 82 |
+
"seo_needs_art_title": "Seni Digital",
|
| 83 |
+
"seo_needs_art_item1": "Desain Karakter",
|
| 84 |
+
"seo_needs_art_item2": "Seni Konsep",
|
| 85 |
+
"seo_needs_art_item3": "Transfer Gaya",
|
| 86 |
+
"seo_needs_art_item4": "Efek Artistik",
|
| 87 |
+
"seo_needs_photo_title": "Fotografi",
|
| 88 |
+
"seo_needs_photo_item1": "Penggantian Latar Belakang",
|
| 89 |
+
"seo_needs_photo_item2": "Penghapusan Objek",
|
| 90 |
+
"seo_needs_photo_item3": "Penyesuaian Pencahayaan",
|
| 91 |
+
"seo_needs_photo_item4": "Penyempurnaan Potret",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Fotografi Produk",
|
| 94 |
+
"seo_needs_ecom_item2": "Foto Gaya Hidup",
|
| 95 |
+
"seo_needs_ecom_item3": "Variasi Warna",
|
| 96 |
+
"seo_needs_ecom_item4": "Penggantian Pemandangan",
|
| 97 |
+
"seo_needs_social_title": "Media Sosial",
|
| 98 |
+
"seo_needs_social_item1": "Pembuatan Konten",
|
| 99 |
+
"seo_needs_social_item2": "Pembuatan Meme",
|
| 100 |
+
"seo_needs_social_item3": "Visual Merek",
|
| 101 |
+
"seo_needs_social_item4": "Konten Viral"
|
| 102 |
+
}
|
i18n/it.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Editor di Immagini AI",
|
| 3 |
+
"header_title": "🎨 Editor di Immagini AI",
|
| 4 |
+
"news_banner_prefix": "🚀 Notizie: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image è disponibile — La migliore generazione umana di sempre!",
|
| 6 |
+
"global_editor_tab": "🌍 Modifica Globale",
|
| 7 |
+
"upload_image_header": "### 📸 Carica Immagine",
|
| 8 |
+
"upload_image_label": "Seleziona un'immagine da modificare",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Istruzioni di Modifica",
|
| 10 |
+
"prompt_input_label": "Inserisci il prompt di modifica",
|
| 11 |
+
"prompt_input_placeholder": "Es: cambia lo sfondo in una spiaggia, aggiungi un arcobaleno, rimuovi lo sfondo, ecc...",
|
| 12 |
+
"start_editing_button": "🚀 Inizia a Modificare",
|
| 13 |
+
"editing_result_header": "### 🎯 Risultato della Modifica",
|
| 14 |
+
"output_image_label": "Immagine modificata",
|
| 15 |
+
"use_as_input_button": "🔄 Usa come Input",
|
| 16 |
+
"status_output_label": "Stato di Elaborazione",
|
| 17 |
+
"prompt_examples_header": "### 💡 Esempi di Prompt",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Inpainting Locale",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Carica Immagine e Disegna Maschera",
|
| 20 |
+
"upload_and_draw_mask_label": "Carica un'immagine e disegna una maschera",
|
| 21 |
+
"reference_image_header": "### 🖼️ Immagine di Riferimento (Opzionale)",
|
| 22 |
+
"reference_image_label": "Carica immagine di riferimento (opzionale)",
|
| 23 |
+
"local_prompt_input_label": "Inserisci prompt per la modifica locale",
|
| 24 |
+
"local_prompt_input_placeholder": "Es: cambia i capelli nell'area selezionata in biondi, aggiungi un motivo all'oggetto selezionato, cambia il colore dell'area selezionata, ecc...",
|
| 25 |
+
"start_local_editing_button": "🎯 Inizia Modifica Locale",
|
| 26 |
+
"local_output_image_label": "Immagine modificata localmente",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Esempio di Inpainting Locale",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Esempio: Trasforma Panda in Gatto",
|
| 29 |
+
"main_image_label": "Immagine Principale",
|
| 30 |
+
"mask_label": "Maschera",
|
| 31 |
+
"reference_label": "Immagine di Riferimento",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Nota**: La maschera verrà applicata automaticamente inviando questo esempio",
|
| 33 |
+
"load_panda_example_button": "🎨 Carica Esempio Panda",
|
| 34 |
+
"refresh_editor_button": "🔄 Aggiorna l'Editor di Immagini",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Per favore, carica prima un'immagine",
|
| 37 |
+
"error_enter_prompt": "Per favore, inserisci un prompt di modifica",
|
| 38 |
+
"error_prompt_too_short": "❌ Il prompt di modifica deve contenere più di 3 caratteri",
|
| 39 |
+
"error_request_processing": "❌ Errore nell'elaborazione della richiesta",
|
| 40 |
+
"error_free_limit_reached": "❌ Hai raggiunto il limite di generazioni gratuite su Hugging Face. Visita https://omnicreator.net/#generator per generazioni illimitate",
|
| 41 |
+
"error_free_limit_wait": "❌ Hai raggiunto il limite di generazioni gratuite su Hugging Face. Visita https://omnicreator.net/#generator per generazioni illimitate, o attendi {wait_minutes_int} minuti e riprova",
|
| 42 |
+
"status_checking_result": "Controllo dell'immagine risultante...",
|
| 43 |
+
"status_applying_filter": "Applicazione del filtro contenuti...",
|
| 44 |
+
"warning_content_filter": "⚠️ È stato applicato un filtro contenuti secondo le linee guida della community di Hugging Face. Per una libertà creativa illimitata, visita il nostro sito ufficiale https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ È richiesta la revisione dei contenuti. Visita https://omnicreator.net/#generator per un'esperienza migliore",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Elaborazione completata",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Si è verificato un errore durante l'elaborazione: {error}",
|
| 50 |
+
"error_upload_and_draw": "Per favore, carica un'immagine e disegna l'area da modificare",
|
| 51 |
+
"error_draw_on_image": "Per favore, disegna sull'immagine l'area che vuoi modificare",
|
| 52 |
+
"error_no_image_found": "❌ Nessuna immagine trovata. Per favore, carica prima un'immagine.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Generazione e Modifica Illimitata di Immagini AI",
|
| 55 |
+
"seo_unlimited_desc": "Sperimenta la massima libertà nella creazione di immagini AI! Genera e modifica immagini senza limiti, senza restrizioni, e scatena la tua immaginazione con la nostra piattaforma avanzata di editing di immagini AI.",
|
| 56 |
+
"seo_unlimited_button": "Ottieni Subito l'Accesso Illimitato",
|
| 57 |
+
"seo_unlimited_footer": "Unisciti a migliaia di creatori che si fidano di Omni Creator per la generazione illimitata di immagini AI!",
|
| 58 |
+
"seo_professional_title": "Editor di Immagini AI Professionale - Illimitato",
|
| 59 |
+
"seo_professional_desc": "Trasforma le tue visioni creative in realtà con la nostra piattaforma avanzata di editing di immagini AI. Che tu stia creando arte, modificando foto, progettando contenuti o lavorando con qualsiasi tipo di immagine, la nostra potente AI rimuove ogni limite, offrendoti totale libertà creativa.",
|
| 60 |
+
"seo_feature1_title": "Generazioni Illimitate",
|
| 61 |
+
"seo_feature1_desc": "Gli utenti Premium godono di generazioni di immagini illimitate, senza limiti giornalieri, limiti di velocità o barriere di contenuto. Crea quante immagini vuoi, quando e dove vuoi.",
|
| 62 |
+
"seo_feature2_title": "Libertà Creativa",
|
| 63 |
+
"seo_feature2_desc": "Genera e modifica qualsiasi tipo di contenuto con completa libertà creativa e senza limiti alla tua immaginazione. Possibilità infinite per artisti, designer e creatori di contenuti.",
|
| 64 |
+
"seo_feature3_title": "Elaborazione Velocissima",
|
| 65 |
+
"seo_feature3_desc": "Un'infrastruttura AI avanzata fornisce risultati di alta qualità in pochi secondi. Nessuna coda, nessun ritardo di elaborazione - solo editing di immagini istantaneo e di livello professionale.",
|
| 66 |
+
"seo_feature4_title": "Strumenti di Modifica Avanzati",
|
| 67 |
+
"seo_feature4_desc": "Trasformazioni globali, editing locale preciso, trasferimento di stile, rimozione di oggetti, sostituzione dello sfondo e decine di altre funzionalità di editing professionali.",
|
| 68 |
+
"seo_feature5_title": "Qualità Eccezionale",
|
| 69 |
+
"seo_feature5_desc": "Modelli AI all'avanguardia addestrati su milioni di immagini offrono qualità e realismo eccezionali. Risultati di livello professionale adatti per uso commerciale e progetti di alto livello.",
|
| 70 |
+
"seo_feature6_title": "Supporto Multimodale",
|
| 71 |
+
"seo_feature6_desc": "Supporto per tutti i formati, stili e casi d'uso delle immagini. Dai ritratti fotorealistici alle creazioni artistiche, dalla fotografia di prodotto all'arte digitale - gestiamo tutto.",
|
| 72 |
+
"seo_protips_title": "Consigli Pro per i Migliori Risultati",
|
| 73 |
+
"seo_protip1_title": "Descrizioni Chiare:",
|
| 74 |
+
"seo_protip1_desc": "Usa prompt dettagliati e specifici per risultati migliori. Descrivi chiaramente colori, stile, illuminazione e composizione.",
|
| 75 |
+
"seo_protip2_title": "Editing Locale:",
|
| 76 |
+
"seo_protip2_desc": "Usa pennellate precise per selezionare le aree per le modifiche locali. Modifiche più piccole e mirate spesso producono risultati migliori.",
|
| 77 |
+
"seo_protip3_title": "Processo Iterativo:",
|
| 78 |
+
"seo_protip3_desc": "Usa la funzione 'Usa come Input' per affinare i risultati. Più iterazioni possono portare a trasformazioni complesse.",
|
| 79 |
+
"seo_protip4_title": "Qualità dell'Immagine:",
|
| 80 |
+
"seo_protip4_desc": "Immagini di input a risoluzione più alta (fino a 10MB) di solito producono modifiche migliori e dettagli più fini.",
|
| 81 |
+
"seo_needs_title": "Per Ogni Esigenza Creativa",
|
| 82 |
+
"seo_needs_art_title": "Arte Digitale",
|
| 83 |
+
"seo_needs_art_item1": "Design di Personaggi",
|
| 84 |
+
"seo_needs_art_item2": "Concept Art",
|
| 85 |
+
"seo_needs_art_item3": "Trasferimento di Stile",
|
| 86 |
+
"seo_needs_art_item4": "Effetti Artistici",
|
| 87 |
+
"seo_needs_photo_title": "Fotografia",
|
| 88 |
+
"seo_needs_photo_item1": "Sostituzione Sfondo",
|
| 89 |
+
"seo_needs_photo_item2": "Rimozione Oggetti",
|
| 90 |
+
"seo_needs_photo_item3": "Regolazione Illuminazione",
|
| 91 |
+
"seo_needs_photo_item4": "Miglioramento Ritratti",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Fotografia di Prodotto",
|
| 94 |
+
"seo_needs_ecom_item2": "Scatti Lifestyle",
|
| 95 |
+
"seo_needs_ecom_item3": "Variazioni di Colore",
|
| 96 |
+
"seo_needs_ecom_item4": "Sostituzione di Scena",
|
| 97 |
+
"seo_needs_social_title": "Social Media",
|
| 98 |
+
"seo_needs_social_item1": "Creazione di Contenuti",
|
| 99 |
+
"seo_needs_social_item2": "Generazione di Meme",
|
| 100 |
+
"seo_needs_social_item3": "Visual del Marchio",
|
| 101 |
+
"seo_needs_social_item4": "Contenuti Virali"
|
| 102 |
+
}
|
i18n/ja.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI画像エディター",
|
| 3 |
+
"header_title": "🎨 AI画像エディター",
|
| 4 |
+
"news_banner_prefix": "🚀 ニュース: ",
|
| 5 |
+
"news_banner_link": "Text-to-Imageがリリース — 史上最高の人物生成!",
|
| 6 |
+
"global_editor_tab": "🌍 全体編集",
|
| 7 |
+
"upload_image_header": "### 📸 画像をアップロード",
|
| 8 |
+
"upload_image_label": "編集する画像を選択",
|
| 9 |
+
"editing_instructions_header": "### ✍️ 編集指示",
|
| 10 |
+
"prompt_input_label": "編集プロンプトを入力",
|
| 11 |
+
"prompt_input_placeholder": "例: 背景をビーチに変更、虹を追加、背景を削除など...",
|
| 12 |
+
"start_editing_button": "🚀 編集を開始",
|
| 13 |
+
"editing_result_header": "### 🎯 編集結果",
|
| 14 |
+
"output_image_label": "編集後の画像",
|
| 15 |
+
"use_as_input_button": "🔄 入力として使用",
|
| 16 |
+
"status_output_label": "処理ステータス",
|
| 17 |
+
"prompt_examples_header": "### 💡 プロンプトの例",
|
| 18 |
+
"local_inpaint_tab": "🖌️ 部分修正",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 画像をアップロードしてマスクを描画",
|
| 20 |
+
"upload_and_draw_mask_label": "画像をアップロードしてマスクを描画",
|
| 21 |
+
"reference_image_header": "### 🖼️ 参考画像 (任意)",
|
| 22 |
+
"reference_image_label": "参考画像をアップロード (任意)",
|
| 23 |
+
"local_prompt_input_label": "部分編集プロンプトを入力",
|
| 24 |
+
"local_prompt_input_placeholder": "例: 選択した部分の髪を金色にする、選択したオブジェクトにパターンを追加する、選択した部分の色を変更する...",
|
| 25 |
+
"start_local_editing_button": "🎯 部分編集を開始",
|
| 26 |
+
"local_output_image_label": "部分編集後の画像",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 部分修正の例",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 例: パンダを猫に変身",
|
| 29 |
+
"main_image_label": "メイン画像",
|
| 30 |
+
"mask_label": "マスク",
|
| 31 |
+
"reference_label": "参考画像",
|
| 32 |
+
"panda_example_note": "**プロンプト**: let the cat ride on the panda\n**注意**: この例を送信するとマスクが自動的に適用されます",
|
| 33 |
+
"load_panda_example_button": "🎨 パンダの例を読み込む",
|
| 34 |
+
"refresh_editor_button": "🔄 画像エディターを更新",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "最初に画像をアップロードしてください",
|
| 37 |
+
"error_enter_prompt": "編集プロンプトを入力してください",
|
| 38 |
+
"error_prompt_too_short": "❌ 編集プロンプトは3文字以上である必要があります",
|
| 39 |
+
"error_request_processing": "❌ リクエストの処理中にエラーが発生しました",
|
| 40 |
+
"error_free_limit_reached": "❌ Hugging Faceの無料生成回数制限に達しました。無制限の生成については https://omnicreator.net/#generator にアクセスしてください",
|
| 41 |
+
"error_free_limit_wait": "❌ Hugging Faceの無料生成回数制限に達しました。無制限の生成については https://omnicreator.net/#generator にアクセスするか、{wait_minutes_int}分後にもう一度お試しください",
|
| 42 |
+
"status_checking_result": "結果画像をチェックしています...",
|
| 43 |
+
"status_applying_filter": "コンテンツフィルターを適用しています...",
|
| 44 |
+
"warning_content_filter": "⚠️ Hugging Faceコミュニティガイドラインに基づき、コンテンツフィルターが適用されました。無制限の創造的自由を得るには、公式サイト https://omnicreator.net/#generator をご覧ください",
|
| 45 |
+
"warning_content_review": "⚠️ コンテンツのレビューが必要です。より良い体験のために https://omnicreator.net/#generator をご覧ください",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "処理が完了しました",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ 処理中にエラーが発生しました: {error}",
|
| 50 |
+
"error_upload_and_draw": "画像をアップロードし、編集したい領域を描画してください",
|
| 51 |
+
"error_draw_on_image": "画像上で編集したい領域を描画してください",
|
| 52 |
+
"error_no_image_found": "❌ 画像が見つかりません。まず画像をアップロードしてください。",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "無制限のAI画像生成と編集",
|
| 55 |
+
"seo_unlimited_desc": "AI画像作成の究極の自由を体験してください!当社の高度なAI画像編集プラットフォームで、制限なく画像を生成・編集し、あなたの想像力を解き放ちましょう。",
|
| 56 |
+
"seo_unlimited_button": "今すぐ無制限アクセスを取得",
|
| 57 |
+
"seo_unlimited_footer": "何千人ものクリエイターが信頼するOmni Creatorに参加して、無制限のAI画像生成を体験しよう!",
|
| 58 |
+
"seo_professional_title": "プロフェッショナルAI画像エディター - 無制限",
|
| 59 |
+
"seo_professional_desc": "当社の先進的なAI画像編��プラットフォームで、あなたのクリエイティブなビジョンを現実にしましょう。アートの作成、写真の編集、コンテンツのデザイン、その他あらゆる種類の画像の扱いに、当社の強力なAIがすべての制限を取り払い、完全な創造的自由を与えます。",
|
| 60 |
+
"seo_feature1_title": "無制限の生成",
|
| 61 |
+
"seo_feature1_desc": "プレミアムユーザーは、日次制限、レート制限、コンテンツの障壁なしで、無制限の画像生成をお楽しみいただけます。いつでも、どこでも、好きなだけ画像を作成できます。",
|
| 62 |
+
"seo_feature2_title": "創造的自由",
|
| 63 |
+
"seo_feature2_desc": "あらゆる種類のコンテンツを生成・編集し、想像力に一切の制限なく、完全な創造的自由を享受できます。アーティスト、デザイナー、コンテンツクリエーターに無限の可能性を提供します。",
|
| 64 |
+
"seo_feature3_title": "超高速処理",
|
| 65 |
+
"seo_feature3_desc": "先進的なAIインフラが、数秒で高品質な結果を提供します。キュー待ちや処理遅延はなく、瞬時にプロレベルの画像編集が可能です。",
|
| 66 |
+
"seo_feature4_title": "高度な編集ツール",
|
| 67 |
+
"seo_feature4_desc": "全体的な変換、正確な部分編集、スタイル転送、オブジェクト除去、背景置換など、数十種類のプロフェッショナルな編集機能。",
|
| 68 |
+
"seo_feature5_title": "卓越した品質",
|
| 69 |
+
"seo_feature5_desc": "数百万枚の画像でトレーニングされた最先端のAIモデルが、卓越した品質とリアリズムを提供します。商用利用やハイエンドプロジェクトに適したプロレベルの結果。",
|
| 70 |
+
"seo_feature6_title": "マルチモーダル対応",
|
| 71 |
+
"seo_feature6_desc": "すべての画像フォーマット、スタイル、ユースケースに対応。リアルなポートレートから芸術的な創作、製品写真からデジタルアートまで、すべてをカバーします。",
|
| 72 |
+
"seo_protips_title": "最高の結果を得るためのプロのヒント",
|
| 73 |
+
"seo_protip1_title": "明確な説明:",
|
| 74 |
+
"seo_protip1_desc": "詳細で具体的なプロンプトを使用すると、より良い結果が得られます。色、スタイル、照明、構図を明確に記述してください。",
|
| 75 |
+
"seo_protip2_title": "部分編集:",
|
| 76 |
+
"seo_protip2_desc": "正確なブラシストロークで部分編集したい領域を選択します。より小さく、集中した編集は、通常、より良い結果を生み出します。",
|
| 77 |
+
"seo_protip3_title": "反復プロセス:",
|
| 78 |
+
"seo_protip3_desc": "「入力として使用」機能を使って結果を洗練させます。複数回の反復により、複雑な変換が可能になります。",
|
| 79 |
+
"seo_protip4_title": "画質:",
|
| 80 |
+
"seo_protip4_desc": "より高解像度の入力画像(最大10MB)は、通常、より良い編集結果と細かいディテールをもたらします。",
|
| 81 |
+
"seo_needs_title": "あらゆるクリエイティブニーズに対応",
|
| 82 |
+
"seo_needs_art_title": "デジタルアート",
|
| 83 |
+
"seo_needs_art_item1": "キャラクターデザイン",
|
| 84 |
+
"seo_needs_art_item2": "コンセプトアート",
|
| 85 |
+
"seo_needs_art_item3": "スタイル転送",
|
| 86 |
+
"seo_needs_art_item4": "アーティスティック効果",
|
| 87 |
+
"seo_needs_photo_title": "写真",
|
| 88 |
+
"seo_needs_photo_item1": "背景置換",
|
| 89 |
+
"seo_needs_photo_item2": "オブジェクト除去",
|
| 90 |
+
"seo_needs_photo_item3": "照明調整",
|
| 91 |
+
"seo_needs_photo_item4": "ポートレート補正",
|
| 92 |
+
"seo_needs_ecom_title": "eコマース",
|
| 93 |
+
"seo_needs_ecom_item1": "製品写真",
|
| 94 |
+
"seo_needs_ecom_item2": "ライフスタイル写真",
|
| 95 |
+
"seo_needs_ecom_item3": "色の変更",
|
| 96 |
+
"seo_needs_ecom_item4": "シーンの置き換え",
|
| 97 |
+
"seo_needs_social_title": "ソーシャルメディア",
|
| 98 |
+
"seo_needs_social_item1": "コンテンツ作成",
|
| 99 |
+
"seo_needs_social_item2": "ミーム生成",
|
| 100 |
+
"seo_needs_social_item3": "ブランドビジュアル",
|
| 101 |
+
"seo_needs_social_item4": "バイラルコンテンツ"
|
| 102 |
+
}
|
i18n/nl.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI-beeld-editor",
|
| 3 |
+
"header_title": "🎨 AI-beeld-editor",
|
| 4 |
+
"news_banner_prefix": "🚀 Nieuws: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image is live — De beste menselijke generatie ooit!",
|
| 6 |
+
"global_editor_tab": "🌍 Algemene Bewerking",
|
| 7 |
+
"upload_image_header": "### 📸 Afbeelding uploaden",
|
| 8 |
+
"upload_image_label": "Selecteer een afbeelding om te bewerken",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Bewerkingsinstructies",
|
| 10 |
+
"prompt_input_label": "Voer een bewerkingsprompt in",
|
| 11 |
+
"prompt_input_placeholder": "Bijv.: verander de achtergrond in een strand, voeg een regenboog toe, verwijder de achtergrond, etc.",
|
| 12 |
+
"start_editing_button": "🚀 Start Bewerken",
|
| 13 |
+
"editing_result_header": "### 🎯 Resultaat van Bewerking",
|
| 14 |
+
"output_image_label": "Bewerkte afbeelding",
|
| 15 |
+
"use_as_input_button": "🔄 Gebruik als Invoer",
|
| 16 |
+
"status_output_label": "Verwerkingsstatus",
|
| 17 |
+
"prompt_examples_header": "### 💡 Voorbeeldprompts",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Lokaal Inpainting",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Afbeelding uploaden & Masker tekenen",
|
| 20 |
+
"upload_and_draw_mask_label": "Upload een afbeelding en teken een masker",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referentieafbeelding (Optioneel)",
|
| 22 |
+
"reference_image_label": "Upload referentieafbeelding (optioneel)",
|
| 23 |
+
"local_prompt_input_label": "Voer lokale bewerkingsprompt in",
|
| 24 |
+
"local_prompt_input_placeholder": "Bijv.: verander het haar in het geselecteerde gebied naar blond, voeg een patroon toe aan het geselecteerde object, verander de kleur van het geselecteerde gebied, etc.",
|
| 25 |
+
"start_local_editing_button": "🎯 Start Lokale Bewerking",
|
| 26 |
+
"local_output_image_label": "Lokaal bewerkte afbeelding",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Voorbeeld van Lokaal Inpainting",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Voorbeeld: Verander Panda in Kat",
|
| 29 |
+
"main_image_label": "Hoofdafbeelding",
|
| 30 |
+
"mask_label": "Masker",
|
| 31 |
+
"reference_label": "Referentieafbeelding",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Opmerking**: Het masker wordt automatisch toegepast bij het indienen van dit voorbeeld",
|
| 33 |
+
"load_panda_example_button": "🎨 Laad Panda-voorbeeld",
|
| 34 |
+
"refresh_editor_button": "🔄 Ververs Beeld-editor",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Upload eerst een afbeelding",
|
| 37 |
+
"error_enter_prompt": "Voer een bewerkingsprompt in",
|
| 38 |
+
"error_prompt_too_short": "❌ De bewerkingsprompt moet langer zijn dan 3 tekens",
|
| 39 |
+
"error_request_processing": "❌ Fout bij het verwerken van het verzoek",
|
| 40 |
+
"error_free_limit_reached": "❌ U heeft uw limiet voor gratis generaties op Hugging Face bereikt. Bezoek https://omnicreator.net/#generator voor onbeperkte generaties",
|
| 41 |
+
"error_free_limit_wait": "❌ U heeft uw limiet voor gratis generaties op Hugging Face bereikt. Bezoek https://omnicreator.net/#generator voor onbeperkte generaties, of wacht {wait_minutes_int} minuten en probeer het opnieuw",
|
| 42 |
+
"status_checking_result": "Resultaatafbeelding controleren...",
|
| 43 |
+
"status_applying_filter": "Contentfilter toepassen...",
|
| 44 |
+
"warning_content_filter": "⚠️ Er is een contentfilter toegepast volgens de communityrichtlijnen van Hugging Face. Voor onbeperkte creatieve vrijheid, bezoek onze officiële website https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Contentbeoordeling vereist. Bezoek https://omnicreator.net/#generator voor een betere ervaring",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Verwerking voltooid",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Er is een fout opgetreden tijdens de verwerking: {error}",
|
| 50 |
+
"error_upload_and_draw": "Upload een afbeelding en teken het te bewerken gebied",
|
| 51 |
+
"error_draw_on_image": "Teken het gebied dat u wilt bewerken op de afbeelding",
|
| 52 |
+
"error_no_image_found": "❌ Geen afbeelding gevonden. Upload eerst een afbeelding.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Onbeperkte AI-beeldgeneratie & -bewerking",
|
| 55 |
+
"seo_unlimited_desc": "Ervaar de ultieme vrijheid in AI-beeldcreatie! Genereer en bewerk afbeeldingen zonder limieten of beperkingen, en laat uw verbeelding de vrije loop met ons geavanceerde AI-beeldbewerkingsplatform.",
|
| 56 |
+
"seo_unlimited_button": "Krijg nu onbeperkte toegang",
|
| 57 |
+
"seo_unlimited_footer": "Sluit u aan bij duizenden makers die Omni Creator vertrouwen voor onbeperkte AI-beeldgeneratie!",
|
| 58 |
+
"seo_professional_title": "Professionele AI-beeld-editor - Onbeperkt",
|
| 59 |
+
"seo_professional_desc": "Breng uw creatieve visies tot leven met ons geavanceerde AI-beeldbewerkingsplatform. Of u nu kunst creëert, foto's bewerkt, content ontwerpt of met welk type afbeelding dan ook werkt - onze krachtige AI verwijdert alle limieten om u volledige creatieve vrijheid te geven.",
|
| 60 |
+
"seo_feature1_title": "Onbeperkte Generaties",
|
| 61 |
+
"seo_feature1_desc": "Premium-gebruikers genieten van onbeperkte beeldgeneraties, zonder dagelijkse limieten, snelheidsbeperkingen of contentbarrières. Creëer zoveel afbeeldingen als u wilt, waar en wanneer u maar wilt.",
|
| 62 |
+
"seo_feature2_title": "Creatieve Vrijheid",
|
| 63 |
+
"seo_feature2_desc": "Genereer en bewerk elk type content met volledige creatieve vrijheid en zonder limieten aan uw verbeelding. Eindeloze mogelijkheden voor kunstenaars, ontwerpers en contentmakers.",
|
| 64 |
+
"seo_feature3_title": "Bliksemsnelle Verwerking",
|
| 65 |
+
"seo_feature3_desc": "Een geavanceerde AI-infrastructuur levert binnen enkele seconden resultaten van hoge kwaliteit. Geen wachtrijen, geen verwerkingsvertragingen - alleen directe, professionele beeldbewerking.",
|
| 66 |
+
"seo_feature4_title": "Geavanceerde Bewerkingstools",
|
| 67 |
+
"seo_feature4_desc": "Globale transformaties, precieze lokale bewerkingen, stijloverdracht, objectverwijdering, achtergrondvervanging en tientallen andere professionele bewerkingsfuncties.",
|
| 68 |
+
"seo_feature5_title": "Uitzonderlijke Kwaliteit",
|
| 69 |
+
"seo_feature5_desc": "State-of-the-art AI-modellen getraind op miljoenen afbeeldingen leveren uitzonderlijke kwaliteit en realisme. Resultaten van professioneel niveau, geschikt voor commercieel gebruik en high-end projecten.",
|
| 70 |
+
"seo_feature6_title": "Multimodale Ondersteuning",
|
| 71 |
+
"seo_feature6_desc": "Ondersteuning voor alle beeldformaten, stijlen en use-cases. Van fotorealistische portretten tot artistieke creaties, van productfotografie tot digitale kunst - wij kunnen het allemaal aan.",
|
| 72 |
+
"seo_protips_title": "Pro-tips voor de Beste Resultaten",
|
| 73 |
+
"seo_protip1_title": "Duidelijke Beschrijvingen:",
|
| 74 |
+
"seo_protip1_desc": "Gebruik gedetailleerde en specifieke prompts voor betere resultaten. Beschrijf kleuren, stijl, belichting en compositie duidelijk.",
|
| 75 |
+
"seo_protip2_title": "Lokale Bewerking:",
|
| 76 |
+
"seo_protip2_desc": "Gebruik precieze penseelstreken om gebieden voor lokale bewerkingen te selecteren. Kleinere, meer gerichte bewerkingen leveren vaak betere resultaten op.",
|
| 77 |
+
"seo_protip3_title": "Iteratief Proces:",
|
| 78 |
+
"seo_protip3_desc": "Gebruik de functie 'Gebruik als Invoer' om resultaten te verfijnen. Meerdere iteraties kunnen leiden tot complexe transformaties.",
|
| 79 |
+
"seo_protip4_title": "Beeldkwaliteit:",
|
| 80 |
+
"seo_protip4_desc": "Invoer-afbeeldingen met een hogere resolutie (tot 10 MB) leveren doorgaans betere bewerkingen en fijnere details op.",
|
| 81 |
+
"seo_needs_title": "Voor Elke Creatieve Behoefte",
|
| 82 |
+
"seo_needs_art_title": "Digitale Kunst",
|
| 83 |
+
"seo_needs_art_item1": "Karakterontwerp",
|
| 84 |
+
"seo_needs_art_item2": "Concept Art",
|
| 85 |
+
"seo_needs_art_item3": "Stijloverdracht",
|
| 86 |
+
"seo_needs_art_item4": "Artistieke Effecten",
|
| 87 |
+
"seo_needs_photo_title": "Fotografie",
|
| 88 |
+
"seo_needs_photo_item1": "Achtergrondvervanging",
|
| 89 |
+
"seo_needs_photo_item2": "Objectverwijdering",
|
| 90 |
+
"seo_needs_photo_item3": "Belichtingsaanpassing",
|
| 91 |
+
"seo_needs_photo_item4": "Portretverbetering",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Productfotografie",
|
| 94 |
+
"seo_needs_ecom_item2": "Lifestylefoto's",
|
| 95 |
+
"seo_needs_ecom_item3": "Kleurvariaties",
|
| 96 |
+
"seo_needs_ecom_item4": "Scène-vervanging",
|
| 97 |
+
"seo_needs_social_title": "Sociale Media",
|
| 98 |
+
"seo_needs_social_item1": "Contentcreatie",
|
| 99 |
+
"seo_needs_social_item2": "Meme-generatie",
|
| 100 |
+
"seo_needs_social_item3": "Merkvisuals",
|
| 101 |
+
"seo_needs_social_item4": "Virale Content"
|
| 102 |
+
}
|
i18n/no.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI-bilderedigering",
|
| 3 |
+
"header_title": "🎨 AI-bilderedigering",
|
| 4 |
+
"news_banner_prefix": "🚀 Nyheter: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image er live — Den beste menneskelige genereringen noensinne!",
|
| 6 |
+
"global_editor_tab": "🌍 Global redigering",
|
| 7 |
+
"upload_image_header": "### 📸 Last opp bilde",
|
| 8 |
+
"upload_image_label": "Velg et bilde du vil redigere",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Redigeringsinstruksjoner",
|
| 10 |
+
"prompt_input_label": "Skriv inn redigeringsprompt",
|
| 11 |
+
"prompt_input_placeholder": "F.eks.: endre bakgrunnen til en strand, legg til en regnbue, fjern bakgrunnen, osv.",
|
| 12 |
+
"start_editing_button": "🚀 Start redigering",
|
| 13 |
+
"editing_result_header": "### 🎯 Redigeringsresultat",
|
| 14 |
+
"output_image_label": "Redigert bilde",
|
| 15 |
+
"use_as_input_button": "🔄 Bruk som input",
|
| 16 |
+
"status_output_label": "Behandlingsstatus",
|
| 17 |
+
"prompt_examples_header": "### 💡 Eksempler på prompter",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Lokal inpainting",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Last opp bilde & tegn maske",
|
| 20 |
+
"upload_and_draw_mask_label": "Last opp et bilde og tegn en maske",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referansebilde (Valgfritt)",
|
| 22 |
+
"reference_image_label": "Last opp referansebilde (valgfritt)",
|
| 23 |
+
"local_prompt_input_label": "Skriv inn lokal redigeringsprompt",
|
| 24 |
+
"local_prompt_input_placeholder": "F.eks.: endre håret i det valgte området til blondt, legg til et mønster på det valgte objektet, endre fargen på det valgte området, osv.",
|
| 25 |
+
"start_local_editing_button": "🎯 Start lokal redigering",
|
| 26 |
+
"local_output_image_label": "Lokalt redigert bilde",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Eksempel på lokal inpainting",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Eksempel: Gjør om panda til katt",
|
| 29 |
+
"main_image_label": "Hovedbilde",
|
| 30 |
+
"mask_label": "Maske",
|
| 31 |
+
"reference_label": "Referansebilde",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Merk**: Masken vil bli brukt automatisk når du sender inn dette eksempelet",
|
| 33 |
+
"load_panda_example_button": "🎨 Last inn panda-eksempel",
|
| 34 |
+
"refresh_editor_button": "🔄 Oppdater bilderedigering",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Vennligst last opp et bilde først",
|
| 37 |
+
"error_enter_prompt": "Vennligst skriv inn en redigeringsprompt",
|
| 38 |
+
"error_prompt_too_short": "❌ Redigeringsprompten må være lengre enn 3 tegn",
|
| 39 |
+
"error_request_processing": "❌ Feil ved behandling av forespørsel",
|
| 40 |
+
"error_free_limit_reached": "❌ Du har nådd grensen for gratis genereringer på Hugging Face. Besøk https://omnicreator.net/#generator for ubegrensede genereringer",
|
| 41 |
+
"error_free_limit_wait": "❌ Du har nådd grensen for gratis genereringer på Hugging Face. Besøk https://omnicreator.net/#generator for ubegrensede genereringer, eller vent i {wait_minutes_int} minutter og prøv igjen",
|
| 42 |
+
"status_checking_result": "Sjekker resultatbildet...",
|
| 43 |
+
"status_applying_filter": "Bruker innholdsfilter...",
|
| 44 |
+
"warning_content_filter": "⚠️ Et innholdsfilter har blitt brukt i henhold til Hugging Face sine retningslinjer for fellesskapet. For ubegrenset kreativ frihet, besøk vår offisielle nettside https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Innholdsgjennomgang kreves. Besøk https://omnicreator.net/#generator for en bedre opplevelse",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Behandling fullført",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ En feil oppstod under behandlingen: {error}",
|
| 50 |
+
"error_upload_and_draw": "Vennligst last opp et bilde og tegn området som skal redigeres",
|
| 51 |
+
"error_draw_on_image": "Vennligst tegn området du vil redigere på bildet",
|
| 52 |
+
"error_no_image_found": "❌ Ingen bilde funnet. Vennligst last opp et bilde først.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Ubegrenset AI-bildegenerering og -redigering",
|
| 55 |
+
"seo_unlimited_desc": "Opplev den ultimate friheten i AI-bildeskaping! Generer og rediger bilder uten grenser eller restriksjoner, og slipp fantasien løs med vår avanserte AI-bilderedigeringsplattform.",
|
| 56 |
+
"seo_unlimited_button": "Få ubegrenset tilgang nå",
|
| 57 |
+
"seo_unlimited_footer": "Bli med tusenvis av skapere som stoler på Omni Creator for ubegrenset AI-bildegenerering!",
|
| 58 |
+
"seo_professional_title": "Profesjonell AI-bilderedigering - Ubegrenset",
|
| 59 |
+
"seo_professional_desc": "Gjør dine kreative visjoner til virkelighet med vår avanserte AI-bilderedigeringsplattform. Enten du skaper kunst, redigerer bilder, designer innhold eller jobber med en hvilken som helst type bilde - vår kraftige AI fjerner alle grenser for å gi deg total kreativ frihet.",
|
| 60 |
+
"seo_feature1_title": "Ubegrensede genereringer",
|
| 61 |
+
"seo_feature1_desc": "Premiumbrukere nyter ubegrensede bildeproduksjoner, uten daglige grenser, hastighetsbegrensninger eller innholdsbarrierer. Lag så mange bilder du vil, når og hvor du vil.",
|
| 62 |
+
"seo_feature2_title": "Kreativ frihet",
|
| 63 |
+
"seo_feature2_desc": "Generer og rediger alle typer innhold med fullstendig kreativ frihet og uten grenser for fantasien. Uendelige muligheter for kunstnere, designere og innholdsskapere.",
|
| 64 |
+
"seo_feature3_title": "Lynrask behandling",
|
| 65 |
+
"seo_feature3_desc": "En avansert AI-infrastruktur leverer resultater av høy kvalitet på sekunder. Ingen køer, ingen behandlingsforsinkelser - bare umiddelbar, profesjonell bilderedigering.",
|
| 66 |
+
"seo_feature4_title": "Avanserte redigeringsverktøy",
|
| 67 |
+
"seo_feature4_desc": "Globale transformasjoner, presise lokale redigeringer, stiloverføring, fjerning av objekter, bakgrunnsutskifting og dusinvis av andre profesjonelle redigeringsfunksjoner.",
|
| 68 |
+
"seo_feature5_title": "Eksepsjonell kvalitet",
|
| 69 |
+
"seo_feature5_desc": "Toppmoderne AI-modeller trent på millioner av bilder leverer eksepsjonell kvalitet og realisme. Resultater på profesjonelt nivå som passer for kommersiell bruk og avanserte prosjekter.",
|
| 70 |
+
"seo_feature6_title": "Multimodal støtte",
|
| 71 |
+
"seo_feature6_desc": "Støtte for alle bildeformater, stiler og bruksområder. Fra fotorealistiske portretter til kunstneriske kreasjoner, fra produktfotografering til digital kunst - vi håndterer alt.",
|
| 72 |
+
"seo_protips_title": "Pro-tips for de beste resultatene",
|
| 73 |
+
"seo_protip1_title": "Tydelige beskrivelser:",
|
| 74 |
+
"seo_protip1_desc": "Bruk detaljerte og spesifikke prompter for bedre resultater. Beskriv farger, stil, belysning og komposisjon tydelig.",
|
| 75 |
+
"seo_protip2_title": "Lokal redigering:",
|
| 76 |
+
"seo_protip2_desc": "Bruk presise penselstrøk for å velge områder for lokale redigeringer. Mindre, mer fokuserte redigeringer gir ofte bedre resultater.",
|
| 77 |
+
"seo_protip3_title": "Iterativ prosess:",
|
| 78 |
+
"seo_protip3_desc": "Bruk 'Bruk som input'-funksjonen for å finpusse resultatene. Flere iterasjoner kan føre til komplekse transformasjoner.",
|
| 79 |
+
"seo_protip4_title": "Bildekvalitet:",
|
| 80 |
+
"seo_protip4_desc": "Inputbilder med høyere oppløsning (opptil 10 MB) gir vanligvis bedre redigeringer og finere detaljer.",
|
| 81 |
+
"seo_needs_title": "For ethvert kreativt behov",
|
| 82 |
+
"seo_needs_art_title": "Digital kunst",
|
| 83 |
+
"seo_needs_art_item1": "Karakterdesign",
|
| 84 |
+
"seo_needs_art_item2": "Konseptkunst",
|
| 85 |
+
"seo_needs_art_item3": "Stiloverføring",
|
| 86 |
+
"seo_needs_art_item4": "Kunstneriske effekter",
|
| 87 |
+
"seo_needs_photo_title": "Fotografering",
|
| 88 |
+
"seo_needs_photo_item1": "Bakgrunnsutskifting",
|
| 89 |
+
"seo_needs_photo_item2": "Fjerning av objekter",
|
| 90 |
+
"seo_needs_photo_item3": "Justering av belysning",
|
| 91 |
+
"seo_needs_photo_item4": "Portrettforbedring",
|
| 92 |
+
"seo_needs_ecom_title": "E-handel",
|
| 93 |
+
"seo_needs_ecom_item1": "Produktfotografering",
|
| 94 |
+
"seo_needs_ecom_item2": "Livsstilsbilder",
|
| 95 |
+
"seo_needs_ecom_item3": "Fargevariasjoner",
|
| 96 |
+
"seo_needs_ecom_item4": "Sceneutskifting",
|
| 97 |
+
"seo_needs_social_title": "Sosiale medier",
|
| 98 |
+
"seo_needs_social_item1": "Innholdsskaping",
|
| 99 |
+
"seo_needs_social_item2": "Mem-generering",
|
| 100 |
+
"seo_needs_social_item3": "Merkevarevisualer",
|
| 101 |
+
"seo_needs_social_item4": "Viralt innhold"
|
| 102 |
+
}
|
i18n/pt.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Editor de Imagens com IA",
|
| 3 |
+
"header_title": "🎨 Editor de Imagens com IA",
|
| 4 |
+
"news_banner_prefix": "🚀 Notícias: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image já está no ar — o melhor modelo humano até agora!",
|
| 6 |
+
"global_editor_tab": "🌍 Edição Global",
|
| 7 |
+
"upload_image_header": "### 📸 Carregar Imagem",
|
| 8 |
+
"upload_image_label": "Selecione uma imagem para editar",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Instruções de Edição",
|
| 10 |
+
"prompt_input_label": "Digite o comando de edição",
|
| 11 |
+
"prompt_input_placeholder": "Ex: mude o fundo para uma praia, adicione um arco-íris, remova o fundo, etc.",
|
| 12 |
+
"start_editing_button": "🚀 Começar a Editar",
|
| 13 |
+
"editing_result_header": "### 🎯 Resultado da Edição",
|
| 14 |
+
"output_image_label": "Imagem editada",
|
| 15 |
+
"use_as_input_button": "🔄 Usar como Entrada",
|
| 16 |
+
"status_output_label": "Status do Processamento",
|
| 17 |
+
"prompt_examples_header": "### 💡 Exemplos de Comandos",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Preenchimento Local (Inpainting)",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Carregar Imagem e Desenhar Máscara",
|
| 20 |
+
"upload_and_draw_mask_label": "Carregue uma imagem e desenhe uma máscara",
|
| 21 |
+
"reference_image_header": "### 🖼️ Imagem de Referência (Opcional)",
|
| 22 |
+
"reference_image_label": "Carregar imagem de referência (opcional)",
|
| 23 |
+
"local_prompt_input_label": "Digite o comando de edição local",
|
| 24 |
+
"local_prompt_input_placeholder": "Ex: mude o cabelo na área selecionada para loiro, adicione um padrão ao objeto selecionado, mude a cor da área selecionada, etc.",
|
| 25 |
+
"start_local_editing_button": "🎯 Começar Edição Local",
|
| 26 |
+
"local_output_image_label": "Imagem editada localmente",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Exemplo de Preenchimento Local",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Exemplo: Transforme o Panda em um Gato",
|
| 29 |
+
"main_image_label": "Imagem Principal",
|
| 30 |
+
"mask_label": "Máscara",
|
| 31 |
+
"reference_label": "Imagem de Referência",
|
| 32 |
+
"panda_example_note": "**Comando**: let the cat ride on the panda\n**Nota**: A máscara será aplicada automaticamente ao enviar este exemplo",
|
| 33 |
+
"load_panda_example_button": "🎨 Carregar Exemplo do Panda",
|
| 34 |
+
"refresh_editor_button": "🔄 Atualizar Editor de Imagens",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Por favor, carregue uma imagem primeiro",
|
| 37 |
+
"error_enter_prompt": "Por favor, insira um comando de edição",
|
| 38 |
+
"error_prompt_too_short": "❌ O comando de edição deve ter mais de 3 caracteres",
|
| 39 |
+
"error_request_processing": "❌ Erro ao processar a solicitação",
|
| 40 |
+
"error_free_limit_reached": "❌ Você atingiu seu limite de gerações gratuitas no Hugging Face. Visite https://omnicreator.net/#generator para gerações ilimitadas",
|
| 41 |
+
"error_free_limit_wait": "❌ Você atingiu seu limite de gerações gratuitas no Hugging Face. Visite https://omnicreator.net/#generator para gerações ilimitadas, ou espere {wait_minutes_int} minutos e tente novamente",
|
| 42 |
+
"status_checking_result": "Verificando a imagem resultante...",
|
| 43 |
+
"status_applying_filter": "Aplicando filtro de conteúdo...",
|
| 44 |
+
"warning_content_filter": "⚠️ Um filtro de conteúdo foi aplicado de acordo com as diretrizes da comunidade Hugging Face. Para liberdade criativa ilimitada, visite nosso site oficial https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Revisão de conteúdo necessária. Visite https://omnicreator.net/#generator para uma melhor experiência",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Processamento concluído",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Ocorreu um erro durante o processamento: {error}",
|
| 50 |
+
"error_upload_and_draw": "Por favor, carregue uma imagem e desenhe a área a ser editada",
|
| 51 |
+
"error_draw_on_image": "Por favor, desenhe na imagem a área que você deseja editar",
|
| 52 |
+
"error_no_image_found": "❌ Nenhuma imagem encontrada. Por favor, carregue uma imagem primeiro.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Geração e Edição de Imagens com IA Ilimitadas",
|
| 55 |
+
"seo_unlimited_desc": "Experimente a liberdade máxima na criação de imagens com IA! Gere e edite imagens sem limites ou restrições, e liberte sua imaginação com nossa plataforma avançada de edição de imagens com IA.",
|
| 56 |
+
"seo_unlimited_button": "Obtenha Acesso Ilimitado Agora",
|
| 57 |
+
"seo_unlimited_footer": "Junte-se a milhares de criadores que confiam na Omni Creator para geração ilimitada de imagens com IA!",
|
| 58 |
+
"seo_professional_title": "Editor Profissional de Imagens com IA - Ilimitado",
|
| 59 |
+
"seo_professional_desc": "Transforme suas visões criativas em realidade com nossa plataforma avançada de edição de imagens com IA. Esteja você criando arte, editando fotos, projetando conteúdo ou trabalhando com qualquer tipo de imagem - nossa poderosa IA remove todos os limites para lhe dar total liberdade criativa.",
|
| 60 |
+
"seo_feature1_title": "Gerações Ilimitadas",
|
| 61 |
+
"seo_feature1_desc": "Usuários premium desfrutam de gerações de imagens ilimitadas, sem limites diários, limites de taxa ou barreiras de conteúdo. Crie quantas imagens quiser, quando e onde quiser.",
|
| 62 |
+
"seo_feature2_title": "Liberdade Criativa",
|
| 63 |
+
"seo_feature2_desc": "Gere e edite qualquer tipo de conteúdo com total liberdade criativa e sem limites para sua imaginação. Possibilidades infinitas para artistas, designers e criadores de conteúdo.",
|
| 64 |
+
"seo_feature3_title": "Processamento Rápido como um Relâmpago",
|
| 65 |
+
"seo_feature3_desc": "Uma infraestrutura de IA avançada oferece resultados de alta qualidade em segundos. Sem filas, sem atrasos no processamento - apenas edição de imagens instantânea e de nível profissional.",
|
| 66 |
+
"seo_feature4_title": "Ferramentas de Edição Avançadas",
|
| 67 |
+
"seo_feature4_desc": "Transformações globais, edições locais precisas, transferência de estilo, remoção de objetos, substituição de fundo e dezenas de outros recursos de edição profissional.",
|
| 68 |
+
"seo_feature5_title": "Qualidade Excepcional",
|
| 69 |
+
"seo_feature5_desc": "Modelos de IA de última geração treinados em milhões de imagens oferecem qualidade e realismo excepcionais. Resultados de nível profissional adequados para uso comercial e projetos de ponta.",
|
| 70 |
+
"seo_feature6_title": "Suporte Multimodal",
|
| 71 |
+
"seo_feature6_desc": "Suporte para todos os formatos de imagem, estilos e casos de uso. De retratos fotorrealistas a criações artísticas, de fotografia de produtos a arte digital - nós cuidamos de tudo.",
|
| 72 |
+
"seo_protips_title": "Dicas Profissionais para os Melhores Resultados",
|
| 73 |
+
"seo_protip1_title": "Descrições Claras:",
|
| 74 |
+
"seo_protip1_desc": "Use comandos detalhados e específicos para obter melhores resultados. Descreva claramente cores, estilo, iluminação e composição.",
|
| 75 |
+
"seo_protip2_title": "Edição Local:",
|
| 76 |
+
"seo_protip2_desc": "Use pinceladas precisas para selecionar áreas para edições locais. Edições menores e mais focadas geralmente produzem melhores resultados.",
|
| 77 |
+
"seo_protip3_title": "Processo Iterativo:",
|
| 78 |
+
"seo_protip3_desc": "Use o recurso 'Usar como Entrada' para refinar os resultados. Múltiplas iterações podem levar a transformações complexas.",
|
| 79 |
+
"seo_protip4_title": "Qualidade da Imagem:",
|
| 80 |
+
"seo_protip4_desc": "Imagens de entrada com maior resolução (até 10MB) geralmente produzem edições melhores e detalhes mais finos.",
|
| 81 |
+
"seo_needs_title": "Para Todas as Necessidades Criativas",
|
| 82 |
+
"seo_needs_art_title": "Arte Digital",
|
| 83 |
+
"seo_needs_art_item1": "Design de Personagem",
|
| 84 |
+
"seo_needs_art_item2": "Arte Conceitual",
|
| 85 |
+
"seo_needs_art_item3": "Transferência de Estilo",
|
| 86 |
+
"seo_needs_art_item4": "Efeitos Artísticos",
|
| 87 |
+
"seo_needs_photo_title": "Fotografia",
|
| 88 |
+
"seo_needs_photo_item1": "Substituição de Fundo",
|
| 89 |
+
"seo_needs_photo_item2": "Remoção de Objetos",
|
| 90 |
+
"seo_needs_photo_item3": "Ajuste de Iluminação",
|
| 91 |
+
"seo_needs_photo_item4": "Aprimoramento de Retrato",
|
| 92 |
+
"seo_needs_ecom_title": "E-commerce",
|
| 93 |
+
"seo_needs_ecom_item1": "Fotografia de Produto",
|
| 94 |
+
"seo_needs_ecom_item2": "Fotos de Estilo de Vida",
|
| 95 |
+
"seo_needs_ecom_item3": "Variações de Cor",
|
| 96 |
+
"seo_needs_ecom_item4": "Substituição de Cenário",
|
| 97 |
+
"seo_needs_social_title": "Mídias Sociais",
|
| 98 |
+
"seo_needs_social_item1": "Criação de Conteúdo",
|
| 99 |
+
"seo_needs_social_item2": "Geração de Memes",
|
| 100 |
+
"seo_needs_social_item3": "Visuais de Marca",
|
| 101 |
+
"seo_needs_social_item4": "Conteúdo Viral"
|
| 102 |
+
}
|
i18n/ru.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Редактор изображений с ИИ",
|
| 3 |
+
"header_title": "🎨 Редактор изображений с ИИ",
|
| 4 |
+
"news_banner_prefix": "🚀 Новости: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image уже доступен — Лучшая генерация людей за всю историю!",
|
| 6 |
+
"global_editor_tab": "🌍 Глобальное редактирование",
|
| 7 |
+
"upload_image_header": "### 📸 Загрузить изображение",
|
| 8 |
+
"upload_image_label": "Выберите изображение для редактирования",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Инструкции по редактированию",
|
| 10 |
+
"prompt_input_label": "Введите текстовую подсказку для редактирования",
|
| 11 |
+
"prompt_input_placeholder": "Например: изменить фон на пляж, добавить радугу, удалить фон и т.д.",
|
| 12 |
+
"start_editing_button": "🚀 Начать редактирование",
|
| 13 |
+
"editing_result_header": "### 🎯 Результат редактирования",
|
| 14 |
+
"output_image_label": "Отредактированное изображение",
|
| 15 |
+
"use_as_input_button": "🔄 Использовать как входное",
|
| 16 |
+
"status_output_label": "Статус обработки",
|
| 17 |
+
"prompt_examples_header": "### 💡 Примеры подсказок",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Локальное восстановление",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Загрузить изображение и нарисовать маску",
|
| 20 |
+
"upload_and_draw_mask_label": "Загрузите изображение и нарисуйте маску",
|
| 21 |
+
"reference_image_header": "### 🖼️ Референсное изображение (необязательно)",
|
| 22 |
+
"reference_image_label": "Загрузить референсное изображение (необязательно)",
|
| 23 |
+
"local_prompt_input_label": "Введите подсказку для локального редактирования",
|
| 24 |
+
"local_prompt_input_placeholder": "Например: сделать волосы в выделенной области светлыми, добавить узор на выбранный объект, изменить цвет выделенной области и т.д.",
|
| 25 |
+
"start_local_editing_button": "🎯 Начать локальное редактирование",
|
| 26 |
+
"local_output_image_label": "Локально отредактированное изображение",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Пример локального восстановления",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Пример: Превратить панду в кота",
|
| 29 |
+
"main_image_label": "Основное изображение",
|
| 30 |
+
"mask_label": "Маска",
|
| 31 |
+
"reference_label": "Референс",
|
| 32 |
+
"panda_example_note": "**Подсказка**: let the cat ride on the panda\n**Примечание**: Маска будет применена автоматически при отправке этого примера",
|
| 33 |
+
"load_panda_example_button": "🎨 Загрузить пример с пандой",
|
| 34 |
+
"refresh_editor_button": "🔄 Обновить редактор изображений",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Пожалуйста, сначала загрузите изображение",
|
| 37 |
+
"error_enter_prompt": "Пожалуйста, введите подсказку для редактирования",
|
| 38 |
+
"error_prompt_too_short": "❌ Подсказка для редактирования должна быть длиннее 3 символов",
|
| 39 |
+
"error_request_processing": "❌ Ошибка обработки запроса",
|
| 40 |
+
"error_free_limit_reached": "❌ Вы достигли лимита бесплатных генераций на Hugging Face. Посетите https://omnicreator.net/#generator для неограниченных генераций",
|
| 41 |
+
"error_free_limit_wait": "❌ Вы достигли лимита бесплатных генераций на Hugging Face. Посетите https://omnicreator.net/#generator для неограниченных генераций или подождите {wait_minutes_int} минут и попробуйте снова",
|
| 42 |
+
"status_checking_result": "Проверка результирующего изображения...",
|
| 43 |
+
"status_applying_filter": "Применение фильтра контента...",
|
| 44 |
+
"warning_content_filter": "⚠️ Был применен фильтр контента в соответствии с правилами сообщества Hugging Face. Для неограниченной творческой свободы посетите наш официальный сайт https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Требуется проверка контента. Посетите https://omnicreator.net/#generator для лучшего опыта",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Обработка завершена",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Произошла ошибка во время обработки: {error}",
|
| 50 |
+
"error_upload_and_draw": "Пожалуйста, загрузите изображение и нарисуйте область для редактирования",
|
| 51 |
+
"error_draw_on_image": "Пожалуйста, нарисуйте на изображении область, которую хотите отредактировать",
|
| 52 |
+
"error_no_image_found": "❌ Изображение не найдено. Пожалуйста, сначала загрузите изображение.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Безлимитная генерация и редактирование изображений с ИИ",
|
| 55 |
+
"seo_unlimited_desc": "Испытайте абсолютную свободу в создании изображений с ИИ! Генерируйте и редактируйте изображения без ограничений и лимитов, и дайте волю своему воображению с нашей передовой платформой для редактирования изображений с ИИ.",
|
| 56 |
+
"seo_unlimited_button": "Получить безлимитный доступ сейчас",
|
| 57 |
+
"seo_unlimited_footer": "Присоединяйтесь к тысячам творцов, которые доверяют Omni Creator для безлимитной генерации изображений с ИИ!",
|
| 58 |
+
"seo_professional_title": "Профессиональный редактор изображений с ИИ - безлимитно",
|
| 59 |
+
"seo_professional_desc": "Воплотите свои творческие замыслы в реальность с нашей передовой платформой для редактирования изображений с ИИ. Создаете ли вы искусство, редактируете фотографии, разрабатываете контент или работаете с любым типом изображений — наш мощный ИИ снимает все ограничения, предоставляя вам полную творческую свободу.",
|
| 60 |
+
"seo_feature1_title": "Безлимитные генерации",
|
| 61 |
+
"seo_feature1_desc": "Премиум-пользователи получают неограниченное количество генераций изображений без дневных лимитов, ограничений по скорости или контенту. Создавайте столько изображений, сколько хотите, когда и где угодно.",
|
| 62 |
+
"seo_feature2_title": "Творческая свобода",
|
| 63 |
+
"seo_feature2_desc": "Генерируйте и редактируйте любой тип контента с полной творческой свободой и без ограничений для вашего воображения. Бесконечные возможности для художников, дизайнеров и создателей контента.",
|
| 64 |
+
"seo_feature3_title": "Молниеносная обработка",
|
| 65 |
+
"seo_feature3_desc": "Передовая инфраструктура ИИ обеспечивает высококачественные результаты за считанные секунды. Никаких очередей, никаких задержек в обработке — только мгновенное редактирование изображений на профессиональном уровне.",
|
| 66 |
+
"seo_feature4_title": "Расширенные инструменты редактирования",
|
| 67 |
+
"seo_feature4_desc": "Глобальные преобразования, точное локальное редактирование, перенос стиля, удаление объектов, замена фона и десятки других профессиональных функций редактирования.",
|
| 68 |
+
"seo_feature5_title": "Исключительное качество",
|
| 69 |
+
"seo_feature5_desc": "Самые современные модели ИИ, обученные на миллионах изображений, обеспечивают исключительное качество и реализм. Результаты профессионального уровня, подходящие для коммерческого использования и высококлассных проектов.",
|
| 70 |
+
"seo_feature6_title": "Мультимодальная поддержка",
|
| 71 |
+
"seo_feature6_desc": "Поддержка всех форматов изображений, стилей и сценариев использования. От фотореалистичных портретов до художественных творений, от предметной съемки до цифрового искусства — мы справимся со всем.",
|
| 72 |
+
"seo_protips_title": "Профессиональные советы для лучших результатов",
|
| 73 |
+
"seo_protip1_title": "Четкие описания:",
|
| 74 |
+
"seo_protip1_desc": "Используйте подробные и конкретные подсказки для лучших результатов. Четко описывайте цвета, стиль, освещение и композицию.",
|
| 75 |
+
"seo_protip2_title": "Локальное редактирование:",
|
| 76 |
+
"seo_protip2_desc": "Используйте точные мазки кистью для выбора областей для локального редактирования. Меньшие, более сфокусированные правки часто дают лучшие результаты.",
|
| 77 |
+
"seo_protip3_title": "Итеративный процесс:",
|
| 78 |
+
"seo_protip3_desc": "Используйте функцию «Использовать как входное», чтобы уточнить результаты. Несколько итераций могут привести к сложным преобразованиям.",
|
| 79 |
+
"seo_protip4_title": "Качество изображения:",
|
| 80 |
+
"seo_protip4_desc": "Изображения с более высоким разрешением на входе (до 10 МБ) обычно приводят к лучшим правкам и более тонким деталям.",
|
| 81 |
+
"seo_needs_title": "Для любых творческих нужд",
|
| 82 |
+
"seo_needs_art_title": "Цифровое искусство",
|
| 83 |
+
"seo_needs_art_item1": "Дизайн персонажей",
|
| 84 |
+
"seo_needs_art_item2": "Концепт-арт",
|
| 85 |
+
"seo_needs_art_item3": "Перенос стиля",
|
| 86 |
+
"seo_needs_art_item4": "Художественные эффекты",
|
| 87 |
+
"seo_needs_photo_title": "Фотография",
|
| 88 |
+
"seo_needs_photo_item1": "Замена фона",
|
| 89 |
+
"seo_needs_photo_item2": "Удаление объектов",
|
| 90 |
+
"seo_needs_photo_item3": "Коррекция освещения",
|
| 91 |
+
"seo_needs_photo_item4": "Улучшение портретов",
|
| 92 |
+
"seo_needs_ecom_title": "Электронная коммерция",
|
| 93 |
+
"seo_needs_ecom_item1": "Предметная съемка",
|
| 94 |
+
"seo_needs_ecom_item2": "Лайфстайл-фото",
|
| 95 |
+
"seo_needs_ecom_item3": "Вариации цвета",
|
| 96 |
+
"seo_needs_ecom_item4": "Замена сцены",
|
| 97 |
+
"seo_needs_social_title": "Социальные сети",
|
| 98 |
+
"seo_needs_social_item1": "Создание контента",
|
| 99 |
+
"seo_needs_social_item2": "Генерация мемов",
|
| 100 |
+
"seo_needs_social_item3": "Визуальные материалы бренда",
|
| 101 |
+
"seo_needs_social_item4": "Вирусный контент"
|
| 102 |
+
}
|
i18n/sv.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI-bildredigerare",
|
| 3 |
+
"header_title": "🎨 AI-bildredigerare",
|
| 4 |
+
"news_banner_prefix": "🚀 Nyheter: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image är live — Den bästa mänskliga genereringen någonsin!",
|
| 6 |
+
"global_editor_tab": "🌍 Global redigering",
|
| 7 |
+
"upload_image_header": "### 📸 Ladda upp bild",
|
| 8 |
+
"upload_image_label": "Välj en bild att redigera",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Redigeringsinstruktioner",
|
| 10 |
+
"prompt_input_label": "Ange redigeringsprompt",
|
| 11 |
+
"prompt_input_placeholder": "T.ex.: ändra bakgrunden till en strand, lägg till en regnbåge, ta bort bakgrunden, etc.",
|
| 12 |
+
"start_editing_button": "🚀 Börja redigera",
|
| 13 |
+
"editing_result_header": "### 🎯 Redigeringsresultat",
|
| 14 |
+
"output_image_label": "Redigerad bild",
|
| 15 |
+
"use_as_input_button": "🔄 Använd som indata",
|
| 16 |
+
"status_output_label": "Bearbetningsstatus",
|
| 17 |
+
"prompt_examples_header": "### 💡 Exempel på prompter",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Lokal inpainting",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Ladda upp bild & rita mask",
|
| 20 |
+
"upload_and_draw_mask_label": "Ladda upp en bild och rita en mask",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referensbild (Valfritt)",
|
| 22 |
+
"reference_image_label": "Ladda upp referensbild (valfritt)",
|
| 23 |
+
"local_prompt_input_label": "Ange lokal redigeringsprompt",
|
| 24 |
+
"local_prompt_input_placeholder": "T.ex.: ändra håret i det valda området till blont, lägg till ett mönster på det valda objektet, ändra färgen på det valda området, etc.",
|
| 25 |
+
"start_local_editing_button": "🎯 Starta lokal redigering",
|
| 26 |
+
"local_output_image_label": "Lokalt redigerad bild",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Exempel på lokal inpainting",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Exempel: Förvandla Panda till Katt",
|
| 29 |
+
"main_image_label": "Huvudbild",
|
| 30 |
+
"mask_label": "Mask",
|
| 31 |
+
"reference_label": "Referensbild",
|
| 32 |
+
"panda_example_note": "**Prompt**: let the cat ride on the panda\n**Obs**: Masken kommer att appliceras automatiskt när du skickar detta exempel",
|
| 33 |
+
"load_panda_example_button": "🎨 Ladda panda-exempel",
|
| 34 |
+
"refresh_editor_button": "🔄 Uppdatera bildredigeraren",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Ladda upp en bild först",
|
| 37 |
+
"error_enter_prompt": "Ange en redigeringsprompt",
|
| 38 |
+
"error_prompt_too_short": "❌ Redigeringsprompten måste vara längre än 3 tecken",
|
| 39 |
+
"error_request_processing": "❌ Fel vid bearbetning av begäran",
|
| 40 |
+
"error_free_limit_reached": "❌ Du har nått din gräns för gratis genereringar på Hugging Face. Besök https://omnicreator.net/#generator för obegränsade genereringar",
|
| 41 |
+
"error_free_limit_wait": "❌ Du har nått din gräns för gratis genereringar på Hugging Face. Besök https://omnicreator.net/#generator för obegränsade genereringar, eller vänta {wait_minutes_int} minuter och försök igen",
|
| 42 |
+
"status_checking_result": "Kontrollerar resultatbilden...",
|
| 43 |
+
"status_applying_filter": "Tillämpar innehållsfilter...",
|
| 44 |
+
"warning_content_filter": "⚠️ Ett innehållsfilter har tillämpats enligt Hugging Face community-riktlinjer. För obegränsad kreativ frihet, besök vår officiella webbplats https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Innehållsgranskning krävs. Besök https://omnicreator.net/#generator för en bättre upplevelse",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Bearbetning slutförd",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Ett fel uppstod under bearbetningen: {error}",
|
| 50 |
+
"error_upload_and_draw": "Ladda upp en bild och rita det område som ska redigeras",
|
| 51 |
+
"error_draw_on_image": "Rita det område du vill redigera på bilden",
|
| 52 |
+
"error_no_image_found": "❌ Ingen bild hittades. Ladda upp en bild först.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Obegränsad AI-bildgenerering & -redigering",
|
| 55 |
+
"seo_unlimited_desc": "Upplev den ultimata friheten i AI-bildskapande! Generera och redigera bilder utan gränser eller restriktioner, och släpp lös din fantasi med vår avancerade AI-bildredigeringsplattform.",
|
| 56 |
+
"seo_unlimited_button": "Få obegränsad åtkomst nu",
|
| 57 |
+
"seo_unlimited_footer": "Gå med tusentals kreatörer som litar på Omni Creator för obegränsad AI-bildgenerering!",
|
| 58 |
+
"seo_professional_title": "Professionell AI-bildredigerare - Obegränsad",
|
| 59 |
+
"seo_professional_desc": "Förverkliga dina kreativa visioner med vår avancerade AI-bildredigeringsplattform. Oavsett om du skapar konst, redigerar foton, designar innehåll eller arbetar med någon typ av bild - vår kraftfulla AI tar bort alla gränser för att ge dig total kreativ frihet.",
|
| 60 |
+
"seo_feature1_title": "Obegränsade genereringar",
|
| 61 |
+
"seo_feature1_desc": "Premiumanvändare åtnjuter obegränsade bildgenereringar, utan dagliga gränser, hastighetsbegränsningar eller innehållsbarriärer. Skapa så många bilder du vill, när och var du vill.",
|
| 62 |
+
"seo_feature2_title": "Kreativ frihet",
|
| 63 |
+
"seo_feature2_desc": "Generera och redigera alla typer av innehåll med fullständig kreativ frihet och utan gränser för din fantasi. Oändliga möjligheter för konstnärer, designers och innehållsskapare.",
|
| 64 |
+
"seo_feature3_title": "Blixtsnabb bearbetning",
|
| 65 |
+
"seo_feature3_desc": "En avancerad AI-infrastruktur levererar högkvalitativa resultat på några sekunder. Inga köer, inga bearbetningsfördröjningar - bara omedelbar, professionell bildredigering.",
|
| 66 |
+
"seo_feature4_title": "Avancerade redigeringsverktyg",
|
| 67 |
+
"seo_feature4_desc": "Globala transformationer, exakta lokala redigeringar, stilöverföring, borttagning av objekt, bakgrundsbyte och dussintals andra professionella redigeringsfunktioner.",
|
| 68 |
+
"seo_feature5_title": "Exceptionell kvalitet",
|
| 69 |
+
"seo_feature5_desc": "Toppmoderna AI-modeller tränade på miljontals bilder levererar exceptionell kvalitet och realism. Resultat på professionell nivå som är lämpliga för kommersiellt bruk och avancerade projekt.",
|
| 70 |
+
"seo_feature6_title": "Multimodalt stöd",
|
| 71 |
+
"seo_feature6_desc": "Stöd för alla bildformat, stilar och användningsfall. Från fotorealistiska porträtt till konstnärliga skapelser, från produktfotografering till digital konst - vi hanterar allt.",
|
| 72 |
+
"seo_protips_title": "Proffstips för bästa resultat",
|
| 73 |
+
"seo_protip1_title": "Tydliga beskrivningar:",
|
| 74 |
+
"seo_protip1_desc": "Använd detaljerade och specifika prompter för bättre resultat. Beskriv färger, stil, belysning och komposition tydligt.",
|
| 75 |
+
"seo_protip2_title": "Lokal redigering:",
|
| 76 |
+
"seo_protip2_desc": "Använd exakta penseldrag för att välja områden för lokala redigeringar. Mindre, mer fokuserade redigeringar ger ofta bättre resultat.",
|
| 77 |
+
"seo_protip3_title": "Iterativ process:",
|
| 78 |
+
"seo_protip3_desc": "Använd funktionen 'Använd som indata' för att förfina resultaten. Flera iterationer kan leda till komplexa transformationer.",
|
| 79 |
+
"seo_protip4_title": "Bildkvalitet:",
|
| 80 |
+
"seo_protip4_desc": "Inmatningsbilder med högre upplösning (upp till 10 MB) ger vanligtvis bättre redigeringar och finare detaljer.",
|
| 81 |
+
"seo_needs_title": "För alla kreativa behov",
|
| 82 |
+
"seo_needs_art_title": "Digital konst",
|
| 83 |
+
"seo_needs_art_item1": "Karaktärsdesign",
|
| 84 |
+
"seo_needs_art_item2": "Konceptkonst",
|
| 85 |
+
"seo_needs_art_item3": "Stilöverföring",
|
| 86 |
+
"seo_needs_art_item4": "Konstnärliga effekter",
|
| 87 |
+
"seo_needs_photo_title": "Fotografi",
|
| 88 |
+
"seo_needs_photo_item1": "Bakgrundsbyte",
|
| 89 |
+
"seo_needs_photo_item2": "Borttagning av objekt",
|
| 90 |
+
"seo_needs_photo_item3": "Belysningsjustering",
|
| 91 |
+
"seo_needs_photo_item4": "Porträttförbättring",
|
| 92 |
+
"seo_needs_ecom_title": "E-handel",
|
| 93 |
+
"seo_needs_ecom_item1": "Produktfotografering",
|
| 94 |
+
"seo_needs_ecom_item2": "Livsstilsfoton",
|
| 95 |
+
"seo_needs_ecom_item3": "Färgvariationer",
|
| 96 |
+
"seo_needs_ecom_item4": "Scenbyte",
|
| 97 |
+
"seo_needs_social_title": "Sociala medier",
|
| 98 |
+
"seo_needs_social_item1": "Innehållsskapande",
|
| 99 |
+
"seo_needs_social_item2": "Mem-generering",
|
| 100 |
+
"seo_needs_social_item3": "Varumärkesvisualer",
|
| 101 |
+
"seo_needs_social_item4": "Viralt innehåll"
|
| 102 |
+
}
|
i18n/tr.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Yapay Zeka Resim Düzenleyici",
|
| 3 |
+
"header_title": "🎨 Yapay Zeka Resim Düzenleyici",
|
| 4 |
+
"news_banner_prefix": "🚀 Haberler: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image yayında — Şimdiye kadarki en iyi insan üretimi!",
|
| 6 |
+
"global_editor_tab": "🌍 Genel Düzenleme",
|
| 7 |
+
"upload_image_header": "### 📸 Resim Yükle",
|
| 8 |
+
"upload_image_label": "Düzenlemek için bir resim seçin",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Düzenleme Talimatları",
|
| 10 |
+
"prompt_input_label": "Düzenleme istemi girin",
|
| 11 |
+
"prompt_input_placeholder": "Örn: arka planı plaj olarak değiştir, gökkuşağı ekle, arka planı kaldır, vb.",
|
| 12 |
+
"start_editing_button": "🚀 Düzenlemeye Başla",
|
| 13 |
+
"editing_result_header": "### 🎯 Düzenleme Sonucu",
|
| 14 |
+
"output_image_label": "Düzenlenmiş resim",
|
| 15 |
+
"use_as_input_button": "🔄 Girdi Olarak Kullan",
|
| 16 |
+
"status_output_label": "İşlem Durumu",
|
| 17 |
+
"prompt_examples_header": "### 💡 Örnek İstemler",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Yerel Düzeltme (Inpainting)",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Resim Yükle & Maske Çiz",
|
| 20 |
+
"upload_and_draw_mask_label": "Bir resim yükleyin ve bir maske çizin",
|
| 21 |
+
"reference_image_header": "### 🖼️ Referans Resim (İsteğe Bağlı)",
|
| 22 |
+
"reference_image_label": "Referans resim yükle (isteğe bağlı)",
|
| 23 |
+
"local_prompt_input_label": "Yerel düzenleme istemi girin",
|
| 24 |
+
"local_prompt_input_placeholder": "Örn: seçilen alandaki saçı sarıya çevir, seçilen nesneye bir desen ekle, seçilen alanın rengini değiştir, vb.",
|
| 25 |
+
"start_local_editing_button": "🎯 Yerel Düzenlemeye Başla",
|
| 26 |
+
"local_output_image_label": "Yerel olarak düzenlenmiş resim",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Yerel Düzeltme Örneği",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Örnek: Pandayı Kediye Dönüştür",
|
| 29 |
+
"main_image_label": "Ana Resim",
|
| 30 |
+
"mask_label": "Maske",
|
| 31 |
+
"reference_label": "Referans Resim",
|
| 32 |
+
"panda_example_note": "**İstem**: let the cat ride on the panda\n**Not**: Bu örneği gönderdiğinizde maske otomatik olarak uygulanacaktır",
|
| 33 |
+
"load_panda_example_button": "🎨 Panda Örneğini Yükle",
|
| 34 |
+
"refresh_editor_button": "🔄 Resim Düzenleyiciyi Yenile",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Lütfen önce bir resim yükleyin",
|
| 37 |
+
"error_enter_prompt": "Lütfen bir düzenleme istemi girin",
|
| 38 |
+
"error_prompt_too_short": "❌ Düzenleme istemi 3 karakterden uzun olmalıdır",
|
| 39 |
+
"error_request_processing": "❌ İstek işlenirken hata oluştu",
|
| 40 |
+
"error_free_limit_reached": "❌ Hugging Face'teki ücretsiz üretim limitinize ulaştınız. Sınırsız üretim için https://omnicreator.net/#generator adresini ziyaret edin",
|
| 41 |
+
"error_free_limit_wait": "❌ Hugging Face'teki ücretsiz üretim limitinize ulaştınız. Sınırsız üretim için https://omnicreator.net/#generator adresini ziyaret edin veya {wait_minutes_int} dakika bekleyip tekrar deneyin",
|
| 42 |
+
"status_checking_result": "Sonuç resmi kontrol ediliyor...",
|
| 43 |
+
"status_applying_filter": "İçerik filtresi uygulanıyor...",
|
| 44 |
+
"warning_content_filter": "⚠️ Hugging Face topluluk kurallarına göre bir içerik filtresi uygulandı. Sınırsız yaratıcı özgürlük için resmi web sitemizi ziyaret edin: https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ İçerik incelemesi gerekli. Daha iyi bir deneyim için https://omnicreator.net/#generator adresini ziyaret edin",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "İşlem tamamlandı",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ İşlem sırasında bir hata oluştu: {error}",
|
| 50 |
+
"error_upload_and_draw": "Lütfen bir resim yükleyin ve düzenlenecek alanı çizin",
|
| 51 |
+
"error_draw_on_image": "Lütfen düzenlemek istediğiniz alanı resmin üzerine çizin",
|
| 52 |
+
"error_no_image_found": "❌ Resim bulunamadı. Lütfen önce bir resim yükleyin.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Sınırsız Yapay Zeka Resim Üretimi ve Düzenlemesi",
|
| 55 |
+
"seo_unlimited_desc": "Yapay zeka ile resim oluşturmanın nihai özgürlüğünü yaşayın! Gelişmiş yapay zeka resim düzenleme platformumuzla sınır veya kısıtlama olmaksızın resimler üretin ve düzenleyin, hayal gücünüzü serbest bırakın.",
|
| 56 |
+
"seo_unlimited_button": "Şimdi Sınırsız Erişime Sahip Olun",
|
| 57 |
+
"seo_unlimited_footer": "Sınırsız yapay zeka resim üretimi için Omni Creator'a güvenen binlerce yaratıcıya katılın!",
|
| 58 |
+
"seo_professional_title": "Profesyonel Yapay Zeka Resim Düzenleyici - Sınırsız",
|
| 59 |
+
"seo_professional_desc": "Gelişmiş yapay zeka resim düzenleme platformumuzla yaratıcı vizyonlarınızı gerçeğe dönüştürün. Sanat yaratıyor, fotoğrafları düzenliyor, içerik tasarlıyor veya herhangi bir türde resimle çalışıyor olun - güçlü yapay zekamız size tam bir yaratıcı özgürlük vermek için tüm sınırları kaldırır.",
|
| 60 |
+
"seo_feature1_title": "Sınırsız Üretim",
|
| 61 |
+
"seo_feature1_desc": "Premium kullanıcılar, günlük limitler, hız limitleri veya içerik engelleri olmadan sınırsız resim üretiminin keyfini çıkarır. İstediğiniz zaman, istediğiniz yerde, istediğiniz kadar resim oluşturun.",
|
| 62 |
+
"seo_feature2_title": "Yaratıcı Özgürlük",
|
| 63 |
+
"seo_feature2_desc": "Hayal gücünüze sınır koymadan, tam bir yaratıcı özgürlükle her türlü içeriği üretin ve düzenleyin. Sanatçılar, tasarımcılar ve içerik oluşturucular için sonsuz olanaklar.",
|
| 64 |
+
"seo_feature3_title": "Yıldırım Hızında İşleme",
|
| 65 |
+
"seo_feature3_desc": "Gelişmiş bir yapay zeka altyapısı, saniyeler içinde yüksek kaliteli sonuçlar sunar. Kuyruk yok, işlem gecikmesi yok - sadece anında, profesyonel düzeyde resim düzenleme.",
|
| 66 |
+
"seo_feature4_title": "Gelişmiş Düzenleme Araçları",
|
| 67 |
+
"seo_feature4_desc": "Genel dönüşümler, hassas yerel düzenlemeler, stil aktarımı, nesne kaldırma, arka plan değiştirme ve onlarca diğer profesyonel düzenleme özelliği.",
|
| 68 |
+
"seo_feature5_title": "Olağanüstü Kalite",
|
| 69 |
+
"seo_feature5_desc": "Milyonlarca resim üzerinde eğitilmiş son teknoloji yapay zeka modelleri, olağanüstü kalite ve gerçekçilik sunar. Ticari kullanım ve üst düzey projeler için uygun profesyonel düzeyde sonuçlar.",
|
| 70 |
+
"seo_feature6_title": "Çok Modlu Destek",
|
| 71 |
+
"seo_feature6_desc": "Tüm resim formatları, stilleri ve kullanım durumları için destek. Fotogerçekçi portrelerden sanatsal yaratımlara, ürün fotoğrafçılığından dijital sanata kadar - her şeyi hallederiz.",
|
| 72 |
+
"seo_protips_title": "En İyi Sonuçlar İçin Profesyonel İpuçları",
|
| 73 |
+
"seo_protip1_title": "Açık Açıklamalar:",
|
| 74 |
+
"seo_protip1_desc": "Daha iyi sonuçlar için ayrıntılı ve spesifik istemler kullanın. Renkleri, stili, aydınlatmayı ve kompozisyonu net bir şekilde tanımlayın.",
|
| 75 |
+
"seo_protip2_title": "Yerel Düzenleme:",
|
| 76 |
+
"seo_protip2_desc": "Yerel düzenlemeler için alanları seçmek üzere hassas fırça darbeleri kullanın. Daha küçük, daha odaklı düzenlemeler genellikle daha iyi sonuçlar verir.",
|
| 77 |
+
"seo_protip3_title": "Yinelemeli Süreç:",
|
| 78 |
+
"seo_protip3_desc": "Sonuçları iyileştirmek için 'Girdi Olarak Kullan' özelliğini kullanın. Birden çok yineleme karmaşık dönüşümlere yol açabilir.",
|
| 79 |
+
"seo_protip4_title": "Resim Kalitesi:",
|
| 80 |
+
"seo_protip4_desc": "Daha yüksek çözünürlüklü girdi resimleri (10 MB'a kadar) genellikle daha iyi düzenlemeler ve daha ince ayrıntılar üretir.",
|
| 81 |
+
"seo_needs_title": "Her Yaratıcı İhtiyaç İçin",
|
| 82 |
+
"seo_needs_art_title": "Dijital Sanat",
|
| 83 |
+
"seo_needs_art_item1": "Karakter Tasarımı",
|
| 84 |
+
"seo_needs_art_item2": "Konsept Sanatı",
|
| 85 |
+
"seo_needs_art_item3": "Stil Aktarımı",
|
| 86 |
+
"seo_needs_art_item4": "Sanatsal Efektler",
|
| 87 |
+
"seo_needs_photo_title": "Fotoğrafçılık",
|
| 88 |
+
"seo_needs_photo_item1": "Arka Plan Değiştirme",
|
| 89 |
+
"seo_needs_photo_item2": "Nesne Kaldırma",
|
| 90 |
+
"seo_needs_photo_item3": "Aydınlatma Ayarı",
|
| 91 |
+
"seo_needs_photo_item4": "Portre Geliştirme",
|
| 92 |
+
"seo_needs_ecom_title": "E-ticaret",
|
| 93 |
+
"seo_needs_ecom_item1": "Ürün Fotoğrafçılığı",
|
| 94 |
+
"seo_needs_ecom_item2": "Yaşam Tarzı Çekimleri",
|
| 95 |
+
"seo_needs_ecom_item3": "Renk Varyasyonları",
|
| 96 |
+
"seo_needs_ecom_item4": "Sahne Değiştirme",
|
| 97 |
+
"seo_needs_social_title": "Sosyal Medya",
|
| 98 |
+
"seo_needs_social_item1": "İçerik Oluşturma",
|
| 99 |
+
"seo_needs_social_item2": "Meme Oluşturma",
|
| 100 |
+
"seo_needs_social_item3": "Marka Görselleri",
|
| 101 |
+
"seo_needs_social_item4": "Viral İçerik"
|
| 102 |
+
}
|
i18n/uk.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Редактор зображень зі ШІ",
|
| 3 |
+
"header_title": "🎨 Редактор зображень зі ШІ",
|
| 4 |
+
"news_banner_prefix": "🚀 Новини: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image вже доступний — Найкраща генерація людей за весь час!",
|
| 6 |
+
"global_editor_tab": "🌍 Глобальне редагування",
|
| 7 |
+
"upload_image_header": "### 📸 Завантажити зображення",
|
| 8 |
+
"upload_image_label": "Виберіть зображення для редагування",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Інструкції з редагування",
|
| 10 |
+
"prompt_input_label": "Введіть підказку для редагування",
|
| 11 |
+
"prompt_input_placeholder": "Наприклад: змінити фон на пляж, додати веселку, видалити фон тощо...",
|
| 12 |
+
"start_editing_button": "🚀 Почати редагування",
|
| 13 |
+
"editing_result_header": "### 🎯 Результат редагування",
|
| 14 |
+
"output_image_label": "Відредаговане зображення",
|
| 15 |
+
"use_as_input_button": "🔄 Використати як вхідні дані",
|
| 16 |
+
"status_output_label": "Статус обробки",
|
| 17 |
+
"prompt_examples_header": "### 💡 Приклади підказок",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Локальне відновлення (Inpainting)",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Завантажити зображення та намалювати маску",
|
| 20 |
+
"upload_and_draw_mask_label": "Завантажте зображення та намалюйте маску",
|
| 21 |
+
"reference_image_header": "### 🖼️ Референтне зображення (необов'язково)",
|
| 22 |
+
"reference_image_label": "Завантажити референтне зображення (необов'язково)",
|
| 23 |
+
"local_prompt_input_label": "Введіть підказку для локального редагування",
|
| 24 |
+
"local_prompt_input_placeholder": "Наприклад: змінити волосся у вибраній області на світле, додати візерунок до вибраного об'єкта, змінити колір вибраної області тощо...",
|
| 25 |
+
"start_local_editing_button": "🎯 Почати локальне редагування",
|
| 26 |
+
"local_output_image_label": "Локально відредаговане зображення",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Приклад локального відновлення",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Приклад: Перетворити панду на кота",
|
| 29 |
+
"main_image_label": "Головне зображення",
|
| 30 |
+
"mask_label": "Маска",
|
| 31 |
+
"reference_label": "Референс",
|
| 32 |
+
"panda_example_note": "**Підказка**: let the cat ride on the panda\n**Примітка**: Маска буде застосована автоматично при відправці цього прикладу",
|
| 33 |
+
"load_panda_example_button": "🎨 Завантажити приклад з пандою",
|
| 34 |
+
"refresh_editor_button": "🔄 Оновити редактор зображень",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Будь ласка, спочатку завантажте зображення",
|
| 37 |
+
"error_enter_prompt": "Будь ласка, введіть підказку для редагування",
|
| 38 |
+
"error_prompt_too_short": "❌ Підказка для редагування повинна містити більше 3 символів",
|
| 39 |
+
"error_request_processing": "❌ Помилка обробки запиту",
|
| 40 |
+
"error_free_limit_reached": "❌ Ви досягли ліміту безкоштовних генерацій на Hugging Face. Відвідайте https://omnicreator.net/#generator для необмежених генерацій",
|
| 41 |
+
"error_free_limit_wait": "❌ Ви досягли ліміту безкоштовних генерацій на Hugging Face. Відвідайте https://omnicreator.net/#generator для необмежених генерацій, або зачекайте {wait_minutes_int} хвилин і спробуйте ще раз",
|
| 42 |
+
"status_checking_result": "Перевірка результуючого зображення...",
|
| 43 |
+
"status_applying_filter": "Застосування фільтра вмісту...",
|
| 44 |
+
"warning_content_filter": "⚠️ Фільтр вмісту було застосовано відповідно до правил спільноти Hugging Face. Для необмеженої творчої свободи відвідайте наш офіційний веб-сайт https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Потрібна перевірка вмісту. Відвідайте https://omnicreator.net/#generator для кращого досвіду",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Обробку завершено",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Сталася помилка під час обробки: {error}",
|
| 50 |
+
"error_upload_and_draw": "Будь ласка, завантажте зображення та намалюйте область для редагування",
|
| 51 |
+
"error_draw_on_image": "Будь ласка, намалюйте на зображенні область, яку ви хочете відредагувати",
|
| 52 |
+
"error_no_image_found": "❌ Зображення не знайдено. Будь ласка, спочатку завантажте зображення.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Безлімітна генерація та редагування зображень зі ШІ",
|
| 55 |
+
"seo_unlimited_desc": "Відчуйте абсолютну свободу у створенні зображень зі ШІ! Генеруйте та редагуйте зображення без обмежень, і розкрийте свою уяву за допомогою нашої передової платформи для редагування зображень зі ШІ.",
|
| 56 |
+
"seo_unlimited_button": "Отримати безлімітний доступ зараз",
|
| 57 |
+
"seo_unlimited_footer": "Приєднуйтесь до тисяч творців, які довіряють Omni Creator для безлімітної генерації зображень зі ШІ!",
|
| 58 |
+
"seo_professional_title": "Професійний редактор зображень зі ШІ - Безлімітно",
|
| 59 |
+
"seo_professional_desc": "Втілюйте свої творчі бачення в реальність за допомогою нашої передової платформи для редагування зображень зі ШІ. Незалежно від того, чи створюєте ви мистецтво, редагуєте фотографії, розробляєте контент чи працюєте з будь-яким типом зображень - наш потужний ШІ усуває всі обмеження, щоб надати вам повну творчу свободу.",
|
| 60 |
+
"seo_feature1_title": "Безлімітні генерації",
|
| 61 |
+
"seo_feature1_desc": "Преміум-користувачі насолоджуються необмеженою генерацією зображень, без щоденних лімітів, обмежень швидкості або бар'єрів вмісту. Створюйте стільки зображень, скільки хочете, коли і де завгодно.",
|
| 62 |
+
"seo_feature2_title": "Творча свобода",
|
| 63 |
+
"seo_feature2_desc": "Генеруйте та редагуйте будь-який тип вмісту з повною творчою свободою та без обмежень для вашої уяви. Нескінченні можливості для художників, дизайнерів та творців контенту.",
|
| 64 |
+
"seo_feature3_title": "Блискавична обробка",
|
| 65 |
+
"seo_feature3_desc": "Передова інфраструктура ШІ забезпечує високоякісні результати за лічені секунди. Жодних черг, жодних затримок в обробці - лише миттєве редагування зображень на професійному рівні.",
|
| 66 |
+
"seo_feature4_title": "Розширені інструменти редагування",
|
| 67 |
+
"seo_feature4_desc": "Глобальні перетворення, точне локальне редагування, перенесення стилю, видалення об'єктів, заміна фону та десятки інших професійних функцій редагування.",
|
| 68 |
+
"seo_feature5_title": "Виняткова якість",
|
| 69 |
+
"seo_feature5_desc": "Найсучасніші моделі ШІ, навчені на мільйонах зображень, забезпечують виняткову якість та реалізм. Результати професійного рівня, придатні для комерційного використання та висококласних проектів.",
|
| 70 |
+
"seo_feature6_title": "Мультимодальна підтримка",
|
| 71 |
+
"seo_feature6_desc": "Підтримка всіх форматів зображень, стилів та випадків використання. Від фотореалістичних портретів до художніх творів, від фотографії продуктів до цифрового мистецтва - ми впораємося з усім.",
|
| 72 |
+
"seo_protips_title": "Професійні поради для найкращих результатів",
|
| 73 |
+
"seo_protip1_title": "Чіткі описи:",
|
| 74 |
+
"seo_protip1_desc": "Використовуйте детальні та конкретні підказки для кращих результатів. Чітко описуйте кольори, стиль, освітлення та композицію.",
|
| 75 |
+
"seo_protip2_title": "Локальне редагування:",
|
| 76 |
+
"seo_protip2_desc": "Використовуйте точні мазки пензлем, щоб вибрати області для локального редагування. Менші, більш сфокусовані правки часто дають кращі результати.",
|
| 77 |
+
"seo_protip3_title": "Ітеративний процес:",
|
| 78 |
+
"seo_protip3_desc": "Використовуйте функцію «Використати як вхідні дані», щоб вдосконалити результати. Кілька ітерацій можуть призвести до складних перетворень.",
|
| 79 |
+
"seo_protip4_title": "Якість зображення:",
|
| 80 |
+
"seo_protip4_desc": "Вхідні зображення з вищою роздільною здатністю (до 10 МБ) зазвичай дають кращі правки та більш дрібні деталі.",
|
| 81 |
+
"seo_needs_title": "Для будь-яких творчих потреб",
|
| 82 |
+
"seo_needs_art_title": "Цифрове мистецтво",
|
| 83 |
+
"seo_needs_art_item1": "Дизайн персонажів",
|
| 84 |
+
"seo_needs_art_item2": "Концепт-арт",
|
| 85 |
+
"seo_needs_art_item3": "Перенесення стилю",
|
| 86 |
+
"seo_needs_art_item4": "Художні ефекти",
|
| 87 |
+
"seo_needs_photo_title": "Фотографія",
|
| 88 |
+
"seo_needs_photo_item1": "Заміна фону",
|
| 89 |
+
"seo_needs_photo_item2": "Видалення об'єктів",
|
| 90 |
+
"seo_needs_photo_item3": "Корекція освітлення",
|
| 91 |
+
"seo_needs_photo_item4": "Покращення портретів",
|
| 92 |
+
"seo_needs_ecom_title": "Електронна комерція",
|
| 93 |
+
"seo_needs_ecom_item1": "Фотографія продуктів",
|
| 94 |
+
"seo_needs_ecom_item2": "Лайфстайл-фото",
|
| 95 |
+
"seo_needs_ecom_item3": "Варіації кольорів",
|
| 96 |
+
"seo_needs_ecom_item4": "Заміна сцени",
|
| 97 |
+
"seo_needs_social_title": "Соціальні мережі",
|
| 98 |
+
"seo_needs_social_item1": "Створення контенту",
|
| 99 |
+
"seo_needs_social_item2": "Генерація мемів",
|
| 100 |
+
"seo_needs_social_item3": "Брендові візуальні матеріали",
|
| 101 |
+
"seo_needs_social_item4": "Віральний контент"
|
| 102 |
+
}
|
i18n/vi.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "Trình chỉnh sửa ảnh AI",
|
| 3 |
+
"header_title": "🎨 Trình chỉnh sửa ảnh AI",
|
| 4 |
+
"news_banner_prefix": "🚀 Tin tức: ",
|
| 5 |
+
"news_banner_link": "Text-to-Image đã ra mắt — Tạo người tốt nhất từ trước đến nay!",
|
| 6 |
+
"global_editor_tab": "🌍 Chỉnh sửa toàn cục",
|
| 7 |
+
"upload_image_header": "### 📸 Tải ảnh lên",
|
| 8 |
+
"upload_image_label": "Chọn một ảnh để chỉnh sửa",
|
| 9 |
+
"editing_instructions_header": "### ✍️ Hướng dẫn chỉnh sửa",
|
| 10 |
+
"prompt_input_label": "Nhập mô tả chỉnh sửa",
|
| 11 |
+
"prompt_input_placeholder": "Ví dụ: thay đổi nền thành bãi biển, thêm cầu vồng, xóa nền, v.v.",
|
| 12 |
+
"start_editing_button": "🚀 Bắt đầu chỉnh sửa",
|
| 13 |
+
"editing_result_header": "### 🎯 Kết quả chỉnh sửa",
|
| 14 |
+
"output_image_label": "Ảnh đã chỉnh sửa",
|
| 15 |
+
"use_as_input_button": "🔄 Dùng làm đầu vào",
|
| 16 |
+
"status_output_label": "Trạng thái xử lý",
|
| 17 |
+
"prompt_examples_header": "### 💡 Ví dụ về mô tả",
|
| 18 |
+
"local_inpaint_tab": "🖌️ Chỉnh sửa cục bộ (Inpainting)",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 Tải ảnh lên & Vẽ mặt nạ",
|
| 20 |
+
"upload_and_draw_mask_label": "Tải ảnh lên và vẽ một mặt nạ",
|
| 21 |
+
"reference_image_header": "### 🖼️ Ảnh tham chiếu (Tùy chọn)",
|
| 22 |
+
"reference_image_label": "Tải ảnh tham chiếu lên (tùy chọn)",
|
| 23 |
+
"local_prompt_input_label": "Nhập mô tả chỉnh sửa cục bộ",
|
| 24 |
+
"local_prompt_input_placeholder": "Ví dụ: đổi tóc trong vùng đã chọn thành màu vàng, thêm họa tiết vào đối tượng đã chọn, thay đổi màu sắc của vùng đã chọn, v.v.",
|
| 25 |
+
"start_local_editing_button": "🎯 Bắt đầu chỉnh sửa cục bộ",
|
| 26 |
+
"local_output_image_label": "Ảnh đã được chỉnh sửa cục bộ",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 Ví dụ về chỉnh sửa cục bộ",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 Ví dụ: Biến Gấu trúc thành Mèo",
|
| 29 |
+
"main_image_label": "Ảnh chính",
|
| 30 |
+
"mask_label": "Mặt nạ",
|
| 31 |
+
"reference_label": "Ảnh tham chiếu",
|
| 32 |
+
"panda_example_note": "**Mô tả**: let the cat ride on the panda\n**Lưu ý**: Mặt nạ sẽ được áp dụng tự động khi gửi ví dụ này",
|
| 33 |
+
"load_panda_example_button": "🎨 Tải ví dụ gấu trúc",
|
| 34 |
+
"refresh_editor_button": "🔄 Làm mới trình chỉnh sửa ảnh",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "Vui lòng tải ảnh lên trước",
|
| 37 |
+
"error_enter_prompt": "Vui lòng nhập mô tả chỉnh sửa",
|
| 38 |
+
"error_prompt_too_short": "❌ Mô tả chỉnh sửa phải dài hơn 3 ký tự",
|
| 39 |
+
"error_request_processing": "❌ Lỗi xử lý yêu cầu",
|
| 40 |
+
"error_free_limit_reached": "❌ Bạn đã đạt đến giới hạn tạo ảnh miễn phí trên Hugging Face. Hãy truy cập https://omnicreator.net/#generator để tạo ảnh không giới hạn",
|
| 41 |
+
"error_free_limit_wait": "❌ Bạn đã đạt đến giới hạn tạo ảnh miễn phí trên Hugging Face. Hãy truy cập https://omnicreator.net/#generator để tạo ảnh không giới hạn, hoặc đợi {wait_minutes_int} phút và thử lại",
|
| 42 |
+
"status_checking_result": "Đang kiểm tra ảnh kết quả...",
|
| 43 |
+
"status_applying_filter": "Đang áp dụng bộ lọc nội dung...",
|
| 44 |
+
"warning_content_filter": "⚠️ Một bộ lọc nội dung đã được áp dụng theo nguyên tắc cộng đồng của Hugging Face. Để có tự do sáng tạo không giới hạn, hãy truy cập trang web chính thức của chúng tôi tại https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ Yêu cầu xem xét nội dung. Vui lòng truy cập https://omnicreator.net/#generator để có trải nghiệm tốt hơn",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "Xử lý hoàn tất",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ Đã xảy ra lỗi trong quá trình xử lý: {error}",
|
| 50 |
+
"error_upload_and_draw": "Vui lòng tải ảnh lên và vẽ vùng cần chỉnh sửa",
|
| 51 |
+
"error_draw_on_image": "Vui lòng vẽ vùng bạn muốn chỉnh sửa trên ảnh",
|
| 52 |
+
"error_no_image_found": "❌ Không tìm thấy ảnh. Vui lòng tải ảnh lên trước.",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "Tạo & Chỉnh sửa ảnh AI không giới hạn",
|
| 55 |
+
"seo_unlimited_desc": "Trải nghiệm sự tự do tối thượng trong việc tạo ảnh AI! Tạo và chỉnh sửa ảnh không giới hạn, không có bất kỳ hạn chế nào, và giải phóng trí tưởng tượng của bạn với nền tảng chỉnh sửa ảnh AI tiên tiến của chúng tôi.",
|
| 56 |
+
"seo_unlimited_button": "Nhận quyền truy cập không giới hạn ngay",
|
| 57 |
+
"seo_unlimited_footer": "Tham gia cùng hàng ngàn nhà sáng tạo tin tưởng Omni Creator để tạo ảnh AI không giới hạn!",
|
| 58 |
+
"seo_professional_title": "Trình chỉnh sửa ảnh AI chuyên nghiệp - Không giới hạn",
|
| 59 |
+
"seo_professional_desc": "Biến những ý tưởng sáng tạo của bạn thành hiện thực với nền tảng chỉnh sửa ảnh AI tiên tiến của chúng tôi. Dù bạn đang tạo nghệ thuật, chỉnh sửa ảnh, thiết kế nội dung, hay làm việc với bất kỳ loại ảnh nào - AI mạnh mẽ của chúng tôi sẽ loại bỏ mọi giới hạn để mang đến cho bạn sự tự do sáng tạo hoàn toàn.",
|
| 60 |
+
"seo_feature1_title": "Tạo ảnh không giới hạn",
|
| 61 |
+
"seo_feature1_desc": "Người dùng cao cấp được hưởng quyền tạo ảnh không giới hạn, không có giới hạn hàng ngày, giới hạn tốc độ hay rào cản nội dung. Tạo bao nhiêu ảnh tùy thích, bất cứ lúc nào, bất cứ nơi đâu.",
|
| 62 |
+
"seo_feature2_title": "Tự do sáng tạo",
|
| 63 |
+
"seo_feature2_desc": "Tạo và chỉnh sửa bất kỳ loại nội dung nào với sự tự do sáng tạo hoàn toàn và không có giới hạn cho trí tưởng tượng của bạn. Khả năng vô tận cho các nghệ sĩ, nhà thiết kế và người tạo nội dung.",
|
| 64 |
+
"seo_feature3_title": "Xử lý nhanh như chớp",
|
| 65 |
+
"seo_feature3_desc": "Cơ sở hạ tầng AI tiên tiến mang lại kết quả chất lượng cao trong vài giây. Không cần xếp hàng, không có độ trễ xử lý - chỉ có chỉnh sửa ảnh tức thì, chuyên nghiệp.",
|
| 66 |
+
"seo_feature4_title": "Công cụ chỉnh sửa nâng cao",
|
| 67 |
+
"seo_feature4_desc": "Biến đổi toàn cục, chỉnh sửa cục bộ chính xác, chuyển đổi phong cách, xóa đối tượng, thay thế nền và hàng tá tính năng chỉnh sửa chuyên nghiệp khác.",
|
| 68 |
+
"seo_feature5_title": "Chất lượng vượt trội",
|
| 69 |
+
"seo_feature5_desc": "Các mô hình AI tiên tiến nhất được đào tạo trên hàng triệu bức ảnh mang lại chất lượng và độ chân thực vượt trội. Kết quả chuyên nghiệp phù hợp cho mục đích thương mại và các dự án cao cấp.",
|
| 70 |
+
"seo_feature6_title": "Hỗ trợ đa phương thức",
|
| 71 |
+
"seo_feature6_desc": "Hỗ trợ tất cả các định dạng ảnh, phong cách và trường hợp sử dụng. Từ chân dung siêu thực đến các tác phẩm nghệ thuật, từ nhiếp ảnh sản phẩm đến nghệ thuật kỹ thuật số - chúng tôi xử lý tất cả.",
|
| 72 |
+
"seo_protips_title": "Mẹo chuyên nghiệp để có kết quả tốt nhất",
|
| 73 |
+
"seo_protip1_title": "Mô tả rõ ràng:",
|
| 74 |
+
"seo_protip1_desc": "Sử dụng các mô tả chi tiết và cụ thể để có kết quả tốt hơn. Mô tả rõ ràng màu sắc, phong cách, ánh sáng và bố cục.",
|
| 75 |
+
"seo_protip2_title": "Chỉnh sửa cục bộ:",
|
| 76 |
+
"seo_protip2_desc": "Sử dụng các nét cọ chính xác để chọn các khu vực cần chỉnh sửa cục bộ. Các chỉnh sửa nhỏ hơn, tập trung hơn thường mang lại kết quả tốt hơn.",
|
| 77 |
+
"seo_protip3_title": "Quy trình lặp lại:",
|
| 78 |
+
"seo_protip3_desc": "Sử dụng tính năng 'Dùng làm đầu vào' để tinh chỉnh kết quả. Nhiều lần lặp lại có thể dẫn đến các biến đổi phức tạp.",
|
| 79 |
+
"seo_protip4_title": "Chất lượng ảnh:",
|
| 80 |
+
"seo_protip4_desc": "Ảnh đầu vào có độ phân giải cao hơn (tối đa 10MB) thường cho ra các chỉnh sửa tốt hơn và chi tiết tinh xảo hơn.",
|
| 81 |
+
"seo_needs_title": "Cho mọi nhu cầu sáng tạo",
|
| 82 |
+
"seo_needs_art_title": "Nghệ thuật kỹ thuật số",
|
| 83 |
+
"seo_needs_art_item1": "Thiết kế nhân vật",
|
| 84 |
+
"seo_needs_art_item2": "Nghệ thuật ý tưởng",
|
| 85 |
+
"seo_needs_art_item3": "Chuyển đổi phong cách",
|
| 86 |
+
"seo_needs_art_item4": "Hiệu ứng nghệ thuật",
|
| 87 |
+
"seo_needs_photo_title": "Nhiếp ảnh",
|
| 88 |
+
"seo_needs_photo_item1": "Thay thế nền",
|
| 89 |
+
"seo_needs_photo_item2": "Xóa đối tượng",
|
| 90 |
+
"seo_needs_photo_item3": "Điều chỉnh ánh sáng",
|
| 91 |
+
"seo_needs_photo_item4": "Nâng cao chân dung",
|
| 92 |
+
"seo_needs_ecom_title": "Thương mại điện tử",
|
| 93 |
+
"seo_needs_ecom_item1": "Nhiếp ảnh sản phẩm",
|
| 94 |
+
"seo_needs_ecom_item2": "Ảnh phong cách sống",
|
| 95 |
+
"seo_needs_ecom_item3": "Thay đổi màu sắc",
|
| 96 |
+
"seo_needs_ecom_item4": "Thay thế bối cảnh",
|
| 97 |
+
"seo_needs_social_title": "Mạng xã hội",
|
| 98 |
+
"seo_needs_social_item1": "Sáng tạo nội dung",
|
| 99 |
+
"seo_needs_social_item2": "Tạo meme",
|
| 100 |
+
"seo_needs_social_item3": "Hình ảnh thương hiệu",
|
| 101 |
+
"seo_needs_social_item4": "Nội dung lan truyền"
|
| 102 |
+
}
|
i18n/zh.json
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"app_title": "AI 图像编辑器",
|
| 3 |
+
"header_title": "🎨 AI 图像编辑器",
|
| 4 |
+
"news_banner_prefix": "🚀 新闻: ",
|
| 5 |
+
"news_banner_link": "文本生成图像上线啦 —— 史上最强人体生成模型!→",
|
| 6 |
+
"global_editor_tab": "🌍 全局编辑",
|
| 7 |
+
"upload_image_header": "### 📸 上传图片",
|
| 8 |
+
"upload_image_label": "选择要编辑的图片",
|
| 9 |
+
"editing_instructions_header": "### ✍️ 编辑指令",
|
| 10 |
+
"prompt_input_label": "输入编辑提示",
|
| 11 |
+
"prompt_input_placeholder": "例如: 将背景更改为海滩,添加彩虹,移除背景等...",
|
| 12 |
+
"start_editing_button": "🚀 开始编辑",
|
| 13 |
+
"editing_result_header": "### 🎯 编辑结果",
|
| 14 |
+
"output_image_label": "编辑后的图片",
|
| 15 |
+
"use_as_input_button": "🔄 用作输入",
|
| 16 |
+
"status_output_label": "处理状态",
|
| 17 |
+
"prompt_examples_header": "### 💡 提示示例",
|
| 18 |
+
"local_inpaint_tab": "🖌️ 局部修复",
|
| 19 |
+
"upload_and_draw_mask_header": "### 📸 上传图片并绘制蒙版",
|
| 20 |
+
"upload_and_draw_mask_label": "上传图片并绘制蒙版",
|
| 21 |
+
"reference_image_header": "### 🖼️ 参考图 (可选)",
|
| 22 |
+
"reference_image_label": "上传参考图 (可选)",
|
| 23 |
+
"local_prompt_input_label": "输入局部编辑提示",
|
| 24 |
+
"local_prompt_input_placeholder": "例如: 将选中区域的头发变为金色,为选中对象添加图案,更改选中区域颜色等...",
|
| 25 |
+
"start_local_editing_button": "🎯 开始局部编辑",
|
| 26 |
+
"local_output_image_label": "局部编辑后的图片",
|
| 27 |
+
"local_inpaint_example_header": "### 💡 局部修复示例",
|
| 28 |
+
"panda_to_cat_example_header": "#### 🐼➡️🐱 示例: 熊猫变猫咪",
|
| 29 |
+
"main_image_label": "主图",
|
| 30 |
+
"mask_label": "蒙版",
|
| 31 |
+
"reference_label": "参考图",
|
| 32 |
+
"panda_example_note": "**提示**: let the cat ride on the panda\n**注意**: 提交此示例时将自动应用蒙版",
|
| 33 |
+
"load_panda_example_button": "🎨 加载熊猫示例",
|
| 34 |
+
"refresh_editor_button": "🔄 刷新图片编辑器",
|
| 35 |
+
|
| 36 |
+
"error_upload_first": "请先上传图片",
|
| 37 |
+
"error_enter_prompt": "请输入编辑提示",
|
| 38 |
+
"error_prompt_too_short": "❌ 编辑提示必须超过3个字符",
|
| 39 |
+
"error_request_processing": "❌ 请求处理错误",
|
| 40 |
+
"error_free_limit_reached": "❌ 您已达到 Hugging Face 的免费生成次数限制。请访问 https://omnicreator.net/#generator 进行无限制生成",
|
| 41 |
+
"error_free_limit_wait": "❌ 您已达到 Hugging Face 的免费生成次数限制。请访问 https://omnicreator.net/#generator 进行无限制生成,或等待 {wait_minutes_int} 分钟后重试",
|
| 42 |
+
"status_checking_result": "正在检查结果图片...",
|
| 43 |
+
"status_applying_filter": "正在应用内容过滤器...",
|
| 44 |
+
"warning_content_filter": "⚠️ 根据 Hugging Face 社区准则,已应用内容过滤器。如需无限创作自由,请访问我们的官方网站 https://omnicreator.net/#generator",
|
| 45 |
+
"warning_content_review": "⚠️ 需要内容审核。请访问 https://omnicreator.net/#generator 以获得更好的体验",
|
| 46 |
+
"status_completed_message": "✅ {message}",
|
| 47 |
+
"status_processing_completed": "处理完成",
|
| 48 |
+
"error_processing_failed": "❌ {message}",
|
| 49 |
+
"error_processing_exception": "❌ 处理过程中发生错误: {error}",
|
| 50 |
+
"error_upload_and_draw": "请上传图片并绘制要编辑的区域",
|
| 51 |
+
"error_draw_on_image": "请在图片上绘制要编辑的区域",
|
| 52 |
+
"error_no_image_found": "❌ 未找到图片。请先上传图片。",
|
| 53 |
+
|
| 54 |
+
"seo_unlimited_title": "无限AI图像生成与编辑",
|
| 55 |
+
"seo_unlimited_desc": "体验AI图像创作的终极自由!无限制地生成和编辑图像,无任何限制,通过我们高级的AI图像编辑平台,让您的想象力完全释放。",
|
| 56 |
+
"seo_unlimited_button": "立即获取无限制访问权限",
|
| 57 |
+
"seo_unlimited_footer": "加入成千上万信任Omni Creator的创作者,进行无限制的AI图像生成!",
|
| 58 |
+
"seo_professional_title": "专业AI图像编辑器 - 无限制",
|
| 59 |
+
"seo_professional_desc": "通过我们先进的AI图像编辑平台,将您的创意愿景变为现实。无论您是创作艺术、编辑照片、设计内容,还是处理任何类型的图像 - 我们强大的AI将消除所有限制,给予您完全的创作自由。",
|
| 60 |
+
"seo_feature1_title": "无限生成",
|
| 61 |
+
"seo_feature1_desc": "高级用户享受无限图像生成,无每日限制、速率限制或内容障碍。随时随地,随心所欲地创建任意数量的图像。",
|
| 62 |
+
"seo_feature2_title": "创作自由",
|
| 63 |
+
"seo_feature2_desc": "生成和编辑任何类型的内容,拥有完全的创作自由,对您的想象力没有任何限制。为艺术家、设计师和内容创作者提供无限可能。",
|
| 64 |
+
"seo_feature3_title": "闪电般的处理速度",
|
| 65 |
+
"seo_feature3_desc": "先进的AI基础设施可在几秒钟内提供高质量的结果。无需排队等待,无处理延迟 - 只有即时、专业级的图像编辑。",
|
| 66 |
+
"seo_feature4_title": "高级���辑工具",
|
| 67 |
+
"seo_feature4_desc": "全局转换、精确的局部编辑、风格迁移、对象移除、背景替换以及数十种其他专业编辑功能。",
|
| 68 |
+
"seo_feature5_title": "卓越品质",
|
| 69 |
+
"seo_feature5_desc": "在数百万张图像上训练的最先进的AI模型,提供卓越的质量和逼真度。适用于商业用途和高端项目的专业级结果。",
|
| 70 |
+
"seo_feature6_title": "多模式支持",
|
| 71 |
+
"seo_feature6_desc": "支持所有图像格式、风格和用例。从逼真的肖像到艺术创作,从产品摄影到数字艺术 - 我们都能处理。",
|
| 72 |
+
"seo_protips_title": "获得最佳效果的专业提示",
|
| 73 |
+
"seo_protip1_title": "清晰的描述:",
|
| 74 |
+
"seo_protip1_desc": "使用详细、具体的提示以获得更好的结果。清晰地描述颜色、风格、光照和构图。",
|
| 75 |
+
"seo_protip2_title": "局部编辑:",
|
| 76 |
+
"seo_protip2_desc": "使用精确的笔触选择要进行局部编辑的区域。更小、更集中的编辑通常会产生更好的效果。",
|
| 77 |
+
"seo_protip3_title": "迭代过程:",
|
| 78 |
+
"seo_protip3_desc": "使用“用作输入”功能来优化结果。多次迭代可以实现复杂的转换。",
|
| 79 |
+
"seo_protip4_title": "图像质量:",
|
| 80 |
+
"seo_protip4_desc": "更高分辨率的输入图像(最大10MB)通常会产生更好的编辑效果和更精细的细节。",
|
| 81 |
+
"seo_needs_title": "满足各种创意需求",
|
| 82 |
+
"seo_needs_art_title": "数字艺术",
|
| 83 |
+
"seo_needs_art_item1": "角色设计",
|
| 84 |
+
"seo_needs_art_item2": "概念艺术",
|
| 85 |
+
"seo_needs_art_item3": "风格迁移",
|
| 86 |
+
"seo_needs_art_item4": "艺术效果",
|
| 87 |
+
"seo_needs_photo_title": "摄影",
|
| 88 |
+
"seo_needs_photo_item1": "背景替换",
|
| 89 |
+
"seo_needs_photo_item2": "对象移除",
|
| 90 |
+
"seo_needs_photo_item3": "光照调整",
|
| 91 |
+
"seo_needs_photo_item4": "肖像增强",
|
| 92 |
+
"seo_needs_ecom_title": "电子商务",
|
| 93 |
+
"seo_needs_ecom_item1": "产品摄影",
|
| 94 |
+
"seo_needs_ecom_item2": "生活照",
|
| 95 |
+
"seo_needs_ecom_item3": "颜色变化",
|
| 96 |
+
"seo_needs_ecom_item4": "场景置换",
|
| 97 |
+
"seo_needs_social_title": "社交媒体",
|
| 98 |
+
"seo_needs_social_item1": "内容创作",
|
| 99 |
+
"seo_needs_social_item2": "表情包生成",
|
| 100 |
+
"seo_needs_social_item3": "品牌视觉",
|
| 101 |
+
"seo_needs_social_item4": "病毒式内容"
|
| 102 |
+
}
|
labels.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"0": "normal",
|
| 3 |
+
"1": "nsfw"
|
| 4 |
+
}
|
nfsw.py
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from PIL import Image
|
| 3 |
+
import numpy as np
|
| 4 |
+
import onnxruntime as ort
|
| 5 |
+
import json
|
| 6 |
+
from huggingface_hub import hf_hub_download
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
class NSFWDetector:
|
| 10 |
+
"""
|
| 11 |
+
NSFW检测器类,使用YOLOv9模型进行图像分类
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
def __init__(self, repo_id="Falconsai/nsfw_image_detection",
|
| 15 |
+
model_filename="falconsai_yolov9_nsfw_model_quantized.pt",
|
| 16 |
+
labels_filename="labels.json",
|
| 17 |
+
input_size=(224, 224)):
|
| 18 |
+
"""
|
| 19 |
+
初始化NSFW检测器
|
| 20 |
+
|
| 21 |
+
Args:
|
| 22 |
+
repo_id (str): Hugging Face仓库ID
|
| 23 |
+
model_filename (str): 模型文件名
|
| 24 |
+
labels_filename (str): 标签文件名
|
| 25 |
+
input_size (tuple): 模型输入尺寸 (height, width)
|
| 26 |
+
"""
|
| 27 |
+
self.repo_id = repo_id
|
| 28 |
+
self.model_filename = model_filename
|
| 29 |
+
self.labels_filename = labels_filename
|
| 30 |
+
self.input_size = input_size
|
| 31 |
+
|
| 32 |
+
# 从Hugging Face下载文件
|
| 33 |
+
self.model_path = self._download_model()
|
| 34 |
+
self.labels_path = self._download_labels()
|
| 35 |
+
|
| 36 |
+
# 加载标签
|
| 37 |
+
self.labels = self._load_labels()
|
| 38 |
+
|
| 39 |
+
# 加载模型
|
| 40 |
+
self.session = self._load_model()
|
| 41 |
+
self.input_name = self.session.get_inputs()[0].name
|
| 42 |
+
self.output_name = self.session.get_outputs()[0].name
|
| 43 |
+
|
| 44 |
+
def _download_model(self):
|
| 45 |
+
"""
|
| 46 |
+
从Hugging Face下载模型文件
|
| 47 |
+
|
| 48 |
+
Returns:
|
| 49 |
+
str: 下载的模型文件路径
|
| 50 |
+
"""
|
| 51 |
+
try:
|
| 52 |
+
print(f"正在从 {self.repo_id} 下载模型文件: {self.model_filename}")
|
| 53 |
+
model_path = hf_hub_download(
|
| 54 |
+
repo_id=self.repo_id,
|
| 55 |
+
filename=self.model_filename,
|
| 56 |
+
cache_dir="./hf_cache"
|
| 57 |
+
)
|
| 58 |
+
print(f"✅ 模型下载成功: {model_path}")
|
| 59 |
+
return model_path
|
| 60 |
+
except Exception as e:
|
| 61 |
+
raise RuntimeError(f"模型下载失败: {e}")
|
| 62 |
+
|
| 63 |
+
def _download_labels(self):
|
| 64 |
+
"""
|
| 65 |
+
从Hugging Face下载标签文件
|
| 66 |
+
|
| 67 |
+
Returns:
|
| 68 |
+
str: 下载的标签文件路径
|
| 69 |
+
"""
|
| 70 |
+
try:
|
| 71 |
+
print(f"正在从 {self.repo_id} 下载标签文件: {self.labels_filename}")
|
| 72 |
+
labels_path = hf_hub_download(
|
| 73 |
+
repo_id=self.repo_id,
|
| 74 |
+
filename=self.labels_filename,
|
| 75 |
+
cache_dir="./hf_cache"
|
| 76 |
+
)
|
| 77 |
+
print(f"✅ 标签文件下载成功: {labels_path}")
|
| 78 |
+
return labels_path
|
| 79 |
+
except Exception as e:
|
| 80 |
+
raise RuntimeError(f"标签文件下载失败: {e}")
|
| 81 |
+
|
| 82 |
+
def _load_labels(self):
|
| 83 |
+
"""
|
| 84 |
+
加载类别标签
|
| 85 |
+
|
| 86 |
+
Returns:
|
| 87 |
+
dict: 标签字典
|
| 88 |
+
"""
|
| 89 |
+
try:
|
| 90 |
+
with open(self.labels_path, "r") as f:
|
| 91 |
+
return json.load(f)
|
| 92 |
+
except FileNotFoundError:
|
| 93 |
+
raise FileNotFoundError(f"标签文件未找到: {self.labels_path}")
|
| 94 |
+
except json.JSONDecodeError:
|
| 95 |
+
raise ValueError(f"标签文件格式错误: {self.labels_path}")
|
| 96 |
+
|
| 97 |
+
def _load_model(self):
|
| 98 |
+
"""
|
| 99 |
+
加载ONNX模型
|
| 100 |
+
|
| 101 |
+
Returns:
|
| 102 |
+
onnxruntime.InferenceSession: 模型会话
|
| 103 |
+
"""
|
| 104 |
+
try:
|
| 105 |
+
return ort.InferenceSession(self.model_path)
|
| 106 |
+
except Exception as e:
|
| 107 |
+
raise RuntimeError(f"模型加载失败: {self.model_path}, 错误: {e}")
|
| 108 |
+
|
| 109 |
+
def _preprocess_image(self, image_path):
|
| 110 |
+
"""
|
| 111 |
+
图像预处理
|
| 112 |
+
|
| 113 |
+
Args:
|
| 114 |
+
image_path (str): 图像文件路径
|
| 115 |
+
|
| 116 |
+
Returns:
|
| 117 |
+
tuple: (预处理后的张量, 原始图像)
|
| 118 |
+
"""
|
| 119 |
+
try:
|
| 120 |
+
# 加载并转换图像
|
| 121 |
+
original_image = Image.open(image_path).convert("RGB")
|
| 122 |
+
|
| 123 |
+
# 调整尺寸
|
| 124 |
+
image_resized = original_image.resize(self.input_size, Image.Resampling.BILINEAR)
|
| 125 |
+
|
| 126 |
+
# 转换为numpy数组并归一化
|
| 127 |
+
image_np = np.array(image_resized, dtype=np.float32) / 255.0
|
| 128 |
+
|
| 129 |
+
# 调整维度顺序 [H, W, C] -> [C, H, W]
|
| 130 |
+
image_np = np.transpose(image_np, (2, 0, 1))
|
| 131 |
+
|
| 132 |
+
# 添加批次维度 [C, H, W] -> [1, C, H, W]
|
| 133 |
+
input_tensor = np.expand_dims(image_np, axis=0).astype(np.float32)
|
| 134 |
+
|
| 135 |
+
return input_tensor, original_image
|
| 136 |
+
|
| 137 |
+
except FileNotFoundError:
|
| 138 |
+
raise FileNotFoundError(f"图像文件未找到: {image_path}")
|
| 139 |
+
except Exception as e:
|
| 140 |
+
raise RuntimeError(f"图像预处理失败: {e}")
|
| 141 |
+
|
| 142 |
+
def _postprocess_predictions(self, predictions):
|
| 143 |
+
"""
|
| 144 |
+
后处理预测结果
|
| 145 |
+
|
| 146 |
+
Args:
|
| 147 |
+
predictions: 模型预测输出
|
| 148 |
+
|
| 149 |
+
Returns:
|
| 150 |
+
str: 预测的类别标签
|
| 151 |
+
"""
|
| 152 |
+
predicted_index = np.argmax(predictions)
|
| 153 |
+
predicted_label = self.labels[str(predicted_index)]
|
| 154 |
+
return predicted_label
|
| 155 |
+
|
| 156 |
+
def predict(self, image_path):
|
| 157 |
+
"""
|
| 158 |
+
对单张图像进行NSFW检测
|
| 159 |
+
|
| 160 |
+
Args:
|
| 161 |
+
image_path (str): 图像文件路径
|
| 162 |
+
|
| 163 |
+
Returns:
|
| 164 |
+
tuple: (预测标签, 原始图像)
|
| 165 |
+
"""
|
| 166 |
+
# 预处理图像
|
| 167 |
+
input_tensor, original_image = self._preprocess_image(image_path)
|
| 168 |
+
|
| 169 |
+
# 运行推理
|
| 170 |
+
outputs = self.session.run([self.output_name], {self.input_name: input_tensor})
|
| 171 |
+
predictions = outputs[0]
|
| 172 |
+
|
| 173 |
+
# 后处理结果
|
| 174 |
+
predicted_label = self._postprocess_predictions(predictions)
|
| 175 |
+
|
| 176 |
+
return predicted_label, original_image
|
| 177 |
+
|
| 178 |
+
def predict_label_only(self, image_path):
|
| 179 |
+
"""
|
| 180 |
+
只返回预测标签(不返回图像)
|
| 181 |
+
|
| 182 |
+
Args:
|
| 183 |
+
image_path (str): 图像文件路径
|
| 184 |
+
|
| 185 |
+
Returns:
|
| 186 |
+
str: 预测的类别标签
|
| 187 |
+
"""
|
| 188 |
+
predicted_label, _ = self.predict(image_path)
|
| 189 |
+
return predicted_label
|
| 190 |
+
|
| 191 |
+
def predict_from_pil(self, pil_image):
|
| 192 |
+
"""
|
| 193 |
+
直接从PIL Image对象进行NSFW检测
|
| 194 |
+
|
| 195 |
+
Args:
|
| 196 |
+
pil_image (PIL.Image): PIL图像对象
|
| 197 |
+
|
| 198 |
+
Returns:
|
| 199 |
+
tuple: (预测标签, 原始图像)
|
| 200 |
+
"""
|
| 201 |
+
try:
|
| 202 |
+
# 确保是RGB格式
|
| 203 |
+
if pil_image.mode != "RGB":
|
| 204 |
+
pil_image = pil_image.convert("RGB")
|
| 205 |
+
|
| 206 |
+
# 调整尺寸
|
| 207 |
+
image_resized = pil_image.resize(self.input_size, Image.Resampling.BILINEAR)
|
| 208 |
+
|
| 209 |
+
# 转换为numpy数组并归一化
|
| 210 |
+
image_np = np.array(image_resized, dtype=np.float32) / 255.0
|
| 211 |
+
|
| 212 |
+
# 调整维度顺序 [H, W, C] -> [C, H, W]
|
| 213 |
+
image_np = np.transpose(image_np, (2, 0, 1))
|
| 214 |
+
|
| 215 |
+
# 添加批次维度 [C, H, W] -> [1, C, H, W]
|
| 216 |
+
input_tensor = np.expand_dims(image_np, axis=0).astype(np.float32)
|
| 217 |
+
|
| 218 |
+
# 运行推理
|
| 219 |
+
outputs = self.session.run([self.output_name], {self.input_name: input_tensor})
|
| 220 |
+
predictions = outputs[0]
|
| 221 |
+
|
| 222 |
+
# 后处理结果
|
| 223 |
+
predicted_label = self._postprocess_predictions(predictions)
|
| 224 |
+
|
| 225 |
+
return predicted_label, pil_image
|
| 226 |
+
|
| 227 |
+
except Exception as e:
|
| 228 |
+
raise RuntimeError(f"PIL图像预测失败: {e}")
|
| 229 |
+
|
| 230 |
+
def predict_pil_label_only(self, pil_image):
|
| 231 |
+
"""
|
| 232 |
+
从PIL Image对象只返回预测标签
|
| 233 |
+
|
| 234 |
+
Args:
|
| 235 |
+
pil_image (PIL.Image): PIL图像对象
|
| 236 |
+
|
| 237 |
+
Returns:
|
| 238 |
+
str: 预测的类别标签
|
| 239 |
+
"""
|
| 240 |
+
predicted_label, _ = self.predict_from_pil(pil_image)
|
| 241 |
+
return predicted_label
|
| 242 |
+
|
| 243 |
+
# --- 使用示例 ---
|
| 244 |
+
if __name__ == "__main__":
|
| 245 |
+
# 配置参数
|
| 246 |
+
single_image_path = "datas/bad01.jpg"
|
| 247 |
+
|
| 248 |
+
try:
|
| 249 |
+
# 创建检测器实例(自动从Hugging Face下载)
|
| 250 |
+
detector = NSFWDetector()
|
| 251 |
+
|
| 252 |
+
# 检查图像文件是否存在
|
| 253 |
+
if os.path.exists(single_image_path):
|
| 254 |
+
# 进行预测
|
| 255 |
+
predicted_label = detector.predict_label_only(single_image_path)
|
| 256 |
+
print(f"图像文件: {single_image_path}")
|
| 257 |
+
print(f"预测结果: {predicted_label}")
|
| 258 |
+
else:
|
| 259 |
+
print(f"错误: 指定的图像文件不存在: {single_image_path}")
|
| 260 |
+
|
| 261 |
+
except Exception as e:
|
| 262 |
+
print(f"初始化检测器时发生错误: {e}")
|
push.sh
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# 设置仓库级别用户名
|
| 3 |
+
git config user.name "selfitcamera"
|
| 4 |
+
git config user.email "ethan.blake@heybeauty.ai"
|
| 5 |
+
|
| 6 |
+
# 验证
|
| 7 |
+
git config user.name
|
| 8 |
+
git config user.email
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
git add .
|
| 12 |
+
git commit -m "init"
|
| 13 |
+
git push
|
requirements.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio==5.42.0
|
| 2 |
+
opencv-python>=4.8.0
|
| 3 |
+
requests>=2.28.0
|
| 4 |
+
func-timeout>=4.3.5
|
| 5 |
+
numpy>=1.24.0
|
| 6 |
+
boto3
|
| 7 |
+
botocore
|
| 8 |
+
onnxruntime
|
| 9 |
+
huggingface_hub>=0.16.0
|
| 10 |
+
Pillow>=9.0.0
|
tmp/1.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
country_dict = {
|
| 3 |
+
"zh": ["中国", "香港"],
|
| 4 |
+
"en": ["美国", "澳大利亚", "英国", "加拿大", "新西兰", "爱尔兰"],
|
| 5 |
+
"es": ["西班牙", "墨西哥", "阿根廷", "哥伦比亚", "智利", "秘鲁", "巴西"],
|
| 6 |
+
"fr": ["法国", "比利时", "摩纳哥"],
|
| 7 |
+
"de": ["德国", "奥地利", ],
|
| 8 |
+
"it": ["意大利", "圣马力诺", "梵蒂冈"],
|
| 9 |
+
"ja": ["日本"],
|
| 10 |
+
"ru": ["俄罗斯"],
|
| 11 |
+
"ar": ["沙特阿拉伯", "埃及"],
|
| 12 |
+
"nl":["荷兰"],
|
| 13 |
+
"id":["印度尼西亚"]
|
| 14 |
+
}
|
util.py
ADDED
|
@@ -0,0 +1,880 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
import cv2
|
| 5 |
+
import json
|
| 6 |
+
import random
|
| 7 |
+
import time
|
| 8 |
+
import datetime
|
| 9 |
+
import requests
|
| 10 |
+
import func_timeout
|
| 11 |
+
import numpy as np
|
| 12 |
+
import gradio as gr
|
| 13 |
+
import boto3
|
| 14 |
+
import tempfile
|
| 15 |
+
import io
|
| 16 |
+
import uuid
|
| 17 |
+
from botocore.client import Config
|
| 18 |
+
from PIL import Image
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
# TOKEN = os.environ['TOKEN']
|
| 22 |
+
# APIKEY = os.environ['APIKEY']
|
| 23 |
+
# UKAPIURL = os.environ['UKAPIURL']
|
| 24 |
+
|
| 25 |
+
OneKey = os.environ['OneKey'].strip()
|
| 26 |
+
OneKey = OneKey.split("#")
|
| 27 |
+
TOKEN = OneKey[0]
|
| 28 |
+
APIKEY = OneKey[1]
|
| 29 |
+
UKAPIURL = OneKey[2]
|
| 30 |
+
LLMKEY = OneKey[3]
|
| 31 |
+
R2_ACCESS_KEY = OneKey[4]
|
| 32 |
+
R2_SECRET_KEY = OneKey[5]
|
| 33 |
+
R2_ENDPOINT = OneKey[6]
|
| 34 |
+
GoodWebsiteUrl = OneKey[7]
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
# tmpFolder is no longer needed since we upload directly from memory
|
| 38 |
+
# tmpFolder = "tmp"
|
| 39 |
+
# os.makedirs(tmpFolder, exist_ok=True)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
# Legacy function - no longer used since we upload directly from memory
|
| 43 |
+
# def upload_user_img(clientIp, timeId, img):
|
| 44 |
+
# fileName = clientIp.replace(".", "")+str(timeId)+".jpg"
|
| 45 |
+
# local_path = os.path.join(tmpFolder, fileName)
|
| 46 |
+
# img = cv2.imread(img)
|
| 47 |
+
# cv2.imwrite(os.path.join(tmpFolder, fileName), img)
|
| 48 |
+
#
|
| 49 |
+
# json_data = {
|
| 50 |
+
# "token": TOKEN,
|
| 51 |
+
# "input1": fileName,
|
| 52 |
+
# "input2": "",
|
| 53 |
+
# "protocol": "",
|
| 54 |
+
# "cloud": "ali"
|
| 55 |
+
# }
|
| 56 |
+
#
|
| 57 |
+
# session = requests.session()
|
| 58 |
+
# ret = requests.post(
|
| 59 |
+
# f"{UKAPIURL}/upload",
|
| 60 |
+
# headers={'Content-Type': 'application/json'},
|
| 61 |
+
# json=json_data
|
| 62 |
+
# )
|
| 63 |
+
#
|
| 64 |
+
# res = ""
|
| 65 |
+
# if ret.status_code==200:
|
| 66 |
+
# if 'upload1' in ret.json():
|
| 67 |
+
# upload_url = ret.json()['upload1']
|
| 68 |
+
# headers = {'Content-Type': 'image/jpeg'}
|
| 69 |
+
# response = session.put(upload_url, data=open(local_path, 'rb').read(), headers=headers)
|
| 70 |
+
# # print(response.status_code)
|
| 71 |
+
# if response.status_code == 200:
|
| 72 |
+
# res = upload_url
|
| 73 |
+
# if os.path.exists(local_path):
|
| 74 |
+
# os.remove(local_path)
|
| 75 |
+
# return res
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
class R2Api:
|
| 79 |
+
|
| 80 |
+
def __init__(self, session=None):
|
| 81 |
+
super().__init__()
|
| 82 |
+
self.R2_BUCKET = "omni-creator"
|
| 83 |
+
self.domain = "https://www.omnicreator.net/"
|
| 84 |
+
self.R2_ACCESS_KEY = R2_ACCESS_KEY
|
| 85 |
+
self.R2_SECRET_KEY = R2_SECRET_KEY
|
| 86 |
+
self.R2_ENDPOINT = R2_ENDPOINT
|
| 87 |
+
|
| 88 |
+
self.client = boto3.client(
|
| 89 |
+
"s3",
|
| 90 |
+
endpoint_url=self.R2_ENDPOINT,
|
| 91 |
+
aws_access_key_id=self.R2_ACCESS_KEY,
|
| 92 |
+
aws_secret_access_key=self.R2_SECRET_KEY,
|
| 93 |
+
config=Config(signature_version="s3v4")
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
self.session = requests.Session() if session is None else session
|
| 97 |
+
|
| 98 |
+
def upload_from_memory(self, image_data, filename, content_type='image/jpeg'):
|
| 99 |
+
"""
|
| 100 |
+
Upload image data directly from memory to R2
|
| 101 |
+
|
| 102 |
+
Args:
|
| 103 |
+
image_data (bytes): Image data in bytes
|
| 104 |
+
filename (str): Filename for the uploaded file
|
| 105 |
+
content_type (str): MIME type of the image
|
| 106 |
+
|
| 107 |
+
Returns:
|
| 108 |
+
str: URL of the uploaded file
|
| 109 |
+
"""
|
| 110 |
+
t1 = time.time()
|
| 111 |
+
headers = {"Content-Type": content_type}
|
| 112 |
+
|
| 113 |
+
cloud_path = f"ImageEdit/Uploads/{str(datetime.date.today())}/{filename}"
|
| 114 |
+
url = self.client.generate_presigned_url(
|
| 115 |
+
"put_object",
|
| 116 |
+
Params={"Bucket": self.R2_BUCKET, "Key": cloud_path, "ContentType": content_type},
|
| 117 |
+
ExpiresIn=604800
|
| 118 |
+
)
|
| 119 |
+
|
| 120 |
+
retry_count = 0
|
| 121 |
+
while retry_count < 3:
|
| 122 |
+
try:
|
| 123 |
+
response = self.session.put(url, data=image_data, headers=headers, timeout=15)
|
| 124 |
+
if response.status_code == 200:
|
| 125 |
+
break
|
| 126 |
+
else:
|
| 127 |
+
print(f"⚠️ Upload failed with status code: {response.status_code}")
|
| 128 |
+
retry_count += 1
|
| 129 |
+
except (requests.exceptions.Timeout, requests.exceptions.RequestException) as e:
|
| 130 |
+
print(f"⚠️ Upload retry {retry_count + 1}/3 failed: {e}")
|
| 131 |
+
retry_count += 1
|
| 132 |
+
if retry_count == 3:
|
| 133 |
+
raise Exception(f'Failed to upload file to R2 after 3 retries! Last error: {str(e)}')
|
| 134 |
+
time.sleep(1) # 等待1秒后重试
|
| 135 |
+
continue
|
| 136 |
+
print("upload_from_memory time is ====>", time.time() - t1)
|
| 137 |
+
return f"{self.domain}{cloud_path}"
|
| 138 |
+
|
| 139 |
+
def upload_user_img_r2(clientIp, timeId, pil_image):
|
| 140 |
+
"""
|
| 141 |
+
Upload PIL Image directly to R2 without saving to local file
|
| 142 |
+
|
| 143 |
+
Args:
|
| 144 |
+
clientIp (str): Client IP address
|
| 145 |
+
timeId (int): Timestamp
|
| 146 |
+
pil_image (PIL.Image): PIL Image object
|
| 147 |
+
|
| 148 |
+
Returns:
|
| 149 |
+
str: Uploaded URL
|
| 150 |
+
"""
|
| 151 |
+
# Generate unique filename using UUID to prevent file conflicts in concurrent environment
|
| 152 |
+
unique_id = str(uuid.uuid4())
|
| 153 |
+
fileName = f"user_img_{unique_id}_{timeId}.jpg"
|
| 154 |
+
|
| 155 |
+
# Convert PIL Image to bytes
|
| 156 |
+
img_buffer = io.BytesIO()
|
| 157 |
+
if pil_image.mode != 'RGB':
|
| 158 |
+
pil_image = pil_image.convert('RGB')
|
| 159 |
+
pil_image.save(img_buffer, format='JPEG', quality=95)
|
| 160 |
+
img_data = img_buffer.getvalue()
|
| 161 |
+
|
| 162 |
+
# Upload directly from memory
|
| 163 |
+
res = R2Api().upload_from_memory(img_data, fileName, 'image/jpeg')
|
| 164 |
+
return res
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
def create_mask_from_layers(base_image, layers):
|
| 169 |
+
"""
|
| 170 |
+
Create mask image from ImageEditor layers
|
| 171 |
+
|
| 172 |
+
Args:
|
| 173 |
+
base_image (PIL.Image): Original image
|
| 174 |
+
layers (list): ImageEditor layer data
|
| 175 |
+
|
| 176 |
+
Returns:
|
| 177 |
+
PIL.Image: Black and white mask image
|
| 178 |
+
"""
|
| 179 |
+
from PIL import Image, ImageDraw
|
| 180 |
+
import numpy as np
|
| 181 |
+
|
| 182 |
+
# Create blank mask with same size as original image
|
| 183 |
+
mask = Image.new('L', base_image.size, 0) # 'L' mode is grayscale, 0 is black
|
| 184 |
+
|
| 185 |
+
if not layers:
|
| 186 |
+
return mask
|
| 187 |
+
|
| 188 |
+
# Iterate through all layers, set drawn areas to white
|
| 189 |
+
for layer in layers:
|
| 190 |
+
if layer is not None:
|
| 191 |
+
# Convert layer to numpy array
|
| 192 |
+
layer_array = np.array(layer)
|
| 193 |
+
|
| 194 |
+
# Check layer format
|
| 195 |
+
if len(layer_array.shape) == 3: # RGB/RGBA format
|
| 196 |
+
# If RGBA, check alpha channel
|
| 197 |
+
if layer_array.shape[2] == 4:
|
| 198 |
+
# Use alpha channel as mask
|
| 199 |
+
alpha_channel = layer_array[:, :, 3]
|
| 200 |
+
# Set non-transparent areas (alpha > 0) to white
|
| 201 |
+
mask_array = np.where(alpha_channel > 0, 255, 0).astype(np.uint8)
|
| 202 |
+
else:
|
| 203 |
+
# RGB format, check if not pure black (0,0,0)
|
| 204 |
+
# Assume drawn areas are non-black
|
| 205 |
+
non_black = np.any(layer_array > 0, axis=2)
|
| 206 |
+
mask_array = np.where(non_black, 255, 0).astype(np.uint8)
|
| 207 |
+
elif len(layer_array.shape) == 2: # Grayscale
|
| 208 |
+
# Use grayscale values directly, set non-zero areas to white
|
| 209 |
+
mask_array = np.where(layer_array > 0, 255, 0).astype(np.uint8)
|
| 210 |
+
else:
|
| 211 |
+
continue
|
| 212 |
+
|
| 213 |
+
# Convert mask_array to PIL image and merge into total mask
|
| 214 |
+
layer_mask = Image.fromarray(mask_array, mode='L')
|
| 215 |
+
# Resize to match original image
|
| 216 |
+
if layer_mask.size != base_image.size:
|
| 217 |
+
layer_mask = layer_mask.resize(base_image.size, Image.LANCZOS)
|
| 218 |
+
|
| 219 |
+
# Merge masks (use maximum value to ensure all drawn areas are included)
|
| 220 |
+
mask_array_current = np.array(mask)
|
| 221 |
+
layer_mask_array = np.array(layer_mask)
|
| 222 |
+
combined_mask_array = np.maximum(mask_array_current, layer_mask_array)
|
| 223 |
+
mask = Image.fromarray(combined_mask_array, mode='L')
|
| 224 |
+
|
| 225 |
+
return mask
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
def upload_mask_image_r2(client_ip, time_id, mask_image):
|
| 229 |
+
"""
|
| 230 |
+
Upload mask image to R2 directly from memory
|
| 231 |
+
|
| 232 |
+
Args:
|
| 233 |
+
client_ip (str): Client IP
|
| 234 |
+
time_id (int): Timestamp
|
| 235 |
+
mask_image (PIL.Image): Mask image
|
| 236 |
+
|
| 237 |
+
Returns:
|
| 238 |
+
str: Uploaded URL
|
| 239 |
+
"""
|
| 240 |
+
# Generate unique filename using UUID to prevent file conflicts in concurrent environment
|
| 241 |
+
unique_id = str(uuid.uuid4())
|
| 242 |
+
file_name = f"mask_img_{unique_id}_{time_id}.png"
|
| 243 |
+
|
| 244 |
+
try:
|
| 245 |
+
# Convert mask image to bytes
|
| 246 |
+
img_buffer = io.BytesIO()
|
| 247 |
+
mask_image.save(img_buffer, format='PNG')
|
| 248 |
+
img_data = img_buffer.getvalue()
|
| 249 |
+
|
| 250 |
+
# Upload directly from memory
|
| 251 |
+
res = R2Api().upload_from_memory(img_data, file_name, 'image/png')
|
| 252 |
+
|
| 253 |
+
return res
|
| 254 |
+
except Exception as e:
|
| 255 |
+
print(f"Failed to upload mask image: {e}")
|
| 256 |
+
return None
|
| 257 |
+
|
| 258 |
+
|
| 259 |
+
|
| 260 |
+
def submit_text_to_image_task(prompt, width, height, priority=0):
|
| 261 |
+
"""
|
| 262 |
+
Submit text-to-image task with improved error handling using API v2
|
| 263 |
+
|
| 264 |
+
Args:
|
| 265 |
+
prompt (str): Text prompt for image generation
|
| 266 |
+
width (int): Image width
|
| 267 |
+
height (int): Image height
|
| 268 |
+
priority (int): Task priority, 1 for high priority, 0 for normal priority
|
| 269 |
+
"""
|
| 270 |
+
headers = {
|
| 271 |
+
'Content-Type': 'application/json',
|
| 272 |
+
'Authorization': f'Bearer {APIKEY}'
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
data = {
|
| 276 |
+
"user_image": "",
|
| 277 |
+
"user_mask": "",
|
| 278 |
+
"type": "79",
|
| 279 |
+
"text": prompt,
|
| 280 |
+
"width": width,
|
| 281 |
+
"height": height,
|
| 282 |
+
"user_uuid": APIKEY,
|
| 283 |
+
"priority": priority,
|
| 284 |
+
"secret_key": "219ngu"
|
| 285 |
+
}
|
| 286 |
+
|
| 287 |
+
retry_count = 0
|
| 288 |
+
max_retries = 3
|
| 289 |
+
|
| 290 |
+
while retry_count < max_retries:
|
| 291 |
+
try:
|
| 292 |
+
response = requests.post(
|
| 293 |
+
f'{UKAPIURL}/public_image_edit_v2',
|
| 294 |
+
headers=headers,
|
| 295 |
+
json=data,
|
| 296 |
+
timeout=30
|
| 297 |
+
)
|
| 298 |
+
|
| 299 |
+
if response.status_code == 200:
|
| 300 |
+
result = response.json()
|
| 301 |
+
if result.get('code') == 0:
|
| 302 |
+
return result['data']['task_id'], None
|
| 303 |
+
else:
|
| 304 |
+
return None, f"API Error: {result.get('message', 'Unknown error')}"
|
| 305 |
+
elif response.status_code in [502, 503, 504]:
|
| 306 |
+
retry_count += 1
|
| 307 |
+
if retry_count < max_retries:
|
| 308 |
+
print(f"⚠️ Server error {response.status_code}, retrying {retry_count}/{max_retries}")
|
| 309 |
+
time.sleep(2)
|
| 310 |
+
continue
|
| 311 |
+
else:
|
| 312 |
+
return None, f"HTTP Error after {max_retries} retries: {response.status_code}"
|
| 313 |
+
else:
|
| 314 |
+
return None, f"HTTP Error: {response.status_code}"
|
| 315 |
+
|
| 316 |
+
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
|
| 317 |
+
retry_count += 1
|
| 318 |
+
if retry_count < max_retries:
|
| 319 |
+
print(f"⚠️ Network error, retrying {retry_count}/{max_retries}: {e}")
|
| 320 |
+
time.sleep(2)
|
| 321 |
+
continue
|
| 322 |
+
else:
|
| 323 |
+
return None, f"Network error after {max_retries} retries: {str(e)}"
|
| 324 |
+
except Exception as e:
|
| 325 |
+
return None, f"Request Exception: {str(e)}"
|
| 326 |
+
|
| 327 |
+
return None, f"Failed after {max_retries} retries"
|
| 328 |
+
|
| 329 |
+
|
| 330 |
+
def submit_image_edit_task(user_image_url, prompt, task_type="80", mask_image_url="", reference_image_url="", priority=0):
|
| 331 |
+
"""
|
| 332 |
+
Submit image editing task with improved error handling using API v2
|
| 333 |
+
|
| 334 |
+
Args:
|
| 335 |
+
priority (int): Task priority, 1 for high priority, 0 for normal priority
|
| 336 |
+
"""
|
| 337 |
+
headers = {
|
| 338 |
+
'Content-Type': 'application/json',
|
| 339 |
+
'Authorization': f'Bearer {APIKEY}'
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
data = {
|
| 343 |
+
"user_image": user_image_url,
|
| 344 |
+
"user_mask": mask_image_url,
|
| 345 |
+
"type": task_type,
|
| 346 |
+
"text": prompt,
|
| 347 |
+
"user_uuid": APIKEY,
|
| 348 |
+
"priority": priority,
|
| 349 |
+
"secret_key": "219ngu"
|
| 350 |
+
}
|
| 351 |
+
|
| 352 |
+
if reference_image_url:
|
| 353 |
+
data["user_image2"] = reference_image_url
|
| 354 |
+
|
| 355 |
+
retry_count = 0
|
| 356 |
+
max_retries = 3
|
| 357 |
+
|
| 358 |
+
while retry_count < max_retries:
|
| 359 |
+
try:
|
| 360 |
+
response = requests.post(
|
| 361 |
+
f'{UKAPIURL}/public_image_edit_v2',
|
| 362 |
+
headers=headers,
|
| 363 |
+
json=data,
|
| 364 |
+
timeout=30 # 增加超时时间
|
| 365 |
+
)
|
| 366 |
+
|
| 367 |
+
if response.status_code == 200:
|
| 368 |
+
result = response.json()
|
| 369 |
+
if result.get('code') == 0:
|
| 370 |
+
return result['data']['task_id'], None
|
| 371 |
+
else:
|
| 372 |
+
return None, f"API Error: {result.get('message', 'Unknown error')}"
|
| 373 |
+
elif response.status_code in [502, 503, 504]: # 服务器错误,可以重试
|
| 374 |
+
retry_count += 1
|
| 375 |
+
if retry_count < max_retries:
|
| 376 |
+
print(f"⚠️ Server error {response.status_code}, retrying {retry_count}/{max_retries}")
|
| 377 |
+
time.sleep(2) # 等待2秒后重试
|
| 378 |
+
continue
|
| 379 |
+
else:
|
| 380 |
+
return None, f"HTTP Error after {max_retries} retries: {response.status_code}"
|
| 381 |
+
else:
|
| 382 |
+
return None, f"HTTP Error: {response.status_code}"
|
| 383 |
+
|
| 384 |
+
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
|
| 385 |
+
retry_count += 1
|
| 386 |
+
if retry_count < max_retries:
|
| 387 |
+
print(f"⚠️ Network error, retrying {retry_count}/{max_retries}: {e}")
|
| 388 |
+
time.sleep(2)
|
| 389 |
+
continue
|
| 390 |
+
else:
|
| 391 |
+
return None, f"Network error after {max_retries} retries: {str(e)}"
|
| 392 |
+
except Exception as e:
|
| 393 |
+
return None, f"Request Exception: {str(e)}"
|
| 394 |
+
|
| 395 |
+
return None, f"Failed after {max_retries} retries"
|
| 396 |
+
|
| 397 |
+
|
| 398 |
+
def check_task_status(task_id):
|
| 399 |
+
"""
|
| 400 |
+
Query task status with improved error handling using API v2
|
| 401 |
+
"""
|
| 402 |
+
headers = {
|
| 403 |
+
'Content-Type': 'application/json',
|
| 404 |
+
'Authorization': f'Bearer {APIKEY}'
|
| 405 |
+
}
|
| 406 |
+
|
| 407 |
+
data = {
|
| 408 |
+
"task_id": task_id
|
| 409 |
+
}
|
| 410 |
+
|
| 411 |
+
retry_count = 0
|
| 412 |
+
max_retries = 2 # 状态查询重试次数少一些
|
| 413 |
+
|
| 414 |
+
while retry_count < max_retries:
|
| 415 |
+
try:
|
| 416 |
+
response = requests.post(
|
| 417 |
+
f'{UKAPIURL}/status_image_edit_v2',
|
| 418 |
+
headers=headers,
|
| 419 |
+
json=data,
|
| 420 |
+
timeout=15 # 状态查询超时时间短一些
|
| 421 |
+
)
|
| 422 |
+
|
| 423 |
+
if response.status_code == 200:
|
| 424 |
+
result = response.json()
|
| 425 |
+
if result.get('code') == 0:
|
| 426 |
+
task_data = result['data']
|
| 427 |
+
status = task_data['status']
|
| 428 |
+
image_url = task_data.get('image_url')
|
| 429 |
+
|
| 430 |
+
# Extract and log queue information for better user feedback
|
| 431 |
+
queue_info = task_data.get('queue_info', {})
|
| 432 |
+
if queue_info:
|
| 433 |
+
tasks_ahead = queue_info.get('tasks_ahead', 0)
|
| 434 |
+
current_priority = queue_info.get('current_priority', 0)
|
| 435 |
+
description = queue_info.get('description', '')
|
| 436 |
+
# print(f"📊 Queue Status - Tasks ahead: {tasks_ahead}, Priority: {current_priority}, Status: {status}")
|
| 437 |
+
|
| 438 |
+
return status, image_url, task_data
|
| 439 |
+
else:
|
| 440 |
+
return 'error', None, result.get('message', 'Unknown error')
|
| 441 |
+
elif response.status_code in [502, 503, 504]: # 服务器错误,可以重试
|
| 442 |
+
retry_count += 1
|
| 443 |
+
if retry_count < max_retries:
|
| 444 |
+
print(f"⚠️ Status check server error {response.status_code}, retrying {retry_count}/{max_retries}")
|
| 445 |
+
time.sleep(1) # 状态查询重试间隔短一些
|
| 446 |
+
continue
|
| 447 |
+
else:
|
| 448 |
+
return 'error', None, f"HTTP Error after {max_retries} retries: {response.status_code}"
|
| 449 |
+
else:
|
| 450 |
+
return 'error', None, f"HTTP Error: {response.status_code}"
|
| 451 |
+
|
| 452 |
+
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
|
| 453 |
+
retry_count += 1
|
| 454 |
+
if retry_count < max_retries:
|
| 455 |
+
print(f"⚠️ Status check network error, retrying {retry_count}/{max_retries}: {e}")
|
| 456 |
+
time.sleep(1)
|
| 457 |
+
continue
|
| 458 |
+
else:
|
| 459 |
+
return 'error', None, f"Network error after {max_retries} retries: {str(e)}"
|
| 460 |
+
except Exception as e:
|
| 461 |
+
return 'error', None, f"Request Exception: {str(e)}"
|
| 462 |
+
|
| 463 |
+
return 'error', None, f"Failed after {max_retries} retries"
|
| 464 |
+
|
| 465 |
+
|
| 466 |
+
def process_image_edit(img_input, prompt, reference_image=None, progress_callback=None, priority=0):
|
| 467 |
+
"""
|
| 468 |
+
Complete process for image editing
|
| 469 |
+
|
| 470 |
+
Args:
|
| 471 |
+
img_input: Can be file path (str) or PIL Image object
|
| 472 |
+
prompt: Editing instructions
|
| 473 |
+
progress_callback: Progress callback function
|
| 474 |
+
priority (int): Task priority, 1 for high priority, 0 for normal priority
|
| 475 |
+
"""
|
| 476 |
+
try:
|
| 477 |
+
# Generate client IP and timestamp
|
| 478 |
+
client_ip = "127.0.0.1" # Default IP
|
| 479 |
+
time_id = int(time.time())
|
| 480 |
+
|
| 481 |
+
# Process input image - supports PIL Image and file path
|
| 482 |
+
if hasattr(img_input, 'save'): # PIL Image object
|
| 483 |
+
pil_image = img_input
|
| 484 |
+
print(f"💾 Using PIL Image directly from memory")
|
| 485 |
+
else:
|
| 486 |
+
# Load from file path
|
| 487 |
+
pil_image = Image.open(img_input)
|
| 488 |
+
print(f"📁 Loaded image from file: {img_input}")
|
| 489 |
+
|
| 490 |
+
if progress_callback:
|
| 491 |
+
progress_callback("uploading image...")
|
| 492 |
+
|
| 493 |
+
# Upload user image directly from memory
|
| 494 |
+
uploaded_url = upload_user_img_r2(client_ip, time_id, pil_image)
|
| 495 |
+
if not uploaded_url:
|
| 496 |
+
return None, None, "image upload failed", None
|
| 497 |
+
|
| 498 |
+
# Extract actual image URL from upload URL
|
| 499 |
+
if "?" in uploaded_url:
|
| 500 |
+
uploaded_url = uploaded_url.split("?")[0]
|
| 501 |
+
|
| 502 |
+
if progress_callback:
|
| 503 |
+
progress_callback("submitting edit task...")
|
| 504 |
+
|
| 505 |
+
reference_url = ""
|
| 506 |
+
if reference_image is not None:
|
| 507 |
+
try:
|
| 508 |
+
if progress_callback:
|
| 509 |
+
progress_callback("uploading reference image...")
|
| 510 |
+
|
| 511 |
+
if hasattr(reference_image, 'save'):
|
| 512 |
+
reference_pil = reference_image
|
| 513 |
+
else:
|
| 514 |
+
reference_pil = Image.open(reference_image)
|
| 515 |
+
|
| 516 |
+
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 517 |
+
if not reference_url:
|
| 518 |
+
return None, None, "reference image upload failed", None
|
| 519 |
+
|
| 520 |
+
if "?" in reference_url:
|
| 521 |
+
reference_url = reference_url.split("?")[0]
|
| 522 |
+
except Exception as e:
|
| 523 |
+
return None, None, f"reference image processing failed: {str(e)}", None
|
| 524 |
+
|
| 525 |
+
# Submit image editing task
|
| 526 |
+
task_id, error = submit_image_edit_task(uploaded_url, prompt, reference_image_url=reference_url, priority=priority)
|
| 527 |
+
if error:
|
| 528 |
+
return None, None, error, None
|
| 529 |
+
|
| 530 |
+
if progress_callback:
|
| 531 |
+
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
| 532 |
+
|
| 533 |
+
# Wait for task completion
|
| 534 |
+
max_attempts = 60 # Wait up to 10 minutes
|
| 535 |
+
task_uuid = None
|
| 536 |
+
for attempt in range(max_attempts):
|
| 537 |
+
status, output_url, task_data = check_task_status(task_id)
|
| 538 |
+
|
| 539 |
+
# Extract task_uuid from task_data
|
| 540 |
+
if task_data and isinstance(task_data, dict):
|
| 541 |
+
task_uuid = task_data.get('uuid', None)
|
| 542 |
+
|
| 543 |
+
if status == 'completed':
|
| 544 |
+
if output_url:
|
| 545 |
+
return uploaded_url, output_url, "image edit completed", task_uuid
|
| 546 |
+
else:
|
| 547 |
+
return None, None, "Task completed but no result image returned", task_uuid
|
| 548 |
+
elif status == 'error' or status == 'failed':
|
| 549 |
+
return None, None, f"task processing failed: {task_data}", task_uuid
|
| 550 |
+
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 551 |
+
# Enhanced progress message with queue info and website promotion
|
| 552 |
+
if progress_callback and task_data and isinstance(task_data, dict):
|
| 553 |
+
queue_info = task_data.get('queue_info', {})
|
| 554 |
+
if queue_info and status in ['queued', 'created']:
|
| 555 |
+
tasks_ahead = queue_info.get('tasks_ahead', 0)
|
| 556 |
+
current_priority = queue_info.get('current_priority', 0)
|
| 557 |
+
if tasks_ahead > 0:
|
| 558 |
+
progress_callback(f"⏳ Queue: {tasks_ahead} tasks ahead | Low priority | Visit website for instant processing → https://omnicreator.net/text-to-image")
|
| 559 |
+
else:
|
| 560 |
+
progress_callback(f"🚀 Processing your image editing request...")
|
| 561 |
+
elif status == 'processing':
|
| 562 |
+
progress_callback(f"🎨 AI is processing... Please wait")
|
| 563 |
+
elif status in ['running', 'working']:
|
| 564 |
+
progress_callback(f"⚡ Generating... Almost done")
|
| 565 |
+
else:
|
| 566 |
+
progress_callback(f"📋 Task status: {status}")
|
| 567 |
+
else:
|
| 568 |
+
if progress_callback:
|
| 569 |
+
progress_callback(f"task processing... (status: {status})")
|
| 570 |
+
time.sleep(1)
|
| 571 |
+
else:
|
| 572 |
+
if progress_callback:
|
| 573 |
+
progress_callback(f"unknown status: {status}")
|
| 574 |
+
time.sleep(1)
|
| 575 |
+
|
| 576 |
+
return None, None, "task processing timeout", task_uuid
|
| 577 |
+
|
| 578 |
+
except Exception as e:
|
| 579 |
+
return None, None, f"error occurred during processing: {str(e)}", None
|
| 580 |
+
|
| 581 |
+
|
| 582 |
+
def process_local_image_edit(base_image, layers, prompt, reference_image=None, progress_callback=None, use_example_mask=None, priority=0):
|
| 583 |
+
"""
|
| 584 |
+
处理局部图片编辑的完整流程
|
| 585 |
+
|
| 586 |
+
Args:
|
| 587 |
+
base_image (PIL.Image): 原始图片
|
| 588 |
+
layers (list): ImageEditor的层数据
|
| 589 |
+
prompt (str): 编辑指令
|
| 590 |
+
progress_callback: 进度回调函数
|
| 591 |
+
priority (int): Task priority, 1 for high priority, 0 for normal priority
|
| 592 |
+
"""
|
| 593 |
+
try:
|
| 594 |
+
# Generate client IP and timestamp
|
| 595 |
+
client_ip = "127.0.0.1" # Default IP
|
| 596 |
+
time_id = int(time.time())
|
| 597 |
+
|
| 598 |
+
if progress_callback:
|
| 599 |
+
progress_callback("creating mask image...")
|
| 600 |
+
|
| 601 |
+
# Check if we should use example mask (backdoor for example case)
|
| 602 |
+
if use_example_mask:
|
| 603 |
+
# Load local mask file for example
|
| 604 |
+
try:
|
| 605 |
+
from PIL import Image
|
| 606 |
+
import os
|
| 607 |
+
|
| 608 |
+
# Check if base_image is valid
|
| 609 |
+
if base_image is None:
|
| 610 |
+
return None, None, "Base image is None, cannot process example mask", None
|
| 611 |
+
|
| 612 |
+
if os.path.exists(use_example_mask):
|
| 613 |
+
mask_image = Image.open(use_example_mask)
|
| 614 |
+
|
| 615 |
+
# Ensure mask has same size as base image
|
| 616 |
+
if hasattr(base_image, 'size') and mask_image.size != base_image.size:
|
| 617 |
+
mask_image = mask_image.resize(base_image.size)
|
| 618 |
+
|
| 619 |
+
# Ensure mask is in L mode (grayscale)
|
| 620 |
+
if mask_image.mode != 'L':
|
| 621 |
+
mask_image = mask_image.convert('L')
|
| 622 |
+
|
| 623 |
+
print(f"🎭 Using example mask from: {use_example_mask}, size: {mask_image.size}")
|
| 624 |
+
else:
|
| 625 |
+
return None, None, f"Example mask file not found: {use_example_mask}", None
|
| 626 |
+
except Exception as e:
|
| 627 |
+
import traceback
|
| 628 |
+
traceback.print_exc()
|
| 629 |
+
return None, None, f"Failed to load example mask: {str(e)}", None
|
| 630 |
+
else:
|
| 631 |
+
# Normal case: create mask from layers
|
| 632 |
+
mask_image = create_mask_from_layers(base_image, layers)
|
| 633 |
+
|
| 634 |
+
# 检查mask是否有内容
|
| 635 |
+
mask_array = np.array(mask_image)
|
| 636 |
+
if np.max(mask_array) == 0:
|
| 637 |
+
return None, None, "please draw mask", None
|
| 638 |
+
|
| 639 |
+
# Print mask statistics
|
| 640 |
+
if not use_example_mask:
|
| 641 |
+
print(f"📝 创建mask图片成功,绘制区域像素数: {np.sum(mask_array > 0)}")
|
| 642 |
+
else:
|
| 643 |
+
mask_array = np.array(mask_image)
|
| 644 |
+
print(f"🎭 Example mask loaded successfully, mask pixels: {np.sum(mask_array > 0)}")
|
| 645 |
+
|
| 646 |
+
if progress_callback:
|
| 647 |
+
progress_callback("uploading original image...")
|
| 648 |
+
|
| 649 |
+
# 直接从内存上传原始图片
|
| 650 |
+
uploaded_url = upload_user_img_r2(client_ip, time_id, base_image)
|
| 651 |
+
if not uploaded_url:
|
| 652 |
+
return None, None, "original image upload failed", None
|
| 653 |
+
|
| 654 |
+
# 从上传 URL 中提取实际的图片 URL
|
| 655 |
+
if "?" in uploaded_url:
|
| 656 |
+
uploaded_url = uploaded_url.split("?")[0]
|
| 657 |
+
|
| 658 |
+
if progress_callback:
|
| 659 |
+
progress_callback("uploading mask image...")
|
| 660 |
+
|
| 661 |
+
# 直接从内存上传mask图片
|
| 662 |
+
mask_url = upload_mask_image_r2(client_ip, time_id, mask_image)
|
| 663 |
+
if not mask_url:
|
| 664 |
+
return None, None, "mask image upload failed", None
|
| 665 |
+
|
| 666 |
+
# 从上传 URL 中提取实际的图片 URL
|
| 667 |
+
if "?" in mask_url:
|
| 668 |
+
mask_url = mask_url.split("?")[0]
|
| 669 |
+
|
| 670 |
+
reference_url = ""
|
| 671 |
+
if reference_image is not None:
|
| 672 |
+
try:
|
| 673 |
+
if progress_callback:
|
| 674 |
+
progress_callback("uploading reference image...")
|
| 675 |
+
|
| 676 |
+
if hasattr(reference_image, 'save'):
|
| 677 |
+
reference_pil = reference_image
|
| 678 |
+
else:
|
| 679 |
+
reference_pil = Image.open(reference_image)
|
| 680 |
+
|
| 681 |
+
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 682 |
+
if not reference_url:
|
| 683 |
+
return None, None, "reference image upload failed", None
|
| 684 |
+
|
| 685 |
+
if "?" in reference_url:
|
| 686 |
+
reference_url = reference_url.split("?")[0]
|
| 687 |
+
except Exception as e:
|
| 688 |
+
return None, None, f"reference image processing failed: {str(e)}", None
|
| 689 |
+
|
| 690 |
+
print(f"📤 图片上传成功:")
|
| 691 |
+
print(f" 原始图片: {uploaded_url}")
|
| 692 |
+
print(f" Mask图片: {mask_url}")
|
| 693 |
+
if reference_url:
|
| 694 |
+
print(f" 参考图片: {reference_url}")
|
| 695 |
+
|
| 696 |
+
if progress_callback:
|
| 697 |
+
progress_callback("submitting local edit task...")
|
| 698 |
+
|
| 699 |
+
# 提交局部图片编辑任务 (task_type=81)
|
| 700 |
+
task_id, error = submit_image_edit_task(
|
| 701 |
+
uploaded_url,
|
| 702 |
+
prompt,
|
| 703 |
+
task_type="81",
|
| 704 |
+
mask_image_url=mask_url,
|
| 705 |
+
reference_image_url=reference_url,
|
| 706 |
+
priority=priority
|
| 707 |
+
)
|
| 708 |
+
if error:
|
| 709 |
+
return None, None, error, None
|
| 710 |
+
|
| 711 |
+
if progress_callback:
|
| 712 |
+
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
| 713 |
+
|
| 714 |
+
print(f"🚀 局部编辑任务已提交,任务ID: {task_id}")
|
| 715 |
+
|
| 716 |
+
# Wait for task completion
|
| 717 |
+
max_attempts = 60 # Wait up to 10 minutes
|
| 718 |
+
task_uuid = None
|
| 719 |
+
for attempt in range(max_attempts):
|
| 720 |
+
status, output_url, task_data = check_task_status(task_id)
|
| 721 |
+
|
| 722 |
+
# Extract task_uuid from task_data
|
| 723 |
+
if task_data and isinstance(task_data, dict):
|
| 724 |
+
task_uuid = task_data.get('uuid', None)
|
| 725 |
+
|
| 726 |
+
if status == 'completed':
|
| 727 |
+
if output_url:
|
| 728 |
+
print(f"✅ 局部编辑任务完成,结果: {output_url}")
|
| 729 |
+
return uploaded_url, output_url, "local image edit completed", task_uuid
|
| 730 |
+
else:
|
| 731 |
+
return None, None, "task completed but no result image returned", task_uuid
|
| 732 |
+
elif status == 'error' or status == 'failed':
|
| 733 |
+
return None, None, f"task processing failed: {task_data}", task_uuid
|
| 734 |
+
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 735 |
+
# Enhanced progress message with queue info and website promotion
|
| 736 |
+
if progress_callback and task_data and isinstance(task_data, dict):
|
| 737 |
+
queue_info = task_data.get('queue_info', {})
|
| 738 |
+
if queue_info and status in ['queued', 'created']:
|
| 739 |
+
tasks_ahead = queue_info.get('tasks_ahead', 0)
|
| 740 |
+
current_priority = queue_info.get('current_priority', 0)
|
| 741 |
+
if tasks_ahead > 0:
|
| 742 |
+
progress_callback(f"⏳ Queue: {tasks_ahead} tasks ahead | Low priority | Visit website for instant processing → https://omnicreator.net/text-to-image")
|
| 743 |
+
else:
|
| 744 |
+
progress_callback(f"🚀 Processing your local editing request...")
|
| 745 |
+
elif status == 'processing':
|
| 746 |
+
progress_callback(f"🎨 AI is processing... Please wait")
|
| 747 |
+
elif status in ['running', 'working']:
|
| 748 |
+
progress_callback(f"⚡ Generating... Almost done")
|
| 749 |
+
else:
|
| 750 |
+
progress_callback(f"📋 Task status: {status}")
|
| 751 |
+
else:
|
| 752 |
+
if progress_callback:
|
| 753 |
+
progress_callback(f"processing... (status: {status})")
|
| 754 |
+
time.sleep(1) # Wait 1 second before retry
|
| 755 |
+
else:
|
| 756 |
+
if progress_callback:
|
| 757 |
+
progress_callback(f"unknown status: {status}")
|
| 758 |
+
time.sleep(1)
|
| 759 |
+
|
| 760 |
+
return None, None, "task processing timeout", task_uuid
|
| 761 |
+
|
| 762 |
+
except Exception as e:
|
| 763 |
+
print(f"❌ 局部编辑处理异常: {str(e)}")
|
| 764 |
+
return None, None, f"error occurred during processing: {str(e)}", None
|
| 765 |
+
|
| 766 |
+
|
| 767 |
+
def download_and_check_result_nsfw(image_url, nsfw_detector=None):
|
| 768 |
+
"""
|
| 769 |
+
下载结果图���并进行NSFW检测
|
| 770 |
+
|
| 771 |
+
Args:
|
| 772 |
+
image_url (str): 结果图片URL
|
| 773 |
+
nsfw_detector: NSFW检测器实例
|
| 774 |
+
|
| 775 |
+
Returns:
|
| 776 |
+
tuple: (is_nsfw, error_message)
|
| 777 |
+
"""
|
| 778 |
+
if nsfw_detector is None:
|
| 779 |
+
return False, None
|
| 780 |
+
|
| 781 |
+
try:
|
| 782 |
+
# 下载图片
|
| 783 |
+
response = requests.get(image_url, timeout=30)
|
| 784 |
+
if response.status_code != 200:
|
| 785 |
+
return False, f"Failed to download result image: HTTP {response.status_code}"
|
| 786 |
+
|
| 787 |
+
# 将图片数据转换为PIL Image
|
| 788 |
+
image_data = io.BytesIO(response.content)
|
| 789 |
+
result_image = Image.open(image_data)
|
| 790 |
+
|
| 791 |
+
# 进行NSFW检测
|
| 792 |
+
nsfw_result = nsfw_detector.predict_pil_label_only(result_image)
|
| 793 |
+
|
| 794 |
+
is_nsfw = nsfw_result.lower() == "nsfw"
|
| 795 |
+
print(f"🔍 结果图片NSFW检测: {'❌❌❌ ' + nsfw_result if is_nsfw else '✅✅✅ ' + nsfw_result}")
|
| 796 |
+
|
| 797 |
+
return is_nsfw, None
|
| 798 |
+
|
| 799 |
+
except Exception as e:
|
| 800 |
+
print(f"⚠️ 结果图片NSFW检测失败: {e}")
|
| 801 |
+
return False, f"Failed to check result image: {str(e)}"
|
| 802 |
+
|
| 803 |
+
|
| 804 |
+
def process_text_to_image(prompt, width, height, progress_callback=None, priority=0):
|
| 805 |
+
"""
|
| 806 |
+
Complete process for text-to-image generation
|
| 807 |
+
|
| 808 |
+
Args:
|
| 809 |
+
prompt (str): Text prompt for image generation
|
| 810 |
+
width (int): Image width
|
| 811 |
+
height (int): Image height
|
| 812 |
+
progress_callback: Progress callback function
|
| 813 |
+
priority (int): Task priority, 1 for high priority, 0 for normal priority
|
| 814 |
+
|
| 815 |
+
Returns:
|
| 816 |
+
tuple: (result_url, message, task_uuid)
|
| 817 |
+
"""
|
| 818 |
+
try:
|
| 819 |
+
if progress_callback:
|
| 820 |
+
progress_callback("submitting text-to-image task...")
|
| 821 |
+
|
| 822 |
+
# Submit text-to-image task
|
| 823 |
+
task_id, error = submit_text_to_image_task(prompt, width, height, priority=priority)
|
| 824 |
+
if error:
|
| 825 |
+
return None, error, None
|
| 826 |
+
|
| 827 |
+
if progress_callback:
|
| 828 |
+
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
| 829 |
+
|
| 830 |
+
# Wait for task completion
|
| 831 |
+
max_attempts = 60 # Wait up to 10 minutes
|
| 832 |
+
task_uuid = None
|
| 833 |
+
for attempt in range(max_attempts):
|
| 834 |
+
status, output_url, task_data = check_task_status(task_id)
|
| 835 |
+
|
| 836 |
+
# Extract task_uuid from task_data
|
| 837 |
+
if task_data and isinstance(task_data, dict):
|
| 838 |
+
task_uuid = task_data.get('uuid', None)
|
| 839 |
+
|
| 840 |
+
if status == 'completed':
|
| 841 |
+
if output_url:
|
| 842 |
+
return output_url, "text-to-image generation completed", task_uuid
|
| 843 |
+
else:
|
| 844 |
+
return None, "Task completed but no result image returned", task_uuid
|
| 845 |
+
elif status == 'error' or status == 'failed':
|
| 846 |
+
return None, f"task processing failed: {task_data}", task_uuid
|
| 847 |
+
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 848 |
+
# Enhanced progress message with queue info
|
| 849 |
+
if progress_callback and task_data and isinstance(task_data, dict):
|
| 850 |
+
queue_info = task_data.get('queue_info', {})
|
| 851 |
+
if queue_info and status in ['queued', 'created']:
|
| 852 |
+
tasks_ahead = queue_info.get('tasks_ahead', 0)
|
| 853 |
+
if tasks_ahead > 0:
|
| 854 |
+
progress_callback(f"⏳ Queue: {tasks_ahead} tasks ahead | Visit website for instant processing → https://omnicreator.net/text-to-image")
|
| 855 |
+
else:
|
| 856 |
+
progress_callback(f"🚀 Processing your generation request...")
|
| 857 |
+
elif status == 'processing':
|
| 858 |
+
progress_callback(f"🎨 AI is generating... Please wait")
|
| 859 |
+
elif status in ['running', 'working']:
|
| 860 |
+
progress_callback(f"⚡ Generating... Almost done")
|
| 861 |
+
else:
|
| 862 |
+
progress_callback(f"📋 Task status: {status}")
|
| 863 |
+
else:
|
| 864 |
+
if progress_callback:
|
| 865 |
+
progress_callback(f"task processing... (status: {status})")
|
| 866 |
+
time.sleep(1)
|
| 867 |
+
else:
|
| 868 |
+
if progress_callback:
|
| 869 |
+
progress_callback(f"unknown status: {status}")
|
| 870 |
+
time.sleep(1)
|
| 871 |
+
|
| 872 |
+
return None, "task processing timeout", task_uuid
|
| 873 |
+
|
| 874 |
+
except Exception as e:
|
| 875 |
+
return None, f"error occurred during processing: {str(e)}", None
|
| 876 |
+
|
| 877 |
+
|
| 878 |
+
if __name__ == "__main__":
|
| 879 |
+
|
| 880 |
+
pass
|