Spaces:
				
			
			
	
			
			
					
		Running
		
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
	Commit 
							
							·
						
						720f3e0
	
1
								Parent(s):
							
							a111cf3
								
init
Browse files- app.py +602 -184
- i18n/ar.json +102 -0
- i18n/de.json +102 -0
- i18n/en.json +102 -0
- i18n/es.json +102 -0
- i18n/fr.json +102 -0
- i18n/id.json +102 -0
- i18n/it.json +102 -0
- i18n/ja.json +102 -0
- i18n/nl.json +102 -0
- i18n/ru.json +102 -0
- i18n/zh.json +102 -0
- tmp/1.txt +14 -0
    	
        app.py
    CHANGED
    
    | @@ -4,9 +4,30 @@ import os | |
| 4 | 
             
            import shutil
         | 
| 5 | 
             
            import tempfile
         | 
| 6 | 
             
            import time
         | 
|  | |
| 7 | 
             
            from util import process_image_edit, process_local_image_edit, download_and_check_result_nsfw
         | 
| 8 | 
             
            from nfsw import NSFWDetector
         | 
| 9 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 10 | 
             
            # Configuration parameters
         | 
| 11 |  | 
| 12 | 
             
            TIP_TRY_N = 4      # Show like button tip after 12 tries
         | 
| @@ -32,26 +53,63 @@ Country_Usage_Stats = {}  # Track usage count by country | |
| 32 | 
             
            Total_Request_Count = 0  # Total request counter for periodic printing
         | 
| 33 | 
             
            PRINT_STATS_INTERVAL = 10  # Print stats every N requests
         | 
| 34 |  | 
|  | |
|  | |
|  | |
| 35 | 
             
            # Restricted countries list (these countries have lower usage limits)
         | 
| 36 | 
             
            RESTRICTED_COUNTRIES = ["印度", "巴基斯坦"]
         | 
| 37 | 
             
            RESTRICTED_COUNTRY_LIMIT = 5  # Max usage for restricted countries
         | 
| 38 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 39 | 
             
            def query_ip_country(client_ip):
         | 
| 40 | 
             
                """
         | 
| 41 | 
            -
                Query IP address geo information  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 42 |  | 
| 43 | 
             
                Returns:
         | 
| 44 | 
             
                    dict: {"country": str, "region": str, "city": str}
         | 
| 45 | 
             
                """
         | 
| 46 | 
             
                # Check cache first - no API call for subsequent visits
         | 
| 47 | 
             
                if client_ip in IP_Country_Cache:
         | 
|  | |
| 48 | 
             
                    return IP_Country_Cache[client_ip]
         | 
| 49 |  | 
| 50 | 
            -
                #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 51 | 
             
                try:
         | 
| 52 | 
             
                    import requests
         | 
|  | |
|  | |
| 53 | 
             
                    api_url = f"https://api.vore.top/api/IPdata?ip={client_ip}"
         | 
| 54 | 
            -
                     | 
|  | |
|  | |
| 55 |  | 
| 56 | 
             
                    if response.status_code == 200:
         | 
| 57 | 
             
                        data = response.json()
         | 
| @@ -63,18 +121,144 @@ def query_ip_country(client_ip): | |
| 63 | 
             
                                "city": ipdata.get("info3", "Unknown")
         | 
| 64 | 
             
                            }
         | 
| 65 | 
             
                            IP_Country_Cache[client_ip] = geo_info
         | 
|  | |
| 66 | 
             
                            return geo_info
         | 
|  | |
|  | |
|  | |
|  | |
| 67 |  | 
| 68 | 
            -
             | 
| 69 | 
            -
                     | 
| 70 | 
            -
             | 
| 71 | 
            -
                     | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 72 |  | 
| 73 | 
             
                except Exception as e:
         | 
| 74 | 
            -
                     | 
| 75 | 
            -
                     | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 78 |  | 
| 79 | 
             
            def is_restricted_country_ip(client_ip):
         | 
| 80 | 
             
                """
         | 
| @@ -303,7 +487,7 @@ except Exception as e: | |
| 303 | 
             
                print(f"❌ NSFW detector initialization failed: {e}")
         | 
| 304 | 
             
                nsfw_detector = None
         | 
| 305 |  | 
| 306 | 
            -
            def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.Progress()):
         | 
| 307 | 
             
                """
         | 
| 308 | 
             
                Interface function for processing image editing with phase-based limitations
         | 
| 309 | 
             
                """
         | 
| @@ -318,17 +502,17 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 318 | 
             
                    IP_Dict[client_ip] += 1
         | 
| 319 |  | 
| 320 | 
             
                    if input_image is None:
         | 
| 321 | 
            -
                        return None, " | 
| 322 |  | 
| 323 | 
             
                    if not prompt or prompt.strip() == "":
         | 
| 324 | 
            -
                        return None, " | 
| 325 |  | 
| 326 | 
             
                    # Check if prompt length is greater than 3 characters
         | 
| 327 | 
             
                    if len(prompt.strip()) <= 3:
         | 
| 328 | 
            -
                        return None, " | 
| 329 | 
             
                except Exception as e:
         | 
| 330 | 
             
                    print(f"⚠️ Request preprocessing error: {e}")
         | 
| 331 | 
            -
                    return None, " | 
| 332 |  | 
| 333 | 
             
                # Get user current phase
         | 
| 334 | 
             
                current_phase = get_ip_phase(client_ip)
         | 
| @@ -366,7 +550,7 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 366 | 
             
                    """
         | 
| 367 |  | 
| 368 | 
             
                    # Use same message for all users to avoid discrimination perception
         | 
| 369 | 
            -
                    blocked_message =  | 
| 370 |  | 
| 371 | 
             
                    return None, blocked_message, gr.update(value=blocked_button_html, visible=True)
         | 
| 372 |  | 
| @@ -397,7 +581,7 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 397 | 
             
                            '>⏰ Skip Wait - Unlimited Generation</a>
         | 
| 398 | 
             
                        </div>
         | 
| 399 | 
             
                        """
         | 
| 400 | 
            -
                        return None,  | 
| 401 |  | 
| 402 | 
             
                # Handle NSFW detection based on phase
         | 
| 403 | 
             
                is_nsfw_task = False  # Track if this task involves NSFW content
         | 
| @@ -459,7 +643,7 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 459 | 
             
                        if nsfw_detector is not None and current_phase != 'free':
         | 
| 460 | 
             
                            try:
         | 
| 461 | 
             
                                if progress is not None:
         | 
| 462 | 
            -
                                    progress(0.9, desc=" | 
| 463 |  | 
| 464 | 
             
                                is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector)
         | 
| 465 |  | 
| @@ -483,17 +667,17 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 483 | 
             
                        # Apply blur processing
         | 
| 484 | 
             
                        if should_blur:
         | 
| 485 | 
             
                            if progress is not None:
         | 
| 486 | 
            -
                                progress(0.95, desc=" | 
| 487 |  | 
| 488 | 
             
                            blurred_image = apply_gaussian_blur_to_image_url(result_url)
         | 
| 489 | 
             
                            if blurred_image is not None:
         | 
| 490 | 
             
                                final_result = blurred_image  # Return PIL Image object
         | 
| 491 | 
            -
                                final_message =  | 
| 492 | 
             
                                print(f"🔒 Applied Gaussian blur for NSFW content - IP: {client_ip}")
         | 
| 493 | 
             
                            else:
         | 
| 494 | 
             
                                # Blur failed, return original URL with warning
         | 
| 495 | 
             
                                final_result = result_url
         | 
| 496 | 
            -
                                final_message =  | 
| 497 |  | 
| 498 | 
             
                            # Generate NSFW button for blurred content
         | 
| 499 | 
             
                            nsfw_action_buttons_html = f"""
         | 
| @@ -520,11 +704,11 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 520 | 
             
                            return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True)
         | 
| 521 | 
             
                        else:
         | 
| 522 | 
             
                            final_result = result_url
         | 
| 523 | 
            -
                            final_message = " | 
| 524 |  | 
| 525 | 
             
                        try:
         | 
| 526 | 
             
                            if progress is not None:
         | 
| 527 | 
            -
                                progress(1.0, desc=" | 
| 528 | 
             
                        except Exception as e:
         | 
| 529 | 
             
                            print(f"⚠️ Final progress update failed: {e}")
         | 
| 530 |  | 
| @@ -600,13 +784,13 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P | |
| 600 | 
             
                        return final_result, final_message, gr.update(value=action_buttons_html, visible=True)
         | 
| 601 | 
             
                    else:
         | 
| 602 | 
             
                        print(f"❌ Processing failed - IP: {client_ip}, error: {message}", flush=True)
         | 
| 603 | 
            -
                        return None, " | 
| 604 |  | 
| 605 | 
             
                except Exception as e:
         | 
| 606 | 
             
                    print(f"❌ Processing exception - IP: {client_ip}, error: {str(e)}")
         | 
| 607 | 
            -
                    return None,  | 
| 608 |  | 
| 609 | 
            -
            def local_edit_interface(image_dict, prompt, reference_image, request: gr.Request, progress=gr.Progress()):
         | 
| 610 | 
             
                """
         | 
| 611 | 
             
                Handle local editing requests (with phase-based limitations)
         | 
| 612 | 
             
                """
         | 
| @@ -621,13 +805,13 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 621 | 
             
                    IP_Dict[client_ip] += 1
         | 
| 622 |  | 
| 623 | 
             
                    if image_dict is None:
         | 
| 624 | 
            -
                        return None, " | 
| 625 |  | 
| 626 | 
             
                    # Handle different input formats for ImageEditor
         | 
| 627 | 
             
                    if isinstance(image_dict, dict):
         | 
| 628 | 
             
                        # ImageEditor dict format
         | 
| 629 | 
             
                        if "background" not in image_dict or "layers" not in image_dict:
         | 
| 630 | 
            -
                            return None, " | 
| 631 |  | 
| 632 | 
             
                        base_image = image_dict["background"]
         | 
| 633 | 
             
                        layers = image_dict["layers"]
         | 
| @@ -669,20 +853,20 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 669 | 
             
                    if base_image is None:
         | 
| 670 | 
             
                        if is_example_case:
         | 
| 671 | 
             
                            print(f"❌ Example case but base_image still None!")
         | 
| 672 | 
            -
                        return None, " | 
| 673 |  | 
| 674 | 
             
                    if not layers and not is_example_case:
         | 
| 675 | 
            -
                        return None, " | 
| 676 |  | 
| 677 | 
             
                    if not prompt or prompt.strip() == "":
         | 
| 678 | 
            -
                        return None, " | 
| 679 |  | 
| 680 | 
             
                    # Check prompt length
         | 
| 681 | 
             
                    if len(prompt.strip()) <= 3:
         | 
| 682 | 
            -
                        return None, " | 
| 683 | 
             
                except Exception as e:
         | 
| 684 | 
             
                    print(f"⚠️ Local edit request preprocessing error: {e}")
         | 
| 685 | 
            -
                    return None, " | 
| 686 |  | 
| 687 | 
             
                # Get user current phase
         | 
| 688 | 
             
                current_phase = get_ip_phase(client_ip)
         | 
| @@ -720,7 +904,7 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 720 | 
             
                    """
         | 
| 721 |  | 
| 722 | 
             
                    # Use same message for all users to avoid discrimination perception
         | 
| 723 | 
            -
                    blocked_message =  | 
| 724 |  | 
| 725 | 
             
                    return None, blocked_message, gr.update(value=blocked_button_html, visible=True)
         | 
| 726 |  | 
| @@ -751,7 +935,7 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 751 | 
             
                            '>⏰ Skip Wait - Unlimited Generation</a>
         | 
| 752 | 
             
                        </div>
         | 
| 753 | 
             
                        """
         | 
| 754 | 
            -
                        return None,  | 
| 755 |  | 
| 756 | 
             
                # Handle NSFW detection based on phase
         | 
| 757 | 
             
                is_nsfw_task = False  # Track if this task involves NSFW content
         | 
| @@ -823,7 +1007,7 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 823 | 
             
                        if nsfw_detector is not None and current_phase != 'free':
         | 
| 824 | 
             
                            try:
         | 
| 825 | 
             
                                if progress is not None:
         | 
| 826 | 
            -
                                    progress(0.9, desc=" | 
| 827 |  | 
| 828 | 
             
                                is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector)
         | 
| 829 |  | 
| @@ -847,17 +1031,17 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 847 | 
             
                        # Apply blur processing
         | 
| 848 | 
             
                        if should_blur:
         | 
| 849 | 
             
                            if progress is not None:
         | 
| 850 | 
            -
                                progress(0.95, desc=" | 
| 851 |  | 
| 852 | 
             
                            blurred_image = apply_gaussian_blur_to_image_url(result_url)
         | 
| 853 | 
             
                            if blurred_image is not None:
         | 
| 854 | 
             
                                final_result = blurred_image  # Return PIL Image object
         | 
| 855 | 
            -
                                final_message =  | 
| 856 | 
             
                                print(f"🔒 Local edit applied Gaussian blur for NSFW content - IP: {client_ip}")
         | 
| 857 | 
             
                            else:
         | 
| 858 | 
             
                                # Blur failed, return original URL with warning
         | 
| 859 | 
             
                                final_result = result_url
         | 
| 860 | 
            -
                                final_message =  | 
| 861 |  | 
| 862 | 
             
                            # Generate NSFW button for blurred content
         | 
| 863 | 
             
                            nsfw_action_buttons_html = f"""
         | 
| @@ -884,11 +1068,11 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 884 | 
             
                            return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True)
         | 
| 885 | 
             
                        else:
         | 
| 886 | 
             
                            final_result = result_url
         | 
| 887 | 
            -
                            final_message = " | 
| 888 |  | 
| 889 | 
             
                        try:
         | 
| 890 | 
             
                            if progress is not None:
         | 
| 891 | 
            -
                                progress(1.0, desc=" | 
| 892 | 
             
                        except Exception as e:
         | 
| 893 | 
             
                            print(f"⚠️ Local edit final progress update failed: {e}")
         | 
| 894 |  | 
| @@ -964,11 +1148,11 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques | |
| 964 | 
             
                        return final_result, final_message, gr.update(value=action_buttons_html, visible=True)
         | 
| 965 | 
             
                    else:
         | 
| 966 | 
             
                        print(f"❌ Local editing processing failed - IP: {client_ip}, error: {message}", flush=True)
         | 
| 967 | 
            -
                        return None, " | 
| 968 |  | 
| 969 | 
             
                except Exception as e:
         | 
| 970 | 
             
                    print(f"❌ Local editing exception - IP: {client_ip}, error: {str(e)}")
         | 
| 971 | 
            -
                    return None,  | 
| 972 |  | 
| 973 | 
             
            # Create Gradio interface
         | 
| 974 | 
             
            def create_app():
         | 
| @@ -980,6 +1164,67 @@ def create_app(): | |
| 980 | 
             
                        max-width: 1200px;
         | 
| 981 | 
             
                        margin: 0 auto;
         | 
| 982 | 
             
                    }
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 983 | 
             
                    .upload-area {
         | 
| 984 | 
             
                        border: 2px dashed #ccc;
         | 
| 985 | 
             
                        border-radius: 10px;
         | 
| @@ -1008,93 +1253,120 @@ def create_app(): | |
| 1008 | 
             
                    """
         | 
| 1009 | 
             
                ) as app:
         | 
| 1010 |  | 
| 1011 | 
            -
                     | 
| 1012 | 
            -
             | 
| 1013 | 
            -
                     | 
|  | |
|  | |
| 1014 | 
             
                        <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);">
         | 
