From 97cbe8f10f27612cdf406450f3f17b86e819bdad Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 13 Nov 2025 09:20:24 +0000 Subject: [PATCH] 3 --- assets/css/custom.css | 208 +++++++- assets/js/main.js | 6 +- db/setup.php | 7 + faq.php | 3 +- includes/footer.php | 9 +- includes/header.php | 27 +- includes/translations.php | 986 +++++++++++--------------------------- index.php | 4 +- list_users.php | 11 + pricing.php | 2 - register.php | 17 +- terms.php | 2 - 12 files changed, 526 insertions(+), 756 deletions(-) create mode 100644 list_users.php diff --git a/assets/css/custom.css b/assets/css/custom.css index 74a82aa..7da551a 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -142,6 +142,10 @@ a:hover { color: var(--color-secondary); } padding: 0.5rem; border: 1px solid var(--border-color); border-radius: var(--border-radius); + transition: background-color 0.2s; +} +.language-switcher:hover .selected-lang { + background-color: var(--bg-color); } .selected-lang img { width: 20px; @@ -155,32 +159,50 @@ a:hover { color: var(--color-secondary); } .icon-sm { width: 16px; height: 16px; + transition: transform 0.2s ease-in-out; +} +.language-switcher:hover .icon-sm { + transform: rotate(180deg); } .lang-dropdown { - display: none; + display: block; /* Use opacity and visibility for animation */ position: absolute; - top: 100%; + top: calc(100% + 0.5rem); right: 0; background-color: var(--surface-color); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: 0.5rem; - margin-top: 0.5rem; - box-shadow: 0 4px 12px rgba(0,0,0,0.1); - min-width: 120px; + box-shadow: 0 8px 24px rgba(0,0,0,0.1); + min-width: 150px; + z-index: 10; + + /* Animation */ + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s; } .language-switcher:hover .lang-dropdown { - display: block; + opacity: 1; + visibility: visible; + transform: translateY(0); } .lang-dropdown a { display: flex; align-items: center; - gap: 0.5rem; - padding: 0.5rem; + gap: 0.75rem; + padding: 0.6rem 0.8rem; border-radius: calc(var(--border-radius) / 2); + color: var(--text-color); + font-weight: 500; } .lang-dropdown a:hover, .lang-dropdown a.active { background-color: var(--bg-color); + color: var(--color-primary); +} +.lang-dropdown a.active { + font-weight: 600; } .lang-dropdown a img { width: 20px; @@ -189,6 +211,67 @@ a:hover { color: var(--color-secondary); } border-radius: 2px; } +/* --- User Menu --- */ +.user-menu { + position: relative; +} +.user-menu-toggle { + background: none; + border: none; + cursor: pointer; + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem; + border-radius: 50px; + transition: background-color 0.2s; +} +.user-menu:hover .user-menu-toggle { + background-color: var(--bg-color); +} +.avatar { + width: 36px; + height: 36px; + border-radius: 50%; + object-fit: cover; + border: 2px solid var(--border-color); +} +.user-menu .icon-sm { + color: var(--text-color); +} +.user-dropdown { + display: block; + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + background-color: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + padding: 0.5rem; + box-shadow: 0 8px 24px rgba(0,0,0,0.1); + min-width: 160px; + z-index: 10; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s; +} +.user-menu:hover .user-dropdown { + opacity: 1; + visibility: visible; + transform: translateY(0); +} +.user-dropdown a { + display: block; + padding: 0.6rem 1rem; + color: var(--text-color); + border-radius: calc(var(--border-radius) / 2); +} +.user-dropdown a:hover { + background-color: var(--bg-color); + color: var(--color-primary); +} + /* --- Theme Switch --- */ .theme-switch-wrapper { display: flex; align-items: center; } .theme-switch { position: relative; display: inline-block; width: 50px; height: 26px; } @@ -532,4 +615,111 @@ input:checked + .slider:before { transform: translateX(24px); } } .terms-content ul, .terms-content ol { padding-left: 1.5rem; -} \ No newline at end of file +} + +/* --- Generator Form --- */ +.generator-section { + padding: calc(var(--base-spacing) * 3) 0; + background-color: var(--surface-color); +} +.generator-form { + background-color: var(--bg-color); + padding: calc(var(--base-spacing) * 2); + border-radius: var(--border-radius); + border: 1px solid var(--border-color); +} +.form-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: calc(var(--base-spacing) * 2); + margin-bottom: calc(var(--base-spacing) * 2); +} +.form-column-wide { + grid-column: 1 / -1; +} +.generator-form .form-group label { + font-size: 0.9rem; + font-weight: 600; + color: var(--subtle-text-color); + text-transform: uppercase; +} +.generator-form input[type="text"], +.generator-form input[type="number"], +.generator-form textarea, +.generator-form select { + width: 100%; + padding: 0.8rem 1rem; + border: 2px solid var(--border-color); + border-radius: var(--border-radius); + background-color: var(--surface-color); + color: var(--text-color); + font-family: var(--font-family-body); + font-size: 1rem; + transition: border-color 0.2s, box-shadow 0.2s; +} +.generator-form input:focus, +.generator-form textarea:focus, +.generator-form select:focus { + outline: none; + border-color: var(--color-primary); + box-shadow: 0 0 0 4px rgba(108, 99, 255, 0.2); +} +.generator-form select { + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%236c757d' class='bi bi-chevron-down' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 1rem center; + background-size: 1em; +} +.form-submit-group { + text-align: center; + margin-top: calc(var(--base-spacing) * 2); +} +.cta-button { + background: var(--gradient); + color: white; + padding: 1rem 2.5rem; + border-radius: 50px; + font-weight: 700; + font-family: var(--font-family-headings); + text-transform: uppercase; + letter-spacing: 1px; + border: none; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s; +} +.cta-button:hover { + transform: translateY(-3px); + box-shadow: 0 10px 20px rgba(0,0,0,0.1); + color: white; +} + +/* --- Hero Section --- */ +.hero { + background: var(--gradient); + padding: 6rem 0; + text-align: center; + margin-top: 2rem; + border-radius: var(--border-radius); +} +.hero h1, .hero p { + color: white; +} +.hero h1 { + font-size: 3.5rem; + font-weight: 700; +} +.hero p { + font-size: 1.25rem; + margin-top: 1rem; + margin-bottom: 2rem; + opacity: 0.9; +} +.hero .cta-button { + background: white; + color: var(--color-primary); +} +.hero .cta-button:hover { + background: var(--surface-color); + color: var(--color-primary); +} diff --git a/assets/js/main.js b/assets/js/main.js index 6262428..84e510d 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -3,7 +3,7 @@ document.addEventListener('DOMContentLoaded', function () { feather.replace(); // --- Theme Switcher --- - const themeSwitch = document.getElementById('checkbox'); + const themeSwitch = document.getElementById('theme-checkbox'); const currentTheme = localStorage.getItem('theme'); if (currentTheme) { @@ -23,7 +23,9 @@ document.addEventListener('DOMContentLoaded', function () { } } - themeSwitch.addEventListener('change', switchTheme, false); + if (themeSwitch) { + themeSwitch.addEventListener('change', switchTheme, false); + } // --- Generator Form: Photo Upload --- const uploadArea = document.getElementById('upload-area'); diff --git a/db/setup.php b/db/setup.php index b64283c..6b5b049 100644 --- a/db/setup.php +++ b/db/setup.php @@ -19,6 +19,7 @@ try { $sql_users = " CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP @@ -26,6 +27,12 @@ try { $pdo->exec($sql_users); echo "Table 'users' is ready.\n"; + // Add username column to users table + if (!columnExists($pdo, 'users', 'username')) { + $pdo->exec("ALTER TABLE users ADD COLUMN username VARCHAR(255) NOT NULL AFTER id"); + echo "Column 'username' added to 'users' table.\n"; + } + // Add role column to users table if (!columnExists($pdo, 'users', 'role')) { $pdo->exec("ALTER TABLE users ADD COLUMN role VARCHAR(50) NOT NULL DEFAULT 'user'"); diff --git a/faq.php b/faq.php index 99f7a83..5625a57 100644 --- a/faq.php +++ b/faq.php @@ -1,10 +1,9 @@
+

diff --git a/includes/footer.php b/includes/footer.php index 7c54cda..9161c04 100644 --- a/includes/footer.php +++ b/includes/footer.php @@ -1,5 +1,12 @@
-

+

© . All rights reserved.

+ + + + + \ No newline at end of file diff --git a/includes/header.php b/includes/header.php index a2767ba..c8eaaab 100644 --- a/includes/header.php +++ b/includes/header.php @@ -22,13 +22,7 @@ if (isset($_GET['lang'])) { exit(); } -$lang = $_SESSION['lang'] ?? 'en'; -$translations = get_translations(); - -function t($key) { - global $translations, $lang; - return $translations[$lang][$key] ?? $key; -} +$lang = get_current_language(); $is_logged_in = isset($_SESSION['user_id']); ?> @@ -42,7 +36,8 @@ $is_logged_in = isset($_SESSION['user_id']); - + + @@ -67,10 +62,10 @@ $is_logged_in = isset($_SESSION['user_id']);
<?php echo $lang; ?> - +
- - +
+ +
+ + +
+
diff --git a/includes/translations.php b/includes/translations.php index df046d0..4786f19 100644 --- a/includes/translations.php +++ b/includes/translations.php @@ -1,759 +1,307 @@ [ - 'app_name' => 'Captionista', + 'app_name' => 'AI Content Generator', 'nav_generator' => 'Generator', + 'nav_pricing' => 'Pricing', + 'nav_faq' => 'FAQ', + 'nav_terms' => 'Terms', 'nav_history' => 'History', - 'nav_subscription' => 'Subscription', - 'nav_login' => 'Login', - 'nav_register' => 'Register', - 'nav_logout' => 'Logout', 'nav_profile' => 'Profile', - 'hero_title' => 'AI-Powered Descriptions for Your Clothing Store.', - 'hero_subtitle' => 'Effortlessly create compelling, SEO-friendly product listings in seconds.', - 'hero_cta' => 'Get Started for Free', - 'how_it_works_title' => 'How It Works', - 'step1_title' => 'Upload', - 'step1_desc' => 'Upload up to 5 photos of your product.', - 'step2_title' => 'Input Details', - 'step2_desc' => 'Add key information like material, size, and brand.', - 'step3_title' => 'Generate', - 'step3_desc' => 'Receive a complete, ready-to-use description.', - 'features_title' => 'Features', - 'feature1_title' => 'AI-Powered Descriptions', - 'feature2_title' => 'Multilingual Support', - 'feature3_title' => 'History & Export', - 'pricing_title' => 'Pricing', - 'pricing_free' => 'Free', - 'pricing_paid' => 'Paid', - 'pricing_premium' => 'Premium', - 'pricing_coming_soon' => 'Coming Soon', - 'footer_copyright' => '© 2025 Captionista. All Rights Reserved.', - 'generator_form_title' => 'Create Your Description', - 'upload_label' => 'Upload Photos (up to 5)', + 'nav_logout' => 'Logout', + 'nav_register' => 'Register', + 'nav_login' => 'Login', + 'admin_panel_title' => 'Admin Panel', + 'auth_form_title' => 'Login to your account', + 'auth_form_email' => 'Email', + 'auth_form_password' => 'Password', + 'auth_form_submit' => 'Login', + 'auth_form_no_account' => "Don\'t have an account?", + 'auth_form_register_link' => 'Register here', + 'registration_form_title' => 'Create a new account', + 'registration_form_username' => 'Username', + 'registration_form_email' => 'Email', + 'registration_form_password' => 'Password', + 'registration_form_password_confirm' => 'Confirm Password', + 'registration_form_submit' => 'Register', + 'registration_form_has_account' => 'Already have an account?', + 'registration_form_login_link' => 'Login here', + 'password_reset_title' => 'Reset Password', + 'password_reset_email' => 'Email', + 'password_reset_submit' => 'Send Password Reset Link', + 'password_reset_return_to_login' => 'Return to Login', + 'profile_title' => 'Profile', + 'profile_username' => 'Username', + 'profile_email' => 'Email', + 'profile_created_at' => 'Registration Date', + 'profile_credits' => 'Credits', + 'profile_subscription_status' => 'Subscription Status', + 'profile_subscription_none' => 'None', + 'profile_subscription_active' => 'Active', + 'profile_subscription_expires' => 'Expires on', + 'profile_manage_subscription_btn' => 'Manage Subscription', + 'pricing_title' => 'Choose Your Plan', + 'pricing_subtitle' => 'Unlock premium features and get more credits.', + 'pricing_free_title' => 'Free', + 'pricing_free_price' => '$0 / month', + 'pricing_free_feature_1' => '10 credits', + 'pricing_free_feature_2' => 'Basic content generation', + 'pricing_free_feature_3' => 'Access to history', + 'pricing_free_btn' => 'Current Plan', + 'pricing_pro_title' => 'Pro', + 'pricing_pro_price' => '$10 / month', + 'pricing_pro_feature_1' => '100 credits per month', + 'pricing_pro_feature_2' => 'Advanced content generation', + 'pricing_pro_feature_3' => 'Priority support', + 'pricing_pro_btn' => 'Subscribe', + 'faq_title' => 'Frequently Asked Questions', + 'faq_q1_title' => 'What is AI Content Generator?', + 'faq_q1_text' => 'It is a tool that uses artificial intelligence to generate content for various purposes.', + 'faq_q2_title' => 'How do credits work?', + 'faq_q2_text' => 'Each generation consumes a certain amount of credits. You can get more by subscribing.', + 'faq_q3_title' => 'Can I use the generated content for commercial purposes?', + 'faq_q3_text' => 'Yes, you can use the generated content for any purpose, including commercial projects.', + 'faq_q4_title' => 'What languages are supported?', + 'faq_q4_text' => 'Currently, we support English and Polish. More languages will be added in the future.', + + 'terms_title' => 'Terms of Service', + 'terms_last_updated' => 'Last Updated: 2025-11-13', + 'terms_section1_title' => 'Acceptance of Terms', + 'terms_section1_text' => 'By accessing and using our service, you accept and agree to be bound by the terms and provision of this agreement.', + 'terms_section2_title' => 'Service Description', + 'terms_section2_text' => 'Our service provides AI-generated content based on user inputs. The service is provided "as is" without any warranties.', + 'terms_section3_title' => 'User Conduct', + 'terms_section3_text' => 'You agree not to use the service for any unlawful purpose or any purpose prohibited under this clause.', + 'terms_section4_title' => 'Intellectual Property', + 'terms_section4_text' => 'The Service and its original content, features, and functionality are and will remain the exclusive property of the service provider.', + 'terms_section5_title' => 'Termination', + 'terms_section5_text' => 'We may terminate or suspend your access to our service immediately, without prior notice or liability, for any reason whatsoever.', + 'history_title' => 'Generation History', + 'history_no_generations' => 'You have no generations yet.', + 'generation_placeholder' => 'Enter your topic or keywords here...', + 'generation_btn' => 'Generate', + 'error_title' => 'Error', + 'error_message' => 'An unexpected error occurred.', + 'insufficient_credits_error' => 'Insufficient credits to proceed with the operation', + 'subscription_expired_error' => 'Your subscription has expired.', + 'generation_limit_exceeded_error' => 'You have exceeded your generation limit for today.', + 'login_to_generate_error' => 'You need to be logged in to generate content.', + 'create_account' => 'Create a new account', + 'register_subtitle' => 'Join our platform to start generating content.', + 'email' => 'Email', + 'password' => 'Password', + 'register_button' => 'Register', + 'already_have_account' => 'Already have an account?', + 'login_link' => 'Login here', + 'fill_all_fields' => 'Please fill in all fields.', + 'invalid_email' => 'Invalid email format.', + 'email_already_registered' => 'This email is already registered.', + 'registration_successful' => 'Registration successful!', + 'login_now' => 'Login now', + 'passwords_do_not_match' => 'Passwords do not match.', + 'hero_title' => 'Create Unique Descriptions in Seconds', + 'hero_subtitle' => 'Our AI will help you create engaging content for your products.', + 'hero_cta' => 'Try it now', + 'generator_form_title' => 'Generate a Description', + 'upload_label' => 'Upload Photos', 'state_label' => 'State', 'state_new' => 'New', 'state_used' => 'Used', 'state_visibly_used' => 'Visibly Used', + 'material_label' => 'Material', + 'brand_label' => 'Brand', + 'size_label' => 'Size', 'length_label' => 'Length (cm)', 'width_chest_label' => 'Chest Width (cm)', 'width_waist_label' => 'Waist Width (cm)', 'width_hips_label' => 'Hips Width (cm)', - 'material_label' => 'Material', - 'size_label' => 'Size', - 'brand_label' => 'Brand/Producer', 'additional_info_label' => 'Additional Info', - 'additional_info_placeholder' => 'e.g., small stain on the sleeve, missing button', - 'generate_button' => 'Generate Description', - 'generated_result' => 'Generated Result', - 'output_title' => 'Title', - 'output_short_description' => 'Short Description', - 'output_description' => 'Description', - 'output_measurements' => 'Measurements', - 'output_hashtags' => 'Hashtags', - 'copy_to_clipboard' => 'Copy', - 'approve' => 'Approve', - 'error_parsing_ai_response' => 'Error: Could not understand the AI response. Please try again.', - 'error_calling_ai_api' => 'Error: Could not connect to the AI service. Please try again later.', - 'error_required_fields' => 'Error: Please fill in all required fields (State and Size).', - 'register_title' => 'Register', - 'create_account' => 'Create Your Account', - 'register_subtitle' => 'Join Captionista to start generating descriptions.', - 'email' => 'Email', - 'password' => 'Password', - 'confirm_password' => 'Confirm Password', - 'register_button' => 'Register', - 'already_have_account' => 'Already have an account?', - 'login_link' => 'Login', - 'login_title' => 'Login', - 'login_heading' => 'Welcome Back!', - 'login_subtitle' => 'Log in to access your account.', - 'login_button' => 'Login', - 'no_account' => "Don't have an account?", - 'register_link' => 'Register', - 'fill_all_fields' => 'Please fill in all fields.', - 'passwords_do_not_match' => 'Passwords do not match.', - 'invalid_email' => 'Invalid email format.', - 'email_already_registered' => 'This email is already registered.', - 'registration_successful' => 'Registration successful! You can now log in.', - 'login_now' => 'Login now.', - 'invalid_credentials' => 'Invalid email or password.', - 'profile_link' => 'Profile', - 'profile_heading' => 'Your Profile', - 'profile_subtitle' => 'Update your account details.', - 'profile_updated_successfully' => 'Profile updated successfully.', - 'email_cannot_be_changed' => 'Email cannot be changed.', - 'new_password' => 'New Password', - 'confirm_new_password' => 'Confirm New Password', - 'update_profile_button' => 'Update Profile', - 'history_title' => 'Generation History', - 'history_empty' => "You haven't generated any descriptions yet.", - 'history_generate_now' => 'Generate Your First Description', - 'generation_date' => 'Generated on', - 'nav_pricing' => 'Pricing', - 'nav_faq' => 'FAQ', - 'nav_terms' => 'Terms of Use', - 'pricing_subtitle' => 'Choose the plan that works for you.', + 'additional_info_placeholder' => 'e.g., any defects, special features', + 'generate_button' => 'Generate', + 'how_it_works_title' => 'How It Works', + 'step1_title' => 'Upload Photos', + 'step1_desc' => 'Add images of your product.', + 'step2_title' => 'Add Details', + 'step2_desc' => 'Provide some basic information.', + 'step3_title' => 'Generate Content', + 'step3_desc' => 'Let our AI do the magic.', + 'basic_plan_name' => 'Basic', + 'premium_plan_name' => 'Premium', + 'basic_plan_limit' => 'Up to 150 generations per month', + 'premium_plan_limit' => 'Unlimited generations', + 'feature_150_generations' => '150 generations', + 'feature_standard_support' => 'Standard support', + 'feature_history_access' => 'Access to generation history', + 'feature_unlimited_generations' => 'Unlimited generations', + 'feature_priority_support' => 'Priority support', 'monthly' => 'Monthly', 'annually' => 'Annually', 'save_15_percent' => 'Save 15%', - 'basic_plan_name' => 'Basic', - 'premium_plan_name' => 'Premium', - 'basic_plan_limit' => '150 generations/month', - 'premium_plan_limit' => 'Unlimited generations', - 'feature_150_generations' => '150 generations per month', - 'feature_unlimited_generations' => 'Unlimited generations', - 'feature_standard_support' => 'Standard email support', - 'feature_priority_support' => 'Priority email support', - 'feature_history_access' => 'Access to generation history', - 'choose_plan' => 'Choose Plan', 'month_short' => 'mo', 'billed_annually_at' => 'Billed annually at', - 'pricing_footer_text' => 'You can upgrade, downgrade, or cancel your subscription at any time. No refunds for partial periods.', - 'faq_title' => 'Frequently Asked Questions', - 'faq_q1_title' => 'How does the subscription work?', - 'faq_q1_text' => 'You can choose between a monthly or annual subscription. The annual plan gives you a 15% discount. Your subscription will automatically renew at the end of each billing cycle.', - 'faq_q2_title' => 'Can I cancel my subscription?', - 'faq_q2_text' => 'Yes, you can cancel your subscription at any time. If you cancel, your subscription will remain active until the end of the current billing period, and it will not be renewed. We do not offer refunds for partial subscription periods.', - 'faq_q3_title' => 'Can I change my plan?', - 'faq_q3_text' => 'Yes, you can upgrade or downgrade your plan at any time. The changes will take effect in the next billing cycle.', - 'faq_q4_title' => 'What happens if I exceed my generation limit on the Basic plan?', - 'faq_q4_text' => 'If you reach the 150-generation limit on the Basic plan, you will need to upgrade to the Premium plan to continue generating descriptions within the same month.', - 'terms_title' => 'Terms of Use', - 'terms_last_updated' => 'Last Updated: November 9, 2025', - 'terms_section1_title' => '1. Acceptance of Terms', - 'terms_section1_text' => 'By accessing and using our service, you accept and agree to be bound by the terms and provision of this agreement. In addition, when using these particular services, you shall be subject to any posted guidelines or rules applicable to such services.', - 'terms_section2_title' => '2. User Accounts', - 'terms_section2_text' => 'You are responsible for maintaining the confidentiality of your account and password. You agree to accept responsibility for all activities that occur under your account or password.', - 'terms_section3_title' => '3. Subscription and Payment', - 'terms_section3_text' => 'All subscriptions are billed in advance on a monthly or annual basis and are non-refundable. Your subscription will automatically renew unless you cancel it.', - 'terms_section4_title' => '4. Termination', - 'terms_section4_text' => 'We may terminate or suspend your account and bar access to the service immediately, without prior notice or liability, under our sole discretion, for any reason whatsoever and without limitation, including but not limited to a breach of the Terms.', - 'terms_section5_title' => '5. Changes to Terms', - 'terms_section5_text' => 'We reserve the right, at our sole discretion, to modify or replace these Terms at any time. We will provide at least 30 days notice prior to any new terms taking effect.', - 'subscription_success_message' => 'Your subscription has been activated successfully!', - 'no_active_subscription' => 'You do not have an active subscription.', - 'choose_plan_to_start' => 'Choose a plan to start generating.', - 'plan' => 'Plan', - 'expires_on' => 'Expires on', - 'change_plan' => 'Change Plan', - 'subscription_expired_error' => 'Your subscription has expired. Please renew your plan to continue generating.', - 'generation_limit_exceeded_error' => 'You have exceeded your monthly generation limit. Please upgrade your plan to continue.', - 'login_to_generate_error' => 'Please log in to generate descriptions.', - 'admin_panel_title' => 'Admin Panel', - 'admin_panel_subtitle' => 'Manage users and application settings.', - 'registered_users' => 'Registered Users', - 'role' => 'Role', - 'subscription_plan' => 'Subscription Plan', - 'subscription_expires_at' => 'Subscription Expires', - 'registered_on' => 'Registered On', - 'no_users_found' => 'No users found.', + 'choose_plan' => 'Choose Plan', + 'pricing_footer_text' => 'Prices are in USD. You can cancel at any time.', + 'history_empty' => 'You have no generation history yet. Create your first one!', + 'history_generate_now' => 'Generate Now', ], 'pl' => [ - 'app_name' => 'Captionista', + 'app_name' => 'Generator Treści AI', 'nav_generator' => 'Generator', + 'nav_pricing' => 'Cennik', + 'nav_faq' => 'FAQ', + 'nav_terms' => 'Regulamin', 'nav_history' => 'Historia', - 'nav_subscription' => 'Subskrypcja', - 'nav_login' => 'Zaloguj się', - 'nav_register' => 'Zarejestruj się', - 'nav_logout' => 'Wyloguj się', 'nav_profile' => 'Profil', - 'hero_title' => 'Opisy do Twojego sklepu odzieżowego wspierane przez AI.', - 'hero_subtitle' => 'Twórz atrakcyjne, zoptymalizowane pod SEO opisy produktów w kilka sekund.', - 'hero_cta' => 'Zacznij za darmo', - 'how_it_works_title' => 'Jak to działa', - 'step1_title' => 'Prześlij', - 'step1_desc' => 'Prześlij do 5 zdjęć swojego produktu.', - 'step2_title' => 'Wprowadź dane', - 'step2_desc' => 'Dodaj kluczowe informacje, takie jak materiał, rozmiar i marka.', - 'step3_title' => 'Generuj', - 'step3_desc' => 'Otrzymaj kompletny, gotowy do użycia opis.', - 'features_title' => 'Funkcje', - 'feature1_title' => 'Opisy wspierane przez AI', - 'feature2_title' => 'Wsparcie wielojęzyczne', - 'feature3_title' => 'Historia i eksport', - 'pricing_title' => 'Cennik', - 'pricing_free' => 'Darmowy', - 'pricing_paid' => 'Płatny', - 'pricing_premium' => 'Premium', - 'pricing_coming_soon' => 'Wkrótce', - 'footer_copyright' => '© 2025 Captionista. Wszelkie prawa zastrzeżone.', - 'generator_form_title' => 'Stwórz swój opis', - 'upload_label' => 'Prześlij zdjęcia (do 5)', + 'nav_logout' => 'Wyloguj', + 'nav_register' => 'Rejestracja', + 'nav_login' => 'Login', + 'admin_panel_title' => 'Panel administratora', + 'auth_form_title' => 'Zaloguj się na swoje konto', + 'auth_form_email' => 'Email', + 'auth_form_password' => 'Hasło', + 'auth_form_submit' => 'Zaloguj', + 'auth_form_no_account' => "Nie masz konta?", + 'auth_form_register_link' => 'Zarejestruj się tutaj', + 'registration_form_title' => 'Utwórz nowe konto', + 'registration_form_username' => 'Nazwa użytkownika', + 'registration_form_email' => 'Email', + 'registration_form_password' => 'Hasło', + 'registration_form_password_confirm' => 'Potwierdź hasło', + 'registration_form_submit' => 'Zarejestruj', + 'registration_form_has_account' => 'Masz już konto?', + 'registration_form_login_link' => 'Zaloguj się tutaj', + 'password_reset_title' => 'Resetuj hasło', + 'password_reset_email' => 'Email', + 'password_reset_submit' => 'Wyślij link do resetowania hasła', + 'password_reset_return_to_login' => 'Wróć do logowania', + 'profile_title' => 'Profil', + 'profile_username' => 'Nazwa użytkownika', + 'profile_email' => 'Email', + 'profile_created_at' => 'Data rejestracji', + 'profile_credits' => 'Kredyty', + 'profile_subscription_status' => 'Status subskrypcji', + 'profile_subscription_none' => 'Brak', + 'profile_subscription_active' => 'Aktywna', + 'profile_subscription_expires' => 'Wygasa dnia', + 'profile_manage_subscription_btn' => 'Zarządzaj subskrypcją', + 'pricing_title' => 'Wybierz swój plan', + 'pricing_subtitle' => 'Odblokuj funkcje premium i zdobądź więcej kredytów.', + 'pricing_free_title' => 'Darmowy', + 'pricing_free_price' => '0 zł / miesiąc', + 'pricing_free_feature_1' => '10 kredytów', + 'pricing_free_feature_2' => 'Podstawowe generowanie treści', + 'pricing_free_feature_3' => 'Dostęp do historii', + 'pricing_free_btn' => 'Obecny plan', + 'pricing_pro_title' => 'Pro', + 'pricing_pro_price' => '40 zł / miesiąc', + 'pricing_pro_feature_1' => '100 kredytów miesięcznie', + 'pricing_pro_feature_2' => 'Zaawansowane generowanie treści', + 'pricing_pro_feature_3' => 'Priorytetowe wsparcie', + 'pricing_pro_btn' => 'Subskrybuj', + 'faq_title' => 'Najczęściej zadawane pytania', + 'faq_q1_title' => 'Czym jest Generator Treści AI?', + 'faq_q1_text' => 'Jest to narzędzie, które wykorzystuje sztuczną inteligencję do generowania treści w różnych celach.', + 'faq_q2_title' => 'Jak działają kredyty?', + 'faq_q2_text' => 'Każde generowanie zużywa określoną ilość kredytów. Możesz uzyskać więcej, subskrybując.', + 'faq_q3_title' => 'Czy mogę używać wygenerowanych treści w celach komercyjnych?', + 'faq_q3_text' => 'Tak, możesz używać wygenerowanych treści w dowolnym celu, w tym w projektach komercyjnych.', + 'faq_q4_title' => 'Jakie języki są obsługiwane?', + 'faq_q4_text' => 'Obecnie obsługujemy język angielski i polski. W przyszłości zostanie dodanych więcej języków.', + 'terms_title' => 'Regulamin usługi', + 'terms_last_updated' => 'Ostatnia aktualizacja: 2025-11-13', + 'terms_section1_title' => 'Akceptacja warunków', + 'terms_section1_text' => 'Korzystając z naszej usługi, akceptujesz i zgadzasz się na przestrzeganie warunków niniejszej umowy.', + 'terms_section2_title' => 'Opis usługi', + 'terms_section2_text' => 'Nasza usługa dostarcza treści generowane przez sztuczną inteligencję na podstawie danych wprowadzonych przez użytkownika. Usługa jest świadczona w stanie, w jakim się znajduje, bez żadnych gwarancji.', + 'terms_section3_title' => 'Postępowanie użytkownika', + 'terms_section3_text' => 'Zgadzasz się nie używać usługi w żadnym celu niezgodnym z prawem lub zabronionym na mocy niniejszej klauzuli.', + 'terms_section4_title' => 'Własność intelektualna', + 'terms_section4_text' => 'Usługa i jej oryginalna treść, funkcje i funkcjonalność są i pozostaną wyłączną własnością dostawcy usługi.', + 'terms_section5_title' => 'Zakończenie świadczenia usług', + 'terms_section5_text' => 'Możemy natychmiast zakończyć lub zawiesić Twój dostęp do naszej usługi, bez wcześniejszego powiadomienia lub odpowiedzialności, z dowolnego powodu.', + 'history_title' => 'Historia generowania', + 'history_no_generations' => 'Nie masz jeszcze żadnych generacji.', + 'generation_placeholder' => 'Wpisz tutaj swój temat lub słowa kluczowe...', + 'generation_btn' => 'Generuj', + 'error_title' => 'Błąd', + 'error_message' => 'Wystąpił nieoczekiwany błąd.', + 'insufficient_credits_error' => 'Niewystarczająca ilość kredytów, aby kontynuować operację', + 'subscription_expired_error' => 'Twoja subskrypcja wygasła.', + 'generation_limit_exceeded_error' => 'Przekroczyłeś limit generowania na dziś.', + 'login_to_generate_error' => 'Musisz być zalogowany, aby generować treści.', + 'create_account' => 'Utwórz nowe konto', + 'register_subtitle' => 'Dołącz do naszej platformy, aby zacząć generować treści.', + 'email' => 'Email', + 'password' => 'Hasło', + 'register_button' => 'Zarejestruj', + 'already_have_account' => 'Masz już konto?', + 'login_link' => 'Zaloguj się tutaj', + 'fill_all_fields' => 'Proszę wypełnić wszystkie pola.', + 'invalid_email' => 'Nieprawidłowy format email.', + 'email_already_registered' => 'Ten email jest już zarejestrowany.', + 'registration_successful' => 'Rejestracja udana!', + 'login_now' => 'Zaloguj się teraz', + 'passwords_do_not_match' => 'Hasła nie pasują do siebie.', + 'hero_title' => 'Twórz unikalne opisy w kilka sekund', + 'hero_subtitle' => 'Nasza SI pomoże Ci stworzyć angażujące treści dla Twoich produktów.', + 'hero_cta' => 'Wypróbuj teraz', + 'generator_form_title' => 'Wygeneruj opis', + 'upload_label' => 'Wgraj zdjęcia', 'state_label' => 'Stan', 'state_new' => 'Nowy', 'state_used' => 'Używany', 'state_visibly_used' => 'Widoczne ślady użytkowania', - 'length_label' => 'Długość (cm)', - 'width_chest_label' => 'Szerokość w klatce piersiowej (cm)', - 'width_waist_label' => 'Szerokość w talii (cm)', - 'width_hips_label' => 'Szerokość w biodrach (cm)', 'material_label' => 'Materiał', + 'brand_label' => 'Marka', 'size_label' => 'Rozmiar', - 'brand_label' => 'Marka/Producent', + 'length_label' => 'Długość (cm)', + 'width_chest_label' => 'Szerokość w klatce (cm)', + 'width_waist_label' => 'Szerokość w pasie (cm)', + 'width_hips_label' => 'Szerokość w biodrach (cm)', 'additional_info_label' => 'Dodatkowe informacje', - 'additional_info_placeholder' => 'np. mała plama na rękawie, brak guzika', - 'generate_button' => 'Generuj opis', - 'generated_result' => 'Wygenerowany wynik', - 'output_title' => 'Tytuł', - 'output_short_description' => 'Krótki opis', - 'output_description' => 'Opis', - 'output_measurements' => 'Wymiary', - 'output_hashtags' => 'Hashtagi', - 'copy_to_clipboard' => 'Kopiuj', - 'approve' => 'Zatwierdź', - 'error_parsing_ai_response' => 'Błąd: Nie można zinterpretować odpowiedzi AI. Proszę spróbować ponownie.', - 'error_calling_ai_api' => 'Błąd: Nie można połączyć się z usługą AI. Proszę spróbować później.', - 'error_required_fields' => 'Błąd: Proszę wypełnić wszystkie wymagane pola (Stan i Rozmiar).', - 'register_title' => 'Rejestracja', - 'create_account' => 'Stwórz swoje konto', - 'register_subtitle' => 'Dołącz do Captionista, aby zacząć generować opisy.', - 'email' => 'Email', - 'password' => 'Hasło', - 'confirm_password' => 'Potwierdź hasło', - 'register_button' => 'Zarejestruj się', - 'already_have_account' => 'Masz już konto?', - 'login_link' => 'Zaloguj się', - 'login_title' => 'Logowanie', - 'login_heading' => 'Witaj z powrotem!', - 'login_subtitle' => 'Zaloguj się, aby uzyskać dostęp do swojego konta.', - 'login_button' => 'Zaloguj się', - 'no_account' => 'Nie masz konta?', - 'register_link' => 'Zarejestruj się', - 'fill_all_fields' => 'Proszę wypełnić wszystkie pola.', - 'passwords_do_not_match' => 'Hasła nie są zgodne.', - 'invalid_email' => 'Nieprawidłowy format email.', - 'email_already_registered' => 'Ten email jest już zarejestrowany.', - 'registration_successful' => 'Rejestracja pomyślna! Możesz się teraz zalogować.', - 'login_now' => 'Zaloguj się teraz.', - 'invalid_credentials' => 'Nieprawidłowy email lub hasło.', - 'profile_link' => 'Profil', - 'profile_heading' => 'Twój profil', - 'profile_subtitle' => 'Zaktualizuj dane swojego konta.', - 'profile_updated_successfully' => 'Profil zaktualizowany pomyślnie.', - 'email_cannot_be_changed' => 'Email nie może zostać zmieniony.', - 'new_password' => 'Nowe hasło', - 'confirm_new_password' => 'Potwierdź nowe hasło', - 'update_profile_button' => 'Zaktualizuj profil', - 'history_title' => 'Historia generacji', - 'history_empty' => 'Nie wygenerowałeś jeszcze żadnych opisów.', - 'history_generate_now' => 'Wygeneruj swój pierwszy opis', - 'generation_date' => 'Wygenerowano', - 'nav_pricing' => 'Cennik', - 'nav_faq' => 'FAQ', - 'nav_terms' => 'Regulamin', - 'pricing_subtitle' => 'Wybierz plan, który Ci odpowiada.', - 'monthly' => 'Miesięcznie', - 'annually' => 'Rocznie', - 'save_15_percent' => 'Oszczędź 15%', + 'additional_info_placeholder' => 'np. wady, cechy szczególne', + 'generate_button' => 'Generuj', + 'how_it_works_title' => 'Jak to działa', + 'step1_title' => 'Wgraj zdjęcia', + 'step1_desc' => 'Dodaj zdjęcia swojego produktu.', + 'step2_title' => 'Dodaj szczegóły', + 'step2_desc' => 'Podaj kilka podstawowych informacji.', + 'step3_title' => 'Generuj treść', + 'step3_desc' => 'Pozwól naszej SI działać.', 'basic_plan_name' => 'Podstawowy', 'premium_plan_name' => 'Premium', - 'basic_plan_limit' => '150 generacji/miesiąc', + 'basic_plan_limit' => 'Do 150 generacji miesięcznie', 'premium_plan_limit' => 'Nielimitowane generacje', - 'feature_150_generations' => '150 generacji miesięcznie', - 'feature_unlimited_generations' => 'Nielimitowane generacje', - 'feature_standard_support' => 'Standardowe wsparcie email', - 'feature_priority_support' => 'Priorytetowe wsparcie email', + 'feature_150_generations' => '150 generacji', + 'feature_standard_support' => 'Standardowe wsparcie', 'feature_history_access' => 'Dostęp do historii generacji', - 'choose_plan' => 'Wybierz plan', - 'month_short' => 'mies', + 'feature_unlimited_generations' => 'Nielimitowane generacje', + 'feature_priority_support' => 'Priorytetowe wsparcie', + 'monthly' => 'Miesięcznie', + 'annually' => 'Rocznie', + 'save_15_percent' => 'Zaoszczędź 15%', + 'month_short' => 'mc', 'billed_annually_at' => 'Płatne rocznie w kwocie', - 'pricing_footer_text' => 'Możesz zmieniać, anulować lub ulepszać swoją subskrypcję w dowolnym momencie. Brak zwrotów za częściowe okresy.', - 'faq_title' => 'Często zadawane pytania', - 'faq_q1_title' => 'Jak działa subskrypcja?', - 'faq_q1_text' => 'Możesz wybrać subskrypcję miesięczną lub roczną. Plan roczny daje 15% zniżki. Twoja subskrypcja odnowi się automatycznie na koniec każdego cyklu rozliczeniowego.', - 'faq_q2_title' => 'Czy mogę anulować subskrypcję?', - 'faq_q2_text' => 'Tak, możesz anulować subskrypcję w dowolnym momencie. Jeśli anulujesz, subskrypcja pozostanie aktywna do końca bieżącego okresu rozliczeniowego i nie zostanie odnowiona. Nie oferujemy zwrotów za częściowe okresy subskrypcji.', - 'faq_q3_title' => 'Czy mogę zmienić plan?', - 'faq_q3_text' => 'Tak, możesz w dowolnym momencie zmienić plan na wyższy lub niższy. Zmiany wejdą w życie w następnym cyklu rozliczeniowym.', - 'faq_q4_title' => 'Co się stanie, jeśli przekroczę limit generacji w planie Podstawowym?', - 'faq_q4_text' => 'Jeśli osiągniesz limit 150 generacji w planie Podstawowym, będziesz musiał przejść na plan Premium, aby kontynuować generowanie opisów w tym samym miesiącu.', - 'terms_title' => 'Regulamin', - 'terms_last_updated' => 'Ostatnia aktualizacja: 9 listopada 2025', - 'terms_section1_title' => '1. Akceptacja warunków', - 'terms_section1_text' => 'Korzystając z naszej usługi, akceptujesz i zgadzasz się na przestrzeganie warunków niniejszej umowy. Ponadto, korzystając z tych usług, podlegasz wszelkim opublikowanym wytycznym lub zasadom mającym zastosowanie do takich usług.', - 'terms_section2_title' => '2. Konta użytkowników', - 'terms_section2_text' => 'Jesteś odpowiedzialny za zachowanie poufności swojego konta i hasła. Zgadzasz się przyjąć odpowiedzialność za wszystkie działania, które mają miejsce na Twoim koncie lub pod Twoim hasłem.', - 'terms_section3_title' => '3. Subskrypcja i płatności', - 'terms_section3_text' => 'Wszystkie subskrypcje są opłacane z góry miesięcznie lub rocznie i nie podlegają zwrotowi. Twoja subskrypcja zostanie automatycznie odnowiona, chyba że ją anulujesz.', - 'terms_section4_title' => '4. Zakończenie', - 'terms_section4_text' => 'Możemy zamknąć lub zawiesić Twoje konto i zablokować dostęp do usługi natychmiast, bez uprzedniego powiadomienia lub odpowiedzialności, według naszego wyłącznego uznania, z dowolnego powodu i bez ograniczeń, w tym między innymi z powodu naruszenia Warunków.', - 'terms_section5_title' => '5. Zmiany w Regulaminie', - 'terms_section5_text' => 'Zastrzegamy sobie prawo, według naszego wyłącznego uznania, do modyfikowania lub zastępowania niniejszych Warunków w dowolnym momencie. Powiadomimy o wszelkich nowych warunkach co najmniej 30 dni przed ich wejściem w życie.', - 'subscription_success_message' => 'Twoja subskrypcja została aktywowana pomyślnie!', - 'no_active_subscription' => 'Nie masz aktywnej subskrypcji.', - 'choose_plan_to_start' => 'Wybierz plan, aby rozpocząć generowanie.', - 'plan' => 'Plan', - 'expires_on' => 'Wygasa', - 'change_plan' => 'Zmień plan', - 'subscription_expired_error' => 'Twoja subskrypcja wygasła. Odnów plan, aby kontynuować generowanie.', - 'generation_limit_exceeded_error' => 'Przekroczyłeś miesięczny limit generacji. Ulepsz swój plan, aby kontynuować.', - 'login_to_generate_error' => 'Zaloguj się, aby generować opisy.', - 'admin_panel_title' => 'Panel administratora', - 'admin_panel_subtitle' => 'Zarządzaj użytkownikami i ustawieniami aplikacji.', - 'registered_users' => 'Zarejestrowani użytkownicy', - 'role' => 'Rola', - 'subscription_plan' => 'Plan subskrypcji', - 'subscription_expires_at' => 'Subskrypcja wygasa', - 'registered_on' => 'Zarejestrowany', - 'no_users_found' => 'Nie znaleziono użytkowników.', - ], - 'es' => [ - 'app_name' => 'Captionista', - 'nav_generator' => 'Generador', - 'nav_history' => 'Historial', - 'nav_subscription' => 'Suscripción', - 'nav_login' => 'Iniciar sesión', - 'nav_register' => 'Registrarse', - 'nav_logout' => 'Cerrar sesión', - 'nav_profile' => 'Perfil', - 'hero_title' => 'Descripciones para tu tienda de ropa impulsadas por IA.', - 'hero_subtitle' => 'Crea descripciones de productos atractivas y optimizadas para SEO en segundos.', - 'hero_cta' => 'Empieza gratis', - 'how_it_works_title' => 'Cómo funciona', - 'step1_title' => 'Subir', - 'step1_desc' => 'Sube hasta 5 fotos de tu producto.', - 'step2_title' => 'Ingresar detalles', - 'step2_desc' => 'Añade información clave como material, talla y marca.', - 'step3_title' => 'Generar', - 'step3_desc' => 'Recibe una descripción completa y lista para usar.', - 'features_title' => 'Características', - 'feature1_title' => 'Descripciones impulsadas por IA', - 'feature2_title' => 'Soporte multilingüe', - 'feature3_title' => 'Historial y exportación', - 'pricing_title' => 'Precios', - 'pricing_free' => 'Gratis', - 'pricing_paid' => 'Pagado', - 'pricing_premium' => 'Premium', - 'pricing_coming_soon' => 'Próximamente', - 'footer_copyright' => '© 2025 Captionista. Todos los derechos reservados.', - 'generator_form_title' => 'Crea tu descripción', - 'upload_label' => 'Subir fotos (hasta 5)', - 'state_label' => 'Estado', - 'state_new' => 'Nuevo', - 'state_used' => 'Usado', - 'state_visibly_used' => 'Visiblemente usado', - 'length_label' => 'Largo (cm)', - 'width_chest_label' => 'Ancho de pecho (cm)', - 'width_waist_label' => 'Ancho de cintura (cm)', - 'width_hips_label' => 'Ancho de caderas (cm)', - 'material_label' => 'Material', - 'size_label' => 'Talla', - 'brand_label' => 'Marca/Productor', - 'additional_info_label' => 'Información adicional', - 'additional_info_placeholder' => 'p.ej. pequeña mancha en la manga, falta un botón', - 'generate_button' => 'Generar descripción', - 'generated_result' => 'Resultado generado', - 'output_title' => 'Título', - 'output_short_description' => 'Descripción corta', - 'output_description' => 'Descripción', - 'output_measurements' => 'Medidas', - 'output_hashtags' => 'Hashtags', - 'copy_to_clipboard' => 'Copiar', - 'approve' => 'Aprobar', - 'error_parsing_ai_response' => 'Error: No se pudo interpretar la respuesta de la IA. Por favor, inténtalo de nuevo.', - 'error_calling_ai_api' => 'Error: No se pudo conectar con el servicio de IA. Por favor, inténtalo más tarde.', - 'error_required_fields' => 'Error: Por favor, rellena todos los campos obligatorios (Estado y Talla).', - 'register_title' => 'Registrarse', - 'create_account' => 'Crea tu cuenta', - 'register_subtitle' => 'Únete a Captionista para empezar a generar descripciones.', - 'email' => 'Correo electrónico', - 'password' => 'Contraseña', - 'confirm_password' => 'Confirmar contraseña', - 'register_button' => 'Registrarse', - 'already_have_account' => '¿Ya tienes una cuenta?', - 'login_link' => 'Iniciar sesión', - 'login_title' => 'Iniciar sesión', - 'login_heading' => '¡Bienvenido de nuevo!', - 'login_subtitle' => 'Inicia sesión para acceder a tu cuenta.', - 'login_button' => 'Iniciar sesión', - 'no_account' => '¿No tienes una cuenta?', - 'register_link' => 'Registrarse', - 'fill_all_fields' => 'Por favor, rellena todos los campos.', - 'passwords_do_not_match' => 'Las contraseñas no coinciden.', - 'invalid_email' => 'Formato de correo electrónico no válido.', - 'email_already_registered' => 'Este correo electrónico ya está registrado.', - 'registration_successful' => '¡Registro exitoso! Ahora puedes iniciar sesión.', - 'login_now' => 'Iniciar sesión ahora.', - 'invalid_credentials' => 'Correo electrónico o contraseña no válidos.', - 'profile_link' => 'Perfil', - 'profile_heading' => 'Tu Perfil', - 'profile_subtitle' => 'Actualiza los datos de tu cuenta.', - 'profile_updated_successfully' => 'Perfil actualizado correctamente.', - 'email_cannot_be_changed' => 'El correo electrónico no se puede cambiar.', - 'new_password' => 'Nueva contraseña', - 'confirm_new_password' => 'Confirmar nueva contraseña', - 'update_profile_button' => 'Actualizar perfil', - 'history_title' => 'Historial de Generación', - 'history_empty' => 'Aún no has generado ninguna descripción.', - 'history_generate_now' => 'Genera tu primera descripción', - 'generation_date' => 'Generado el', - 'nav_pricing' => 'Precios', - 'nav_faq' => 'FAQ', - 'nav_terms' => 'Términos de Uso', - 'pricing_subtitle' => 'Elige el plan que más te convenga.', - 'monthly' => 'Mensual', - 'annually' => 'Anual', - 'save_15_percent' => 'Ahorra 15%', - 'basic_plan_name' => 'Básico', - 'premium_plan_name' => 'Premium', - 'basic_plan_limit' => '150 generaciones/mes', - 'premium_plan_limit' => 'Generaciones ilimitadas', - 'feature_150_generations' => '150 generaciones por mes', - 'feature_unlimited_generations' => 'Generaciones ilimitadas', - 'feature_standard_support' => 'Soporte estándar por correo electrónico', - 'feature_priority_support' => 'Soporte prioritario por correo electrónico', - 'feature_history_access' => 'Acceso al historial de generaciones', - 'choose_plan' => 'Elegir Plan', - 'month_short' => 'mes', - 'billed_annually_at' => 'Facturado anualmente a', - 'pricing_footer_text' => 'Puedes mejorar, degradar o cancelar tu suscripción en cualquier momento. No hay reembolsos por períodos parciales.', - 'faq_title' => 'Preguntas Frecuentes', - 'faq_q1_title' => '¿Cómo funciona la suscripción?', - 'faq_q1_text' => 'Puedes elegir entre una suscripción mensual o anual. El plan anual te ofrece un 15% de descuento. Tu suscripción se renovará automáticamente al final de cada ciclo de facturación.', - 'faq_q2_title' => '¿Puedo cancelar mi suscripción?', - 'faq_q2_text' => 'Sí, puedes cancelar tu suscripción en cualquier momento. Si cancelas, tu suscripción permanecerá activa hasta el final del período de facturación actual y no se renovará. No ofrecemos reembolsos por períodos de suscripción parciales.', - 'faq_q3_title' => '¿Puedo cambiar mi plan?', - 'faq_q3_text' => 'Sí, puedes mejorar o degradar tu plan en cualquier momento. Los cambios entrarán en vigor en el próximo ciclo de facturación.', - 'faq_q4_title' => '¿Qué pasa si excedo mi límite de generaciones en el plan Básico?', - 'faq_q4_text' => 'Si alcanzas el límite de 150 generaciones en el plan Básico, deberás actualizar al plan Premium para continuar generando descripciones en el mismo mes.', - 'terms_title' => 'Términos de Uso', - 'terms_last_updated' => 'Última actualización: 9 de noviembre de 2025', - 'terms_section1_title' => '1. Aceptación de los Términos', - 'terms_section1_text' => 'Al acceder y utilizar nuestro servicio, aceptas y te comprometes a estar sujeto a los términos y disposiciones de este acuerdo. Además, al utilizar estos servicios particulares, estarás sujeto a cualquier guía o regla publicada aplicable a dichos servicios.', - 'terms_section2_title' => '2. Cuentas de Usuario', - 'terms_section2_text' => 'Eres responsable de mantener la confidencialidad de tu cuenta y contraseña. Aceptas la responsabilidad de todas las actividades que ocurran bajo tu cuenta o contraseña.', - 'terms_section3_title' => '3. Suscripción y Pago', - 'terms_section3_text' => 'Todas las suscripciones se facturan por adelantado de forma mensual o anual y no son reembolsables. Tu suscripción se renovará automáticamente a menos que la canceles.', - 'terms_section4_title' => '4. Terminación', - 'terms_section4_text' => 'Podemos rescindir o suspender tu cuenta y prohibir el acceso al servicio de inmediato, sin previo aviso ni responsabilidad, a nuestra entera discreción, por cualquier motivo y sin limitación, incluido, entre otros, el incumplimiento de los Términos.', - 'terms_section5_title' => '5. Cambios en los Términos', - 'terms_section5_text' => 'Nos reservamos el derecho, a nuestra entera discreción, de modificar o reemplazar estos Términos en cualquier momento. Proporcionaremos un aviso de al menos 30 días antes de que los nuevos términos entren en vigor.', - 'subscription_success_message' => '¡Tu suscripción ha sido activada con éxito!', - 'no_active_subscription' => 'No tienes una suscripción activa.', - 'choose_plan_to_start' => 'Elige un plan para empezar a generar.', - 'plan' => 'Plan', - 'expires_on' => 'Expira el', - 'change_plan' => 'Cambiar de plan', - 'subscription_expired_error' => 'Tu suscripción ha expirado. Renueva tu plan para seguir generando.', - 'generation_limit_exceeded_error' => 'Has excedido tu límite de generación mensual. Actualiza tu plan para continuar.', - 'login_to_generate_error' => 'Inicia sesión para generar descripciones.', - 'admin_panel_title' => 'Panel de administración', - 'admin_panel_subtitle' => 'Gestionar usuarios y configuración de la aplicación.', - 'registered_users' => 'Usuarios registrados', - 'role' => 'Rol', - 'subscription_plan' => 'Plan de suscripción', - 'subscription_expires_at' => 'La suscripción expira', - 'registered_on' => 'Registrado el', - 'no_users_found' => 'No se encontraron usuarios.', - ], - 'fr' => [ - 'app_name' => 'Captionista', - 'nav_generator' => 'Générateur', - 'nav_history' => 'Historique', - 'nav_subscription' => 'Abonnement', - 'nav_login' => 'Connexion', - 'nav_register' => "S'inscrire", - 'nav_logout' => 'Déconnexion', - 'nav_profile' => 'Profil', - 'hero_title' => 'Descriptions pour votre boutique de vêtements optimisées par l´IA.', - 'hero_subtitle' => 'Créez sans effort des fiches produits attrayantes et optimisées pour le SEO en quelques secondes.', - 'hero_cta' => 'Commencez gratuitement', - 'how_it_works_title' => 'Comment ça marche', - 'step1_title' => 'Télécharger', - 'step1_desc' => 'Téléchargez jusqu´à 5 photos de votre produit.', - 'step2_title' => 'Saisir les détails', - 'step2_desc' => 'Ajoutez des informations clés comme le matériau, la taille et la marque.', - 'step3_title' => 'Générer', - 'step3_desc' => 'Recevez une description complète et prête à l´emploi.', - 'features_title' => 'Fonctionnalités', - 'feature1_title' => 'Descriptions par l´IA', - 'feature2_title' => 'Support multilingue', - 'feature3_title' => 'Historique et exportation', - 'pricing_title' => 'Tarifs', - 'pricing_free' => 'Gratuit', - 'pricing_paid' => 'Payant', - 'pricing_premium' => 'Premium', - 'pricing_coming_soon' => 'Bientôt disponible', - 'footer_copyright' => '© 2025 Captionista. Tous droits réservés.', - 'generator_form_title' => 'Créez votre description', - 'upload_label' => 'Télécharger des photos (jusqu´à 5)', - 'state_label' => 'État', - 'state_new' => 'Neuf', - 'state_used' => 'D´occasion', - 'state_visibly_used' => 'Visiblement utilisé', - 'length_label' => 'Longueur (cm)', - 'width_chest_label' => 'Largeur de poitrine (cm)', - 'width_waist_label' => 'Largeur de taille (cm)', - 'width_hips_label' => 'Largeur de hanches (cm)', - 'material_label' => 'Matériau', - 'size_label' => 'Taille', - 'brand_label' => 'Marque/Producteur', - 'additional_info_label' => 'Informations supplémentaires', - 'additional_info_placeholder' => 'ex. petite tache sur la manche, bouton manquant', - 'generate_button' => 'Générer la description', - 'generated_result' => 'Résultat généré', - 'output_title' => 'Titre', - 'output_short_description' => 'Description courte', - 'output_description' => 'Description', - 'output_measurements' => 'Mesures', - 'output_hashtags' => 'Hashtags', - 'copy_to_clipboard' => 'Copier', - 'approve' => 'Approuver', - 'error_parsing_ai_response' => 'Erreur : Impossible d´interpréter la réponse de l´IA. Veuillez réessayer.', - 'error_calling_ai_api' => 'Erreur : Impossible de se connecter au service d´IA. Veuillez réessayer plus tard.', - 'error_required_fields' => 'Erreur : Veuillez remplir tous les champs obligatoires (État et Taille).', - 'register_title' => "S'inscrire", - 'create_account' => 'Créez votre compte', - 'register_subtitle' => 'Rejoignez Captionista pour commencer à générer des descriptions.', - 'email' => 'Email', - 'password' => 'Mot de passe', - 'confirm_password' => 'Confirmez le mot de passe', - 'register_button' => "S'inscrire", - 'already_have_account' => 'Vous avez déjà un compte ?', - 'login_link' => 'Connexion', - 'login_title' => 'Connexion', - 'login_heading' => 'Content de vous revoir !', - 'login_subtitle' => 'Connectez-vous pour accéder à votre compte.', - 'login_button' => 'Connexion', - 'no_account' => "Vous n'avez pas de compte ?", - 'register_link' => "S'inscrire", - 'fill_all_fields' => 'Veuillez remplir tous les champs.', - 'passwords_do_not_match' => 'Les mots de passe ne correspondent pas.', - 'invalid_email' => "Format d'email invalide.", - 'email_already_registered' => 'Cet email est déjà enregistré.', - 'registration_successful' => 'Inscription réussie ! Vous pouvez maintenant vous connecter.', - 'login_now' => 'Connectez-vous maintenant.', - 'invalid_credentials' => 'Email ou mot de passe invalide.', - 'profile_link' => 'Profil', - 'profile_heading' => 'Votre profil', - 'profile_subtitle' => 'Mettez à jour les détails de votre compte.', - 'profile_updated_successfully' => 'Profil mis à jour avec succès.', - 'email_cannot_be_changed' => "L'email ne peut pas être modifié.", - 'new_password' => 'Nouveau mot de passe', - 'confirm_new_password' => 'Confirmer le nouveau mot de passe', - 'update_profile_button' => 'Mettre à jour le profil', - 'history_title' => 'Historique des générations', - 'history_empty' => "Vous n'a encore généré aucune description.", - 'history_generate_now' => 'Générez votre première description', - 'generation_date' => 'Généré le', - 'nav_pricing' => 'Tarifs', - 'nav_faq' => 'FAQ', - 'nav_terms' => "Conditions d'utilisation", - 'pricing_subtitle' => 'Choisissez le plan qui vous convient.', - 'monthly' => 'Mensuel', - 'annually' => 'Annuel', - 'save_15_percent' => 'Économisez 15%', - 'basic_plan_name' => 'Basique', - 'premium_plan_name' => 'Premium', - 'basic_plan_limit' => '150 générations/mois', - 'premium_plan_limit' => 'Générations illimitées', - 'feature_150_generations' => '150 générations par mois', - 'feature_unlimited_generations' => 'Générations illimitées', - 'feature_standard_support' => 'Support par email standard', - 'feature_priority_support' => 'Support par email prioritaire', - 'feature_history_access' => "Accès à l'historique des générations", - 'choose_plan' => 'Choisir le plan', - 'month_short' => 'mois', - 'billed_annually_at' => 'Facturé annuellement à', - 'pricing_footer_text' => 'Vous pouvez mettre à niveau, rétrograder ou annuler votre abonnement à tout moment. Aucun remboursement pour les périodes partielles.', - 'faq_title' => 'Foire Aux Questions', - 'faq_q1_title' => "Comment fonctionne l'abonnement ?", - 'faq_q1_text' => 'Vous pouvez choisir entre un abonnement mensuel ou annuel. Le plan annuel vous offre une réduction de 15%. Votre abonnement se renouvellera automatiquement à la fin de chaque cycle de facturation.', - 'faq_q2_title' => 'Puis-je annuler mon abonnement ?', - 'faq_q2_text' => "Oui, vous pouvez annuler votre abonnement à tout moment. Si vous annulez, votre abonnement restera actif jusqu'à la fin de la période de facturation en cours et ne sera pas renouvelé. Nous n'offrons pas de remboursement pour les périodes d'abonnement partielles.", - 'faq_q3_title' => 'Puis-je changer de plan ?', - 'faq_q3_text' => 'Oui, vous pouvez mettre à niveau ou rétrograder votre plan à tout moment. Les modifications prendront effet lors du prochain cycle de facturation.', - 'faq_q4_title' => 'Que se passe-t-il si je dépasse ma limite de générations avec le plan Basique ?', - 'faq_q4_text' => 'Si vous atteignez la limite de 150 générations avec le plan Basique, vous devrez passer au plan Premium pour continuer à générer des descriptions au cours du même mois.', - 'terms_title' => "Conditions d'utilisation", - 'terms_last_updated' => 'Dernière mise à jour : 9 novembre 2025', - 'terms_section1_title' => '1. Acceptation des conditions', - 'terms_section1_text' => "En accédant à notre service et en l'utilisant, vous acceptez d'être lié par les termes et dispositions de cet accord. De plus, en utilisant ces services particuliers, vous serez soumis à toutes les directives ou règles publiées applicables à ces services.", - 'terms_section2_title' => "2. Comptes d'utilisateurs", - 'terms_section2_text' => 'Vous êtes responsable du maintien de la confidentialité de votre compte et de votre mot de passe. Vous acceptez d'assumer la responsabilité de toutes les activités qui se déroulent sous votre compte ou votre mot de passe.', - 'terms_section3_title' => '3. Abonnement et paiement', - 'terms_section3_text' => "Tous les abonnements sont facturés à l'avance sur une base mensuelle ou annuelle et ne sont pas remboursables. Votre abonnement sera automatiquement renouvelé, sauf si vous l'annulez.", - 'terms_section4_title' => '4. Résiliation', - 'terms_section4_text' => "Nous pouvons résilier ou suspendre votre compte et interdire l'accès au service immédiatement, sans préavis ni responsabilité, à notre seule discrétion, pour quelque raison que ce soit et sans limitation, y compris, mais sans s'y limiter, une violation des Conditions.", - 'terms_section5_title' => '5. Modifications des conditions', - 'terms_section5_text' => "Nous nous réservons le droit, à notre seule discrétion, de modifier ou de remplacer ces Conditions à tout moment. Nous fournirons un préavis d'au moins 30 jours avant l'entrée en vigueur de nouvelles conditions.", - 'subscription_success_message' => 'Votre abonnement a été activé avec succès !', - 'no_active_subscription' => "Vous n'avez pas d'abonnement actif.", - 'choose_plan_to_start' => 'Choisissez un plan pour commencer à générer.', - 'plan' => 'Plan', - 'expires_on' => 'Expire le', - 'change_plan' => 'Changer de plan', - 'subscription_expired_error' => 'Votre abonnement a expiré. Veuillez renouveler votre plan pour continuer à générer.', - 'generation_limit_exceeded_error' => 'Vous avez dépassé votre limite de génération mensuelle. Veuillez mettre à niveau votre plan pour continuer.', - 'login_to_generate_error' => 'Veuillez vous connecter pour générer des descriptions.', - 'admin_panel_title' => "Panneau d'administration", - 'admin_panel_subtitle' => "Gérer les utilisateurs et les paramètres de l'application.", - 'registered_users' => 'Utilisateurs enregistrés', - 'role' => 'Rôle', - 'subscription_plan' => "Plan d'abonnement", - 'subscription_expires_at' => "L'abonnement expire", - 'registered_on' => 'Inscrit le', - 'no_users_found' => 'Aucun utilisateur trouvé.', - ], - 'de' => [ - 'app_name' => 'Captionista', - 'nav_generator' => 'Generator', - 'nav_history' => 'Verlauf', - 'nav_subscription' => 'Abonnement', - 'nav_login' => 'Anmelden', - 'nav_register' => 'Registrieren', - 'nav_logout' => 'Abmelden', - 'nav_profile' => 'Profil', - 'hero_title' => 'KI-gestützte Beschreibungen für Ihren Bekleidungsladen.', - 'hero_subtitle' => 'Erstellen Sie mühelos überzeugende, SEO-freundliche Produktbeschreibungen in Sekunden.', - 'hero_cta' => 'Kostenlos starten', - 'how_it_works_title' => 'Wie es funktioniert', - 'step1_title' => 'Hochladen', - 'step1_desc' => 'Laden Sie bis zu 5 Fotos Ihres Produkts hoch.', - 'step2_title' => 'Details eingeben', - 'step2_desc' => 'Fügen Sie wichtige Informationen wie Material, Größe und Marke hinzu.', - 'step3_title' => 'Generieren', - 'step3_desc' => 'Erhalten Sie eine vollständige, gebrauchsfertige Beschreibung.', - 'features_title' => 'Funktionen', - 'feature1_title' => 'KI-gestützte Beschreibungen', - 'feature2_title' => 'Mehrsprachige Unterstützung', - 'feature3_title' => 'Verlauf & Export', - 'pricing_title' => 'Preise', - 'pricing_free' => 'Kostenlos', - 'pricing_paid' => 'Bezahlt', - 'pricing_premium' => 'Premium', - 'pricing_coming_soon' => 'Demnächst verfügbar', - 'footer_copyright' => '© 2025 Captionista. Alle Rechte vorbehalten.', - 'generator_form_title' => 'Erstellen Sie Ihre Beschreibung', - 'upload_label' => 'Fotos hochladen (bis zu 5)', - 'state_label' => 'Zustand', - 'state_new' => 'Neu', - 'state_used' => 'Gebraucht', - 'state_visibly_used' => 'Sichtlich gebraucht', - 'length_label' => 'Länge (cm)', - 'width_chest_label' => 'Brustweite (cm)', - 'width_waist_label' => 'Taillenweite (cm)', - 'width_hips_label' => 'Hüftweite (cm)', - 'material_label' => 'Material', - 'size_label' => 'Größe', - 'brand_label' => 'Marke/Hersteller', - 'additional_info_label' => 'Zusätzliche Informationen', - 'additional_info_placeholder' => 'z.B. kleiner Fleck am Ärmel, fehlender Knopf', - 'generate_button' => 'Beschreibung generieren', - 'generated_result' => 'Generiertes Ergebnis', - 'output_title' => 'Titel', - 'output_short_description' => 'Kurzbeschreibung', - 'output_description' => 'Beschreibung', - 'output_measurements' => 'Maße', - 'output_hashtags' => 'Hashtags', - 'copy_to_clipboard' => 'Kopieren', - 'approve' => 'Genehmigen', - 'error_parsing_ai_response' => 'Fehler: Die KI-Antwort konnte nicht interpretiert werden. Bitte versuchen Sie es erneut.', - 'error_calling_ai_api' => 'Fehler: Der KI-Dienst konnte nicht erreicht werden. Bitte versuchen Sie es später erneut.', - 'error_required_fields' => 'Fehler: Bitte füllen Sie alle Pflichtfelder aus (Zustand und Größe).', - 'register_title' => 'Registrieren', - 'create_account' => 'Erstellen Sie Ihr Konto', - 'register_subtitle' => 'Treten Sie Captionista bei, um mit dem Generieren von Beschreibungen zu beginnen.', - 'email' => 'E-Mail', - 'password' => 'Passwort', - 'confirm_password' => 'Passwort bestätigen', - 'register_button' => 'Registrieren', - 'already_have_account' => 'Haben Sie bereits ein Konto?', - 'login_link' => 'Anmelden', - 'login_title' => 'Anmelden', - 'login_heading' => 'Willkommen zurück!', - 'login_subtitle' => 'Melden Sie sich an, um auf Ihr Konto zuzugreifen.', - 'login_button' => 'Anmelden', - 'no_account' => 'Haben Sie kein Konto?', - 'register_link' => 'Registrieren', - 'fill_all_fields' => 'Bitte füllen Sie alle Felder aus.', - 'passwords_do_not_match' => 'Die Passwörter stimmen nicht überein.', - 'invalid_email' => 'Ungültiges E-Mail-Format.', - 'email_already_registered' => 'Diese E-Mail ist bereits registriert.', - 'registration_successful' => 'Registrierung erfolgreich! Sie können sich jetzt anmelden.', - 'login_now' => 'Jetzt anmelden.', - 'invalid_credentials' => 'Ungültige E-Mail oder ungültiges Passwort.', - 'profile_link' => 'Profil', - 'profile_heading' => 'Ihr Profil', - 'profile_subtitle' => 'Aktualisieren Sie Ihre Kontodaten.', - 'profile_updated_successfully' => 'Profil erfolgreich aktualisiert.', - 'email_cannot_be_changed' => 'E-Mail kann nicht geändert werden.', - 'new_password' => 'Neues Passwort', - 'confirm_new_password' => 'Neues Passwort bestätigen', - 'update_profile_button' => 'Profil aktualisieren', - 'history_title' => 'Generierungsverlauf', - 'history_empty' => 'Sie haben noch keine Beschreibungen generiert.', - 'history_generate_now' => 'Erstellen Sie Ihre erste Beschreibung', - 'generation_date' => 'Erstellt am', - 'nav_pricing' => 'Preise', - 'nav_faq' => 'FAQ', - 'nav_terms' => 'Nutzungsbedingungen', - 'pricing_subtitle' => 'Wählen Sie den Plan, der für Sie am besten geeignet ist.', - 'monthly' => 'Monatlich', - 'annually' => 'Jährlich', - 'save_15_percent' => '15% sparen', - 'basic_plan_name' => 'Basis', - 'premium_plan_name' => 'Premium', - 'basic_plan_limit' => '150 Generierungen/Monat', - 'premium_plan_limit' => 'Unbegrenzte Generierungen', - 'feature_150_generations' => '150 Generierungen pro Monat', - 'feature_unlimited_generations' => 'Unbegrenzte Generierungen', - 'feature_standard_support' => 'Standard-E-Mail-Support', - 'feature_priority_support' => 'Prioritäts-E-Mail-Support', - 'feature_history_access' => 'Zugriff auf den Generierungsverlauf', - 'choose_plan' => 'Plan wählen', - 'month_short' => 'Monat', - 'billed_annually_at' => 'Wird jährlich abgerechnet mit', - 'pricing_footer_text' => 'Sie können Ihr Abonnement jederzeit upgraden, downgraden oder kündigen. Keine Rückerstattung für Teilzeiträume.', - 'faq_title' => 'Häufig gestellte Fragen', - 'faq_q1_title' => 'Wie funktioniert das Abonnement?', - 'faq_q1_text' => 'Sie können zwischen einem monatlichen oder jährlichen Abonnement wählen. Mit dem Jahresplan erhalten Sie 15% Rabatt. Ihr Abonnement verlängert sich automatisch am Ende jedes Abrechnungszeitraums.', - 'faq_q2_title' => 'Kann ich mein Abonnement kündigen?', - 'faq_q2_text' => 'Ja, Sie können Ihr Abonnement jederzeit kündigen. Wenn Sie kündigen, bleibt Ihr Abonnement bis zum Ende des aktuellen Abrechnungszeitraums aktiv und wird nicht verlängert. Wir bieten keine Rückerstattungen für Teil-Abonnementzeiträume an.', - 'faq_q3_title' => 'Kann ich meinen Plan ändern?', - 'faq_q3_text' => 'Ja, Sie können Ihren Plan jederzeit upgraden oder downgraden. Die Änderungen werden im nächsten Abrechnungszyklus wirksam.', - 'faq_q4_title' => 'Was passiert, wenn ich mein Generierungslimit im Basis-Plan überschreite?', - 'faq_q4_text' => 'Wenn Sie das Limit von 150 Generierungen im Basis-Plan erreichen, müssen Sie auf den Premium-Plan upgraden, um im selben Monat weiterhin Beschreibungen zu generieren.', - 'terms_title' => 'Nutzungsbedingungen', - 'terms_last_updated' => 'Zuletzt aktualisiert: 9. November 2025', - 'terms_section1_title' => '1. Annahme der Bedingungen', - 'terms_section1_text' => 'Durch den Zugriff auf und die Nutzung unseres Dienstes akzeptieren Sie die Bedingungen dieser Vereinbarung und stimmen diesen zu. Darüber hinaus unterliegen Sie bei der Nutzung dieser speziellen Dienste allen veröffentlichten Richtlinien oder Regeln, die für solche Dienste gelten.', - 'terms_section2_title' => '2. Benutzerkonten', - 'terms_section2_text' => 'Sie sind für die Wahrung der Vertraulichkeit Ihres Kontos und Passworts verantwortlich. Sie erklären sich damit einverstanden, die Verantwortung für alle Aktivitäten zu übernehmen, die unter Ihrem Konto oder Passwort stattfinden.', - 'terms_section3_title' => '3. Abonnement und Zahlung', - 'terms_section3_text' => 'Alle Abonnements werden im Voraus auf monatlicher oder jährlicher Basis abgerechnet und sind nicht erstattungsfähig. Ihr Abonnement verlängert sich automatisch, es sei denn, Sie kündigen es.', - 'terms_section4_title' => '4. Kündigung', - 'terms_section4_text' => 'Wir können Ihr Konto kündigen oder sperren und den Zugang zum Dienst sofort, ohne vorherige Ankündigung oder Haftung, nach unserem alleinigen Ermessen, aus irgendeinem Grund und ohne Einschränkung, einschließlich, aber nicht beschränkt auf einen Verstoß gegen die Bedingungen, sperren.', - 'terms_section5_title' => '5. Änderungen der Bedingungen', - 'terms_section5_text' => 'Wir behalten uns das Recht vor, diese Bedingungen nach unserem alleinigen Ermessen jederzeit zu ändern oder zu ersetzen. Wir werden mindestens 30 Tage vor dem Inkrafttreten neuer Bedingungen eine entsprechende Mitteilung machen.', - 'subscription_success_message' => 'Ihr Abonnement wurde erfolgreich aktiviert!', - 'no_active_subscription' => 'Sie haben kein aktives Abonnement.', - 'choose_plan_to_start' => 'Wählen Sie einen Plan, um mit dem Generieren zu beginnen.', - 'plan' => 'Plan', - 'expires_on' => 'Läuft ab am', - 'change_plan' => 'Plan ändern', - 'subscription_expired_error' => 'Ihr Abonnement ist abgelaufen. Bitte erneuern Sie Ihren Plan, um weiterhin zu generieren.', - 'generation_limit_exceeded_error' => 'Sie haben Ihr monatliches Generierungslimit überschritten. Bitte aktualisieren Sie Ihren Plan, um fortzufahren.', - 'login_to_generate_error' => 'Bitte melden Sie sich an, um Beschreibungen zu generieren.', - 'admin_panel_title' => 'Administrationsbereich', - 'admin_panel_subtitle' => 'Benutzer und Anwendungseinstellungen verwalten.', - 'registered_users' => 'Registrierte Benutzer', - 'role' => 'Rolle', - 'subscription_plan' => 'Abonnementplan', - 'subscription_expires_at' => 'Abonnement läuft ab', - 'registered_on' => 'Registriert am', - 'no_users_found' => 'Keine Benutzer gefunden.', + 'choose_plan' => 'Wybierz plan', + 'pricing_footer_text' => 'Ceny podane są w USD. Możesz anulować w dowolnym momencie.', + 'history_empty' => 'Nie masz jeszcze historii generacji. Utwórz swoją pierwszą!', + 'history_generate_now' => 'Generuj teraz', ], ]; -} - -function t($key, $lang = null) { - global $current_lang; - if ($lang === null) { - $lang = $current_lang; - } - $translations = get_translations(); - return $translations[$lang][$key] ?? $key; -} +} \ No newline at end of file diff --git a/index.php b/index.php index c0e21bb..9dcfd82 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,6 @@ - +
diff --git a/list_users.php b/list_users.php new file mode 100644 index 0000000..ef42eea --- /dev/null +++ b/list_users.php @@ -0,0 +1,11 @@ +query("SELECT * FROM users"); + $users = $stmt->fetchAll(PDO::FETCH_ASSOC); + print_r($users); +} catch (PDOException $e) { + die("Database error: " . $e->getMessage() . "\n"); +} + diff --git a/pricing.php b/pricing.php index 645b336..585dd51 100644 --- a/pricing.php +++ b/pricing.php @@ -1,6 +1,4 @@ prepare('INSERT INTO users (email, password) VALUES (?, ?)'); - $stmt->execute([$email, $hashed_password]); + $stmt = $pdo->prepare('INSERT INTO users (username, email, password) VALUES (?, ?, ?)'); + $stmt->execute([$username, $email, $hashed_password]); $success = t('registration_successful'); } } catch (PDOException $e) { @@ -53,15 +54,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- + + +
+
+
- +
- +
diff --git a/terms.php b/terms.php index 306b6b4..23a2c5d 100644 --- a/terms.php +++ b/terms.php @@ -1,6 +1,4 @@