| 1015 | 
            -
                             | 
| 1016 | 
             
                        </h1>
         | 
| 1017 | 
             
                    </div>
         | 
| 1018 | 
            -
                    """ | 
| 1019 |  | 
| 1020 | 
            -
                    # 🌟 NEW: Multi-Image Editing Announcement Banner with  | 
| 1021 | 
            -
                    gr. | 
| 1022 | 
            -
             | 
| 1023 | 
            -
             | 
| 1024 | 
            -
             | 
| 1025 | 
            -
             | 
| 1026 | 
            -
             | 
| 1027 | 
            -
             | 
| 1028 | 
            -
             | 
| 1029 | 
            -
             | 
| 1030 | 
            -
             | 
| 1031 | 
            -
             | 
| 1032 | 
            -
             | 
| 1033 | 
            -
             | 
| 1034 | 
            -
             | 
| 1035 | 
            -
             | 
| 1036 | 
            -
             | 
| 1037 | 
            -
             | 
| 1038 | 
            -
             | 
| 1039 | 
            -
             | 
| 1040 | 
            -
             | 
| 1041 | 
            -
             | 
| 1042 | 
            -
                             | 
| 1043 | 
            -
                                color: white; 
         | 
| 1044 | 
            -
             | 
| 1045 | 
            -
             | 
| 1046 | 
            -
             | 
| 1047 | 
            -
             | 
| 1048 | 
            -
             | 
| 1049 | 
            -
             | 
| 1050 | 
            -
             | 
| 1051 | 
            -
             | 
| 1052 | 
            -
             | 
| 1053 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 1054 |  | 
| 1055 | 
            -
                    with gr.Tabs():
         | 
| 1056 | 
            -
                        with gr.Tab(" | 
| 1057 | 
             
                            with gr.Row():
         | 
| 1058 | 
             
                                with gr.Column(scale=1):
         | 
| 1059 | 
            -
                                    gr.Markdown(" | 
| 1060 | 
             
                                    input_image = gr.Image(
         | 
| 1061 | 
            -
                                        label=" | 
| 1062 | 
             
                                        type="pil",
         | 
| 1063 | 
             
                                        height=512,
         | 
| 1064 | 
             
                                        elem_classes=["upload-area"]
         | 
| 1065 | 
             
                                    )
         | 
| 1066 |  | 
| 1067 | 
            -
                                    gr.Markdown(" | 
| 1068 | 
             
                                    prompt_input = gr.Textbox(
         | 
| 1069 | 
            -
                                        label=" | 
| 1070 | 
            -
                                        placeholder=" | 
| 1071 | 
             
                                        lines=3,
         | 
| 1072 | 
             
                                        max_lines=5
         | 
| 1073 | 
             
                                    )
         | 
| 1074 |  | 
| 1075 | 
             
                                    edit_button = gr.Button(
         | 
| 1076 | 
            -
                                        " | 
| 1077 | 
             
                                        variant="primary",
         | 
| 1078 | 
             
                                        size="lg"
         | 
| 1079 | 
             
                                    )
         | 
| 1080 |  | 
| 1081 | 
             
                                with gr.Column(scale=1):
         | 
| 1082 | 
            -
                                    gr.Markdown(" | 
| 1083 | 
             
                                    output_image = gr.Image(
         | 
| 1084 | 
            -
                                        label=" | 
| 1085 | 
             
                                        height=320,
         | 
| 1086 | 
             
                                        elem_classes=["result-area"]
         | 
| 1087 | 
             
                                    )
         | 
| 1088 |  | 
| 1089 | 
             
                                    use_as_input_btn = gr.Button(
         | 
| 1090 | 
            -
                                        " | 
| 1091 | 
             
                                        variant="secondary",
         | 
| 1092 | 
             
                                        size="sm",
         | 
| 1093 | 
             
                                        elem_classes=["use-as-input-btn"]
         | 
| 1094 | 
             
                                    )
         | 
| 1095 |  | 
| 1096 | 
             
                                    status_output = gr.Textbox(
         | 
| 1097 | 
            -
                                        label=" | 
| 1098 | 
             
                                        lines=2,
         | 
| 1099 | 
             
                                        max_lines=3,
         | 
| 1100 | 
             
                                        interactive=False
         | 
| @@ -1102,7 +1374,7 @@ def create_app(): | |
| 1102 |  | 
| 1103 | 
             
                                    action_buttons = gr.HTML(visible=False)
         | 
| 1104 |  | 
| 1105 | 
            -
                            gr.Markdown(" | 
| 1106 | 
             
                            with gr.Row():
         | 
| 1107 | 
             
                                example_prompts = [
         | 
| 1108 | 
             
                                    "Set the background to a grand opera stage with red curtains",
         | 
| @@ -1123,7 +1395,7 @@ def create_app(): | |
| 1123 |  | 
| 1124 | 
             
                            edit_button.click(
         | 
| 1125 | 
             
                                fn=edit_image_interface,
         | 
| 1126 | 
            -
                                inputs=[input_image, prompt_input],
         | 
| 1127 | 
             
                                outputs=[output_image, status_output, action_buttons],
         | 
| 1128 | 
             
                                show_progress=True,
         | 
| 1129 | 
             
                                concurrency_limit=10,
         | 
| @@ -1141,56 +1413,56 @@ def create_app(): | |
| 1141 | 
             
                                outputs=[input_image]
         | 
| 1142 | 
             
                            )
         | 
| 1143 |  | 
| 1144 | 
            -
                        with gr.Tab(" | 
| 1145 | 
             
                            with gr.Row():
         | 
| 1146 | 
             
                                with gr.Column(scale=1):
         | 
| 1147 | 
            -
                                    gr.Markdown(" | 
| 1148 | 
             
                                    local_input_image = gr.ImageEditor(
         | 
| 1149 | 
            -
                                        label=" | 
| 1150 | 
             
                                        type="pil",
         | 
| 1151 | 
             
                                        height=512,
         | 
| 1152 | 
             
                                        brush=gr.Brush(colors=["#ff0000"], default_size=180),
         | 
| 1153 | 
             
                                        elem_classes=["upload-area"]
         | 
| 1154 | 
             
                                    )
         | 
| 1155 |  | 
| 1156 | 
            -
                                    gr.Markdown(" | 
| 1157 | 
             
                                    local_reference_image = gr.Image(
         | 
| 1158 | 
            -
                                        label=" | 
| 1159 | 
             
                                        type="pil",
         | 
| 1160 | 
             
                                        height=256
         | 
| 1161 | 
             
                                    )
         | 
| 1162 |  | 
| 1163 | 
            -
                                    gr.Markdown(" | 
| 1164 | 
             
                                    local_prompt_input = gr.Textbox(
         | 
| 1165 | 
            -
                                        label=" | 
| 1166 | 
            -
                                        placeholder=" | 
| 1167 | 
             
                                        lines=3,
         | 
| 1168 | 
             
                                        max_lines=5
         | 
| 1169 | 
             
                                    )
         | 
| 1170 |  | 
| 1171 | 
             
                                    local_edit_button = gr.Button(
         | 
| 1172 | 
            -
                                        " | 
| 1173 | 
             
                                        variant="primary",
         | 
| 1174 | 
             
                                        size="lg"
         | 
| 1175 | 
             
                                    )
         | 
| 1176 |  | 
| 1177 | 
             
                                with gr.Column(scale=1):
         | 
| 1178 | 
            -
                                    gr.Markdown(" | 
| 1179 | 
             
                                    local_output_image = gr.Image(
         | 
| 1180 | 
            -
                                        label=" | 
| 1181 | 
             
                                        height=320,
         | 
| 1182 | 
             
                                        elem_classes=["result-area"]
         | 
| 1183 | 
             
                                    )
         | 
| 1184 |  | 
| 1185 | 
             
                                    local_use_as_input_btn = gr.Button(
         | 
| 1186 | 
            -
                                        " | 
| 1187 | 
             
                                        variant="secondary",
         | 
| 1188 | 
             
                                        size="sm",
         | 
| 1189 | 
             
                                        elem_classes=["use-as-input-btn"]
         | 
| 1190 | 
             
                                    )
         | 
| 1191 |  | 
| 1192 | 
             
                                    local_status_output = gr.Textbox(
         | 
| 1193 | 
            -
                                        label=" | 
| 1194 | 
             
                                        lines=2,
         | 
| 1195 | 
             
                                        max_lines=3,
         | 
| 1196 | 
             
                                        interactive=False
         | 
| @@ -1200,7 +1472,7 @@ def create_app(): | |
| 1200 |  | 
| 1201 | 
             
                            local_edit_button.click(
         | 
| 1202 | 
             
                                fn=local_edit_interface,
         | 
| 1203 | 
            -
                                inputs=[local_input_image, local_prompt_input, local_reference_image],
         | 
| 1204 | 
             
                                outputs=[local_output_image, local_status_output, local_action_buttons],
         | 
| 1205 | 
             
                                show_progress=True,
         | 
| 1206 | 
             
                                concurrency_limit=8,
         | 
| @@ -1223,7 +1495,7 @@ def create_app(): | |
| 1223 | 
             
                            )
         | 
| 1224 |  | 
| 1225 | 
             
                            # Local inpaint example
         | 
| 1226 | 
            -
                            gr.Markdown(" | 
| 1227 |  | 
| 1228 | 
             
                            def load_local_example():
         | 
| 1229 | 
             
                                """Load panda to cat transformation example - simplified, mask handled in backend"""
         | 
| @@ -1264,49 +1536,53 @@ def create_app(): | |
| 1264 | 
             
                                    return None, None, "EXAMPLE_PANDA_CAT_Transform the panda head into a cute cat head, keeping the body"
         | 
| 1265 |  | 
| 1266 | 
             
                                # Example display
         | 
| 1267 | 
            -
                            gr.Markdown(" | 
| 1268 | 
             
                            with gr.Row():
         | 
| 1269 | 
             
                                with gr.Column(scale=2):
         | 
| 1270 | 
             
                                    # Preview images for local example
         | 
| 1271 | 
             
                                    with gr.Row():
         | 
| 1272 | 
             
                                        try:
         | 
| 1273 | 
            -
                                            gr.Image("datas/panda01.jpeg", label=" | 
| 1274 | 
            -
                                            gr.Image("datas/panda01m.jpeg", label=" | 
| 1275 | 
            -
                                            gr.Image("datas/cat01.webp", label=" | 
| 1276 | 
             
                                        except:
         | 
| 1277 | 
             
                                            gr.Markdown("*Preview images not available*")
         | 
| 1278 | 
            -
                                    gr.Markdown(" | 
| 1279 | 
             
                                with gr.Column(scale=1):
         | 
| 1280 | 
            -
                                    gr.Button(
         | 
| 1281 | 
            -
                                        " | 
| 1282 | 
             
                                        size="lg",
         | 
| 1283 | 
             
                                        variant="secondary"
         | 
| 1284 | 
            -
                                    ) | 
|  | |
| 1285 | 
             
                                        fn=load_local_example,
         | 
| 1286 | 
             
                                        outputs=[local_input_image, local_reference_image, local_prompt_input]
         | 
| 1287 | 
             
                                    )
         | 
| 1288 |  | 
| 1289 | 
             
                            # Add a refresh button to fix UI state issues
         | 
| 1290 | 
            -
                            gr.Button(
         | 
| 1291 | 
            -
                                " | 
| 1292 | 
             
                                size="sm",
         | 
| 1293 | 
             
                                variant="secondary"
         | 
| 1294 | 
            -
                            ) | 
|  | |
| 1295 | 
             
                                fn=lambda: gr.update(),
         | 
| 1296 | 
             
                                outputs=[local_input_image]
         | 
| 1297 | 
             
                            )
         | 
| 1298 |  | 
| 1299 | 
             
                    # SEO Content Section
         | 
| 1300 | 
            -
                    gr.HTML( | 
|  | |
|  | |
|  | |
| 1301 | 
             
                <div style="width: 100%; margin: 50px 0; padding: 0 20px;">
         | 
| 1302 |  | 
| 1303 | 
             
                    <div style="text-align: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px; border-radius: 20px; margin: 40px 0;">
         | 
| 1304 | 
             
                        <h2 style="margin: 0 0 20px 0; font-size: 2.2em; font-weight: 700;">
         | 
| 1305 | 
            -
                            🎨  | 
| 1306 | 
             
                        </h2>
         | 
| 1307 | 
             
                        <p style="margin: 0 0 25px 0; font-size: 1.2em; opacity: 0.95; line-height: 1.6;">
         | 
| 1308 | 
            -
                             | 
| 1309 | 
            -
                            with complete creative freedom and no limits on your imagination with our premium AI image editing platform.
         | 
| 1310 | 
             
                        </p>
         | 
| 1311 |  | 
| 1312 | 
             
                        <div style="display: flex; justify-content: center; gap: 25px; flex-wrap: wrap; margin: 30px 0;">
         | 
| @@ -1328,24 +1604,22 @@ def create_app(): | |
| 1328 | 
             
                                border: none;
         | 
| 1329 | 
             
                                transform: scale(1);
         | 
| 1330 | 
             
                            " onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'">
         | 
| 1331 | 
            -
                                🚀  | 
| 1332 | 
             
                            </a>
         | 
| 1333 |  | 
| 1334 | 
             
                        </div>
         | 
| 1335 |  | 
| 1336 | 
             
                        <p style="color: rgba(255,255,255,0.9); font-size: 1em; margin: 20px 0 0 0;">
         | 
| 1337 | 
            -
                             | 
| 1338 | 
             
                        </p>
         | 
| 1339 | 
             
                    </div>
         | 
| 1340 |  | 
| 1341 | 
             
                    <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);">
         | 
| 1342 | 
             
                        <h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.9em; font-weight: 700;">
         | 
| 1343 | 
            -
                            ⭐  | 
| 1344 | 
             
                        </h2>
         | 
| 1345 | 
             
                        <p style="color: #555; font-size: 1.1em; line-height: 1.6; margin: 0 0 20px 0; padding: 0 20px;">
         | 
| 1346 | 
            -
                             | 
| 1347 | 
            -
                            art, editing photos, designing content, or working with any type of imagery - our powerful AI removes all limitations 
         | 
| 1348 | 
            -
                            and gives you complete creative freedom.
         | 
| 1349 | 
             
                        </p>
         | 
| 1350 | 
             
                    </div>
         | 
| 1351 |  | 
| @@ -1353,61 +1627,55 @@ def create_app(): | |
| 1353 |  | 
| 1354 | 
             
                        <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;">
         | 
| 1355 | 
             
                            <h3 style="color: #e74c3c; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1356 | 
            -
                                🎯  | 
| 1357 | 
             
                            </h3>
         | 
| 1358 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1359 | 
            -
                                 | 
| 1360 | 
            -
                                Create as many images as you need, whenever you need them.
         | 
| 1361 | 
             
                            </p>
         | 
| 1362 | 
             
                        </div>
         | 
| 1363 |  | 
| 1364 | 
             
                        <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;">
         | 
| 1365 | 
             
                            <h3 style="color: #3498db; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1366 | 
            -
                                🔓  | 
| 1367 | 
             
                            </h3>
         | 
| 1368 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1369 | 
            -
                                 | 
| 1370 | 
            -
                                Unlimited possibilities for artists, designers, and content creators.
         | 
| 1371 | 
             
                            </p>
         | 
| 1372 | 
             
                        </div>
         | 
| 1373 |  | 
| 1374 | 
             
                        <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;">
         | 
| 1375 | 
             
                            <h3 style="color: #27ae60; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1376 | 
            -
                                ⚡  | 
| 1377 | 
             
                            </h3>
         | 
| 1378 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1379 | 
            -
                                 | 
| 1380 | 
            -
                                no processing delays - just instant, professional-grade image editing.
         | 
| 1381 | 
             
                            </p>
         | 
| 1382 | 
             
                        </div>
         | 
| 1383 |  | 
| 1384 | 
             
                        <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;">
         | 
| 1385 | 
             
                            <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1386 | 
            -
                                🎨  | 
| 1387 | 
             
                            </h3>
         | 
| 1388 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1389 | 
            -
                                 | 
| 1390 | 
            -
                                and dozens of other professional editing capabilities.
         | 
| 1391 | 
             
                            </p>
         | 
| 1392 | 
             
                        </div>
         | 
| 1393 |  | 
| 1394 | 
             
                        <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;">
         | 
| 1395 | 
             
                            <h3 style="color: #f39c12; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1396 | 
            -
                                💎  | 
| 1397 | 
             
                            </h3>
         | 
| 1398 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1399 | 
            -
                                 | 
| 1400 | 
            -
                                Professional results suitable for commercial use and high-end projects.
         | 
| 1401 | 
             
                            </p>
         | 
| 1402 | 
             
                        </div>
         | 
| 1403 |  | 
| 1404 | 
             
                        <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;">
         | 
| 1405 | 
             
                            <h3 style="color: #34495e; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1406 | 
            -
                                🌍  | 
| 1407 | 
             
                            </h3>
         | 
| 1408 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1409 | 
            -
                                 | 
| 1410 | 
            -
                                product photography to digital art - we handle everything.
         | 
| 1411 | 
             
                            </p>
         | 
| 1412 | 
             
                        </div>
         | 
| 1413 |  | 
| @@ -1415,28 +1683,28 @@ def create_app(): | |
| 1415 |  | 
| 1416 | 
             
                    <div style="background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 50%, #fecfef 100%); padding: 30px; border-radius: 15px; margin: 40px 0;">
         | 
| 1417 | 
             
                        <h3 style="color: #8b5cf6; text-align: center; margin: 0 0 25px 0; font-size: 1.5em; font-weight: 700;">
         | 
| 1418 | 
            -
                            💡  | 
| 1419 | 
             
                        </h3>
         | 
| 1420 | 
             
                        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 18px;">
         | 
| 1421 |  | 
| 1422 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1423 | 
            -
                                <strong style="color: #8b5cf6; font-size: 1.1em;">📝  | 
| 1424 | 
            -
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;"> | 
| 1425 | 
             
                            </div>
         | 
| 1426 |  | 
| 1427 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1428 | 
            -
                                <strong style="color: #8b5cf6; font-size: 1.1em;">🎯  | 
| 1429 | 
            -
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;"> | 
| 1430 | 
             
                            </div>
         | 
| 1431 |  | 
| 1432 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1433 | 
            -
                                <strong style="color: #8b5cf6; font-size: 1.1em;">⚡  | 
| 1434 | 
            -
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;"> | 
| 1435 | 
             
                            </div>
         | 
| 1436 |  | 
| 1437 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1438 | 
            -
                                <strong style="color: #8b5cf6; font-size: 1.1em;">🖼  | 
| 1439 | 
            -
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;"> | 
| 1440 | 
             
                            </div>
         | 
| 1441 |  | 
| 1442 | 
             
                        </div>
         | 
| @@ -1444,47 +1712,47 @@ def create_app(): | |
| 1444 |  | 
| 1445 | 
             
                    <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);">
         | 
| 1446 | 
             
                        <h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.8em; font-weight: 700;">
         | 
| 1447 | 
            -
                            🚀  | 
| 1448 | 
             
                        </h2>
         | 
| 1449 | 
             
                        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin: 25px 0; text-align: left;">
         | 
| 1450 |  | 
| 1451 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1452 | 
            -
                                <h4 style="color: #e74c3c; margin: 0 0 10px 0;">🎨  | 
| 1453 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1454 | 
            -
                                    <li> | 
| 1455 | 
            -
                                    <li> | 
| 1456 | 
            -
                                    <li> | 
| 1457 | 
            -
                                    <li> | 
| 1458 | 
             
                                </ul>
         | 
| 1459 | 
             
                            </div>
         | 
| 1460 |  | 
| 1461 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1462 | 
            -
                                <h4 style="color: #3498db; margin: 0 0 10px 0;">📸  | 
| 1463 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1464 | 
            -
                                    <li> | 
| 1465 | 
            -
                                    <li> | 
| 1466 | 
            -
                                    <li> | 
| 1467 | 
            -
                                    <li> | 
| 1468 | 
             
                                </ul>
         | 
| 1469 | 
             
                            </div>
         | 
| 1470 |  | 
| 1471 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1472 | 
            -
                                <h4 style="color: #27ae60; margin: 0 0 10px 0;">🛍️  | 
| 1473 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1474 | 
            -
                                    <li> | 
| 1475 | 
            -
                                    <li> | 
| 1476 | 
            -
                                    <li> | 
| 1477 | 
            -
                                    <li> | 
| 1478 | 
             
                                </ul>
         | 
| 1479 | 
             
                            </div>
         | 
| 1480 |  | 
| 1481 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1482 | 
            -
                                <h4 style="color: #9b59b6; margin: 0 0 10px 0;">📱  | 
| 1483 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1484 | 
            -
                                    <li> | 
| 1485 | 
            -
                                    <li> | 
| 1486 | 
            -
                                    <li> | 
| 1487 | 
            -
                                    <li> | 
| 1488 | 
             
                                </ul>
         | 
| 1489 | 
             
                            </div>
         | 
| 1490 |  | 
| @@ -1492,9 +1760,159 @@ def create_app(): | |
| 1492 | 
             
                    </div>
         | 
| 1493 |  | 
| 1494 | 
             
                </div>
         | 
| 1495 | 
            -
                
         | 
| 1496 | 
            -
             | 
| 1497 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 1498 | 
             
                return app
         | 
| 1499 |  | 
| 1500 | 
             
            if __name__ == "__main__":
         | 
|  | |
| 4 | 
             
            import shutil
         | 
| 5 | 
             
            import tempfile
         | 
| 6 | 
             
            import time
         | 
| 7 | 
            +
            import json
         | 
| 8 | 
             
            from util import process_image_edit, process_local_image_edit, download_and_check_result_nsfw
         | 
| 9 | 
             
            from nfsw import NSFWDetector
         | 
| 10 |  | 
| 11 | 
            +
            # i18n
         | 
| 12 | 
            +
            def load_translations():
         | 
| 13 | 
            +
                translations = {}
         | 
| 14 | 
            +
                import os
         | 
| 15 | 
            +
                i18n_dir = "i18n/"
         | 
| 16 | 
            +
                for lang_file in os.listdir(i18n_dir):
         | 
| 17 | 
            +
                    if lang_file.endswith('.json'):
         | 
| 18 | 
            +
                        lang = lang_file[:-5]  # Remove .json extension
         | 
| 19 | 
            +
                        try:
         | 
| 20 | 
            +
                            with open(os.path.join(i18n_dir, lang_file), "r", encoding="utf-8") as f:
         | 
| 21 | 
            +
                                translations[lang] = json.load(f)
         | 
| 22 | 
            +
                        except Exception as e:
         | 
| 23 | 
            +
                            print(f"Failed to load {lang_file}: {e}")
         | 
| 24 | 
            +
                return translations
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            translations = load_translations()
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            def t(key, lang="en"):
         | 
| 29 | 
            +
                return translations.get(lang, {}).get(key, key)
         | 
| 30 | 
            +
             | 
| 31 | 
             
            # Configuration parameters
         | 
| 32 |  | 
| 33 | 
             
            TIP_TRY_N = 4      # Show like button tip after 12 tries
         | 
|  | |
| 53 | 
             
            Total_Request_Count = 0  # Total request counter for periodic printing
         | 
| 54 | 
             
            PRINT_STATS_INTERVAL = 10  # Print stats every N requests
         | 
| 55 |  | 
| 56 | 
            +
            # Async IP query tracking
         | 
| 57 | 
            +
            IP_Query_Results = {}  # Track async query results
         | 
| 58 | 
            +
             | 
| 59 | 
             
            # Restricted countries list (these countries have lower usage limits)
         | 
| 60 | 
             
            RESTRICTED_COUNTRIES = ["印度", "巴基斯坦"]
         | 
| 61 | 
             
            RESTRICTED_COUNTRY_LIMIT = 5  # Max usage for restricted countries
         | 
| 62 |  | 
| 63 | 
            +
            country_dict = {
         | 
| 64 | 
            +
                "zh": ["中国", "香港"],
         | 
| 65 | 
            +
                "en": ["美国", "澳大利亚", "英国", "加拿大", "新西兰", "爱尔兰"],
         | 
| 66 | 
            +
                "es": ["西班牙", "墨西哥", "阿根廷", "哥伦比亚", "智利", "秘鲁", "巴西"],
         | 
| 67 | 
            +
                "fr": ["法国", "比利时", "摩纳哥"],
         | 
| 68 | 
            +
                "de": ["德国", "奥地利", ],
         | 
| 69 | 
            +
                "it": ["意大利", "圣马力诺", "梵蒂冈"],
         | 
| 70 | 
            +
                "ja": ["日本"],
         | 
| 71 | 
            +
                "ru": ["俄罗斯"],
         | 
| 72 | 
            +
                "ar": ["沙特阿拉伯", "埃及"],
         | 
| 73 | 
            +
                "nl":["荷兰"],
         | 
| 74 | 
            +
                "id":["印度尼西亚"]
         | 
| 75 | 
            +
            }
         | 
| 76 | 
            +
             | 
| 77 | 
             
            def query_ip_country(client_ip):
         | 
| 78 | 
             
                """
         | 
| 79 | 
            +
                Query IP address geo information with robust error handling
         | 
| 80 | 
            +
                
         | 
| 81 | 
            +
                Features:
         | 
| 82 | 
            +
                - 3 second timeout limit
         | 
| 83 | 
            +
                - Comprehensive error handling 
         | 
| 84 | 
            +
                - Automatic fallback to default values
         | 
| 85 | 
            +
                - Cache mechanism to avoid repeated queries
         | 
| 86 |  | 
| 87 | 
             
                Returns:
         | 
| 88 | 
             
                    dict: {"country": str, "region": str, "city": str}
         | 
| 89 | 
             
                """
         | 
| 90 | 
             
                # Check cache first - no API call for subsequent visits
         | 
| 91 | 
             
                if client_ip in IP_Country_Cache:
         | 
| 92 | 
            +
                    print(f"Using cached IP data for {client_ip}")
         | 
| 93 | 
             
                    return IP_Country_Cache[client_ip]
         | 
| 94 |  | 
| 95 | 
            +
                # Validate IP address
         | 
| 96 | 
            +
                if not client_ip or client_ip in ["127.0.0.1", "localhost", "::1"]:
         | 
| 97 | 
            +
                    print(f"Invalid or local IP address: {client_ip}, using default")
         | 
| 98 | 
            +
                    default_geo = {"country": "Unknown", "region": "Unknown", "city": "Unknown"}
         | 
| 99 | 
            +
                    IP_Country_Cache[client_ip] = default_geo
         | 
| 100 | 
            +
                    return default_geo
         | 
| 101 | 
            +
                
         | 
| 102 | 
            +
                # First time visit - query API with robust error handling
         | 
| 103 | 
            +
                print(f"Querying IP geolocation for {client_ip}...")
         | 
| 104 | 
            +
                
         | 
| 105 | 
             
                try:
         | 
| 106 | 
             
                    import requests
         | 
| 107 | 
            +
                    from requests.exceptions import Timeout, ConnectionError, RequestException
         | 
| 108 | 
            +
                    
         | 
| 109 | 
             
                    api_url = f"https://api.vore.top/api/IPdata?ip={client_ip}"
         | 
| 110 | 
            +
                    
         | 
| 111 | 
            +
                    # Make request with 3 second timeout
         | 
| 112 | 
            +
                    response = requests.get(api_url, timeout=3)
         | 
| 113 |  | 
| 114 | 
             
                    if response.status_code == 200:
         | 
| 115 | 
             
                        data = response.json()
         | 
|  | |
| 121 | 
             
                                "city": ipdata.get("info3", "Unknown")
         | 
| 122 | 
             
                            }
         | 
| 123 | 
             
                            IP_Country_Cache[client_ip] = geo_info
         | 
| 124 | 
            +
                            print(f"Successfully detected location for {client_ip}: {geo_info['country']}")
         | 
| 125 | 
             
                            return geo_info
         | 
| 126 | 
            +
                        else:
         | 
| 127 | 
            +
                            print(f"API returned invalid data for {client_ip}: {data}")
         | 
| 128 | 
            +
                    else:
         | 
| 129 | 
            +
                        print(f"API request failed with status {response.status_code} for {client_ip}")
         | 
| 130 |  | 
| 131 | 
            +
                except Timeout:
         | 
| 132 | 
            +
                    print(f"Timeout (>3s) querying IP location for {client_ip}, using default")
         | 
| 133 | 
            +
                except ConnectionError:
         | 
| 134 | 
            +
                    print(f"Network connection error for IP {client_ip}, using default")
         | 
| 135 | 
            +
                except RequestException as e:
         | 
| 136 | 
            +
                    print(f"Request error for IP {client_ip}: {e}, using default")
         | 
| 137 | 
            +
                except Exception as e:
         | 
| 138 | 
            +
                    print(f"Unexpected error querying IP {client_ip}: {e}, using default")
         | 
| 139 | 
            +
                
         | 
| 140 | 
            +
                # All failures lead here - cache default and return
         | 
| 141 | 
            +
                default_geo = {"country": "Unknown", "region": "Unknown", "city": "Unknown"}
         | 
| 142 | 
            +
                IP_Country_Cache[client_ip] = default_geo
         | 
| 143 | 
            +
                print(f"Cached default location for {client_ip}")
         | 
| 144 | 
            +
                return default_geo
         | 
| 145 | 
            +
             | 
| 146 | 
            +
            def query_ip_country_async(client_ip):
         | 
| 147 | 
            +
                """
         | 
| 148 | 
            +
                Async version that returns immediately with default, then updates cache in background
         | 
| 149 | 
            +
                
         | 
| 150 | 
            +
                Returns:
         | 
| 151 | 
            +
                    tuple: (immediate_lang, geo_info_or_none)
         | 
| 152 | 
            +
                """
         | 
| 153 | 
            +
                # If already cached, return immediately
         | 
| 154 | 
            +
                if client_ip in IP_Country_Cache:
         | 
| 155 | 
            +
                    geo_info = IP_Country_Cache[client_ip]
         | 
| 156 | 
            +
                    lang = get_lang_from_country(geo_info["country"])
         | 
| 157 | 
            +
                    return lang, geo_info
         | 
| 158 | 
            +
                
         | 
| 159 | 
            +
                # Return default immediately, query in background
         | 
| 160 | 
            +
                return "en", None
         | 
| 161 | 
            +
             | 
| 162 | 
            +
            def get_lang_from_country(country):
         | 
| 163 | 
            +
                """
         | 
| 164 | 
            +
                Map country name to language code with comprehensive validation
         | 
| 165 | 
            +
                
         | 
| 166 | 
            +
                Features:
         | 
| 167 | 
            +
                - Handles invalid/empty input
         | 
| 168 | 
            +
                - Case-insensitive matching
         | 
| 169 | 
            +
                - Detailed logging
         | 
| 170 | 
            +
                - Always returns valid language code
         | 
| 171 | 
            +
                
         | 
| 172 | 
            +
                Args:
         | 
| 173 | 
            +
                    country (str): Country name
         | 
| 174 | 
            +
                    
         | 
| 175 | 
            +
                Returns:
         | 
| 176 | 
            +
                    str: Language code (always valid, defaults to "en")
         | 
| 177 | 
            +
                """
         | 
| 178 | 
            +
                # Input validation
         | 
| 179 | 
            +
                if not country or not isinstance(country, str) or country.strip() == "":
         | 
| 180 | 
            +
                    print(f"Invalid country provided: '{country}', defaulting to English")
         | 
| 181 | 
            +
                    return "en"
         | 
| 182 | 
            +
                
         | 
| 183 | 
            +
                # Normalize country name
         | 
| 184 | 
            +
                country = country.strip()
         | 
| 185 | 
            +
                if country.lower() == "unknown":
         | 
| 186 | 
            +
                    print(f"Unknown country, defaulting to English")
         | 
| 187 | 
            +
                    return "en"
         | 
| 188 | 
            +
                
         | 
| 189 | 
            +
                try:
         | 
| 190 | 
            +
                    # Search in country dictionary with case-sensitive match first
         | 
| 191 | 
            +
                    for lang, countries in country_dict.items():
         | 
| 192 | 
            +
                        if country in countries:
         | 
| 193 | 
            +
                            print(f"Matched country '{country}' to language '{lang}'")
         | 
| 194 | 
            +
                            return lang
         | 
| 195 | 
            +
                    
         | 
| 196 | 
            +
                    # If no exact match, try case-insensitive match
         | 
| 197 | 
            +
                    country_lower = country.lower()
         | 
| 198 | 
            +
                    for lang, countries in country_dict.items():
         | 
| 199 | 
            +
                        for country_variant in countries:
         | 
| 200 | 
            +
                            if country_variant.lower() == country_lower:
         | 
| 201 | 
            +
                                print(f"Case-insensitive match: country '{country}' to language '{lang}'")
         | 
| 202 | 
            +
                                return lang
         | 
| 203 | 
            +
                    
         | 
| 204 | 
            +
                    # No match found
         | 
| 205 | 
            +
                    print(f"Country '{country}' not found in country_dict, defaulting to English")
         | 
| 206 | 
            +
                    return "en"
         | 
| 207 |  | 
| 208 | 
             
                except Exception as e:
         | 
| 209 | 
            +
                    print(f"Error matching country '{country}': {e}, defaulting to English")
         | 
| 210 | 
            +
                    return "en"
         | 
| 211 | 
            +
             | 
| 212 | 
            +
            def get_lang_from_ip(client_ip):
         | 
| 213 | 
            +
                """
         | 
| 214 | 
            +
                Get language based on IP geolocation with comprehensive error handling
         | 
| 215 | 
            +
                
         | 
| 216 | 
            +
                Features:
         | 
| 217 | 
            +
                - Validates input IP address
         | 
| 218 | 
            +
                - Handles all possible exceptions
         | 
| 219 | 
            +
                - Always returns a valid language code
         | 
| 220 | 
            +
                - Defaults to English on any failure
         | 
| 221 | 
            +
                - Includes detailed logging
         | 
| 222 | 
            +
                
         | 
| 223 | 
            +
                Args:
         | 
| 224 | 
            +
                    client_ip (str): Client IP address
         | 
| 225 | 
            +
                    
         | 
| 226 | 
            +
                Returns:
         | 
| 227 | 
            +
                    str: Language code (always valid, defaults to "en")
         | 
| 228 | 
            +
                """
         | 
| 229 | 
            +
                # Input validation
         | 
| 230 | 
            +
                if not client_ip or not isinstance(client_ip, str):
         | 
| 231 | 
            +
                    print(f"Invalid IP address provided: {client_ip}, defaulting to English")
         | 
| 232 | 
            +
                    return "en"
         | 
| 233 | 
            +
                
         | 
| 234 | 
            +
                try:
         | 
| 235 | 
            +
                    # Query geolocation info (has its own error handling and 3s timeout)
         | 
| 236 | 
            +
                    geo_info = query_ip_country(client_ip)
         | 
| 237 | 
            +
                    
         | 
| 238 | 
            +
                    if not geo_info or not isinstance(geo_info, dict):
         | 
| 239 | 
            +
                        print(f"No geolocation data for {client_ip}, defaulting to English")
         | 
| 240 | 
            +
                        return "en"
         | 
| 241 | 
            +
                    
         | 
| 242 | 
            +
                    # Extract country with fallback
         | 
| 243 | 
            +
                    country = geo_info.get("country", "Unknown")
         | 
| 244 | 
            +
                    if not country or country == "Unknown":
         | 
| 245 | 
            +
                        print(f"Unknown country for IP {client_ip}, defaulting to English") 
         | 
| 246 | 
            +
                        return "en"
         | 
| 247 | 
            +
                    
         | 
| 248 | 
            +
                    # Map country to language
         | 
| 249 | 
            +
                    detected_lang = get_lang_from_country(country)
         | 
| 250 | 
            +
                    
         | 
| 251 | 
            +
                    # Validate language code
         | 
| 252 | 
            +
                    if not detected_lang or not isinstance(detected_lang, str) or len(detected_lang) != 2:
         | 
| 253 | 
            +
                        print(f"Invalid language code '{detected_lang}' for {client_ip}, defaulting to English")
         | 
| 254 | 
            +
                        return "en"
         | 
| 255 | 
            +
                    
         | 
| 256 | 
            +
                    print(f"IP {client_ip} -> Country: {country} -> Language: {detected_lang}")
         | 
| 257 | 
            +
                    return detected_lang
         | 
| 258 | 
            +
                    
         | 
| 259 | 
            +
                except Exception as e:
         | 
| 260 | 
            +
                    print(f"Unexpected error getting language from IP {client_ip}: {e}, defaulting to English")
         | 
| 261 | 
            +
                    return "en"  # Always return a valid language code
         | 
| 262 |  | 
| 263 | 
             
            def is_restricted_country_ip(client_ip):
         | 
| 264 | 
             
                """
         | 
|  | |
| 487 | 
             
                print(f"❌ NSFW detector initialization failed: {e}")
         | 
| 488 | 
             
                nsfw_detector = None
         | 
| 489 |  | 
| 490 | 
            +
            def edit_image_interface(input_image, prompt, lang, request: gr.Request, progress=gr.Progress()):
         | 
| 491 | 
             
                """
         | 
| 492 | 
             
                Interface function for processing image editing with phase-based limitations
         | 
| 493 | 
             
                """
         | 
|  | |
| 502 | 
             
                    IP_Dict[client_ip] += 1
         | 
| 503 |  | 
| 504 | 
             
                    if input_image is None:
         | 
| 505 | 
            +
                        return None, t("error_upload_first", lang), gr.update(visible=False)
         | 
| 506 |  | 
| 507 | 
             
                    if not prompt or prompt.strip() == "":
         | 
| 508 | 
            +
                        return None, t("error_enter_prompt", lang), gr.update(visible=False)
         | 
| 509 |  | 
| 510 | 
             
                    # Check if prompt length is greater than 3 characters
         | 
| 511 | 
             
                    if len(prompt.strip()) <= 3:
         | 
| 512 | 
            +
                        return None, t("error_prompt_too_short", lang), gr.update(visible=False)
         | 
| 513 | 
             
                except Exception as e:
         | 
| 514 | 
             
                    print(f"⚠️ Request preprocessing error: {e}")
         | 
| 515 | 
            +
                    return None, t("error_request_processing", lang), gr.update(visible=False)
         | 
| 516 |  | 
| 517 | 
             
                # Get user current phase
         | 
| 518 | 
             
                current_phase = get_ip_phase(client_ip)
         | 
|  | |
| 550 | 
             
                    """
         | 
| 551 |  | 
| 552 | 
             
                    # Use same message for all users to avoid discrimination perception
         | 
| 553 | 
            +
                    blocked_message = t("error_free_limit_reached", lang)
         | 
| 554 |  | 
| 555 | 
             
                    return None, blocked_message, gr.update(value=blocked_button_html, visible=True)
         | 
| 556 |  | 
|  | |
| 581 | 
             
                            '>⏰ Skip Wait - Unlimited Generation</a>
         | 
| 582 | 
             
                        </div>
         | 
| 583 | 
             
                        """
         | 
| 584 | 
            +
                        return None, t("error_free_limit_wait", lang).format(wait_minutes_int=wait_minutes_int), gr.update(value=rate_limit_button_html, visible=True)
         | 
| 585 |  | 
| 586 | 
             
                # Handle NSFW detection based on phase
         | 
| 587 | 
             
                is_nsfw_task = False  # Track if this task involves NSFW content
         | 
|  | |
| 643 | 
             
                        if nsfw_detector is not None and current_phase != 'free':
         | 
| 644 | 
             
                            try:
         | 
| 645 | 
             
                                if progress is not None:
         | 
| 646 | 
            +
                                    progress(0.9, desc=t("status_checking_result", lang))
         | 
| 647 |  | 
| 648 | 
             
                                is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector)
         | 
| 649 |  | 
|  | |
| 667 | 
             
                        # Apply blur processing
         | 
| 668 | 
             
                        if should_blur:
         | 
| 669 | 
             
                            if progress is not None:
         | 
| 670 | 
            +
                                progress(0.95, desc=t("status_applying_filter", lang))
         | 
| 671 |  | 
| 672 | 
             
                            blurred_image = apply_gaussian_blur_to_image_url(result_url)
         | 
| 673 | 
             
                            if blurred_image is not None:
         | 
| 674 | 
             
                                final_result = blurred_image  # Return PIL Image object
         | 
| 675 | 
            +
                                final_message = t("warning_content_filter", lang)
         | 
| 676 | 
             
                                print(f"🔒 Applied Gaussian blur for NSFW content - IP: {client_ip}")
         | 
| 677 | 
             
                            else:
         | 
| 678 | 
             
                                # Blur failed, return original URL with warning
         | 
| 679 | 
             
                                final_result = result_url
         | 
| 680 | 
            +
                                final_message = t("warning_content_review", lang)
         | 
| 681 |  | 
| 682 | 
             
                            # Generate NSFW button for blurred content
         | 
| 683 | 
             
                            nsfw_action_buttons_html = f"""
         | 
|  | |
| 704 | 
             
                            return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True)
         | 
| 705 | 
             
                        else:
         | 
| 706 | 
             
                            final_result = result_url
         | 
| 707 | 
            +
                            final_message = t("status_completed_message", lang).format(message=message)
         | 
| 708 |  | 
| 709 | 
             
                        try:
         | 
| 710 | 
             
                            if progress is not None:
         | 
| 711 | 
            +
                                progress(1.0, desc=t("status_processing_completed", lang))
         | 
| 712 | 
             
                        except Exception as e:
         | 
| 713 | 
             
                            print(f"⚠️ Final progress update failed: {e}")
         | 
| 714 |  | 
|  | |
| 784 | 
             
                        return final_result, final_message, gr.update(value=action_buttons_html, visible=True)
         | 
| 785 | 
             
                    else:
         | 
| 786 | 
             
                        print(f"❌ Processing failed - IP: {client_ip}, error: {message}", flush=True)
         | 
| 787 | 
            +
                        return None, t("error_processing_failed", lang).format(message=message), gr.update(visible=False)
         | 
| 788 |  | 
| 789 | 
             
                except Exception as e:
         | 
| 790 | 
             
                    print(f"❌ Processing exception - IP: {client_ip}, error: {str(e)}")
         | 
| 791 | 
            +
                    return None, t("error_processing_exception", lang).format(error=str(e)), gr.update(visible=False)
         | 
| 792 |  | 
| 793 | 
            +
            def local_edit_interface(image_dict, prompt, reference_image, lang, request: gr.Request, progress=gr.Progress()):
         | 
| 794 | 
             
                """
         | 
| 795 | 
             
                Handle local editing requests (with phase-based limitations)
         | 
| 796 | 
             
                """
         | 
|  | |
| 805 | 
             
                    IP_Dict[client_ip] += 1
         | 
| 806 |  | 
| 807 | 
             
                    if image_dict is None:
         | 
| 808 | 
            +
                        return None, t("error_upload_and_draw", lang), gr.update(visible=False)
         | 
| 809 |  | 
| 810 | 
             
                    # Handle different input formats for ImageEditor
         | 
| 811 | 
             
                    if isinstance(image_dict, dict):
         | 
| 812 | 
             
                        # ImageEditor dict format
         | 
| 813 | 
             
                        if "background" not in image_dict or "layers" not in image_dict:
         | 
| 814 | 
            +
                            return None, t("error_draw_on_image", lang), gr.update(visible=False)
         | 
| 815 |  | 
| 816 | 
             
                        base_image = image_dict["background"]
         | 
| 817 | 
             
                        layers = image_dict["layers"]
         | 
|  | |
| 853 | 
             
                    if base_image is None:
         | 
| 854 | 
             
                        if is_example_case:
         | 
| 855 | 
             
                            print(f"❌ Example case but base_image still None!")
         | 
| 856 | 
            +
                        return None, t("error_no_image_found", lang), gr.update(visible=False)
         | 
| 857 |  | 
| 858 | 
             
                    if not layers and not is_example_case:
         | 
| 859 | 
            +
                        return None, t("error_draw_on_image", lang), gr.update(visible=False)
         | 
| 860 |  | 
| 861 | 
             
                    if not prompt or prompt.strip() == "":
         | 
| 862 | 
            +
                        return None, t("error_enter_prompt", lang), gr.update(visible=False)
         | 
| 863 |  | 
| 864 | 
             
                    # Check prompt length
         | 
| 865 | 
             
                    if len(prompt.strip()) <= 3:
         | 
| 866 | 
            +
                        return None, t("error_prompt_too_short", lang), gr.update(visible=False)
         | 
| 867 | 
             
                except Exception as e:
         | 
| 868 | 
             
                    print(f"⚠️ Local edit request preprocessing error: {e}")
         | 
| 869 | 
            +
                    return None, t("error_request_processing", lang), gr.update(visible=False)
         | 
| 870 |  | 
| 871 | 
             
                # Get user current phase
         | 
| 872 | 
             
                current_phase = get_ip_phase(client_ip)
         | 
|  | |
| 904 | 
             
                    """
         | 
| 905 |  | 
| 906 | 
             
                    # Use same message for all users to avoid discrimination perception
         | 
| 907 | 
            +
                    blocked_message = t("error_free_limit_reached", lang)
         | 
| 908 |  | 
| 909 | 
             
                    return None, blocked_message, gr.update(value=blocked_button_html, visible=True)
         | 
| 910 |  | 
|  | |
| 935 | 
             
                            '>⏰ Skip Wait - Unlimited Generation</a>
         | 
| 936 | 
             
                        </div>
         | 
| 937 | 
             
                        """
         | 
| 938 | 
            +
                        return None, t("error_free_limit_wait", lang).format(wait_minutes_int=wait_minutes_int), gr.update(value=rate_limit_button_html, visible=True)
         | 
| 939 |  | 
| 940 | 
             
                # Handle NSFW detection based on phase
         | 
| 941 | 
             
                is_nsfw_task = False  # Track if this task involves NSFW content
         | 
|  | |
| 1007 | 
             
                        if nsfw_detector is not None and current_phase != 'free':
         | 
| 1008 | 
             
                            try:
         | 
| 1009 | 
             
                                if progress is not None:
         | 
| 1010 | 
            +
                                    progress(0.9, desc=t("status_checking_result", lang))
         | 
| 1011 |  | 
| 1012 | 
             
                                is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector)
         | 
| 1013 |  | 
|  | |
| 1031 | 
             
                        # Apply blur processing
         | 
| 1032 | 
             
                        if should_blur:
         | 
| 1033 | 
             
                            if progress is not None:
         | 
| 1034 | 
            +
                                progress(0.95, desc=t("status_applying_filter", lang))
         | 
| 1035 |  | 
| 1036 | 
             
                            blurred_image = apply_gaussian_blur_to_image_url(result_url)
         | 
| 1037 | 
             
                            if blurred_image is not None:
         | 
| 1038 | 
             
                                final_result = blurred_image  # Return PIL Image object
         | 
| 1039 | 
            +
                                final_message = t("warning_content_filter", lang)
         | 
| 1040 | 
             
                                print(f"🔒 Local edit applied Gaussian blur for NSFW content - IP: {client_ip}")
         | 
| 1041 | 
             
                            else:
         | 
| 1042 | 
             
                                # Blur failed, return original URL with warning
         | 
| 1043 | 
             
                                final_result = result_url
         | 
| 1044 | 
            +
                                final_message = t("warning_content_review", lang)
         | 
| 1045 |  | 
| 1046 | 
             
                            # Generate NSFW button for blurred content
         | 
| 1047 | 
             
                            nsfw_action_buttons_html = f"""
         | 
|  | |
| 1068 | 
             
                            return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True)
         | 
| 1069 | 
             
                        else:
         | 
| 1070 | 
             
                            final_result = result_url
         | 
| 1071 | 
            +
                            final_message = t("status_completed_message", lang).format(message=message)
         | 
| 1072 |  | 
| 1073 | 
             
                        try:
         | 
| 1074 | 
             
                            if progress is not None:
         | 
| 1075 | 
            +
                                progress(1.0, desc=t("status_processing_completed", lang))
         | 
| 1076 | 
             
                        except Exception as e:
         | 
| 1077 | 
             
                            print(f"⚠️ Local edit final progress update failed: {e}")
         | 
| 1078 |  | 
|  | |
| 1148 | 
             
                        return final_result, final_message, gr.update(value=action_buttons_html, visible=True)
         | 
| 1149 | 
             
                    else:
         | 
| 1150 | 
             
                        print(f"❌ Local editing processing failed - IP: {client_ip}, error: {message}", flush=True)
         | 
| 1151 | 
            +
                        return None, t("error_processing_failed", lang).format(message=message), gr.update(visible=False)
         | 
| 1152 |  | 
| 1153 | 
             
                except Exception as e:
         | 
| 1154 | 
             
                    print(f"❌ Local editing exception - IP: {client_ip}, error: {str(e)}")
         | 
| 1155 | 
            +
                    return None, t("error_processing_exception", lang).format(error=str(e)), gr.update(visible=False)
         | 
| 1156 |  | 
| 1157 | 
             
            # Create Gradio interface
         | 
| 1158 | 
             
            def create_app():
         | 
|  | |
| 1164 | 
             
                        max-width: 1200px;
         | 
| 1165 | 
             
                        margin: 0 auto;
         | 
| 1166 | 
             
                    }
         | 
| 1167 | 
            +
                    .news-banner-row {
         | 
| 1168 | 
            +
                        margin: 10px auto 15px auto;
         | 
| 1169 | 
            +
                        padding: 0 10px;
         | 
| 1170 | 
            +
                        max-width: 1200px;
         | 
| 1171 | 
            +
                        width: 100% !important;
         | 
| 1172 | 
            +
                    }
         | 
| 1173 | 
            +
                    .news-banner-row .gr-row {
         | 
| 1174 | 
            +
                        display: flex !important;
         | 
| 1175 | 
            +
                        align-items: center !important;
         | 
| 1176 | 
            +
                        width: 100% !important;
         | 
| 1177 | 
            +
                    }
         | 
| 1178 | 
            +
                    .news-banner-row .gr-column:first-child {
         | 
| 1179 | 
            +
                        flex: 1 !important; /* 占据所有剩余空间 */
         | 
| 1180 | 
            +
                        display: flex !important;
         | 
| 1181 | 
            +
                        justify-content: center !important; /* 在其空间内居中 */
         | 
| 1182 | 
            +
                    }
         | 
| 1183 | 
            +
                    .banner-lang-selector {
         | 
| 1184 | 
            +
                        margin-left: auto !important;
         | 
| 1185 | 
            +
                        display: flex !important;
         | 
| 1186 | 
            +
                        justify-content: flex-end !important;
         | 
| 1187 | 
            +
                        align-items: center !important;
         | 
| 1188 | 
            +
                        position: relative !important;
         | 
| 1189 | 
            +
                        z-index: 10 !important;
         | 
| 1190 | 
            +
                    }
         | 
| 1191 | 
            +
                    .banner-lang-selector .gr-dropdown {
         | 
| 1192 | 
            +
                        background: white !important;
         | 
| 1193 | 
            +
                        border: 1px solid #ddd !important;
         | 
| 1194 | 
            +
                        border-radius: 8px !important;
         | 
| 1195 | 
            +
                        padding: 8px 16px !important;
         | 
| 1196 | 
            +
                        font-size: 14px !important;
         | 
| 1197 | 
            +
                        font-weight: 500 !important;
         | 
| 1198 | 
            +
                        color: #333 !important;
         | 
| 1199 | 
            +
                        cursor: pointer !important;
         | 
| 1200 | 
            +
                        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important;
         | 
| 1201 | 
            +
                        min-width: 140px !important;
         | 
| 1202 | 
            +
                        max-width: 160px !important;
         | 
| 1203 | 
            +
                        transition: all 0.2s ease !important;
         | 
| 1204 | 
            +
                    }
         | 
| 1205 | 
            +
                    .banner-lang-selector .gr-dropdown:hover {
         | 
| 1206 | 
            +
                        border-color: #999 !important;
         | 
| 1207 | 
            +
                        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15) !important;
         | 
| 1208 | 
            +
                    }
         | 
| 1209 | 
            +
                    @media (max-width: 768px) {
         | 
| 1210 | 
            +
                        .news-banner-row {
         | 
| 1211 | 
            +
                            padding: 0 15px !important;
         | 
| 1212 | 
            +
                        }
         | 
| 1213 | 
            +
                        .news-banner-row .gr-row {
         | 
| 1214 | 
            +
                            display: flex !important;
         | 
| 1215 | 
            +
                            flex-direction: column !important;
         | 
| 1216 | 
            +
                            gap: 10px !important;
         | 
| 1217 | 
            +
                            position: static !important;
         | 
| 1218 | 
            +
                        }
         | 
| 1219 | 
            +
                        .news-banner-row .gr-column:first-child {
         | 
| 1220 | 
            +
                            position: static !important;
         | 
| 1221 | 
            +
                            pointer-events: auto !important;
         | 
| 1222 | 
            +
                        }
         | 
| 1223 | 
            +
                        .banner-lang-selector {
         | 
| 1224 | 
            +
                            margin-left: 0 !important;
         | 
| 1225 | 
            +
                            justify-content: center !important;
         | 
| 1226 | 
            +
                        }
         | 
| 1227 | 
            +
                    }
         | 
| 1228 | 
             
                    .upload-area {
         | 
| 1229 | 
             
                        border: 2px dashed #ccc;
         | 
| 1230 | 
             
                        border-radius: 10px;
         | 
|  | |
| 1253 | 
             
                    """
         | 
| 1254 | 
             
                ) as app:
         | 
| 1255 |  | 
| 1256 | 
            +
                    lang_state = gr.State("en")
         | 
| 1257 | 
            +
             | 
| 1258 | 
            +
                    # Main title - centered
         | 
| 1259 | 
            +
                    header_title = gr.HTML(f"""
         | 
| 1260 | 
            +
                    <div style="text-align: center; margin: 20px auto 10px auto; max-width: 800px;">
         | 
| 1261 | 
             
                        <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);">
         | 
| 1262 | 
            +
                            {t('header_title', 'en')}
         | 
| 1263 | 
             
                        </h1>
         | 
| 1264 | 
             
                    </div>
         | 
| 1265 | 
            +
                    """)
         | 
| 1266 |  | 
| 1267 | 
            +
                    # 🌟 NEW: Multi-Image Editing Announcement Banner with language selector
         | 
| 1268 | 
            +
                    with gr.Row(elem_classes=["news-banner-row"]):
         | 
| 1269 | 
            +
                        with gr.Column(scale=1, min_width=400):
         | 
| 1270 | 
            +
                            news_banner = gr.HTML(f"""
         | 
| 1271 | 
            +
                            <style>
         | 
| 1272 | 
            +
                            @keyframes breathe {{
         | 
| 1273 | 
            +
                                0%, 100% {{ transform: scale(1); }}
         | 
| 1274 | 
            +
                                50% {{ transform: scale(1.02); }}
         | 
| 1275 | 
            +
                            }}
         | 
| 1276 | 
            +
                            .breathing-banner {{
         | 
| 1277 | 
            +
                                animation: breathe 3s ease-in-out infinite;
         | 
| 1278 | 
            +
                            }}
         | 
| 1279 | 
            +
                            </style>
         | 
| 1280 | 
            +
                            <div class="breathing-banner" style="
         | 
| 1281 | 
            +
                                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
         | 
| 1282 | 
            +
                                margin: 0 auto;
         | 
| 1283 | 
            +
                                padding: 8px 40px;
         | 
| 1284 | 
            +
                                border-radius: 20px;
         | 
| 1285 | 
            +
                                max-width: 600px;
         | 
| 1286 | 
            +
                                box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
         | 
| 1287 | 
            +
                                text-align: center;
         | 
| 1288 | 
            +
                                width: fit-content;
         | 
| 1289 | 
            +
                            ">
         | 
| 1290 | 
            +
                                <span style="color: white; font-weight: 600; font-size: 1.0em;">
         | 
| 1291 | 
            +
                                    {t('news_banner_prefix', 'en')} 
         | 
| 1292 | 
            +
                                    <a href="https://huggingface.co/spaces/Selfit/Multi-Image-Edit" target="_blank" style="
         | 
| 1293 | 
            +
                                        color: white; 
         | 
| 1294 | 
            +
                                        text-decoration: none; 
         | 
| 1295 | 
            +
                                        border-bottom: 1px solid rgba(255,255,255,0.5);
         | 
| 1296 | 
            +
                                        transition: all 0.3s ease;
         | 
| 1297 | 
            +
                                    " onmouseover="this.style.borderBottom='1px solid white'" 
         | 
| 1298 | 
            +
                                       onmouseout="this.style.borderBottom='1px solid rgba(255,255,255,0.5)'">
         | 
| 1299 | 
            +
                                       {t('news_banner_link', 'en')}
         | 
| 1300 | 
            +
                                    </a>
         | 
| 1301 | 
            +
                                </span>
         | 
| 1302 | 
            +
                            </div>
         | 
| 1303 | 
            +
                            """)
         | 
| 1304 | 
            +
                        
         | 
| 1305 | 
            +
                        with gr.Column(scale=0, min_width=160, elem_classes=["banner-lang-selector"]):
         | 
| 1306 | 
            +
                            lang_dropdown = gr.Dropdown(
         | 
| 1307 | 
            +
                                choices=[
         | 
| 1308 | 
            +
                                    ("English", "en"), 
         | 
| 1309 | 
            +
                                    ("中文", "zh"),
         | 
| 1310 | 
            +
                                    ("Español", "es"),
         | 
| 1311 | 
            +
                                    ("Français", "fr"),
         | 
| 1312 | 
            +
                                    ("Deutsch", "de"), 
         | 
| 1313 | 
            +
                                    ("Italiano", "it"),
         | 
| 1314 | 
            +
                                    ("日本語", "ja"),
         | 
| 1315 | 
            +
                                    ("Русский", "ru"),
         | 
| 1316 | 
            +
                                    ("العربية", "ar"),
         | 
| 1317 | 
            +
                                    ("Nederlands", "nl"),
         | 
| 1318 | 
            +
                                    ("Indonesian", "id")
         | 
| 1319 | 
            +
                                ],
         | 
| 1320 | 
            +
                                value="en",
         | 
| 1321 | 
            +
                                label="🌐",
         | 
| 1322 | 
            +
                                show_label=True,
         | 
| 1323 | 
            +
                                interactive=True,
         | 
| 1324 | 
            +
                                container=False
         | 
| 1325 | 
            +
                            )
         | 
| 1326 |  | 
| 1327 | 
            +
                    with gr.Tabs() as tabs:
         | 
| 1328 | 
            +
                        with gr.Tab(t("global_editor_tab", "en")) as global_tab:
         | 
| 1329 | 
             
                            with gr.Row():
         | 
| 1330 | 
             
                                with gr.Column(scale=1):
         | 
| 1331 | 
            +
                                    upload_image_header = gr.Markdown(t("upload_image_header", "en"))
         | 
| 1332 | 
             
                                    input_image = gr.Image(
         | 
| 1333 | 
            +
                                        label=t("upload_image_label", "en"),
         | 
| 1334 | 
             
                                        type="pil",
         | 
| 1335 | 
             
                                        height=512,
         | 
| 1336 | 
             
                                        elem_classes=["upload-area"]
         | 
| 1337 | 
             
                                    )
         | 
| 1338 |  | 
| 1339 | 
            +
                                    editing_instructions_header = gr.Markdown(t("editing_instructions_header", "en"))
         | 
| 1340 | 
             
                                    prompt_input = gr.Textbox(
         | 
| 1341 | 
            +
                                        label=t("prompt_input_label", "en"),
         | 
| 1342 | 
            +
                                        placeholder=t("prompt_input_placeholder", "en"),
         | 
| 1343 | 
             
                                        lines=3,
         | 
| 1344 | 
             
                                        max_lines=5
         | 
| 1345 | 
             
                                    )
         | 
| 1346 |  | 
| 1347 | 
             
                                    edit_button = gr.Button(
         | 
| 1348 | 
            +
                                        t("start_editing_button", "en"),
         | 
| 1349 | 
             
                                        variant="primary",
         | 
| 1350 | 
             
                                        size="lg"
         | 
| 1351 | 
             
                                    )
         | 
| 1352 |  | 
| 1353 | 
             
                                with gr.Column(scale=1):
         | 
| 1354 | 
            +
                                    editing_result_header = gr.Markdown(t("editing_result_header", "en"))
         | 
| 1355 | 
             
                                    output_image = gr.Image(
         | 
| 1356 | 
            +
                                        label=t("output_image_label", "en"),
         | 
| 1357 | 
             
                                        height=320,
         | 
| 1358 | 
             
                                        elem_classes=["result-area"]
         | 
| 1359 | 
             
                                    )
         | 
| 1360 |  | 
| 1361 | 
             
                                    use_as_input_btn = gr.Button(
         | 
| 1362 | 
            +
                                        t("use_as_input_button", "en"),
         | 
| 1363 | 
             
                                        variant="secondary",
         | 
| 1364 | 
             
                                        size="sm",
         | 
| 1365 | 
             
                                        elem_classes=["use-as-input-btn"]
         | 
| 1366 | 
             
                                    )
         | 
| 1367 |  | 
| 1368 | 
             
                                    status_output = gr.Textbox(
         | 
| 1369 | 
            +
                                        label=t("status_output_label", "en"),
         | 
| 1370 | 
             
                                        lines=2,
         | 
| 1371 | 
             
                                        max_lines=3,
         | 
| 1372 | 
             
                                        interactive=False
         | 
|  | |
| 1374 |  | 
| 1375 | 
             
                                    action_buttons = gr.HTML(visible=False)
         | 
| 1376 |  | 
| 1377 | 
            +
                            prompt_examples_header = gr.Markdown(t("prompt_examples_header", "en"))
         | 
| 1378 | 
             
                            with gr.Row():
         | 
| 1379 | 
             
                                example_prompts = [
         | 
| 1380 | 
             
                                    "Set the background to a grand opera stage with red curtains",
         | 
|  | |
| 1395 |  | 
| 1396 | 
             
                            edit_button.click(
         | 
| 1397 | 
             
                                fn=edit_image_interface,
         | 
| 1398 | 
            +
                                inputs=[input_image, prompt_input, lang_state],
         | 
| 1399 | 
             
                                outputs=[output_image, status_output, action_buttons],
         | 
| 1400 | 
             
                                show_progress=True,
         | 
| 1401 | 
             
                                concurrency_limit=10,
         | 
|  | |
| 1413 | 
             
                                outputs=[input_image]
         | 
| 1414 | 
             
                            )
         | 
| 1415 |  | 
| 1416 | 
            +
                        with gr.Tab(t("local_inpaint_tab", "en")) as local_tab:
         | 
| 1417 | 
             
                            with gr.Row():
         | 
| 1418 | 
             
                                with gr.Column(scale=1):
         | 
| 1419 | 
            +
                                    upload_and_draw_mask_header = gr.Markdown(t("upload_and_draw_mask_header", "en"))
         | 
| 1420 | 
             
                                    local_input_image = gr.ImageEditor(
         | 
| 1421 | 
            +
                                        label=t("upload_and_draw_mask_label", "en"),
         | 
| 1422 | 
             
                                        type="pil",
         | 
| 1423 | 
             
                                        height=512,
         | 
| 1424 | 
             
                                        brush=gr.Brush(colors=["#ff0000"], default_size=180),
         | 
| 1425 | 
             
                                        elem_classes=["upload-area"]
         | 
| 1426 | 
             
                                    )
         | 
| 1427 |  | 
| 1428 | 
            +
                                    reference_image_header = gr.Markdown(t("reference_image_header", "en"))
         | 
| 1429 | 
             
                                    local_reference_image = gr.Image(
         | 
| 1430 | 
            +
                                        label=t("reference_image_label", "en"),
         | 
| 1431 | 
             
                                        type="pil",
         | 
| 1432 | 
             
                                        height=256
         | 
| 1433 | 
             
                                    )
         | 
| 1434 |  | 
| 1435 | 
            +
                                    local_editing_instructions_header = gr.Markdown(t("editing_instructions_header", "en"))
         | 
| 1436 | 
             
                                    local_prompt_input = gr.Textbox(
         | 
| 1437 | 
            +
                                        label=t("local_prompt_input_label", "en"),
         | 
| 1438 | 
            +
                                        placeholder=t("local_prompt_input_placeholder", "en"),
         | 
| 1439 | 
             
                                        lines=3,
         | 
| 1440 | 
             
                                        max_lines=5
         | 
| 1441 | 
             
                                    )
         | 
| 1442 |  | 
| 1443 | 
             
                                    local_edit_button = gr.Button(
         | 
| 1444 | 
            +
                                        t("start_local_editing_button", "en"),
         | 
| 1445 | 
             
                                        variant="primary",
         | 
| 1446 | 
             
                                        size="lg"
         | 
| 1447 | 
             
                                    )
         | 
| 1448 |  | 
| 1449 | 
             
                                with gr.Column(scale=1):
         | 
| 1450 | 
            +
                                    local_editing_result_header = gr.Markdown(t("editing_result_header", "en"))
         | 
| 1451 | 
             
                                    local_output_image = gr.Image(
         | 
| 1452 | 
            +
                                        label=t("local_output_image_label", "en"),
         | 
| 1453 | 
             
                                        height=320,
         | 
| 1454 | 
             
                                        elem_classes=["result-area"]
         | 
| 1455 | 
             
                                    )
         | 
| 1456 |  | 
| 1457 | 
             
                                    local_use_as_input_btn = gr.Button(
         | 
| 1458 | 
            +
                                        t("use_as_input_button", "en"),
         | 
| 1459 | 
             
                                        variant="secondary",
         | 
| 1460 | 
             
                                        size="sm",
         | 
| 1461 | 
             
                                        elem_classes=["use-as-input-btn"]
         | 
| 1462 | 
             
                                    )
         | 
| 1463 |  | 
| 1464 | 
             
                                    local_status_output = gr.Textbox(
         | 
| 1465 | 
            +
                                        label=t("status_output_label", "en"),
         | 
| 1466 | 
             
                                        lines=2,
         | 
| 1467 | 
             
                                        max_lines=3,
         | 
| 1468 | 
             
                                        interactive=False
         | 
|  | |
| 1472 |  | 
| 1473 | 
             
                            local_edit_button.click(
         | 
| 1474 | 
             
                                fn=local_edit_interface,
         | 
| 1475 | 
            +
                                inputs=[local_input_image, local_prompt_input, local_reference_image, lang_state],
         | 
| 1476 | 
             
                                outputs=[local_output_image, local_status_output, local_action_buttons],
         | 
| 1477 | 
             
                                show_progress=True,
         | 
| 1478 | 
             
                                concurrency_limit=8,
         | 
|  | |
| 1495 | 
             
                            )
         | 
| 1496 |  | 
| 1497 | 
             
                            # Local inpaint example
         | 
| 1498 | 
            +
                            local_inpaint_example_header = gr.Markdown(t("local_inpaint_example_header", "en"))
         | 
| 1499 |  | 
| 1500 | 
             
                            def load_local_example():
         | 
| 1501 | 
             
                                """Load panda to cat transformation example - simplified, mask handled in backend"""
         | 
|  | |
| 1536 | 
             
                                    return None, None, "EXAMPLE_PANDA_CAT_Transform the panda head into a cute cat head, keeping the body"
         | 
| 1537 |  | 
| 1538 | 
             
                                # Example display
         | 
| 1539 | 
            +
                            panda_to_cat_example_header = gr.Markdown(t("panda_to_cat_example_header", "en"))
         | 
| 1540 | 
             
                            with gr.Row():
         | 
| 1541 | 
             
                                with gr.Column(scale=2):
         | 
| 1542 | 
             
                                    # Preview images for local example
         | 
| 1543 | 
             
                                    with gr.Row():
         | 
| 1544 | 
             
                                        try:
         | 
| 1545 | 
            +
                                            gr.Image("datas/panda01.jpeg", label=t("main_image_label", "en"), height=120, width=120, show_label=True, interactive=False)
         | 
| 1546 | 
            +
                                            gr.Image("datas/panda01m.jpeg", label=t("mask_label", "en"), height=120, width=120, show_label=True, interactive=False)
         | 
| 1547 | 
            +
                                            gr.Image("datas/cat01.webp", label=t("reference_label", "en"), height=120, width=120, show_label=True, interactive=False)
         | 
| 1548 | 
             
                                        except:
         | 
| 1549 | 
             
                                            gr.Markdown("*Preview images not available*")
         | 
| 1550 | 
            +
                                    panda_example_note = gr.Markdown(t("panda_example_note", "en"))
         | 
| 1551 | 
             
                                with gr.Column(scale=1):
         | 
| 1552 | 
            +
                                    load_panda_example_button = gr.Button(
         | 
| 1553 | 
            +
                                        t("load_panda_example_button", "en"),
         | 
| 1554 | 
             
                                        size="lg",
         | 
| 1555 | 
             
                                        variant="secondary"
         | 
| 1556 | 
            +
                                    )
         | 
| 1557 | 
            +
                                    load_panda_example_button.click(
         | 
| 1558 | 
             
                                        fn=load_local_example,
         | 
| 1559 | 
             
                                        outputs=[local_input_image, local_reference_image, local_prompt_input]
         | 
| 1560 | 
             
                                    )
         | 
| 1561 |  | 
| 1562 | 
             
                            # Add a refresh button to fix UI state issues
         | 
| 1563 | 
            +
                            refresh_editor_button = gr.Button(
         | 
| 1564 | 
            +
                                t("refresh_editor_button", "en"), 
         | 
| 1565 | 
             
                                size="sm",
         | 
| 1566 | 
             
                                variant="secondary"
         | 
| 1567 | 
            +
                            )
         | 
| 1568 | 
            +
                            refresh_editor_button.click(
         | 
| 1569 | 
             
                                fn=lambda: gr.update(),
         | 
| 1570 | 
             
                                outputs=[local_input_image]
         | 
| 1571 | 
             
                            )
         | 
| 1572 |  | 
| 1573 | 
             
                    # SEO Content Section
         | 
| 1574 | 
            +
                    seo_html = gr.HTML()
         | 
| 1575 | 
            +
             | 
| 1576 | 
            +
                    def get_seo_html(lang):
         | 
| 1577 | 
            +
                        return f"""
         | 
| 1578 | 
             
                <div style="width: 100%; margin: 50px 0; padding: 0 20px;">
         | 
| 1579 |  | 
| 1580 | 
             
                    <div style="text-align: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px; border-radius: 20px; margin: 40px 0;">
         | 
| 1581 | 
             
                        <h2 style="margin: 0 0 20px 0; font-size: 2.2em; font-weight: 700;">
         | 
| 1582 | 
            +
                            🎨 {t('seo_unlimited_title', lang)}
         | 
| 1583 | 
             
                        </h2>
         | 
| 1584 | 
             
                        <p style="margin: 0 0 25px 0; font-size: 1.2em; opacity: 0.95; line-height: 1.6;">
         | 
| 1585 | 
            +
                            {t('seo_unlimited_desc', lang)}
         | 
|  | |
| 1586 | 
             
                        </p>
         | 
| 1587 |  | 
| 1588 | 
             
                        <div style="display: flex; justify-content: center; gap: 25px; flex-wrap: wrap; margin: 30px 0;">
         | 
|  | |
| 1604 | 
             
                                border: none;
         | 
| 1605 | 
             
                                transform: scale(1);
         | 
| 1606 | 
             
                            " onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'">
         | 
| 1607 | 
            +
                                🚀 {t('seo_unlimited_button', lang)}
         | 
| 1608 | 
             
                            </a>
         | 
| 1609 |  | 
| 1610 | 
             
                        </div>
         | 
| 1611 |  | 
| 1612 | 
             
                        <p style="color: rgba(255,255,255,0.9); font-size: 1em; margin: 20px 0 0 0;">
         | 
| 1613 | 
            +
                            {t('seo_unlimited_footer', lang)}
         | 
| 1614 | 
             
                        </p>
         | 
| 1615 | 
             
                    </div>
         | 
| 1616 |  | 
| 1617 | 
             
                    <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);">
         | 
| 1618 | 
             
                        <h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.9em; font-weight: 700;">
         | 
| 1619 | 
            +
                            ⭐ {t('seo_professional_title', lang)}
         | 
| 1620 | 
             
                        </h2>
         | 
| 1621 | 
             
                        <p style="color: #555; font-size: 1.1em; line-height: 1.6; margin: 0 0 20px 0; padding: 0 20px;">
         | 
| 1622 | 
            +
                            {t('seo_professional_desc', lang)}
         | 
|  | |
|  | |
| 1623 | 
             
                        </p>
         | 
| 1624 | 
             
                    </div>
         | 
| 1625 |  | 
|  | |
| 1627 |  | 
| 1628 | 
             
                        <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;">
         | 
| 1629 | 
             
                            <h3 style="color: #e74c3c; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1630 | 
            +
                                🎯 {t('seo_feature1_title', lang)}
         | 
| 1631 | 
             
                            </h3>
         | 
| 1632 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1633 | 
            +
                                {t('seo_feature1_desc', lang)}
         | 
|  | |
| 1634 | 
             
                            </p>
         | 
| 1635 | 
             
                        </div>
         | 
| 1636 |  | 
| 1637 | 
             
                        <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;">
         | 
| 1638 | 
             
                            <h3 style="color: #3498db; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1639 | 
            +
                                🔓 {t('seo_feature2_title', lang)}
         | 
| 1640 | 
             
                            </h3>
         | 
| 1641 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1642 | 
            +
                                {t('seo_feature2_desc', lang)}
         | 
|  | |
| 1643 | 
             
                            </p>
         | 
| 1644 | 
             
                        </div>
         | 
| 1645 |  | 
| 1646 | 
             
                        <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;">
         | 
| 1647 | 
             
                            <h3 style="color: #27ae60; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1648 | 
            +
                                ⚡ {t('seo_feature3_title', lang)}
         | 
| 1649 | 
             
                            </h3>
         | 
| 1650 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1651 | 
            +
                                {t('seo_feature3_desc', lang)}
         | 
|  | |
| 1652 | 
             
                            </p>
         | 
| 1653 | 
             
                        </div>
         | 
| 1654 |  | 
| 1655 | 
             
                        <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;">
         | 
| 1656 | 
             
                            <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1657 | 
            +
                                🎨 {t('seo_feature4_title', lang)}
         | 
| 1658 | 
             
                            </h3>
         | 
| 1659 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1660 | 
            +
                                {t('seo_feature4_desc', lang)}
         | 
|  | |
| 1661 | 
             
                            </p>
         | 
| 1662 | 
             
                        </div>
         | 
| 1663 |  | 
| 1664 | 
             
                        <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;">
         | 
| 1665 | 
             
                            <h3 style="color: #f39c12; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1666 | 
            +
                                💎 {t('seo_feature5_title', lang)}
         | 
| 1667 | 
             
                            </h3>
         | 
| 1668 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1669 | 
            +
                                {t('seo_feature5_desc', lang)}
         | 
|  | |
| 1670 | 
             
                            </p>
         | 
| 1671 | 
             
                        </div>
         | 
| 1672 |  | 
| 1673 | 
             
                        <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;">
         | 
| 1674 | 
             
                            <h3 style="color: #34495e; margin: 0 0 15px 0; font-size: 1.4em; font-weight: 600;">
         | 
| 1675 | 
            +
                                🌍 {t('seo_feature6_title', lang)}
         | 
| 1676 | 
             
                            </h3>
         | 
| 1677 | 
             
                            <p style="color: #666; margin: 0; line-height: 1.6; font-size: 1em;">
         | 
| 1678 | 
            +
                                {t('seo_feature6_desc', lang)}
         | 
|  | |
| 1679 | 
             
                            </p>
         | 
| 1680 | 
             
                        </div>
         | 
| 1681 |  | 
|  | |
| 1683 |  | 
| 1684 | 
             
                    <div style="background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 50%, #fecfef 100%); padding: 30px; border-radius: 15px; margin: 40px 0;">
         | 
| 1685 | 
             
                        <h3 style="color: #8b5cf6; text-align: center; margin: 0 0 25px 0; font-size: 1.5em; font-weight: 700;">
         | 
| 1686 | 
            +
                            💡 {t('seo_protips_title', lang)}
         | 
| 1687 | 
             
                        </h3>
         | 
| 1688 | 
             
                        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 18px;">
         | 
| 1689 |  | 
| 1690 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1691 | 
            +
                                <strong style="color: #8b5cf6; font-size: 1.1em;">📝 {t('seo_protip1_title', lang)}</strong>
         | 
| 1692 | 
            +
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">{t('seo_protip1_desc', lang)}</p>
         | 
| 1693 | 
             
                            </div>
         | 
| 1694 |  | 
| 1695 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1696 | 
            +
                                <strong style="color: #8b5cf6; font-size: 1.1em;">🎯 {t('seo_protip2_title', lang)}</strong>
         | 
| 1697 | 
            +
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">{t('seo_protip2_desc', lang)}</p>
         | 
| 1698 | 
             
                            </div>
         | 
| 1699 |  | 
| 1700 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1701 | 
            +
                                <strong style="color: #8b5cf6; font-size: 1.1em;">⚡ {t('seo_protip3_title', lang)}</strong>
         | 
| 1702 | 
            +
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">{t('seo_protip3_desc', lang)}</p>
         | 
| 1703 | 
             
                            </div>
         | 
| 1704 |  | 
| 1705 | 
             
                            <div style="background: rgba(255,255,255,0.85); padding: 18px; border-radius: 12px;">
         | 
| 1706 | 
            +
                                <strong style="color: #8b5cf6; font-size: 1.1em;">🖼 {t('seo_protip4_title', lang)}</strong>
         | 
| 1707 | 
            +
                                <p style="color: #555; margin: 5px 0 0 0; line-height: 1.5;">{t('seo_protip4_desc', lang)}</p>
         | 
| 1708 | 
             
                            </div>
         | 
| 1709 |  | 
| 1710 | 
             
                        </div>
         | 
|  | |
| 1712 |  | 
| 1713 | 
             
                    <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);">
         | 
| 1714 | 
             
                        <h2 style="color: #2c3e50; margin: 0 0 20px 0; font-size: 1.8em; font-weight: 700;">
         | 
| 1715 | 
            +
                            🚀 {t('seo_needs_title', lang)}
         | 
| 1716 | 
             
                        </h2>
         | 
| 1717 | 
             
                        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin: 25px 0; text-align: left;">
         | 
| 1718 |  | 
| 1719 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1720 | 
            +
                                <h4 style="color: #e74c3c; margin: 0 0 10px 0;">🎨 {t('seo_needs_art_title', lang)}</h4>
         | 
| 1721 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1722 | 
            +
                                    <li>{t('seo_needs_art_item1', lang)}</li>
         | 
| 1723 | 
            +
                                    <li>{t('seo_needs_art_item2', lang)}</li>
         | 
| 1724 | 
            +
                                    <li>{t('seo_needs_art_item3', lang)}</li>
         | 
| 1725 | 
            +
                                    <li>{t('seo_needs_art_item4', lang)}</li>
         | 
| 1726 | 
             
                                </ul>
         | 
| 1727 | 
             
                            </div>
         | 
| 1728 |  | 
| 1729 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1730 | 
            +
                                <h4 style="color: #3498db; margin: 0 0 10px 0;">📸 {t('seo_needs_photo_title', lang)}</h4>
         | 
| 1731 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1732 | 
            +
                                    <li>{t('seo_needs_photo_item1', lang)}</li>
         | 
| 1733 | 
            +
                                    <li>{t('seo_needs_photo_item2', lang)}</li>
         | 
| 1734 | 
            +
                                    <li>{t('seo_needs_photo_item3', lang)}</li>
         | 
| 1735 | 
            +
                                    <li>{t('seo_needs_photo_item4', lang)}</li>
         | 
| 1736 | 
             
                                </ul>
         | 
| 1737 | 
             
                            </div>
         | 
| 1738 |  | 
| 1739 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1740 | 
            +
                                <h4 style="color: #27ae60; margin: 0 0 10px 0;">🛍️ {t('seo_needs_ecom_title', lang)}</h4>
         | 
| 1741 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1742 | 
            +
                                    <li>{t('seo_needs_ecom_item1', lang)}</li>
         | 
| 1743 | 
            +
                                    <li>{t('seo_needs_ecom_item2', lang)}</li>
         | 
| 1744 | 
            +
                                    <li>{t('seo_needs_ecom_item3', lang)}</li>
         | 
| 1745 | 
            +
                                    <li>{t('seo_needs_ecom_item4', lang)}</li>
         | 
| 1746 | 
             
                                </ul>
         | 
| 1747 | 
             
                            </div>
         | 
| 1748 |  | 
| 1749 | 
             
                            <div style="background: rgba(255,255,255,0.8); padding: 20px; border-radius: 12px;">
         | 
| 1750 | 
            +
                                <h4 style="color: #9b59b6; margin: 0 0 10px 0;">📱 {t('seo_needs_social_title', lang)}</h4>
         | 
| 1751 | 
             
                                <ul style="color: #555; margin: 0; padding-left: 18px; line-height: 1.6;">
         | 
| 1752 | 
            +
                                    <li>{t('seo_needs_social_item1', lang)}</li>
         | 
| 1753 | 
            +
                                    <li>{t('seo_needs_social_item2', lang)}</li>
         | 
| 1754 | 
            +
                                    <li>{t('seo_needs_social_item3', lang)}</li>
         | 
| 1755 | 
            +
                                    <li>{t('seo_needs_social_item4', lang)}</li>
         | 
| 1756 | 
             
                                </ul>
         | 
| 1757 | 
             
                            </div>
         | 
| 1758 |  | 
|  | |
| 1760 | 
             
                    </div>
         | 
| 1761 |  | 
| 1762 | 
             
                </div>
         | 
| 1763 | 
            +
                """
         | 
| 1764 | 
            +
                    
         | 
| 1765 | 
            +
                    all_ui_components = [
         | 
| 1766 | 
            +
                        header_title, news_banner, 
         | 
| 1767 | 
            +
                        global_tab, upload_image_header, input_image, editing_instructions_header, prompt_input, edit_button,
         | 
| 1768 | 
            +
                        editing_result_header, output_image, use_as_input_btn, status_output, prompt_examples_header,
         | 
| 1769 | 
            +
                        local_tab, upload_and_draw_mask_header, local_input_image, reference_image_header, local_reference_image,
         | 
| 1770 | 
            +
                        local_editing_instructions_header, local_prompt_input, local_edit_button, local_editing_result_header,
         | 
| 1771 | 
            +
                        local_output_image, local_use_as_input_btn, local_status_output, local_inpaint_example_header,
         | 
| 1772 | 
            +
                        panda_to_cat_example_header, panda_example_note, load_panda_example_button, refresh_editor_button,
         | 
| 1773 | 
            +
                        seo_html,
         | 
| 1774 | 
            +
                    ]
         | 
| 1775 | 
            +
             | 
| 1776 | 
            +
                    def update_ui_lang(lang):
         | 
| 1777 | 
            +
                        return {
         | 
| 1778 | 
            +
                            header_title: gr.update(value=f"""
         | 
| 1779 | 
            +
                                <div style="text-align: center; margin: 20px auto 10px auto; max-width: 800px;">
         | 
| 1780 | 
            +
                                    <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);">
         | 
| 1781 | 
            +
                                        {t('header_title', lang)}
         | 
| 1782 | 
            +
                                    </h1>
         | 
| 1783 | 
            +
                                </div>"""),
         | 
| 1784 | 
            +
                            news_banner: gr.update(value=f"""
         | 
| 1785 | 
            +
                                <style>
         | 
| 1786 | 
            +
                                @keyframes breathe {{ 0%, 100% {{ transform: scale(1); }} 50% {{ transform: scale(1.02); }} }}
         | 
| 1787 | 
            +
                                .breathing-banner {{ animation: breathe 3s ease-in-out infinite; }}
         | 
| 1788 | 
            +
                                </style>
         | 
| 1789 | 
            +
                                <div class="breathing-banner" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto 5px auto; padding: 6px 40px; border-radius: 20px; max-width: 700px; box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3); text-align: center;">
         | 
| 1790 | 
            +
                                    <span style="color: white; font-weight: 600; font-size: 1.0em;">
         | 
| 1791 | 
            +
                                        {t('news_banner_prefix', lang)} 
         | 
| 1792 | 
            +
                                        <a href="https://huggingface.co/spaces/Selfit/Multi-Image-Edit" target="_blank" style="color: white; text-decoration: none; border-bottom: 1px solid rgba(255,255,255,0.5); transition: all 0.3s ease;" onmouseover="this.style.borderBottom='1px solid white'" onmouseout="this.style.borderBottom='1px solid rgba(255,255,255,0.5)'">
         | 
| 1793 | 
            +
                                           {t('news_banner_link', lang)}
         | 
| 1794 | 
            +
                                        </a>
         | 
| 1795 | 
            +
                                    </span>
         | 
| 1796 | 
            +
                                </div>"""),
         | 
| 1797 | 
            +
                            global_tab: gr.update(label=t("global_editor_tab", lang)),
         | 
| 1798 | 
            +
                            upload_image_header: gr.update(value=t("upload_image_header", lang)),
         | 
| 1799 | 
            +
                            input_image: gr.update(label=t("upload_image_label", lang)),
         | 
| 1800 | 
            +
                            editing_instructions_header: gr.update(value=t("editing_instructions_header", lang)),
         | 
| 1801 | 
            +
                            prompt_input: gr.update(label=t("prompt_input_label", lang), placeholder=t("prompt_input_placeholder", lang)),
         | 
| 1802 | 
            +
                            edit_button: gr.update(value=t("start_editing_button", lang)),
         | 
| 1803 | 
            +
                            editing_result_header: gr.update(value=t("editing_result_header", lang)),
         | 
| 1804 | 
            +
                            output_image: gr.update(label=t("output_image_label", lang)),
         | 
| 1805 | 
            +
                            use_as_input_btn: gr.update(value=t("use_as_input_button", lang)),
         | 
| 1806 | 
            +
                            status_output: gr.update(label=t("status_output_label", lang)),
         | 
| 1807 | 
            +
                            prompt_examples_header: gr.update(value=t("prompt_examples_header", lang)),
         | 
| 1808 | 
            +
                            local_tab: gr.update(label=t("local_inpaint_tab", lang)),
         | 
| 1809 | 
            +
                            upload_and_draw_mask_header: gr.update(value=t("upload_and_draw_mask_header", lang)),
         | 
| 1810 | 
            +
                            local_input_image: gr.update(label=t("upload_and_draw_mask_label", lang)),
         | 
| 1811 | 
            +
                            reference_image_header: gr.update(value=t("reference_image_header", lang)),
         | 
| 1812 | 
            +
                            local_reference_image: gr.update(label=t("reference_image_label", lang)),
         | 
| 1813 | 
            +
                            local_editing_instructions_header: gr.update(value=t("editing_instructions_header", lang)),
         | 
| 1814 | 
            +
                            local_prompt_input: gr.update(label=t("local_prompt_input_label", lang), placeholder=t("local_prompt_input_placeholder", lang)),
         | 
| 1815 | 
            +
                            local_edit_button: gr.update(value=t("start_local_editing_button", lang)),
         | 
| 1816 | 
            +
                            local_editing_result_header: gr.update(value=t("editing_result_header", lang)),
         | 
| 1817 | 
            +
                            local_output_image: gr.update(label=t("local_output_image_label", lang)),
         | 
| 1818 | 
            +
                            local_use_as_input_btn: gr.update(value=t("use_as_input_button", lang)),
         | 
| 1819 | 
            +
                            local_status_output: gr.update(label=t("status_output_label", lang)),
         | 
| 1820 | 
            +
                            local_inpaint_example_header: gr.update(value=t("local_inpaint_example_header", lang)),
         | 
| 1821 | 
            +
                            panda_to_cat_example_header: gr.update(value=t("panda_to_cat_example_header", lang)),
         | 
| 1822 | 
            +
                            panda_example_note: gr.update(value=t("panda_example_note", lang)),
         | 
| 1823 | 
            +
                            load_panda_example_button: gr.update(value=t("load_panda_example_button", lang)),
         | 
| 1824 | 
            +
                            refresh_editor_button: gr.update(value=t("refresh_editor_button", lang)),
         | 
| 1825 | 
            +
                            seo_html: gr.update(value=get_seo_html(lang)),
         | 
| 1826 | 
            +
                        }
         | 
| 1827 | 
            +
             | 
| 1828 | 
            +
                    def on_lang_change(lang):
         | 
| 1829 | 
            +
                        return lang, *update_ui_lang(lang).values()
         | 
| 1830 | 
            +
                        
         | 
| 1831 | 
            +
                    lang_dropdown.change(
         | 
| 1832 | 
            +
                        on_lang_change,
         | 
| 1833 | 
            +
                        inputs=[lang_dropdown],
         | 
| 1834 | 
            +
                        outputs=[lang_state] + all_ui_components
         | 
| 1835 | 
            +
                    )
         | 
| 1836 | 
            +
             | 
| 1837 | 
            +
                    # IP query state for async loading
         | 
| 1838 | 
            +
                    ip_query_state = gr.State({"status": "pending", "ip": None, "lang": "en"})
         | 
| 1839 | 
            +
                    
         | 
| 1840 | 
            +
                    def on_load_immediate(request: gr.Request):
         | 
| 1841 | 
            +
                        """
         | 
| 1842 | 
            +
                        Load page with language based on robust IP detection
         | 
| 1843 | 
            +
                        
         | 
| 1844 | 
            +
                        Features:
         | 
| 1845 | 
            +
                        - Multiple fallback layers for IP extraction
         | 
| 1846 | 
            +
                        - Comprehensive error handling
         | 
| 1847 | 
            +
                        - Always returns valid language (defaults to English)
         | 
| 1848 | 
            +
                        - Detailed logging for debugging
         | 
| 1849 | 
            +
                        """
         | 
| 1850 | 
            +
                        # Extract client IP with multiple fallback methods
         | 
| 1851 | 
            +
                        client_ip = None
         | 
| 1852 | 
            +
                        try:
         | 
| 1853 | 
            +
                            # Primary method: direct client host
         | 
| 1854 | 
            +
                            client_ip = request.client.host
         | 
| 1855 | 
            +
                            
         | 
| 1856 | 
            +
                            # Secondary method: check forwarded headers  
         | 
| 1857 | 
            +
                            headers = dict(request.headers) if hasattr(request, 'headers') else {}
         | 
| 1858 | 
            +
                            x_forwarded_for = headers.get('x-forwarded-for') or headers.get('X-Forwarded-For')
         | 
| 1859 | 
            +
                            if x_forwarded_for:
         | 
| 1860 | 
            +
                                # Take first IP from comma-separated list
         | 
| 1861 | 
            +
                                client_ip = x_forwarded_for.split(',')[0].strip()
         | 
| 1862 | 
            +
                            
         | 
| 1863 | 
            +
                            # Alternative headers
         | 
| 1864 | 
            +
                            if not client_ip or client_ip in ["127.0.0.1", "localhost"]:
         | 
| 1865 | 
            +
                                client_ip = headers.get('x-real-ip') or headers.get('X-Real-IP') or client_ip
         | 
| 1866 | 
            +
                            
         | 
| 1867 | 
            +
                        except Exception as e:
         | 
| 1868 | 
            +
                            print(f"Error extracting client IP: {e}, using default")
         | 
| 1869 | 
            +
                            client_ip = "unknown"
         | 
| 1870 | 
            +
                        
         | 
| 1871 | 
            +
                        # Validate extracted IP
         | 
| 1872 | 
            +
                        if not client_ip:
         | 
| 1873 | 
            +
                            client_ip = "unknown"
         | 
| 1874 | 
            +
                        
         | 
| 1875 | 
            +
                        print(f"Loading page for IP: {client_ip}")
         | 
| 1876 | 
            +
                        
         | 
| 1877 | 
            +
                        # Determine language with robust error handling
         | 
| 1878 | 
            +
                        try:
         | 
| 1879 | 
            +
                            # Check if IP is already cached (second+ visit)
         | 
| 1880 | 
            +
                            if client_ip in IP_Country_Cache:
         | 
| 1881 | 
            +
                                # Use cached data - very fast
         | 
| 1882 | 
            +
                                cached_lang = get_lang_from_ip(client_ip)
         | 
| 1883 | 
            +
                                # Validate cached language
         | 
| 1884 | 
            +
                                if cached_lang and len(cached_lang) == 2:
         | 
| 1885 | 
            +
                                    print(f"Using cached language: {cached_lang} for IP: {client_ip}")
         | 
| 1886 | 
            +
                                    query_state = {"ip": client_ip, "cached": True}
         | 
| 1887 | 
            +
                                    return cached_lang, cached_lang, query_state, *update_ui_lang(cached_lang).values()
         | 
| 1888 | 
            +
                            
         | 
| 1889 | 
            +
                            # First visit: Query IP and determine language (max 3s timeout built-in)
         | 
| 1890 | 
            +
                            print(f"First visit - detecting language for IP: {client_ip}")
         | 
| 1891 | 
            +
                            detected_lang = get_lang_from_ip(client_ip)
         | 
| 1892 | 
            +
                            
         | 
| 1893 | 
            +
                            # Double-check the detected language is valid
         | 
| 1894 | 
            +
                            if not detected_lang or len(detected_lang) != 2:
         | 
| 1895 | 
            +
                                print(f"Invalid detected language '{detected_lang}', using English")
         | 
| 1896 | 
            +
                                detected_lang = "en"
         | 
| 1897 | 
            +
                            
         | 
| 1898 | 
            +
                            print(f"First visit - Final language: {detected_lang} for IP: {client_ip}")
         | 
| 1899 | 
            +
                            query_state = {"ip": client_ip, "cached": False}
         | 
| 1900 | 
            +
                            return detected_lang, detected_lang, query_state, *update_ui_lang(detected_lang).values()
         | 
| 1901 | 
            +
                            
         | 
| 1902 | 
            +
                        except Exception as e:
         | 
| 1903 | 
            +
                            # Ultimate fallback - always works
         | 
| 1904 | 
            +
                            print(f"Critical error in language detection for {client_ip}: {e}")
         | 
| 1905 | 
            +
                            print("Using English as ultimate fallback")
         | 
| 1906 | 
            +
                            query_state = {"ip": client_ip or "unknown", "cached": False, "error": str(e)}
         | 
| 1907 | 
            +
                            return "en", "en", query_state, *update_ui_lang("en").values()
         | 
| 1908 | 
            +
             | 
| 1909 | 
            +
             | 
| 1910 | 
            +
                    app.load(
         | 
| 1911 | 
            +
                        on_load_immediate,
         | 
| 1912 | 
            +
                        inputs=None,
         | 
| 1913 | 
            +
                        outputs=[lang_state, lang_dropdown, ip_query_state] + all_ui_components,
         | 
| 1914 | 
            +
                    )
         | 
| 1915 | 
            +
             | 
| 1916 | 
             
                return app
         | 
| 1917 |  | 
| 1918 | 
             
            if __name__ == "__main__":
         | 
    	
        i18n/ar.json
    ADDED
    
    | @@ -0,0 +1,102 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
                "app_title": "محرر الصور بالذكاء الاصطناعي",
         | 
| 3 | 
            +
                "header_title": "🎨 محرر الصور بالذكاء الاصطناعي",
         | 
| 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": "توليد وتحرير صور غير محدود بالذكاء الاصطناعي",
         | 
| 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/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": "Das weltweit erste Multi-Bild-Bearbeitungstool →",
         | 
| 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": "World's First Multi-Image Editing Tool →",
         | 
| 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": "La primera herramienta de edición de múltiples imágenes del mundo →",
         | 
| 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/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": "Le premier outil de retouche multi-images au monde →",
         | 
| 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/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": "Alat edit multi-gambar pertama di dunia →",
         | 
| 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": "Il primo strumento di modifica multi-immagine al mondo →",
         | 
| 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": "世界初のマルチ画像編集ツール →",
         | 
| 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": "De eerste multi-beeld-bewerkingstool ter wereld →",
         | 
| 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/ru.json
    ADDED
    
    | @@ -0,0 +1,102 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
                "app_title": "Редактор изображений с ИИ",
         | 
| 3 | 
            +
                "header_title": "🎨 Редактор изображений с ИИ",
         | 
| 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": "Безлимитная генерация и редактирование изображений с ИИ",
         | 
| 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/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 | 
            +
            }
         | 
    	
        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 | 
            +
            }
         |